问题描述
|
这是我不明白的加号
plus(0,X,X):-natural_number(X).
plus(s(X),Y,s(Z)) :- plus(X,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)
将停止递归,但我认为我做错了。
解决方法
因此,让我们从ѭ5开始。将此读为“ P是自然数”。我们得到
natural_number(0).
,这告诉我们0
始终是自然数(即,没有任何条件必须成为事实)。 natural_number(s(X)) :- natural_number(X).
告诉我们if9ѭ是自然数,if10ѭ是自然数。这是自然数的一般归纳定义,但是当我们读Prolog \“ Q:= P \”时写为\“ backwards \”,因为\“如果P为真,则Q为真”。
现在我们来看看plus(P,Q,R)
。将其读为\“plus
为真,如果P加Q等于R \”。然后,我们查看给出的情况:
plus(0,X,X) :- natural_number(X).
。读取为如果X是自然数,则将0加到X会得到X。这是我们的归纳基本情况,是加法的自然定义。
plus(s(X),Y,s(Z)) :- plus(X,Z).
读为\“如果将X添加到Y,则将X的后继者添加到Y会导致后继者Z。'如果X + Y = Z \“,这又很自然。
因此,为回答您的直接问题“如果我有plus(s(0),s(s(s(0))),z)
,我如何获得1 + 3 = 4的答案?”,让我们考虑如何在归纳的每一步中将z统一起来
应用ѭ12的第二个定义,因为它是唯一与查询统一的定义。如果对于某些z
来说plus(0,z\')
则17ѭ成立
现在应用plus的第一个定义,因为它是唯一的统一定义:如果z\'
是s(s(s(0)))
且s(s(s(0)))
是自然数,则是plus(0,z\')
。
在s(s(s(0)))
上解开natural_number
的定义几次,以确认是正确的。
因此,如果s(s(s(0)))
与ѭ21统一,而s(z\')
与ѭ19统一,则总体说法是正确的。
因此,解释器返回true,其中包含z\' = s(s(s(0)))
和z = s(z\')
,即z = s(s(s(s(0))))
。所以ѭ194.是4。
, 该代码是Peano算术中加法的直接实现。
在Peano算术中,自然数使用常量0
和一元函数s
表示。所以s(0)
是1的表示,s(s(s(0)))
是3的表示。And2ѭ将给您Z = s(s(s(s(0))))
,它是4的表示。
, 您将不会得到像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.