任何人都可以帮助我理解这个递归序言的例子吗?

时间:2011-06-12 15:33:21

标签: prolog successor-arithmetics

这是我不理解的加号

plus(0,X,X):-natural_number(X).
plus(s(X),Y,s(Z)) :- plus(X,Y,Z).
给予

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

我不明白这种递归。如果我有plus(s(0),s(s(s(0))),Z),我怎样才能得到1+3=4的答案?

我需要对第一个代码进行一些解释。我尝试plus(0,X,X)将停止递归,但我认为我做错了。

3 个答案:

答案 0 :(得分:4)

所以,让我们从natural_number(P)开始吧。将其读作“P是自然数”。我们得到了natural_number(0).,它告诉我们0总是一个自然数(即没有必须满足的条件才能成为事实)。 natural_number(s(X)) :- natural_number(X).告诉我们s(X)是自然数,如果X是自然数。这是自然数的正常归纳定义,但是当我们将Prolog“Q:= P”读作“如果P为真,则Q为真”时写成“向后”。

现在我们可以看一下plus(P, Q, R)。如果P加Q等于R,则“plus为真”。然后我们看看我们给出的案例:

  1. plus(0,X,X) :- natural_number(X).。如果X是自然数,则读为添加0到X会产生X.这是我们的归纳基础案例,是添加的自然定义。
  2. plus(s(X),Y,s(Z)) :- plus(X,Y,Z).读为“如果将X添加到Y是Y,则将X的后继添加到Y会产生后继Z。如果我们更改符号,我们可以将其代数读成”X + 1 + Y如果X + Y = Z“,则= Z + 1,这是非常自然的。
  3. 所以,直接回答你问题“如果我有plus(s(0),s(s(s(0))),z),我怎样才能得到1 + 3 = 4的答案?”,让我们考虑如何在z的每一步中统一z的东西< / p>

    1. 应用plus的第二个定义,因为它是唯一与查询统一的定义。如果某些plus(s(0),s(s(s(0))), s(z'))
    2. plus(0, s(s(s(0))), z')为真,则z为真
    3. 现在应用plus的第一个定义,因为它是唯一的统一定义:plus(0, s(s(s(0))), z')如果z's(s(s(0)))s(s(s(0)))是自然数。
    4. natural_number上多次展开s(s(s(0)))的定义,看看是否属实。
    5. 因此,如果s(s(s(0)))z'统一且s(z')z统一,则整体陈述为真。
    6. 因此解释器返回true,z' = s(s(s(0)))z = s(z'),即z = s(s(s(s(0))))。所以,z是4。

答案 1 :(得分:1)

你不会得到像1+3=4这样的数字术语,你得到的是术语s/1,它可以嵌入任何深度,因此可以代表任何自然数。您可以组合这些术语(使用plus/3),从而实现求和。

请注意,您对plus/3的定义与SWI-Prolog的内置plus/3(整数而不是s/1条款无关):

?- help(plus).
plus(?Int1, ?Int2, ?Int3)
    True if Int3 = Int1 + Int2.
    At least two of the three arguments must be instantiated to integers.

答案 2 :(得分:1)

该代码是addition in Peano arithmetic的直接实现。

在Peano算术中,使用常量0和一元函数s表示自然数。因此s(0)表示为1,s(s(s(0)))表示为3. plus(s(0),s(s(s(0))),Z)将为您提供Z = s(s(s(s(0)))),表示为4。