Resolución, reglas y metas en Prolog

Pregunta central

¿Por qué Prolog puede ejecutar una regla reemplazando una meta por las premisas de esa regla, y cómo se relaciona este procedimiento con una demostración por refutación mediante resolución?

Idea principal

Un programa lógico describe conocimiento mediante hechos y reglas. Una consulta se convierte en una lista de metas pendientes. Prolog intenta demostrarla seleccionando una meta, unificándola con la cabeza de una regla y sustituyéndola por el cuerpo de esa regla. Este paso operacional no es un truco del lenguaje: es una instancia de la regla lógica de resolución aplicada a cláusulas de Horn.

La búsqueda termina de dos maneras:

  • Éxito: ya no quedan metas; aparece la meta vacía, equivalente a la cláusula vacía en la refutación.
  • Fallo de una rama: ninguna cláusula del programa puede resolver la meta seleccionada; Prolog retrocede para intentar otra regla.

1. Notación mínima

Átomos, literales y cláusulas

Un átomo es una expresión como o . Un literal es un átomo o su negación. Una cláusula es una disyunción de literales:

Esta cláusula tiene una lectura equivalente como implicación:

y como regla de Prolog:

t(X) :- s(X).

En general, la regla

abrevia

y en forma clausal se escribe

La cabeza es y el cuerpo contiene . Una regla de esta forma es una cláusula definida: contiene exactamente un literal positivo.

Metas

La consulta conjunta

?- a1, a2, ..., an.

se representa como la cláusula objetivo

equivalente a

La flecha hacia la izquierda puede leerse como: «todavía falta demostrar estas metas».

Dos objetos que no deben confundirse

El programa contiene cláusulas definidas (hechos y reglas). La consulta produce una cláusula objetivo, sin literales positivos. La ejecución conecta ambos objetos mediante resolución.


2. Regla general de resolución

Si dos cláusulas contienen literales complementarios que pueden unificarse, esos literales se eliminan y el unificador se aplica a todo lo restante. Sean

y sea un unificador de y . Entonces:

El resultado se llama resolvente. En lógica proposicional los literales complementarios deben coincidir exactamente; en primer orden basta con que exista una sustitución que los vuelva iguales.

Unificación rápida

y unifican con . En cambio, y no unifican si y son constantes distintas.


3. De una regla y una meta al siguiente objetivo

Supongamos que el programa contiene una regla cuya cabeza puede unificarse con la meta seleccionada :

y que el objetivo actual es

Primero se renombran las variables de la regla si hace falta, para que sean independientes de las del objetivo. Después se calcula

donde UMG significa unificador más general. El siguiente objetivo es:

Es decir: se elimina la meta resuelta y, en su lugar, se insertan las premisas que todavía deben demostrarse.

Por qué esta sustitución es resolución

La regla equivale a:

y el objetivo equivale a:

Al resolver con se cancelan esos dos literales. Queda:

que, regresando a notación de metas, es justamente el objetivo enmarcado arriba.

Caso de un hecho

Un hecho puede verse como . Al resolverlo, se reemplaza por un cuerpo vacío. Si era la última meta, obtenemos la meta vacía y la consulta tiene éxito.


4. Ejemplo de resolución general por refutación

Sea

Queremos probar:

La prueba por refutación agrega la negación de la conclusión, , y busca derivar :

Una derivación posible es:

Como es inconsistente, concluimos:

Refutación frente a esquema de búsqueda

Una refutación muestra una secuencia que sí alcanza . El esquema de búsqueda contiene también las elecciones alternativas que el algoritmo pudo haber intentado. Por eso el segundo suele ser mucho más ancho que la prueba final.


5. El mismo mecanismo restringido a Prolog

Considérese el programa clausal:

Su escritura como programa es:

t(X) :- s(X).
r(X) :- t(X).
r(X) :- q(X).
s(X).

La consulta es:

?- r(X).

La cláusula objetivo inicial es , o de forma disyuntiva, . Si elegimos la regla , la derivación SLD es:

Interpretación paso a paso:

  1. Para demostrar basta demostrar .
  2. Para demostrar basta demostrar .
  3. es un hecho; no deja submeta pendiente.
  4. La lista de metas queda vacía y la consulta tiene éxito.

La otra regla para produciría la meta . Como el programa no contiene un hecho ni una regla cuya cabeza sea , esa rama falla. El retroceso permite regresar y probar la alternativa basada en .

El orden sí importa operacionalmente

Lógicamente, reordenar cláusulas no cambia el conjunto de consecuencias. En Prolog habitual, sin embargo, se selecciona la meta más a la izquierda y se prueban las cláusulas en el orden del programa mediante búsqueda en profundidad. Un orden desafortunado puede hacer la ejecución lenta o incluso no terminante.


6. Explorador paso a paso

El recurso permite alternar entre la refutación general y la derivación SLD. En ambos casos se elimina un par de literales complementarios; la diferencia es que SLD mantiene una meta central y siempre resuelve contra una cláusula del programa, lo que reduce drásticamente el espacio de búsqueda.


7. Resolución general vs. resolución SLD

AspectoResolución generalResolución SLD / Prolog
Cláusulas permitidasCláusulas arbitrariasCláusulas definidas + una meta
ElecciónPuede resolver diversos pares de cláusulasResuelve una meta con una regla del programa
Forma de la derivaciónÁrbol o grafo amplioDerivación lineal por rama
Dirección intuitivaBuscar una contradicciónReducir metas a submetas
ÉxitoSe deriva La lista de metas queda vacía
AlternativasMuchas combinaciones posiblesSe exploran mediante retroceso

La «L» de SLD significa lineal: cada nuevo resolvente se obtiene del objetivo anterior y una cláusula del programa. La «S» recuerda que existe una regla de selección para escoger cuál meta resolver. La «D» alude a cláusulas definidas.


8. Errores frecuentes

  1. Agregar la conclusión en vez de negarla. En refutación se trabaja con .
  2. Confundir conjunción de metas con disyunción clausal. representa , no .
  3. Olvidar aplicar el unificador al resto. La sustitución afecta todo el resolvente, no solo el par eliminado.
  4. No renombrar variables entre cláusulas. Dos variables con el mismo nombre en reglas distintas no tienen por qué ser la misma variable.
  5. Confundir falla de una rama con falsedad lógica. Una elección puede fallar aunque otra rama sí demuestre la consulta.
  6. Creer que una búsqueda que no termina equivale a falso. Prolog puede quedarse atrapado en una rama infinita antes de alcanzar una alternativa exitosa.

9. Comprobación rápida

Resumen después de clase

Una regla de Prolog es la cláusula de Horn . Una consulta es una cláusula objetivo formada por las negaciones de las metas pendientes. Resolver la cabeza contra una meta seleccionada elimina esa meta y agrega el cuerpo de la regla, aplicando el unificador más general. La resolución SLD restringe la resolución general para producir derivaciones lineales guiadas por metas; Prolog añade una estrategia concreta de selección, orden y retroceso.

Fuentes de la clase