Prolog-一些基本算术运算的实现

Prolog-一些基本算术运算的实现,prolog,successor-arithmetics,non-termination,Prolog,Successor Arithmetics,Non Termination,我不熟悉Prolog,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算 我用一元符号表示自然数项,这意味着我有常数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

我不熟悉Prolog,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算

我用一元符号表示自然数项,这意味着我有常数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(0)щщщ)))

当我提问时:(想问6/3=?)

我陷入了一个无限循环,得到了S.O

即使我在mult谓词中更改递归调用的顺序,也无济于事:

mult(s(X),Y,Z) :-
    add(XY,Y,Z),
    mult(X,Y,XY).
我在linux机器上运行swi prolog

谢谢你的建议

好的,有一个快速修复(错误的递归):

然后是骡子:

mult(s(X),Y,Z) :-
   add(XY,Y,Z),
   mult(X,Y,XY).
将给出期望的结果

然而,对于查询:

?- mult(X,Y,s(s(s(s(s(s(0))))))).
它将输出对应于:X*Y=s(s(s(s(s(s(s(0))的))的所有X,Y对,在最后一对之后,将进入无限循环,原因我不知道

mult(s(X),Y,Z) :-
   add(XY,Y,Z),
   mult(X,Y,XY).
?- mult(X,Y,s(s(s(s(s(s(0))))))).