【问题标题】:Arithmetic on Two Lists Prolog两个列表的算术 Prolog
【发布时间】:2013-05-08 10:11:23
【问题描述】:

所以我有一个硬件问题,我已经解决了几天,我被困在最后一部分。在 Prolog 中,我应该编写一个包含两个列表的函数 ((x1, x2, ..., xn), (y1, y2, ...yn) ) 并找到两者之间的距离。输出是对列表进行的数学运算的结果。 公式:sqrt((x1-y1)(x1-y1) + (x2-y2)(x2-y2) + … + (xn-yn)*(xn-yn)) 到目前为止,这是我所拥有的:

distance([],[], 0).
distance([Ha|Ta],[Hb|Tb], Sum) :-
   distance(Ta,Tb, Rest),
   Sum is sqrt( (Ha-Hb)*(Ha-Hb)) + Rest.

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    Prolog 有列表,而不是数组。

    您的代码未实现所示公式,因为必须在 乘积总和之后计算 sqrt。在下面的代码中,我还引入了一个累加器,使循环尾递归(更高效)。

    distance(Xs, Ys, Dist) :-
      distance(Xs, Ys, 0, Dist).
    
    distance([], [], Acc, Dist) :- 
        Dist is sqrt(Acc).
    distance([X|Xs], [Y|Ys], Acc, Dist) :-
        Sum is (Y-X)*(Y-X) + Acc,
        distance(Xs, Ys, Sum, Dist).
    

    根据您的 Prolog 库,代码可能会更简单:

    distance(Xs, Ys, Dist) :-
        foldl(distpoint, Xs, Ys, 0, Sq),
        Dist is sqrt(Sq).
    distpoint(X, Y, S, D) :- D is S+(Y-X)*(Y-X).
    

    【讨论】:

    • 确实!习惯了 Erlang,我有时会忘记你必须使用两个累加器,而在 Erlang 中你只能使用一个。
    【解决方案2】:

    很近。在我的脑海中,只需将平方和 (distance_aux) 相加,然后返回累积和的平方根:

    distance(L1, L2, D) :-
            distance_aux(L1, L2, SQSUM),
            D is sqrt(SQSUM).
    
    distance_aux([],[],0).
    distance_aux([Ha|Ta],[Hb|Tb], Sum) :-
       distance_aux(Ta,Tb, Rest),
       Sum is (Ha-Hb)*(Ha-Hb) + Rest.
    

    您也可以添加简化规则distance([], [], 0).,尽管这不是必需的。

    【讨论】:

    • 啊,好吧,我知道出了什么问题。我添加了一个辅助功能,它工作得很好。感谢您的快速回复:-)
    【解决方案3】:

    您给出的公式对整个总和进行平方,而不是对每一对单独进行平方 - 这就是您在代码中所做的。使用辅助解决了这个问题:

    distance_sum([], [], 0).
    distance_sum([Ha|Ta], [Hb|Tb], Sum) :-
       distance_sum(Ta, Tb, Rest),
       Sum is ((Ha-Hb) * (Ha-Hb)) + Rest.
    
    distance(A, B, Sum) :- distance_sum(A, B, DSum), Sum is sqrt(DSum).
    

    所以一个例子是:

    distance([1,2,3], [4,5,6], Sum).
    Sum = 5.196152422706632.
    

    工作:

    sqrt( (1-4)*(1-4) + (2-5)*(2-5) + (3-6)*(3-6) )
    sqrt( 3*3 + 3*3 + 3*3 )
    sqrt( 27 )
    5.19615
    

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 2017-10-25
      • 1970-01-01
      • 2019-07-09
      • 2013-09-12
      • 2014-05-23
      • 2015-12-20
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多