Prolog 序言:脚本不';别停下

Prolog 序言:脚本不';别停下,prolog,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,


我目前正在努力学习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).
反转和开始使用似乎按其应有的方式工作

但后缀并没有停止计算。我不明白为什么?

一般来说,将尚未统一的变量传递给稍后将统一的谓词是个坏主意。本质上,
append(Z[H],Y)
正在螺旋式地进入prolog never-land,因为它在prolog的append版本的基础上一次又一次地统一了
Z

改变

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


因此,在将Z传递给
append

之前,统一Z,现在它以错误结束:超出全局范围stack@gunt您的原始代码还是我建议的代码?超出全局堆栈意味着它已达到堆栈限制并溢出。(递归调用太多)对不起,我用你的代码重试了,现在可以了!以前引入了一个新问题;)非常感谢。
reverse([H|T], Y) :- reverse(T, Z), append(Z, [H], Y).