我刚开始使用ProLog编程并尝试编写Fibonacci系列程序的总和。
我对这个给定的代码有一个问题。
任何人都可以告诉我这将如何工作(执行方法),因为我尝试打印N1,N2值来弄清楚发生了什么,但仍然无法得到它,也无法弄清楚F1和F2如何存储系列之和。
fib(0,0).
fib(1,1).
fib(F,N):-
N > 1,
N1 is N-1,
N2 is N-2,
fib(F1,N1),
fib(F2,N2),
F is F1 + F2.
答案 0 :(得分:2)
0和1的查询非常简单,因为您已将它们定义为事实。如果你要求第0个号码:
?- fib(X,0).
Prolog尝试第一个规则,并成功地将0
与第二个参数匹配。然后X
与0统一。由于X
是一个变量,统一只需要用X
代替0
。这产生了第一个解决方案:
?- fib(X,0).
X = 0 ?
如果您输入;
Prolog搜索更多解决方案:
?- fib(X,0).
X = 0 ?;
第二条规则不匹配,因为1=0
无法统一。所以Prolog尝试第三条规则。规则标题中的N
已成功与0
统一。但是,由于0>1
不成立,规则正文中的第一个目标失败了。所以第三条规则失败了。没有更多的规则需要尝试,所以Prolog得出结论,没有更多的解决方案:
X = 0 ?;
no
第一个数字的查询几乎相同,唯一的区别是第一个规则的第一次失败而第二个规则成功。认为这是一个练习。现在换一个更有趣的案例:
?- fib(X,2).
Prolog尝试前两个规则并失败,因为0=2
和1=2
都不能统一。然后Prolog尝试第三条规则并成功统一N=2
。自2>1
以来第一个目标成功。第二个目标评估N1=1
。第三个目标评估N2=0
。第四个目标以递归方式调用
fib(F1,1)
这取决于fib / 2的第二个规则(见上文),因此取代F1=1
。从递归返回Prolog移动到第五个目标并递归调用
fib(F2,0)
如上所述,这取决于第一条规则,因此取代F2=0
。再次从递归返回Prolog移动到最后一个目标并评估F=1
。这产生了查询的第一个解决方案:
?- fib(X,2).
X = 1 ?
输入;
,您需要进一步的解决方案:
?- fib(X,2).
X = 1 ? ;
所以Prolog回溯到第五个目标,并试图找到它的进一步解决方案,但失败了(见上文)。然后Prolog回溯到第四个目标并试图找到它的进一步解决方案,但失败了。目标三,二和一相同。所以Prolog告诉你,没有进一步的解决方案:
?- fib(X,2).
X = 1 ? ;
no
如果您想了解这一点,请拿一张纸并尝试3和4的查询。您可以使用trace
检查结果,并在评论中建议@lurker。