我正在尝试用Prolog实现Fibonacci序列的递归版本。代码如下:
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)时,我得到以下代码行:
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。
发布于 2016-09-15 01:07:22
如果我没记错的话,问题在于
F == R检查F (一个新引入的没有值的术语)是否等于R。
如果将其更改为
F = R因此,将F与R (在F is R之后是冗余的)统一起来,您的fib/2应该可以工作。
但我建议你做个比喻。
(1)终止大小写fib(0,F) :- F is 0.很好,但您可以将其编写为
fib(0,0).(2)另一种情况的语义相同:您可以将其写为
fib(1,1).(3)在一般子句中,您不需要具有相同(统一)值的两个不同变量F和RR;您可以按以下方式仅使用F
fib(N,F) :-
N > 1,
AA is (N - 1),
BB is (N - 2),
fib(AA,CC),
fib(BB,DD),
F is (CC + DD).https://stackoverflow.com/questions/39495782
复制相似问题