Prolog:脚本不会停止

时间:2014-02-06 19:11:16

标签: prolog


我正在努力学习prolog。我希望你能帮忙..

我有三条规则:
反向 - 检索列表的反向
startswith - 检查第二个列表是否是第一个列表的前缀
后缀 - 检查第一个列表是否是第二个列表的后缀

reverse([H|T], Y) :- append(Z, [H], Y), reverse(T, Z).
reverse([], Y) :- Y = [].

startswith(_, []).
startswith([Xh|Xt], [Yh|Yt]) :- Xh=Yh, startswith(Xt, Yt).

suffix(X, Y) :- reverse(X, XR), reverse(Y, YR), startswith(YR,XR).
反向和开始似乎按照他们应该的方式工作。
但后缀不会停止计算。我不明白为什么?

1 个答案:

答案 0 :(得分:0)

一般来说,将尚未统一的变量传递给您将在以后统一的谓词是一个坏主意。从本质上讲,append(Z,[H],Y)正在突然变成prolog永远不会落地,因为它会根据你Prolog附加的版本一遍又一遍地统一Z

更改

reverse([H|T], Y) :- append(Z, [H], Y), reverse(T, Z).

reverse([H|T], Y) :- reverse(T, Z), append(Z, [H], Y).

这样你就可以在将Z传递给append

之前统一Z.