我有下面的代码来添加 s(0) (代表 0 的后继者)和 p(0) (代表 0 的前任者)。但是,当我运行下面列出的查询时,输出为 Z = p(s(s(s(s(0)))),而它应该只是 Z = s(s(s(0))) 作为 p( 0) 可以被 1 s(0) 抵消。我不确定为什么递归不能正常工作,任何帮助将不胜感激。
?- add3(p(0)+s(s(0)),s(s(0)),Z).
这是知识库的代码:
% Original add
add(0,X,X).
add(s(X),Y,s(Z)) :- add(X,Y,Z).
add(p(X), Y, p(Z)) :- add(X,Y,Z).
% Base case when 0 cannot be broken down further
simple(0,0).
simple(p(s(0)), 0).
simple(s(p(0)), 0).
% Change to make to simplify expression
simple(s(X),s(Y)) :-
simple(X,Y).
simple(p(X), p(Y)) :-
simple(X, Y).
% Case if X+Y
simple(X+Y,Z) :-
simple(X,XS),
simple(Y,YS),
add(XS,YS,Z).
% add3
add3(A,B,C) :-
simple(A,RA),
simple(B,RB),
add(RA,RB,C).
不用太担心,我实际上找到了解决方案。
我将基本情况更改为这三个:
simple(0, 0).
simple(p(s(X)), X).
simple(s(p(X)), X).
看起来有效