【发布时间】:2012-04-16 20:44:06
【问题描述】:
我对 Prolog 完全陌生,正在做家庭作业。我的程序应该采用两个长度相等的列表,并执行 D = sqrt((X1-Y1)^2 + (X2-Y2)^2 + ... + (XN-YN)^2)。我已经编写了代码来获得正确的答案,但它没有正确呈现它。我认为这可能是逻辑流程的问题,因为它似乎以无限循环结束。它应该看起来像:
?- 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);这行感到困惑,您能对此发表评论吗? -
N/M,我明白你现在在做什么......在最后一个参数中累积距离的总和。我认为这有点令人困惑,但正确。所以唯一的问题是奇怪的印刷。我认为这与您缺乏真正的基本案例有关。在您的方法中, distance([],[],0) 不会是真的。另请注意您的代码在运行时如何挂起,等待额外的“。”返回 true 后。