Consultas, unificación y corte en Prolog

Simulador basado en MariaGusta.pl y en las sesiones reales de SWI-Prolog de los apuntes.

Consola interactiva de SWI-Prolog

gusta( maria, helado ).
gusta( maria, leer ).
gusta( maria, cine ).

dar( juan, beso, maria ).
recibe( X, beso ) :- dar( juan, beso, X ).

Elige una consulta y presiona «Ejecutar». Si tiene varias soluciones, usa «Siguiente solución ( ; )» para pedirle a Prolog más respuestas, tal como en la consola real.

Hechos con átomos
Consultas con variables (una posición)
Átomos en mayúscula: ¿variable o constante?
La regla recibe/2, y un error de sintaxis clásico

El corte ( ! ): qué rama poda

Predicado con corte:

factorial( 0, 1 ) :- !.
factorial( N, F ) :- N > 0, N1 is N - 1, factorial( N1, F1 ), F is N * F1.

Al resolver factorial(0, F), Prolog encuentra F = 1 con la primera cláusula. Si más adelante el programa falla y Prolog necesita retroceder (backtracking) hasta este punto, ¿vuelve a intentar la segunda cláusula?

Sin !

Al retroceder, Prolog sí prueba N > 0 con N = 0. La condición falla, así que el resultado final es el mismo — pero Prolog perdió tiempo explorando una rama inútil.

Con !

El corte descarta de inmediato la segunda cláusula para esta llamada. Prolog nunca vuelve a intentarla, sin importar qué pase después en el programa.