Унарные и двоичные арифметические c операции в Прологе - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь выполнить унарные и двоичные арифметические операции 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).
...