我正在尝试为 fibonacci series.This 代码编写一个 prolog 程序,代码进入无限循环。有人能告诉我错误是什么吗?
I am trying to write a prolog program for fibbonaci series.This code is going in infinite loop .Can someone tell what's the error?
fib(0,0).
fib(1,1).
fib(A,Result):-
fib(A-1,R),
fib(A-2,P),
Result is R+P.
当你做fib(A-1,R)
时,比如A=4,发送的是4-1而不是3,你需要做Aminus1 is A -1, fib(Aminus1,R)
。同A-2
要了解原因,首先缩小未终止的原因。这是程序中仍在循环的最小部分:
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(0,0).
fib(1,1).
fib(A,Result):-
fib(A-1,R),
fib(A-2,P),
Result is R+P.
当你做fib(A-1,R)
时,比如A=4,发送的是4-1而不是3,你需要做Aminus1 is A -1, fib(Aminus1,R)
。同A-2
要了解原因,首先缩小未终止的原因。这是程序中仍在循环的最小部分:
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。