siguiente anterior arriba atrasadelante (solo si previamente se ha ido
atras)

A.3.2. Unificación y retroceso

Unificación

En el Apartado 4.8.3 se explica la operación de unificación como paso previo a la aplicación de la regla de resolución. Igual que hacíamos allí, consideraremos únicamente el caso más sencillo, en el que se unifican variables con variables o constantes. La presencia de funciones y de listas hace necesario un algoritmo de unificación en el que no vamos a entrar.

Unificar consiste en atribuir provisionalmente valores a variables. La palabra «provisional» diferencia a la unificación de la asignación en lenguajes procedimentales (operación ésta que es «destructiva» ). En los ejemplos que hemos seguido siempre se ha tratado de unificar variables con constantes. Pero la unificación es más general. Así, por ejemplo, p(a,X,b) puede unificarse con p(a,Y,Z) mediante la sustitución de Y por X y Z por b (lo que se puede indicar escribiendo «X/Y, b/Z» , con una notación que ya hemos utilizado en las figuras anteriores). Sin embargo, p(Z,X,b) y p(a,Y,Z) no pueden unificarse, ya que Z no se puede sustituir al mismo tiempo por la constante a y por la b.

La unificación de una variable con una constante (o de un conjunto de variables con un conjunto de constantes) se llama «ejemplarización» : «sócrates» es un ejemplar de X en «hombre(X)» .

Retroceso

Como ya se ha visto en los ejemplos, en el momento en que fracasa la unificación de un predicado el procesador retrocede y deshace la última unificación que tuvo lugar (se deshacen todas las sustituciones) y prueba con otra unificación. Para hacer esto posible, el procesador maneja una estructura de datos de tipo pila en la que va almacenado las sustituciones y los «puntos de retroceso» . Cuando llega a un fracaso, recupera de la pila la información necesaria para restaurar el estado anterior al de la última unificación (si la pila está vacía, entonces responde «NO» ).

Procesador

El procesador de Prolog consta de dos procedimientos: un procesador de objetivos y un procesador de reglas y hechos. En un intérprete son programas independientes que se llaman de manera recursiva; en un compilador están imbricados, pero el resultado de la ejecución es el mismo.

He aquí una descripción muy resumida de ambos procedimientos:

El procesador de objetivos llama sucesivamente al procesador de reglas y hechos para cada uno de los subobjetivos pendientes («de izquierda a derecha» ). Si el procesador de reglas y hechos devuelve un fracaso, el de objetivos retrocede al subobjetivo anterior (si lo hay) y deshace la última unificación, llamando de nuevo al procesador de reglas con ese subobjetivo.

El procesador de hechos y reglas explora las cláusulas («de arriba abajo» ) buscando posibles unificaciones. Si encuentra una unificación con un hecho la introduce en la pila e informa del éxito al procesador de objetivos. Si encuentra unificación con la cabeza de una regla llama al procesador de objetivos para el conjunto de subobjetivos del cuerpo de la regla.

Ante una consulta, se llama al procesador de objetivos para el conjunto de subobjetivos que constituye la consulta. En caso de éxito para todos los subobjetivos, responde «YES» (si la consulta no contenía variables) o bien los valores unificados con las variables, y en este último caso continúa la búsqueda de más unificaciones hasta agotar las posibilidades. En caso de fracaso de alguno de los subobjetivos iniciales el procesador da la respuesta «NO» .


siguiente
anterior arriba atrasadelante (sólo si previamente se ha ido atras)


algunos derechos reservados DIT-ETSIT-UPM
Portada