Prolog 欧几里得广场

Prolog Euclidian Square

我编写了一个程序,对于两个相等的数组 X 和 Y,它应该计算 SUM((X-Y)*(X-Y))。然而它只是 returns false:

euclidsqr([],[],ED).
euclidsqr([X|Xs],[Y|Ys],ED) :- euclidsqr(Xs,Ys,ED),ED is (X-Y)*(X-Y).

这里存在三个问题:

你的两个空列表的版本应该将第二个参数统一为 0,而不是 ED,因为它仍然是一个 free 变量,所以:

euclidsqr([], [], <b>0</b>).

你也用ED来统一结果(在子句的头部),但是你在递归调用中使用相同的变量(在列表的尾部),而且你不求和递归调用的结果,(X-Y)*(X-Y):

euclidsqr([X|Xs], [Y|Ys], ED) :-
    euclidsqr(Xs, Ys, <b>ED1</b>),
    ED is <b>ED1 +</b> (X-Y)*(X-Y).

或将其放在一起:

euclidsqr([], [], <b>0</b>).
euclidsqr([X|Xs], [Y|Ys], ED) :-
    euclidsqr(Xs, Ys, <b>ED1</b>),
    ED is <b>ED1 +</b> (X-Y)*(X-Y).