2011-05-10 3 views
4

Je commence à utiliser Prolog, et déjà j'ai rencontré problème avec un exemple simple en apparence. Voici mon fichier .pl:Undefined Procédure dans SWI-Prolog ne fonctionne pas

hacker(P) :- mountaindew(P), doesntsleep(P). 
hacker(P) :- writesgoodcode(P). 
writesgoodcode(jeff). 

Puis, après que je charge le programme dans swipl, je le tester avec cette ligne à l'invite

writesgoodcode(jeff). 

Je pensais que ce serait afficher vrai, mais je reçois cette erreur:

?- hacker(jeff). 
ERROR: hacker/1: Undefined procedure: mountaindew/1 
    Exception: (7) hacker(jeff) ? 

ce programme fonctionne très bien, mais cela ne résout pas mes problèmes:

hacker(P) :- writesgoodcode(P). 
writesgoodcode(jeff). 

$ swipl -s dumb.pl 
% dumb.pl compiled 0.00 sec, 1,112 bytes 

?- hacker(jeff). 
true. 

Quelqu'un peut-il expliquer pourquoi mon programme initial ne fonctionne pas? D'après ce que je comprends, Prolog devrait "ignorer" la première déclaration, car il ne dispose pas de suffisamment d'informations, et vérifiez la ligne suivante. Il a suffisamment d'informations pour cette deuxième ligne, et donc il devrait évaluer vrai. Toute aide ou un point dans la bonne direction serait génial. Merci.

Répondre

2

Comme le message d'erreur indique, vous avez une procédure définie mountaindew/1. Pour rendre votre code return true, vos options sont:

  1. Définir ce prédicat
  2. déclare que ce prédicat est dynamique: dynamic(mountaindew/1)
  3. déclare que tous les prédicats inconnus devraient échouer (non recommandé): set_prolog_flag(unknown, fail)
0

vous pouvez également changer l'ordre des prédicats (ne peut pas être fait toujours ofc) mais surtout ce que dit Kaarel.

à la fin il n'y a pas vraiment un point par écrit quelque chose qui va toujours échouer, même si vous développez toujours le code

0

Cela fonctionne, mais comme je suis un débutant, je ne peux pas dire pourquoi. Le mot "non instancié" peut s'appliquer. En dépit de ne pas savoir pourquoi cela fonctionne, je pense qu'il est utile de montrer d'une façon qui fonctionne.

hacker(P) :- mountaindew(P), doesntsleep(P). 
hacker(P) :- writesgoodcode(P). 
mountaindew(john). 
doesntsleep(john). 
writesgoodcode(jeff). 
Questions connexes