我正在尝试为斐波那契系列编写一个prolog程序。这段代码进入无限循环。有人能告诉我这是什么错误吗?

问题描述 投票:1回答:2
fib(0,0).   
fib(1,1).  
fib(A,Result):-    
    fib(A-1,R),  
    fib(A-2,P),  
    Result is R+P.
prolog infinite-loop fibonacci failure-slice
2个回答
1
投票

要了解原因,首先要缩小不终止的原因。这是程序中仍然循环的最小部分:

fib(0,0) :- false.
fib(1,1) :- false.
fib(A,Result):-    
    fib(A-1,R), false,
    fib(A-2,P),  
    Result is R+P.

无论参数是什么,这个程序都会循环。因此你的原始程序也将循环。

要解决此问题,您需要更改可见部分中的内容:您需要确保A > 1。以这种方式,程序现在终止。

此外,正如@andsanmar正确指出的那样,单独的A-1不是一个数字,而只是-(A,1)这个术语所以它永远不会是0也不是1。所以要么写

fib(N,0) :- N =:= 0.
fib(N,1) :- N =:= 1.
...

或者按照@andsanmar的建议添加(is)/2

有关如何缩小非终止原因的更多信息,请参阅


0
投票

当你做fib(A-1,R)时,例如A = 4,将要发送的是4-1而不是3,你需要做Aminus1 is A -1, fib(Aminus1,R)。与A-2相同

© www.soinside.com 2019 - 2024. All rights reserved.