我整天都在想这个。我终于承认,我对 Prolog 的理解并没有我想象的那么好。
在一天开始的时候,我在实现一个后继算法时遇到了麻烦,它乘以 2 个 s 数,它的结构是这样的:
nat(0).
nat(s(X)):-nat(X).
我的第一次尝试是这样的:
mul(0,_,0).
mul(s(F1),F2,P):-mul(F1,F2,Tmp),add(F2,Tmp,P)
这有效,但查询mul(X,Y,s(0))
以无限循环结束。为什么?我已阅读以下帖子:Prolog 后继符号产生不完整的结果和无限循环
我从中了解到:如果我在调用 add 之前调用 mul,并且我在 mul/3 谓词中有变量,这些变量在两个 mul/3 调用中都没有使用,Prolog 会尝试为它未绑定的变量寻找新的可能性。因此它进入了一个无限循环。
为了解决这个问题,我先调用了add:
mul(0,_,0).
mul(s(F1),F2,P):-add(F2,Tmp,P),mul(F2,F1,Tmp).
做到了。然后我尝试实现幂函数,并想“嗯,现在很容易,第一次尝试是:
pow(_,0,s(0)).
pow(B,s(E),R):-pow(B,E,Tmp), mul(Tmp,B,R).
但是,我必须把 mul 放在第一位,以防止 R 和 Tmp 的左递归。
简单!”男孩,我错了。我不知道如何在不进入无限循环的情况下实现它,即使我把 mul 放在前面。
任何建议都将受到高度赞赏。您可以节省我周六的工作量并提高我的自尊心!先感谢您。
编辑:添加了我缺少的总和谓词:
add(0, Y, Y).
add(s(S1), S2, s(Sum)):- add(S1,S2,Sum).