2011-09-13 7 views
17

Para una alondra, he empezado a aprender Prolog a través de http://www.learnprolognow.org/. Mi excusa es que solo tengo solo comenzado.advertencia de predicado no contiguo de GNU Prolog

No estoy seguro de cómo se debe escribir el siguiente ejercicio (¿simple?) Para que funcione como se espera. http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

puedo ver que GNU Prolog 1.4 (http://www.gprolog.org/) no es feliz que el segundo predicado para el asistente \ 1 es no al lado de la primera. Puedo volver a ordenar el programa para que funcione, pero luego termino con un código que para mi novato Prolog eye es menos comprensible que el que se presenta a continuación.

¿Me falta algo obvio?

wiz.pl

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

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

consultar 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 

Respuesta

19

La mayoría de los prólogos quieren las cláusulas para cualquier predicado en particular para ser listados juntos, a menos que haga un poco de magia. Estoy sorprendido de que Striegnitz y Bos ignoren esto. Cambiar el programa a

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

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

Tenga en cuenta que he mantenido las cláusulas de wizard/1 en el mismo orden que en el programa original. Para bases de conocimiento simples como esta, el orden no importa mucho, pero cuando se implementan algoritmos no deterministas, el orden de las cláusulas puede determinar el orden en que se generan las soluciones.

+1

ok gracias, yo había asumido ingenuamente que los hechos serían mantenidos juntos y luego las reglas derivadas . Llevaré tu nota sobre el orden en mente en el futuro. Enviaré a los autores para que hagan un comentario también. –

+1

@ AdamStraughan ¿Alguna vez respondieron? –

+0

@DanielLyons, no recuerdo, una búsqueda de mis correos electrónicos no encontró nada. Lo siento, no pude ayudar más. –

6

Hay una discontiguous Directiva ISO Prolog que se puede utilizar para relajar este requisito para un predicado específica:

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

+0

Esto fue útil, pero me costaba entender cómo usar la directiva. Estoy usando el mismo material de aprendizaje que el OP, y descubrí cómo usar la directiva en tu código fuente para solucionar el problema. Simplemente usa esto: –

+0

De alguna manera extrañé mi ventana para editarla. Solo agrégala al principio de tu base de conocimiento: ': -discontiguous (wizard/1) .' –