У меня есть задание для определения базовой арифметики как приращений нуля (т. Е. add(inc(inc(inc(zero))),inc(inc(zero)),Z)
дает Z = inc(inc(inc(inc(inc(zero)))))
).
add реализован как
add(zero, Y, Z) :- Z = Y.
add(inc(X), Y, Z) :- add(X, Y, V), Z = inc(V).
и я пытаюсь реализовать мул как
mul(zero, Y, Z) :- Z = zero.
mul(inc(zero), Y, Z) :- Z = Y.
mul(inc(X), Y, Z) :- mul(X,Y,V), Z = add(Y,Y,Z).
но это трактует add(Y,Y,Z)
как определение структуры вместо предиката add и просто возвращает что-то вроде add(add(inc(inc(zero)), inc(zero)), add(inc(zero),(inc(zero)))
Кто-нибудь знает, как заставить его рассматривать добавить как предикат?