任何人都可以帮助我理解此递归序言示例吗?

问题描述

| 这是我不明白的加号
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.
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...