J'essaye d'implémenter la version récursive de la séquence de Fibonacci dans Prolog. Voici le code:La fonction récursive de Prolog ne se comporte pas comme prévu
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.
Le problème est qu'il ne se comporte pas comme je m'y attendais logiquement. Lorsque j'utilise trace
appeler fib (3,2), je reçois les lignes suivantes:
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
Ce qui retient mon attention est le dernier appel, composez le: (10), qui dit "? _G2578 est 1", même si j'appelle fib (1, _G2579). Mon attente est que c'est _G2579 qui va être changé, mais cela ne semble pas être le cas. J'ai besoin de savoir pourquoi parce que je soupçonne fortement que c'est pourquoi fib (3,2) retourne faux au lieu de vrai.
Merci pour les changements suggérés! Après avoir implémenté le code que vous avez écrit dans (3) dans mon propre programme, le comportement auquel je m'attendais initialement a maintenant été rempli. Il retourne vrai dans tous les cas où F est exactement le Nième numéro de fibonacci, et seulement dans ces cas. –