两个列表的算法Prolog

时间:2013-04-22 19:51:39

标签: list prolog

所以我有一个硬件问题我已经工作了几天而且我被困在最后一部分。在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.

3 个答案:

答案 0 :(得分: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).,尽管没有必要。

答案 1 :(得分:2)

Prolog有列表,而不是数组。

您的代码未实现显示的公式,因为{/ 1}}必须在产品总和之后计算。在下面的代码中,我还介绍了一个累加器,使循环尾递归(更高效)。

sqrt

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

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).

答案 2 :(得分:0)

你给出的公式将整个求和平方,而不是平均每对夫妇 - 这就是你在代码中所做的。使用辅助解决了这个问题:

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