El significado procedural especifica el cómo contesta Prolog a las preguntas. Responder a una pregunta significa tratar de satisfacer una lista de metas. Estas pueden satisfacerse si las variables que existen en las metas pueden instanciarse de tal modo que las metas se sigan lógicamente del programa. Así el significado procedural de Prolog es un procedimiento para ejecutar una lista de metas con respecto a un programa dado. Ejecutar las metas significa tratar de satisfacerlas.
Las entradas y salidas a este procedimiento son:
- Entrada : Un programa y una lista de metas.
- Salida : Un indicador de éxito / falla y una instanciación particular de las variables.
El significado procedural determina cómo se vá a obtener esta salida, es decir, como evalúa Prolog sucesivamente las relaciones definidas en el programa. Ejemplo. En el siguiente ejemplo se hace una traza de la ejecución para ilustrar el significado procedural de Prolog :
Pregunta:
Traza de la ejecución. Lista inicial de metas : oscuro(X), enorme(X). Examina el programa de arriba hacia abajo buscando una cláusula cuya cabeza empate con la primera meta : oscuro(X). Se encuentra la cláusula 7 : oscuro( Z) :- negro( Z). Se reemplaza la primera meta con el cuerpo instanciado de la cláusula 7, dando una nueva lista de metas : negro(X), enorme(X). Examina el programa para encontrar un empatamiento de negro(X). Se encuentra la cláusula 5: negro( gato). Esta cláusula no tiene cuerpo, así que la lista de metas, luego de instanciarse se convierte en : enorme(gato).
Examina el programa para buscar la meta enorme(gato), no se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de backtracking al paso 3) y se elimina la instanciación X = gato. Ahora la lista de metas es de nuevo:
negro(X), enorme(X).
Se continúa examinando el programa a partir de la cláusula 5. No se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de backtracking nuevamente al paso (2) y se continúa examinando a partir de la cláusula 7. Se encuentra la cláusula 8:
oscuro(Z) :- cafe(Z).
Se reemplaza la primera meta en la lista de metas por cafe(X), dando:
cafe(X), enorme(X) Examina el programa buscando empatar cafe(X), encuentra cafe(oso). Esta cláusula no tiene cuerpo, así que la lista de metas es ahora: enorme(oso).
Examina el programa y encuentra la cláusula enorme(oso). Esta cláusula no tiene cuerpo, así que la lista de metas se queda vacía. Esto indica una terminación exitosa y la instanciación correspondiente a la variable queda como: X=oso.
No hay comentarios:
Publicar un comentario