2010-07-24 13 views
25

Mi base de conocimientos SWI-Prolog contiene los siguientes dos hechos:¿Por qué esta consulta de prólogo es verdadera y falsa?

f(a,b). 
f(a,c). 

Ahora bien, si me plantean la consulta

?- f(a,c). 
true. 

Pero

?- f(a,b). 
true ; 
false. 

¿Por qué es f (a, b) ambos verdaderos y falsos? Esto también sucede cuando hay tres hechos en el KB. Si añado f (a, d). al KB, entonces f (a, d) es verdadero (solo), pero f (a, b) y f (a, c) son verdaderos y falsos. ¿Qué está pasando y qué puedo hacer para que Prolog responda (solo) fiel a estas consultas?

+3

Maldición, buena pregunta. –

Respuesta

24

(Nota: esta respuesta es algo así como una conjetura)

considerar cómo Prolog determina si f(a,c) es verdad o no. Comprueba la primera regla, f(a,b), y no encuentra una coincidencia, pero coincide la segunda regla, f(a,c). Por lo tanto, f(a,c) es verdadero. Además, dado que no hay más reglas para f, no tiene sentido permitir que se produzca un retroceso: no hay otras soluciones posibles.

Considera ahora f(a,b). Prolog comprobará la primera regla y buscará una coincidencia. Por lo tanto, f(a,b) es verdadero. Sin embargo, no todas las reglas se han agotado. Por lo tanto, Prolog permitirá que la búsqueda continúe (si tocas ;). Cuando continúe la búsqueda y retroceda, descubrirá que las reglas restantes, específicamente f(a,c), no coinciden con f(a,b). Por lo tanto, el resultado es falso.

+11

Esta respuesta es correcta. En Prolog, el orden en el que sus hechos son reglas escritas determina el orden en que se encontrarán en una consulta. Más específicamente, la opción 'retroceder' ";" esencialmente dice obliga al motor de consulta a descartar el resultado devuelto y responder la pregunta "¿hay alguna * otra * respuesta?". Entonces, no es que f (a, b) sea verdadero y falso; sino que es cierto y si elige ignorar ese resultado, el motor le dirá que no hay otras entradas de datos f (a, b). Para probar esto, observa lo que sucede si agregas un segundo hecho f (a, b). – Assaf

+4

Esto también ilustra por qué debe prestar atención al orden de sus argumentos si le preocupa el rendimiento. Si el orden de los argumentos en el predicado 'f' se invirtió, entonces esto no habría sucedido porque los argumentos iniciales ya no son los mismos, por lo que no dejan un punto de elección. Esto sucede porque la mayoría de los prólogos realizan la indexación de argumentos, lo que permite que los predicados con argumentos incompatibles sean eliminados del espacio de búsqueda de antemano. SWI Prolog solo indexa el primer argumento de manera predeterminada, pero esto puede modificarse. – nedned

11

Simplemente además de la respuesta de Michael Williamson. Si usted quiere decir Prolog a dejar de buscar respuestas después del primer golpe exitoso, a continuación, utilizar el corte (!):

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true. 
Cuestiones relacionadas