我正在使用 SWI Prolog,我的作业中使用了以下代码(该代码不是作业,但需要编写课程所需的方法):
nat(0).
nat(s(X)) :-
nat(X).
plus(0,N,N) :-
nat(N).
plus(s(M),N,s(Z)) :-
plus(M,N,Z).
times(0,N,0) :-
nat(N).
times(s(M),N,Z) :-
times(M,N,W),
plus(W,N,Z).
exp(s(M),0,0) :-
nat(M).
exp(0,s(M),s(0)) :-
nat(M).
exp(s(N),X,Z) :-
exp(N,X,Y),
times(X,Y,Z).
exp(a,b,c)
意味着c=b^a
。
它直接从书中复制:“Prolog的艺术:高级编程技术”。
当我运行以下查询时:
exp(s(s(0)),L,s(s(s(s(0))))).
我得到一个答案:
L = s(s(0))
但是当我通过输入要求另一个答案时;
L = s(s(0)) ;
我得到一个无限循环(以堆栈外错误结束),我希望得到错误。
代码中的问题是什么?是否有相同的代码(具有相同的自然数表示)但行为方式与我描述的方式相同?如果是这样,一些指示或建议会很有帮助。
提前致谢。