使用 s(0) 和 p(0) 的 Prolog 递归

问题描述 投票:0回答:1

我有下面的代码来添加 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).
recursion prolog
1个回答
0
投票

不用太担心,我实际上找到了解决方案。

我将基本情况更改为这三个:

simple(0, 0).
simple(p(s(X)), X).
simple(s(p(X)), X).

看起来有效

© www.soinside.com 2019 - 2024. All rights reserved.