fib(0,0).
fib(1,1).
fib(A,Result):-
fib(A-1,R),
fib(A-2,P),
Result is R+P.
要了解原因,首先要缩小不终止的原因。这是程序中仍然循环的最小部分:
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
。
有关如何缩小非终止原因的更多信息,请参阅failure-slice。
当你做fib(A-1,R)
时,例如A = 4,将要发送的是4-1而不是3,你需要做Aminus1 is A -1, fib(Aminus1,R)
。与A-2相同