2

这是我不明白的加号代码

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)会停止递归,但我认为我做错了。

4

3 回答 3

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)。将此解读为“plus如果 P 加 Q 等于 R,则为真”。然后我们看看我们给出的案例:

  1. plus(0,X,X) :- natural_number(X).. 如果 X 是自然数,则读作 X 加 0 得到 X。这是我们的归纳基本情况,也是加法的自然定义。
  2. plus(s(X),Y,s(Z)) :- plus(X,Y,Z).读作“如果将 X 加到 Y 是 Z',则将 X 的后继添加到 Y 会导致后继 Z”。如果我们更改符号,我们可以将其代数读为“X + 1 + Y = Z + 1 如果 X + Y = Z”,这又很自然。

所以,要回答你直接的问题“如果我有plus(s(0),s(s(s(0))),z),我怎么能得到 1+3=4 的答案?”,让我们考虑一下如何在归纳的每个步骤中将一些东西与 z 统一起来

  1. 应用 的第二个定义plus,因为它是唯一与查询统一的定义。plus(s(0),s(s(s(0))), s(z'))如果plus(0, s(s(s(0))), z')对某些人为真,则为真z
  2. 现在应用加号的第一个定义,因为它是唯一统一的定义:plus(0, s(s(s(0))), z')如果z's(s(s(0)))并且s(s(s(0)))是自然数。
  3. 把定义解开natural_number几次s(s(s(0))),看看是不是真的。
  4. 所以整体的说法是正确的,如果s(s(s(0)))是统一的z's(z')是统一的z

所以解释器返回 true,带有z' = s(s(s(0)))and z = s(z'),即z = s(s(s(s(0))))。所以,z是 4。

于 2011-06-12T15:48:02.593 回答
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.
于 2011-06-12T15:46:04.097 回答
1

该代码是Peano 算术中加法的直接实现。

在 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 的表示。

于 2011-06-12T15:51:07.703 回答