1. Considere el programa anterior y realice la traza de ejecución a la pregunta :
?- enorme(X), oscuro(X).
compare su traza de ejecución con la anterior, ya que esencialmente es la misma pregunta pero con otro orden. ¿En cuál de ambos casos Prolog realiza más trabajo antes de encontrar la respuesta final?
Analizando:
(a). Pregunta.
?- oscuro( X), enorme( X). % Quién es oscuro y enorme ?
Traza de la ejecución.
(1). Lista inicial de metas : oscuro(X), enorme(X).
(2). 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).
(3). 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)
(4). 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)
(5). 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)
(6). 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.
Analizando:
(a). Pregunta.
?- oscuro( X), enorme( X). % Quién es oscuro y enorme ?
Traza de la ejecución.
(1). Lista inicial de metas : oscuro(X), enorme(X).
(2). 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).
(3). 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)
(4). 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)
(5). 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)
(6). 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.
b) Pregunta.
?- enorme(X), oscuro(X). % Quién es oscuro y enorme ?
Traza de la ejecución.
(1). Lista inicial de metas: enorme(X), oscuro(X).
(2). Examina el programa de arriba hacia abajo buscando una cláusula cuya cabeza empate con la primera meta : enorme(X). Se encuentra en la cláusula 1:
se reemplaza la primera meta con el cuerpo instanciado de la cláusula 7, dando una nueva lista de metas :
(4). Examina el programa para buscar la meta negro(oso), no se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de backtracking al paso 3) y se elimina la instanciación negro(oso). Ahora la lista de metas es de nuevo:
Se reemplaza la segundo meta en la lista de metas por cafe(X), dando:
X = oso.
Traza de la ejecución.
(1). Lista inicial de metas: enorme(X), oscuro(X).
(2). Examina el programa de arriba hacia abajo buscando una cláusula cuya cabeza empate con la primera meta : enorme(X). Se encuentra en la cláusula 1:
enorme(oso).
Esta cláusula no tiene cuerpo, así que la lista de metas, luego de instanciarse se convierte en :
oscuro(oso)
(3). Examina el programa para encontrar un empatamiento de oscuro(oso). 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 :
enorme(oso), negro(oso).
enorme(oso), oscuro(oso).
Se continúa examinando el programa a partir de la cláusula 7. Se encuentra la cláusula 8:
oscuro(Z) :- cafe(Z).
enorme(oso), cafe(oso).
(5). Examina el programa buscando empatar cafe(X), encuentra cafe(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.
CONCLUSIÓN:
Prolog realiza más trabajo antes de encontrar la respuesta final en la pregunta ?- oscuro( X), enorme( X).
Magdaly M.G.
No hay comentarios.:
Publicar un comentario