Prolog 对于两个以上的输入,如何使用后续函数?

Prolog 对于两个以上的输入,如何使用后续函数?,prolog,successor-arithmetics,Prolog,Successor Arithmetics,这是两个输入的加法代码(例如,如果X+1+Y的结果为Z+1,我们希望结果为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)))))) 先谢谢你 pl(A, B, C, Sum) :- pl(A, B, Tmp), pl(Tmp, C, Sum). 或者,如果您想添加自然数列表,您当然可以将其折叠: pl([], 0). pl(

这是两个输入的加法代码(例如,如果X+1+Y的结果为Z+1,我们希望结果为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))))))
先谢谢你

pl(A, B, C, Sum) :-
    pl(A, B, Tmp),
    pl(Tmp, C, Sum).
或者,如果您想添加自然数列表,您当然可以将其折叠:

pl([], 0).
pl([N|Ns], Sum) :-
    foldl(pl, Ns, N, Sum).
甚至(根据Capelical的建议):


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

将第一个添加到第二个,然后将结果添加到第三个?有关终止原因的一般方法,请参阅。如果更短,更好
pl(Ns,Sum):-foldl(pl,Ns,0,Sum)。
pl/4
的终止性非常差:@false后续符号算术的终止性已经在这里的许多问答中讨论过了。@false PS:正如我在回答中所写的,我想在实际程序中有一些后续符号自然数的有效用法,但就其本身而言,这是一种相当愚蠢的算术方法:-/我想我的回答太懒了(投票很好地反映了这一点)。@Boris:这个特定的定义从未被讨论过w.r.t.终止。
pl([], 0).
pl([N|Ns], Sum) :-
    foldl(pl, Ns, N, Sum).
pl(Ns, Sum) :- foldl(pl, Ns, 0, Sum).