我正在尝试在 Prolog 中进行一元和二元算术运算。
一元数定义为bot=0
和s(X)=x+1
,例如3是s(s(s(bot)))
。
二进制数表示为一系列Z
s 和O
s,当Z
数字0和O
数字1从最低有效位到最高有效位时。例如4是z(z(o(bot)))
.
当我使用形式的谓词power(z(o(bot),z(o(bot)),Result).
但是当我尝试类似power(X,z(o(bot)),z(o(o(bot))) ).
它崩溃的东西时,一切都很好。
suc(bot,o(bot)).
suc(o(X),z(Res)):-suc(X,Res).
suc(z(X),o(Res)):-X=Res.
add(bot,X,X).
add(s(X),Y,Res):-add(X,s(Y),Res).
add(X,Y,Res):-suc(A,X),
suc(Y,B),
add(A,B,Res).
multiply(bot,_,bot).
multiply(_,bot,bot).
multiply(X,Y,Res):-suc(A,X),
multiply(A,Y,NewRes),
add(Y,NewRes,Res).
multiply(s(X),Y,Res):-multiply(X,Y,NewRes),
add(Y,NewRes,Res).
power(_,bot,s(bot)).
power(X,o(bot),X).
power(X,s(Y),Res):-power(X,Y,NewRes),
multiply(X,NewRes,Res).
power(X,Y,Res):-suc(A,Y),
power(X,A,NewRes),
multiply(X,NewRes,Res).