首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog递归函数的行为与预期不符

Prolog递归函数的行为与预期不符
EN

Stack Overflow用户
提问于 2016-09-15 00:48:12
回答 1查看 63关注 0票数 0

我正在尝试用Prolog实现Fibonacci序列的递归版本。代码如下:

代码语言:javascript
复制
fib(0,F) :- F is 0.
fib(1,F) :- F is 1.
fib(N,F) :- N > 1,
AA is (N - 1),
BB is (N - 2),
fib(AA,CC),
fib(BB,DD),
RR is (CC + DD),
F == RR,
F is RR.

问题是,它的行为并不像我逻辑上期望的那样。当我使用trace调用fib(3,2)时,我得到以下代码行:

代码语言:javascript
复制
   Call: (7) fib(3, 2) ? creep
   Call: (8) 3>1 ? creep
   Exit: (8) 3>1 ? creep
   Call: (8) _G2569 is 3+ -1 ? creep
   Exit: (8) 2 is 3+ -1 ? creep
   Call: (8) _G2572 is 3+ -2 ? creep
   Exit: (8) 1 is 3+ -2 ? creep
   Call: (8) fib(2, _G2573) ? creep
   Call: (9) 2>1 ? creep
   Exit: (9) 2>1 ? creep
   Call: (9) _G2575 is 2+ -1 ? creep
   Exit: (9) 1 is 2+ -1 ? creep
   Call: (9) _G2578 is 2+ -2 ? creep
   Exit: (9) 0 is 2+ -2 ? creep
   Call: (9) fib(1, _G2579) ? creep
   Call: (10) _G2578 is 1 ? creep
   Exit: (10) 1 is 1 ? creep

吸引我注意的是最后一个调用call:(10),它显示“fib is 1 ?",尽管我调用的是_G2578(1,_G2579)。我的期望是_G2579会被改变,但事实似乎并非如此。我需要找出原因,因为我高度怀疑这就是为什么fib(3,2)返回false而不是true。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 01:07:22

如果我没记错的话,问题在于

代码语言:javascript
复制
F == R

检查F (一个新引入的没有值的术语)是否等于R

如果将其更改为

代码语言:javascript
复制
F = R

因此,将FR (在F is R之后是冗余的)统一起来,您的fib/2应该可以工作。

但我建议你做个比喻。

(1)终止大小写fib(0,F) :- F is 0.很好,但您可以将其编写为

代码语言:javascript
复制
fib(0,0).

(2)另一种情况的语义相同:您可以将其写为

代码语言:javascript
复制
fib(1,1).

(3)在一般子句中,您不需要具有相同(统一)值的两个不同变量FRR;您可以按以下方式仅使用F

代码语言:javascript
复制
fib(N,F) :-
  N > 1,
  AA is (N - 1),
  BB is (N - 2),
  fib(AA,CC),
  fib(BB,DD),
  F is (CC + DD).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39495782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档