【问题标题】:How can I use successor function in addition for more two input?除了两个输入之外,我如何使用后继功能?
【发布时间】:2016-09-28 12:37:44
【问题描述】:

这是两个输入的加法代码(就像我们想要 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))))))

提前谢谢你。

【问题讨论】:

  • 将第一个添加到第二个,然后将结果添加到第三个?
  • 请参阅this answer 了解终止原因的一般方法。

标签: prolog successor-arithmetics


【解决方案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 所示。

【讨论】:

  • 如果更短更好? pl(Ns, Sum) :- foldl(pl, Ns, 0, Sum).
  • @false 后继符号算术的终止已在 SO 上的 许多 问题和答案中进行了讨论。
  • @false PS:正如我在回答中所写,我想在实际程序中后继符号自然数有一些有效的用法,但就其本身而言,这是一种非常愚蠢的算术方法: -/ 我想我的回答太懒了(投票很好地反映了这一点)。
  • @Boris:这个特定的定义从未被讨论过。终止。
猜你喜欢
  • 2019-05-05
  • 2020-12-11
  • 1970-01-01
  • 2019-08-22
  • 2023-01-24
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多