这是我不理解的加号
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)
将停止递归,但我认为我做错了。
答案 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
为真”。然后我们看看我们给出的案例:
plus(0,X,X) :- natural_number(X).
。如果X是自然数,则读为添加0到X会产生X.这是我们的归纳基础案例,是添加的自然定义。plus(s(X),Y,s(Z)) :- plus(X,Y,Z).
读为“如果将X添加到Y是Y,则将X的后继添加到Y会产生后继Z。如果我们更改符号,我们可以将其代数读成”X + 1 + Y如果X + Y = Z“,则= Z + 1,这是非常自然的。所以,直接回答你问题“如果我有plus(s(0),s(s(s(0))),z)
,我怎样才能得到1 + 3 = 4的答案?”,让我们考虑如何在z的每一步中统一z的东西< / p>
plus
的第二个定义,因为它是唯一与查询统一的定义。如果某些plus(s(0),s(s(s(0))), s(z'))
plus(0, s(s(s(0))), z')
为真,则z
为真
plus(0, s(s(s(0))), z')
如果z'
是s(s(s(0)))
且s(s(s(0)))
是自然数。natural_number
上多次展开s(s(s(0)))
的定义,看看是否属实。s(s(s(0)))
与z'
统一且s(z')
与z
统一,则整体陈述为真。因此解释器返回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。