Prolog-一些基本算术运算的实现
我不熟悉Prolog,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算 我用一元符号表示自然数项,这意味着我有常数0和递归后继函子s[即4=s(s(s(s(0)))]。我实现了与上述符号相关的算术运算 这套规则是: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
% 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))))))).