swi - prolog pdf
¡Leyendo un corte! en Prolog (1)
Ver también esta respuesta y esta pregunta .
¿Cómo debería leer la solución propuesta para max / 3 arriba?
max(X,Y,Z):- X =< Y, !, Y = Z.
max(X,Y,X).
Puedes leer esto de la siguiente manera:
Cuando
X =< Y
, olvida la segunda cláusula del predicado, y unificaY
yZ
El corte arroja puntos de elección. Los puntos de elección son marcas en el árbol de pruebas que le indican a Prolog dónde reanudar la búsqueda de más soluciones después de encontrar una solución. Entonces el corte corta partes del árbol de prueba. El primer enlace de arriba ( aquí está de nuevo ) discute los cortes con cierto detalle, pero gran parte de esa respuesta es solo citar lo que otros han dicho acerca de los recortes en otros lugares.
Supongo que el mensaje para llevar a casa es que una vez que pones un corte en un programa Prolog, te fuerzas a leerlo operacionalmente en lugar de declarativamente. Para comprender qué partes del árbol de pruebas se eliminarán, usted (el programador) tiene que realizar los movimientos, considerar el orden de las cláusulas, considerar qué subobjetivos pueden crear puntos de elección, considerar qué soluciones se pierden. Necesita construir el árbol de prueba (en lugar de dejar que Prolog lo haga).
Hay muchas técnicas que puede usar para evitar crear puntos de elección que sabe que no necesita. Sin embargo, este es un tema un poco grande. Debe leer el material disponible y hacer preguntas específicas.
¡Estoy leyendo Learn Prolog ahora! En el capítulo sobre cortes y, al mismo tiempo, Programación Prolog para la inteligencia artificial de Bratko, Capítulo 5: Control del retroceso. Al principio, parecía que un corte era una manera directa de imitar una cláusula if-else conocida de otros lenguajes de programación, por ejemplo
# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).
Sin embargo, como se observa en la siguiente línea, este código fallará en los casos en que todas las variables se instancian incluso cuando esperamos false
, por ejemplo
?- max(2,3,2).
true.
La razón es clara: la primera regla falla, la segunda ya no tiene ninguna condición conectada, por lo que tendrá éxito. Entiendo eso, pero luego se propone una solución (aquí hay un chasquido ):
max(X,Y,Z):- X =< Y,!, Y = Z.
max(X,Y,X).
Y estoy confundido sobre cómo debería leer esto. ¡Pensé !
significaba: "¡si todo lo que viene antes de esto !
es verdadero, detenga la terminación incluyendo cualquier otra regla con el mismo predicado ''. Sin embargo, eso no puede ser correcto, porque eso significaría que la instanciación de Y = Z
solo ocurre en caso de falla, lo que sería inútil para esa regla.
Entonces, ¿cómo debe leerse un corte de una manera "humana"? Y, como una extensión, ¿cómo debería leer la solución propuesta para max/3
arriba?