1

这是两个输入的加法代码(就像我们想要 Z 中的结果,如果 X+1 加 Y 有 Z+1 的结果)。

    natural_number(0).
    natural_number(s(X)) :- natural_number(X).

    pl(0,X,X) :- natural_number(X).
    pl(s(X),Y,s(Z)) :- pl(X,Y,Z).

但我想知道我们可以将类似的代码用于 3 个组件,例如

    pl(s(0),s(s(0)),s(s(s(0))),W) 
    and got a result W = s(s(s(s(s(s(0))))))

先感谢您。

4

1 回答 1

1
pl(A, B, C, Sum) :-
    pl(A, B, Tmp),
    pl(Tmp, C, Sum).

或者,如果你想添加一个自然数列表,你当然可以对其进行折叠:

pl([], 0).
pl([N|Ns], Sum) :-
    foldl(pl, Ns, N, Sum).

甚至(在 CapelliC 的建议之后):

pl(Ns, Sum) :- foldl(pl, Ns, 0, Sum).

PS:使用后继符号并不总是一个坏主意。它的至少一个有效用途是使用它来跟踪队列的长度,如this answer所示。

于 2016-09-28T12:46:18.440 回答