ProLog程序执行中Fibonacci系列的总和

时间:2017-04-28 15:05:53

标签: recursion prolog fibonacci

我刚开始使用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.

1 个答案:

答案 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=21=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。