【发布时间】:2016-03-19 13:45:36
【问题描述】:
我是 Prolog 的新手,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算。
我用一元表示法表示自然数 Term,这意味着我有常数 0,以及递归后继函子 s [即4 = s(s(s(s(0))))]。关于上述符号,我实现了算术运算。
规则集是:
% nat(N)/1 ---> N is a natural number
nat(0).
nat(s(X)) :-
nat(X).
% add(X,Y,Z)/3 ---> Z = X + Y
add(X,0,X) :-
nat(X).
add(X,s(Y),s(Z)) :-
add(X,Y,Z).
% mult(X,Y,Z)/3 ---> Z = X * Y
mult(0,X,0) :-
nat(X).
mult(s(X),Y,Z) :-
mult(X,Y,XY),
add(XY,Y,Z).
现在,当我查询时:
?- mult(s(s(0)), s(s(s(0))), RES).
一切正常:
RES = s(s(s(s(s(s(0))))))。
当我查询时:(喜欢问 6/3=?)
?- mult(X, s(s(s(0))), s(s(s(s(s(s(0))))))).
我陷入了无限循环并得到了 S.O.
即使我在 mult 谓词中更改递归调用的顺序也无济于事:
mult(s(X),Y,Z) :-
add(XY,Y,Z),
mult(X,Y,XY).
我在 linux 机器上运行 swi-prolog。
非常感谢您的建议!
【问题讨论】:
标签: prolog successor-arithmetics non-termination