Я пытаюсь выполнить унарные и двоичные арифметические операции c в прологе.
унарные числа определены как bot=0
и s(X)=x+1
, например 3 равно s(s(s(bot)))
.
двоичные числа представляются в виде последовательности Z
с и O
с, когда Z
представляет собой ди git ноль и O
ди git один переход от младшего значащего бита к старшему значащему. например, 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).