2011-09-13 6 views
17

Pour une alouette j'ai commencé à apprendre Prolog via http://www.learnprolognow.org/. Mon excuse est que j'ai seulement juste commencé.Avertissement de prédicat discontiguous de GNU Prolog

Je ne suis pas sûr de la façon dont l'exercice suivant (simple?) Devrait être écrit pour fonctionner comme prévu. http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

Je vois que Gnu Prolog 1.4 (http://www.gprolog.org/) ne sont pas heureux que le 2ème prédicat pour assistant \ 1 est pas à côté de la première. Je peux réordonner le programme pour le faire fonctionner mais ensuite je me retrouve avec un code qui à mon oeil Prolog novice est moins compréhensible que celui présenté ci-dessous.

Est-ce que quelque chose me manque?

wiz.pl

wizard(ron). 
hasWand(harry). 
quidditchPlayer(harry). 

wizard(X) :- hasBroom(X),hasWand(X). 
hasBroom(X) :- quidditchPlayer(X). 

consulter wiz.pl

| ?- [wiz]. 
compiling D:/wiz.pl for byte code... 
D:/wiz.pl:5: warning: discontiguous predicate wizard/1 - clause ignored 
D:/wiz.pl compiled, 5 lines read - 632 bytes written, 24 ms 

Répondre

19

La plupart des Prologs veulent les clauses pour tout prédicat particulier à la liste ensemble, à moins que vous faites un peu de magie. Je suis surpris Striegnitz et Bos ignorent cela. Modifier le programme

% all clauses for wizard/1 
wizard(ron). 
wizard(X) :- hasBroom(X),hasWand(X). 

hasWand(harry). 
quidditchPlayer(harry). 
hasBroom(X) :- quidditchPlayer(X). 

Notez que j'ai gardé les clauses pour wizard/1 dans le même ordre que dans le programme original. Pour les bases de connaissances simples comme celle-ci, l'ordre n'a pas beaucoup d'importance, mais lors de l'implémentation d'algorithmes non déterministes, l'ordre des clauses peut déterminer l'ordre dans lequel les solutions sont générées.

+1

ok merci, j'avais naïvement supposé que les faits seraient maintenus ensemble, puis les règles dérivées . Je vais garder votre note sur l'ordre à l'esprit à l'avenir. Je vais poster les auteurs pour le commentaire aussi. –

+1

@AdamStraughan Ont-ils déjà répondu? –

+0

@DanielLyons, je ne me souviens pas, une recherche de mes e-mails n'a rien trouvé. Désolé, je ne pouvais pas aider plus. –

6

Il y a une directive ISO Prolog discontiguous que vous pouvez utiliser pour détendre cette exigence pour un prédicat spécifique:

http://www.gprolog.org/manual/gprolog.html#htoc53

+0

C'était utile, mais j'avais du mal à comprendre comment utiliser la directive. J'utilise le même matériel d'apprentissage que l'OP, et j'ai découvert comment utiliser la directive dans votre code source pour résoudre le problème. Il suffit d'utiliser ceci: –

+0

D'une façon ou d'une autre, j'ai raté ma fenêtre pour l'édition - ajoutez simplement ceci au début de votre base de connaissances: ': -discontiguous (wizard/1) .' –

Questions connexes