SWI-Prolog的递归

2025-05-08 17:53:31

递归是Prolog中最主要而又最难于掌握的概念之一,Prolog是一门声明式编程语言,当你处理事物集合时,如列表或树,你会经常使用递归而不是迭代。此外,由于我们经常需要控制回溯的程度,我们最好需要了解一下截断这个概念(在我的另一篇经验会提到它)。

SWI-Prolog的递归

2、我们可以测试一下这个规则:我们首先询问命题ancestor(john_boy_sr, john_boy_jr).和ancestor(zeb, john_boy_jr).是否为真,接着给出变量Who,分别寻找zeb的后代和john_boy_jr的祖先。我们已经可以在知识库中使用这个规则实现两个目的:寻找祖先和后代。

SWI-Prolog的递归

2、在数学的定义上,0的阶乘等于1。因此,阶乘的完整定义如下:0! = 1(停止条件)n! = n x (n - 1)!(递归定义)转换成Prolog程序如下图所示:

SWI-Prolog的递归

趁热打铁——斐波那契数列

1、数学的斐波那契数列是一个正整数数列,它与黄金比例有着密切的联系。该数列的下一个数是由其前面两个数相加得到的,头两个数均为1。该数列如下:1,1,2,3,5,8,13,21,34,55,……通式为:f(1) = 1 (两个停止条件)f(2) = 1f(n) = f(n-1) + f(n-2) (递归规则)

SWI-Prolog的递归

3、运行后的结果如下图所示。从截图可以看出,这些递归的程序还存在一些问题,比如在已经得出结果后,如果按“;”键试图查找另一个解时,会出现错误的答案,甚至开始报错。因为如果查找另一个结果,会重新进入递归条件,会再次减去数字,因而会报错。我将会在下次介绍Prolog的另一个机制——截断。

SWI-Prolog的递归
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢