假设我们有以下谓词(这是来自Prolog 编程 http://www.springer.com/computer/swe/book/978-3-540-00678-7):
[F0] isInteger(0).
[F1] isInteger(X):- isInteger(Y), X is Y+1.
查询第一个结果为Integer(R),标记放在F0处,会返回R=0
如果用户按 ; ,标记放置在F1处,我们移动到子目标(isInteger(Y),满足F0)并且R=1。
以上我都明白了。现在我的问题是:
- 如果用户按 ;再说一遍,标记在哪里?搜索如何继续返回 R=2?我试图理解这本书第78-79页中的图像,但我不清楚。我发现的在线教程不处理存在递归的回溯。
我正在寻找任何解释存在递归时回溯的教程,希望其中的堆栈内容图像可以帮助我理解。
先感谢您
苏珊娜
通过使用图像来理解回溯和递归适用于非常小的示例,但它不能扩展到更大的程序。此外,通过逐步执行程序,您很容易错过最有趣的属性。幸运的是,还有比这更好的想法。让我们以你的例子为例isInteger/1
.
解决方案/答案集
您的主要兴趣是确保您描述的是正确的事情。这里,第二条规则最有趣。按箭头方向读取:-
。即从右到左:提供Y
是一个整数,并且X is Y+1
然后还有X
是一个整数。
然后,您可以估计在这种情况下无限的解集。
终止属性
下一个问题涉及谓词的终止属性。请注意,事实上它不能must not– 如果必须产生无限多个答案,则终止。另一方面,地面查询如isInteger(1)
要么有一个解决方案,要么没有解决方案。因此,对于这种情况,谓词最好终止。但是,您的定义并没有就此结束!
故障切片
为了更好地理解这一点,我将使用故障切片 https://stackoverflow.com/questions/tagged/failure-slice。也就是说,我将插入目标false
到你的程序中。如果生成的程序片段没有终止,则原始程序片段也不会终止。
?- isInteger(1), false
isInteger(0) :- false.
isInteger(X) :-
isInteger(Y), false,
X is Y+1.
只有极少部分负责不终止!剩下的部分连价值都不看X
根本不。因此你的程序终止never。不管你怎么称呼它。
See 故障切片 /questions/tagged/failure-slice了解更多示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)