Я пытаюсь реализовать рекурсивную версию последовательности Фибоначчи в Prolog. Ниже приведен код:Рекурсивная функция пролога не работает должным образом
fib(0,F) :- F is 0.
fib(1,F) :- F is 1.
fib(N,F) :- N > 1,
AA is (N - 1),
BB is (N - 2),
fib(AA,CC),
fib(BB,DD),
RR is (CC + DD),
F == RR,
F is RR.
Проблема в том, что она не ведет себя так, как я ее логически ожидаю. Когда я использую trace
назвать выдумку (3,2), я получаю следующие строки:
Call: (7) fib(3, 2) ? creep
Call: (8) 3>1 ? creep
Exit: (8) 3>1 ? creep
Call: (8) _G2569 is 3+ -1 ? creep
Exit: (8) 2 is 3+ -1 ? creep
Call: (8) _G2572 is 3+ -2 ? creep
Exit: (8) 1 is 3+ -2 ? creep
Call: (8) fib(2, _G2573) ? creep
Call: (9) 2>1 ? creep
Exit: (9) 2>1 ? creep
Call: (9) _G2575 is 2+ -1 ? creep
Exit: (9) 1 is 2+ -1 ? creep
Call: (9) _G2578 is 2+ -2 ? creep
Exit: (9) 0 is 2+ -2 ? creep
Call: (9) fib(1, _G2579) ? creep
Call: (10) _G2578 is 1 ? creep
Exit: (10) 1 is 1 ? creep
Что привлекает мое внимание, это последний звонок, по телефону: (10), который говорит «? _G2578 является 1», хотя я называю fib (1, _G2579). Я ожидаю, что это будет _G2579, это будет изменено, но это, похоже, не так. Мне нужно выяснить, почему, потому что я очень подозреваю, что именно поэтому fib (3,2) возвращает false вместо true.
Спасибо за предлагаемые изменения! После реализации кода, который вы написали в (3) в моей собственной программе, поведение, которое я изначально ожидал, теперь выполнено. Он возвращает true во всех случаях, где F - это число N-й фибоначчи, и только в этих случаях. –