Je viens de commencer à apprendre Prolog, et je me pose des questions sur la première question de ce .Apprenez Prolog maintenant: Pourquoi répondre à la première requête de l'exercice 1.5?
%% Suppose we are working with the following knowledge base:
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).
wizard(X) :- hasBroom(X), hasWand(X).
hasBroom(X) :- quidditchPlayer(X).
Comment Prolog répond aux requêtes suivantes?
wizard(ron). -> true
witch(ron). -> undefined procedure
wizard(hermione). -> false
witch(hermione). -> undefined procedure
wizard(harry). -> true
wizard(Y). -> Y = ron ; Y = harry.
witch(Y). -> undefined procedure
En utilisant swipl
sur Ubuntu, en important la base de connaissances pour cet exercice, d'abord en essayant bien sûr de déchiffrer ce que Prolog retournera, et finalement de vérifier par moi-même.
Ok choses assez ennuyeux jusqu'à présent, je l'ai vu quelques réponses à ces exercices sur Github (here, here et there), et je ne comprends pas la réponse à la première: %% 1. wizard(ron). -> true
.
tout d'abord l'interprète se plaint de deux définition de ce qui est un wizard
:
Warning: /tmp/prolog/ex15.pl:4:
Clauses of wizard/1 are not together in the source-file
Earlier definition at /tmp/prolog/ex15.pl:1
Current predicate: quidditchPlayer/1
Use :- discontiguous wizard/1. to suppress this message
En second lieu, lors de l'interrogation que j'obtiens:
?- wizard(ron).
true ;
false.
La façon dont je l'obtiens, d'abord Prolog renvoie le premier fait de la base de connaissances, puis applique la tête de règle et découvre que ron n'a ni balai ni baguette.
Tout cela a conduit à ma question: quelle subtilité ai-je manqué qui fait que les autres écrivent true
comme réponse à cette requête?
L'interprète ne se plaint pas vraiment sur le fait qu'il ya deux définitions pour l'assistant, il se plaint qu'il n'y a pas écrit immédiatement l'un après l'autre. –
De plus, quelque chose est 'vrai' étant donné qu'il y a * au moins un chemin qui retourne' true' *. –
Le 'exercise.pl' que vous pointez est mal structuré. Il définit 'wizard (ron) .', quelques autres faits différents, puis' wizard (X): - ... '. Cela signifie que la définition de 'wizard' est * discontiguous * et de nombreux interprètes Prolog ignorera' wizard (X) 'à ce stade. Vous devez garder toutes vos définitions 'wizard (_)' les unes à côté des autres. – lurker