我对Prolog完全陌生,并且在做家庭作业。我的程序应该采用两个等长的列表,并执行D = sqrt((X1-Y1)^ 2 +(X2-Y2)^ 2 + ... +(XN-YN)^ 2)。我已经编写了代码来获得正确的答案,但它没有正确显示。我认为这可能是逻辑流程的一个问题,因为它看起来像是在一个无限循环中结束。它应该是这样的:Prolog逻辑流程
?- distance([1,2,3], [2,3,4], D).
D = 1.732051.
我的代码是给我正确的结果,但它打印它想:
?- distance([1,2,3],[2,3,4],D).
1.732051
true
只是因为我有一条线在那里打印的结果。它也没有结束(没有时期),直到我进入,这就是为什么我害怕我有一个循环。如何更改我的代码或重定向我的逻辑,使其正常打印?
distance([],[],D) :-
F is sqrt(D),
format("~f~n", [F]).
distance([A|T1], [B|T2], D) :-
var(D),
S is (A-B)*(A-B),
distance(T1, T2, S);
C is A-B,
E is C*C,
F is D+E,
distance(T1, T2, F).
不应该'F'评价为'd-E',而不是'd + E'?你希望递归距离是总距离减去每次第一项的距离。我也对'distance(T1,T2,S)'这一行感到困惑;'你可以评论一下吗? – ely 2012-04-16 21:49:41
N/M,我明白你现在在做什么..在最后一个参数中累积距离的总和。我认为这有点混乱,但是正确。所以唯一的问题是奇怪的印刷。我认为这与你缺乏真正的基础案例有关。在你的方法中,距离([],[],0)不会成立。另请注意,代码在运行时如何挂起,等待额外的'。'。返回true后。 – ely 2012-04-16 22:01:05