Я пытаюсь написать прологическую программу для серии fibbonaci. Этот код идет по бесконечному циклу. Может кто-нибудь сказать, в чем ошибка? - PullRequest
1 голос
/ 06 марта 2019
fib(0,0).   
fib(1,1).  
fib(A,Result):-    
    fib(A-1,R),  
    fib(A-2,P),  
    Result is R+P.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Чтобы понять почему, сначала сузьте причину не прекращения.Вот самая маленькая часть вашей программы, которая все еще выполняет цикл:

<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.

Подробнее о том, как сузить причины отсутствия завершения, см. .

0 голосов
/ 06 марта 2019

Когда вы делаете fib(A-1,R), например, A = 4, то, что будет отправлено, будет 4-1 вместо 3, вам нужно будет сделать Aminus1 is A -1, fib(Aminus1,R). То же самое с A-2

...