2011-09-13 4 views
17

Per un allodola ho iniziato a imparare Prolog tramite http://www.learnprolognow.org/. La mia scusa è che ho solo solo avviato.Avviso di predicato discontinuo da GNU Prolog

Non sono sicuro di come il seguente esercizio (semplice?) Dovrebbe essere scritto per funzionare come previsto. http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

vedo che Gnu Prolog 1.4 (http://www.gprolog.org/) non è felice che il 2 ° predicato per la procedura guidata \ 1 non è vicino al primo. Posso riordinare il programma per farlo funzionare, ma poi finisco con il codice che al mio principiante, l'occhio di Prolog è meno comprensibile di quello presentato di seguito.

Mi manca qualcosa di ovvio?

wiz.pl

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

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

consultare 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 

risposta

19

La maggior parte Prologs vogliono che le clausole di un particolare predicato per essere incluso insieme, a meno che non fare un po 'di magia. Sono sorpreso che Striegnitz e Bos ignorino questo. Modificare il programma per

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

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

Si noti che ho tenuto le clausole per wizard/1 nello stesso ordine come nel programma originale. Per semplici basi di conoscenza come questa, l'ordine non importa molto, ma quando si implementano algoritmi non deterministici, l'ordine delle clausole può determinare l'ordine in cui vengono generate le soluzioni.

+1

ok grazie, avevo ingenuamente per scontato che i fatti sarebbero stati tenuti insieme e poi le regole derivate . Porterò avanti la nota sull'ordine in mente. Spedirò anche gli autori per un commento. –

+1

@AdamStraughan Hanno mai risposto? –

+0

@DanielLyons, non ricordo, una ricerca delle mie e-mail non ha trovato nulla. Scusa non ho potuto aiutare di più. –

6

C'è una direttiva ISO Prolog discontiguous che è possibile utilizzare per rilassarsi questo requisito per una specifica predicato:

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

+0

Questo è stato utile, ma stavo faticando a capire COME utilizzare la direttiva. Sto utilizzando lo stesso materiale didattico dell'OP e ho scoperto come utilizzare la direttiva nel codice sorgente per risolvere il problema. Semplicemente usa questo: –

+0

In qualche modo mi sono perso la finestra per la modifica - aggiungi questo nella parte superiore della tua knowledge base: ': -discontiguo (procedura guidata/1) .' –