Чтобы понять почему, сначала сузьте причину не прекращения.Вот самая маленькая часть вашей программы, которая все еще выполняет цикл:
<s>fib(0,0) :- <b>false</b></s>.
<s>fib(1,1) :- <b>false</b></s>.
fib(A,Result):-
fib(A-1,R), <b>false</b>,
<s>fib(A-2,P)</s>,
<s>Result is R+P</s>.
Независимо от аргументов, эта программа будет выполнять цикл.И поэтому ваша оригинальная программа тоже будет зацикливаться.
Чтобы исправить это, вам нужно изменить что-то в видимой части: вам нужно убедиться, что A > 1
.Таким образом, программа теперь завершает свою работу.
Далее, как правильно заметил @andsanmar, A-1
сам по себе не число, а просто термин -(A,1)
, поэтому он никогда не может быть 0
или * 1012.*.Так что либо напишите
fib(N,0) :- N =:= 0.
fib(N,1) :- N =:= 1.
...
, либо добавьте (is)/2
, как предложено @ andsanmar.
Подробнее о том, как сузить причины отсутствия завершения, см. fail-slice .