Professional Documents
Culture Documents
Unidad I
Semana 3
Comprender el paradigma de
programación lógica, conceptos y
fundamentos de los sistemas expertos.
Objetivo Específico
Control en prolog
• Las técnicas de programación de esta sección
explota la fuerza de prolog, que son el rastreo
inverso (backtracking) y la unificación.
Técnicas de Programación
Dicho en palabras, las listas X e Y son comunes si existe al menos algún objeto M que sea
miembro de ambos. La primera meta miembro(M,X) propone una M de la lista X y la
segunda meta miembro(M,Y) verifica si M aparece también en la lista Y.
Si preguntamos: comunes([a,b,c],[1,2,c,d]).
Prolog responde:
Si
Técnicas de Programación
Propone y Verifica
Si se consulta:
miembro(M,[a,b,c]) , miembro(M,[1,2,c,d]).
La primera meta de esta consulta genera soluciones y la segunda las verifica para ver si son
aceptables.
miembro(M,[a,b,c])
M=a
M=b
M=c
miembro(a,[1,2,c,d,])
no
comunes2.pl
miembro(b,[1,2,c,d])
Muestra el primer miembro que tienen en común las listas.
no
miembro(c,[1,2,c,d]) comunes3.pl
si Muestra todos los miembros que tienen en común las listas.
Prolog tiene varios predicados y ordenes
incorporadas que lo hacen un lenguaje de
programación de propósito general en vez de
solo una implementación de la lógica.
Control en Prolog
Como programador usted puede ayudar. Primero puede escribir las cláusulas en
un orden tal que haga eficiente la búsqueda. Segundo, ya que como
programador es más inteligente que su computadora, puede decirle al prolog
cuando saltar parte de una búsqueda que no es necesaria. Para ello debe
insertar unas cuantas ordenes especiales en el programa. Estas pueden dirigir la
lógica y ahorrar tiempo de calculo.
! (Corte)
Prolog utiliza una búsqueda "primero en
profundidad" en un árbol. Procede desde el
objetivo principal al primer subobjetivo, luego al
Control de la vuelta atrás
Control en Prolog
Prolog procede con la “D”. Ahora buscara todas las posibilidades para “D”, intentando
encontrar algo en la base de datos que verifique a “D”. Si lo encuentra, la regla se
cumplirá porque todas las cláusulas a las que se ha llegado antes (“B”,”C” y “!”) se han
cumplido. Si no se encuentra una solución para “D”, fallara la regla entera, porque el
”!” detiene la vuelta atrás que se produciría para encontrar otros valores de “B” y “C”.
Recuerde que con la vuelta atrás normal, el prolog podría examinar el siguiente valor
de “C” y luego volver a encontrar un valor que verifique “D”. Puede encontrar tal valor
para “D” una vez que el valor de “C” sea diferente. Pero la “!” no permite dicha
posibilidad. Esta regla debe parar con la primera solución que encuentre para “B” y
“C”.
! (Corte)
Si se considera el siguiente ejemplo: (animales.pl)
DOMAINS
animal = symbol
Control de la vuelta atrás
Control en Prolog
PREDICATES
es_un_pato(animal)
suena_como_un_pato(animal)
parece_un_pato(animal)
anda_como_un_pato(animal)
CLAUSES
es_un_pato(X) :- suena_como_un_pato(X), parece_un_pato(X), anda_como_un_pato(X).
suena_como_un_pato(donald).
suena_como_un_pato(daysi).
parece_un_pato(donald).
parece_un_pato(daysi).
anda_como_un_pato(donald).
anda_como_un_pato(daysi).
Si consultamos: es_un_pato(X)
prolog responderá:
X = donald
X = daysi
2 soluciones
! (Corte)
Sin embargo si añadimos un corte como se muestra a continuación: (animales2.pl)
DOMAINS
animal = symbol
Control de la vuelta atrás
Control en Prolog
PREDICATES
es_un_pato(animal)
suena_como_un_pato(animal)
parece_un_pato(animal)
anda_como_un_pato(animal)
CLAUSES
es_un_pato(X) :- suena_como_un_pato(X), parece_un_pato(X), anda_como_un_pato(X), !.
suena_como_un_pato(donald).
suena_como_un_pato(daysi).
parece_un_pato(donald).
parece_un_pato(daysi).
anda_como_un_pato(donald).
anda_como_un_pato(daysi).
es_un_pato(X)
Es decir se obtendrá el primer nombre de
Prolog responderá: pato. La regla no permitirá volver atrás al
primer subobjetivo (“suena_como_un_pato”)
X = donald después de que se haya llegado al “corte”.
fail (fallo)
Otra orden incorporada para controlar la vuelta atrás, “fail”, es un predicado sin argumentos que
automáticamente falla y fuerza la vuelta atrás. En cierto sentido es opuesto al “corte”, el cual
elimina la vuelta atrás.
Control en Prolog
Suponga por ahora que el prolog tiene un predicado incorporado que imprime la información
sobre la pantalla. Al igual que con cualquier predicado, el prolog intentaría hacer que esto se
cumpliera. Pero en este caso, en vez de mirar donde existe material para la identificación, el
prolog sabe todo lo que tiene que hacer para satisfacer el predicado es ejecutar alguna función.
Tales predicados son muy “procedurales” y evitan que el prolog sea solo un lenguaje de
programación declarativo estrictamente lógico. También hacen útil al prolog para las tareas de
programación corrientes.
Prolog sabe que tiene que satisfacer la parte derecha para satisfacer a “A”. La única acción
necesaria para satisfacer la parte derecha es escribir la frase: Hola a todos en la pantalla en la
posición actual del cursor. El predicado - write("Hola a todos") – puede suponerse que es verdad y
a su vez puede suponerse que es verdad el saludo.
Ejemplo: (pais.pl) Ejemplo añadiendo fail: (pais2.pl)
DOMAINS DOMAINS
lugar = symbol lugar = symbol
PREDICATES PREDICATES
saludar saludar
prolog_pais(lugar) prolog_pais(lugar)
Control en Prolog
CLAUSES CLAUSES
saludar:- saludar:-
prolog_pais(Pais),write(“Hola ”),write(Pais),nl. prolog_pais(Pais),write(“Hola ”),write(Pais),nl,fail.
fail (fallo)
prolog_pais(usa). prolog_pais(usa).
prolog_pais(peru). prolog_pais(peru).
prolog_pais(japon). prolog_pais(japon).
Si consultamos: Si consultamos:
saludar saludar
Unidad I
Semana 3