Programme pour générer la suite de fibonacci dans GNU Prolog est de donner une instanciation d'erreur
C'est mon code:-
fib(0,0).
fib(1,1).
fib(F,N) :-
N>1,
N1 is N-1,
N2 is N-2,
F is F1+F2,
fib(F1,N1),
fib(F2,N2),
write(F," ,").
Sur la consultation de GNU Prolog, j'obtiens:
| ?- consult('C:/GNU-Prolog/bin/fib.pl').
compiling C:/GNU-Prolog/bin/fib.pl for byte code...
C:/GNU-Prolog/bin/fib.pl compiled, 3 lines read - 1253 bytes written, 15 ms
yes
| ?- fib(F,2).
uncaught exception: error(instantiation_error,(is)/2)
OriginalL'auteur user3341381 | 2014-04-01
Vous devez vous connecter pour publier un commentaire.
Instanciation d'erreur est provoqué par la tentative de calculer
F
avant les valeurs deF1
etF2
ont été déterminés. La solution la plus simple serait de déplacerF is F1+F2
après les appels récursifs à ce que votre programme devient(merci à @mbratch le rappeler)
write
a un seul argument, c'est à dire,write(F," ,").
devrait êtrewrite(F), write(" ,").
Vous devriez cependant être prudent avec la sortie. Le programme ci-dessus serait d'imprimer la même valeur à plusieurs reprises: par exemple, pour calculer
fib(F,3)
il appellerafib(F1,2)
etfib(F2,1)
toutfib(F1,2)
invoquerafib(F11,1)
etfib(F12,1)
résultant dans la sortie suivante1, 1, 2, 1, 3
. Est-ce vraiment ce dont vous avez besoin?Merci pour les précieuses informations.Suppose que c'était ce qui était la cause de l'erreur. Et pour ajouter à la réponse, de l'ordre de la définition de l'argument. Donc, la définition de "N2 N-2" devrait venir juste avant "fib(F2,N2)". Cela dit, est-il possible d'obtenir de la série en un seul aller dans GNU Prolog?
quel type de sortie avez-vous besoin?
?-fib(F,5) pour, par exemple, doit retourner F=11235 ou encore F=01123 ou tout simplement afficher la suite de fibonacci, sans affecter les valeurs de F comme- ?-fib(F,5) 11235 @Alexandre
OriginalL'auteur Alexander Serebrenik
Vous avez probablement besoin de
F is F1+F2
après avoir instanciéF1
etF2
. La suite est exacte adaptation de votre code à quelque chose qui fonctionne. Maintenant, je suis sûr que c'est exactement ce que vous voulez (d'ailleurs, il ne parvient pas pour de grandes valeurs de N, le grand être impressionnante petite ici).J'ai utilisé
format
au lieu dewrite
, je ne suis pas sûr quewrite/2
est-ce que vous attendez.dans le Prologue, en se référant à un prédicat, vous donnez le nom et l'arité (nombre de accepté les arguments).
write/2
signifie lawrite
prédicat à deux arguments.write/1
etwrite/2
sont simples à écrire des prédicats avec aucun contrôle sur le format.format/2
vous permet de contrôler le format de ce que vous écrivez. Consultez le manuel en ligne pour plus de détails.- Je l'obtenir..Merci! 🙂 Le manuel en ligne est difficile à comprendre .
OriginalL'auteur gniourf_gniourf
OriginalL'auteur kirubel markos
domaines
prédicats
clauses
exemple de sortie
Objectif: aller
Entrez le numéro de
10
1 , 1, 2, 3, 5, 8, 13, 21, 34, 45, 55,Oui
OriginalL'auteur h4k3r