iii. exploración en prolog
DESCRIPTION
III. Exploración en Prolog. Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria. La exploración en Prolog. Exploración en profundidad. Estrategias. Exploración sistemática de todas las posibilidades. - PowerPoint PPT PresentationTRANSCRIPT
Prolog III 1
III. Exploración en
Prolog
Jorge Cabrera GámezDepartamento de Informática y Sistemas
Universidad de Las Palmas de Gran Canaria
Prolog III 2
La exploración en PrologExploración en profundidad
Estrategias
Exploración sistemática de todas las posibilidades
Exploración secuencial de izquierda a derecha de las condiciones and,tanto en las reglas como en el teorema
Exploración secuencial de arriba a abajo de las condiciones or, desde el principio al final de la base de datos
Prolog III 3
La exploración en PrologConsideremos el siguiente programa
a(X) :- b(X).a(w).b(X) :- c(X), d(X).b(y).b(w).c(w).d(z).
y la pregunta: ?- a(X).
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), d(X).b2 (y).b3 (w).c(w).d(z).
Prolog III 4
[ a(X) ][ [ a1(X) ] [ a2(X) ] ][ [ [ b1(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ c(X), d(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = w [ [ [ c(w), d(w) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ d(w) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] Fail, backtrack[ [ [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = y[ [ [ b2(y) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ ] [ b3(X) ] ] [ a2(X) ] ]1. Solución X = y[ [ [ b3(X) ] ] [ a2(X) ] ]
La exploración en Prolog
Prolog III 5
1. Solución X = y[ [ [ b3(X) ] ] [ a2(X) ] ]
X = w[ [ [ b3(w) ] ] [ a2(X) ] ][ [ [ ] ] [ a2(X) ] ]2. Solución X = w[ [ a2(X) ] ]
X = w[ [ a2(w) ] ][ [ ] ]3. Solución X = w
La exploración en Prolog
Prolog III 6
?- a(X).T Call a1: ( 7) a(_G93)T Call b1: ( 8) b(_G93)T Call c : ( 9) c(_G93)T Exit c : ( 9) c(w)T Call d : ( 9) d(w)T Fail d : ( 9) d(w)T Redo b2: ( 8) b(_G93)T Exit b2: ( 8) b(y)T Exit a1: ( 7) a(y)X = y ;T Redo b3: ( 8) b(_G93)T Exit b3: ( 8) b(w)T Exit: a1: ( 7) a(w)X = w ;T Redo a2: ( 7) a(_G93)T Exit a2: ( 7) a(w)X = w ;No
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), d(X).b2 (y).b3 (w).c(w).d(z).
1. Solución X = y2. Solución X = w3. Solución X = w
Prolog III 7
El predicado cut (!)
a(X) :- b(X).a(w).b(X) :- c(X), d(X).b(y).b(w).c(w).d(z).
Consideremos la siguiente base de conocimiento ...
?- a(X).
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), d(X).b2 (y).b3 (w).c(w).d(z).
1. Solución X = y2. Solución X = w3. Solución X = w
Prolog III 8
El predicado cut (!)
a(X) :- b(X).a(w).b(X) :- c(X), !, d(X).b(y).b(w).c(w).d(z).
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), !, d(X).b2 (y).b3 (w).c(w).d(z).
Introduzcamos una “ligerísima” variación ...
Prolog III 9
[ a(X) ][ [ a1(X) ] [ a2(X) ] ][ [ [ b1(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ c(X), !, d(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = w [ [ [ c(w), !, d(w) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ !, d(w) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ d(w) ] ] [ a2(X) ] ] Fail, backtrack[ [ a2(X) ] ]
X = w[ [ a2(w) ] ][ [ ] ]1. Solución X = w
La exploración en Prolog
¡¡¡ Una única solución !!!
Prolog III 10
El predicado cut (!) ?- a(X).T Call a1: ( 7) a(_G93)T Call b1: ( 8) b(_G93)T Call c : ( 9) c(_G93)T Exit c : ( 9) c(w)----- PODA b: ------T Call d : ( 9) d(w)T Fail d : ( 9) d(w)T Fail b1: ( 8) b(_G93)--- b2 y b3 han sido podadas ---T Redo a2: ( 7) a(_G93)T Exit a2: ( 7) a(w)
X = w ;No
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), !, d(X).b2 (y).b3 (w).c(w).d(z).
Prolog III 11
?- a(X).T Call a1: ( 7) a(_G93)T Call b1: ( 8) b(_G93)T Call c : ( 9) c(_G93)T Exit c : ( 9) c(w)T Call d : ( 9) d(w)T Fail d : ( 9) d(w)T Redo b2: ( 8) b(_G93)T Exit b2: ( 8) b(y)T Exit a1: ( 7) a(y)X = y ;T Redo b3: ( 8) b(_G93)T Exit b3: ( 8) b(w)T Exit: a1: ( 7) a(w)X = w ;T Redo a2: ( 7) a(_G93)T Exit a2: ( 7) a(w)X = w ;No
?- a(X).T Call a1: ( 7) a(_G93)T Call b1: ( 8) b(_G93)T Call c : ( 9) c(_G93)T Exit c : ( 9) c(w) ----- PODA b: ------T Call d : ( 9) d(w)T Fail d : ( 9) d(w)
--- b2 y b3 han sido podadas ---no hay backtracking posible para lallamada ( 8) por lo que falla.
T Fail b1: ( 8) b(_G93)
T Redo a2: ( 7) a(_G93)T Exit a2: ( 7) a(w)X = w ;No
Prolog III 12
El predicado cut (!) (como ejercicio)
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), d(X).b2 (y).b3 (w).c1 (y).c2 (z).d(z).
a1 (X) :- b(X).a2 (w).b1 (X) :- c(X), !, d(X).b2 (y).b3 (w).c1 (y).c2 (z).d(z).
¿Qué diferencias se presentan cuando introducimos otra “ligerísima” variación añadiendo una nueva definición del predicado c/1 en estas dos versiones del programa ?
Prolog III 13
[ a(X) ][ [ a1(X) ] [ a2(X) ] ][ [ [ b1(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [[[ c1(X), d(X) ] [ c2(X), d(X) ]] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = y [ [[[ c1(y), d(y) ] [ c2(X), d(X) ]] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [[[ d(y) ] [ c2(X), d(X) ]] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] Fail, backtrack
[ [ [ c2(X), d(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = z [ [ [c2(z), d(z) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [d(z) ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ ] [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ]1. Solución X = z
Prolog III 14
[ [ [ b2(X) ] [ b3(X) ] ] [ a2(X) ] ] X = y[ [ [ b2(y) ] [ b3(X) ] ] [ a2(X) ] ][ [ [ ] [ b3(X) ] ] [ a2(X) ] ]2. Solución X = y[ [ [ b3(X) ] ] [ a2(X) ] ]
X = w[ [ [ b3(w) ] ] [ a2(X) ] ][ [ [ ] ] [ a2(X) ] ]3. Solución X = w[ [ a2(X) ] ]
X = w[ [ a2(w) ] ][ [ ] ]4. Solución X = w
Prolog III 15
Cut:
Es un predicado extra-lógico que siempre se evalúa a cierto.
Provoca la poda o eliminación de alternativas. Concretamente impide que se intente la verificación de las opciones pendientes de los predicados a la izquierda del mismo
Prolog III 16
Ejemplo
incluido( X, [X | Y], Y).incluido( X, [_ | Y ], Z) :- incluido( X, Y, Z).
incluido( X, [X | _ ] ).incluido( X, [_ | Y ] ) :- incluido( X, Y).
?- incluido(a,[a,b,a,c,o]).true;true;false.
?- incluido(a,[a,b,a,c,o],R).R = [b, a, c, o] ;R = [c, o] ;false.
Prolog III 17
Ejemplo
incluido( X, [X | Y], Y).incluido( X, [_ | Y ], Z) :- incluido( X, Y, Z).
incluido( X, [X | _ ] ).incluido( X, [_ | Y ] ) :- incluido( X, Y).
?- incluido(a,[a,b,a,c,o],R),!.R = [b, a, c, o] ;false.
?- incluido(a,[a,b,a,c,o],R).R = [b, a, c, o] ;R = [c, o] ;false.
Prolog III 18
Ejemplo
predicado :- condicion, !, accion1.predicado :- accion2
Generación de estructuras alternativas
?- max( 3, 2, Z).Z = 3 ;Z = 2 ;No
max( X, Y, Z):- X>Y, Z is X.max( X, Y, Z):- Z is Y.
?- max( 2, 3, Z).Z = 3 ;No
max( X, Y, Z):- X>Y, !, Z is X.max( X, Y, Z):- Z is Y.
?- max( 3, 2, Z).Z = 3 ;No
?- max( 2, 3, Z).Z = 3 ;No
Prolog III 19
Generación de estructuras alternativas
En muchas implementaciones de Prolog se dispone del operador ‘->’, cuya semántica es equivalente a la construcción:
(Condición, !, Acción1; Acción2)
Más concretamente, su definición en muchos sistemas es la siguiente:
Condición -> Acción1 ; _ :- Condición, !, Acción1. Condición -> _ ; Acción2 :- !, Acción2. Condición -> Acción :- Condición, !, Acción.
Prolog III 20
El operador ‘->’ puede encadenarse para simular la construcción “case”, presente en otros lenguajes imperativos:
case :- ( Condición1 -> Acción1 ; Condición2 -> Acción2 ; … ; CondiciónN –> AcciónN ; OtroCaso).
Prolog III 21
El predicado Fail
Definición
libro('Todos los nombres', 'Saramago').libro('Cuadernos de Lanzarote', 'Saramago').libro('Ensayo sobre la ceguera', 'Saramago').libro('El Evangelio según Jesucristo', 'Saramago').
un_libro_de(X) :-libro(Y,X),write(Y),nl.
todos_los_libros_de(X) :-libro(Y,X), write(Y), nl, fail.
Prolog III 22
?- un_libro_de('Saramago').Todos los nombres
Yes
?- todos_los_libros_de('Saramago').Todos los nombresCuadernos de LanzaroteEnsayo sobre la cegueraEl Evangelio según Jesucristo
No
Prolog III 23
?- todos_los_libros_de('Saramago').T Call: ( 8) libro(_L143, 'Saramago')T Exit: ( 8) libro('Todos los nombres', 'Saramago')T Call: ( 8) write('Todos los nombres')Todos los nombresT Exit: ( 8) write('Todos los nombres')T Call: ( 8) nl
T Exit: ( 8) nlT Call: ( 8) failT Fail: ( 8) fail
todos_los_libros_de(X) :- libro(Y,X), write(Y), nl, fail.
T Redo: ( 8) libro(_L143, 'Saramago')T Exit: ( 8) libro('Cuadernos de Lanzarote', 'Saramago')T Call: ( 8) write('Cuadernos de Lanzarote')Cuadernos de LanzaroteT Exit: ( 8) write('Cuadernos de Lanzarote')T Call: ( 8) nl
T Exit: ( 8) nlT Call: ( 8) failT Fail: ( 8) fail
T Redo: ( 8) libro(_L143, 'Saramago')T Exit: ( 8) libro('Ensayo sobre la ceguera', 'Saramago')T Call: ( 8) write('Ensayo sobre la ceguera')Ensayo sobre la cegueraT Exit: ( 8) write('Ensayo sobre la ceguera')T Call: ( 8) nl
T Exit: ( 8) nlT Call: ( 8) failT Fail: ( 8) fail
T Redo: ( 8) libro(_L143, 'Saramago')T Exit: ( 8) libro('El Evangelio según Jesucristo', 'Saramago')T Call: ( 8) write('El Evangelio según Jesucristo')El Evangelio según JesucristoT Exit: ( 8) write('El Evangelio según Jesucristo')T Call: ( 8) nl
T Exit: ( 8) nlT Call: ( 8) failT Fail: ( 8) fail
No
Prolog III 24
Fail:
Es un predicado que nunca se evalúa a cierto.
Provoca la “vuelta atrás” o backtracking y
por tanto, que se explore la siguiente
alternativa.
Prolog III 25
La negación: el operador Not
“A María le gustan todos los animales excepto las serpientes”
¿Cómo podemos decir esto en Prolog?
Veamos la parte fácil:
gusta(maría, X):- animal(X).
Ahora es necesario excluir a las serpientes:
Si X es una serpiente entonces “gusta(maría, X)” no es verdadero,en otro caso si X es un animal entonces a María le gusta X
Prolog III 26
La negación: el operador Not
Si X es una serpiente entonces “gusta(maría, X)” no es verdadero,en otro caso si X es un animal entonces a María le gusta X
gusta( maría, X) :-serpiente(X), !, fail.
gusta( maría, X) :-animal(X).
gusta( maría, X) :-serpiente(X), !, fail;animal(X).
Prolog III 27
La negación: el operador Not
Si X e Y son unificables entonces “diferente( X, Y)” falla, en otro caso “diferente( X, Y)” es verdadero
Consideremos otro caso:
Intentemos definir el predicado diferente(X,Y):
diferente(X, Y) :- X = Y, !, fail;true.
Prolog III 28
La negación: el operador Not
Estos dos ejemplos sugieren la posible utilidad de un operador Not, de manera que
not(Objetivo)
sea verdadero si Objetivo es falso
diferente(X, Y) :- X = Y, !, fail;true.
gusta( maría, X) :-serpiente(X), !, fail;animal(X).
not(P) :- P, !, fail;true
Prolog III 29
La negación: el operador Not
diferente(X, Y) :- X = Y, !, fail;true.
gusta( maría, X) :-serpiente(X), !, fail;animal(X).
diferente(X, Y) :- not( X = Y ).
gusta( maría, X) :-animal(X),not( serpiente( X )).
gusta( maría, X) :-animal(X),not serpiente( X ).
gusta( maría, X) :-animal(X),\+ serpiente( X ).
Prolog III 30
Un uso interesante de not:
forall(A,B) :- \+ (A, \+B).
forall(:Cond, :Action) [semidet] For all alternative bindings of Cond, Action can be proven. 3 ?- forall(member(Result = Formula, [2 = 1 + 1, 4 = 2 * 2]), Result =:= Formula).true.4 ?- forall(member(Atom, [ejem, aja, ojú]), name(Atom,[_,106|_])).true.
Prolog III 31
Problemas con cut y not
Consideremos el siguiente ejemplop :- a, b.p :- c.
El significado declarativo de este programa es:
p es cierto si a y b son ciertos o si c es ciertop <==> (a b) c
Podemos cambiar el orden de las cláusulas sin afectarel significado declarativo del programa
Prolog III 32
Problemas con cut y not
Si ahora insertamos una poda:p :- a, !, b.p :- c.
El significado declarativo de este programa esahora:
p es cierto si a y b son ciertos o si a no es cierto y c es cierto
p <==> (a b) (~a c)
Prolog III 33
Problemas con cut y not
Si se intercambia el orden de las cláusulas:p :- c.p :- a, !, b.
El significado declarativo de este programa cambia a:
p es cierto si c es cierto o si a y b son ciertos
p <==> c (a b)
Prolog III 34
Problemas con cut y not
inocente( peter_pan).inocente( X) :- ocupación(X, duende).inocente( winnie_the_pooh).inocente( mary_poppins).
culpable(X) :- ocupación(X, ladrón).culpable(joe_bloggs).
La base de datos contiene nombres de personajes
cuya inocencia o culpabilidad es conocida.
Prolog III 35
Problemas con cut y not
Considérese el siguiente diálogo sobre heidi, cuya
inocencia es conocida por todos excepto por la base de
datos de la Policía.
?- inocente( heidi).No.
inocente( peter_pan).inocente( X) :- ocupación(X, duende).inocente( winnie_the_pooh).inocente( mary_poppins).ocupación(david_el_gnomo, duende).
culpable(X) :- ocupación(X, ladrón).culpable(joe_bloggs).
?- culpable( heidi).Yes.
inocente( peter_pan).inocente( X) :- ocupación(X, duende).inocente( winnie_the_pooh).inocente( mary_poppins).ocupación(david_el_gnomo, duende).
culpable(X) :- ocupación(X, ladrón).culpable(joe_bloggs).culpable(X) :- \+ inocente(X).
Prolog III 36
Problemas con cut y not
Consideremos ahora este programa:
buena_comida( jean_luis).caro(jean_luis).buena_comida(francesco).aceptable(Restaurante) :-
not(caro(Restaurante)).
?- buena_comida(X), aceptable(X).X = francesco.
?- aceptable(X), buena_comida(X).No.
Prolog III 37
Problemas con cut y not
?- aceptable(X),buena_comida(X).
T Call: ( 8) aceptable(_G237)T Call: ( 9) not(caro(_G237))T Call: ( 10) caro(_G237)T Exit: ( 10) caro(jean_luis)T Fail: ( 9) not(caro(_G237))T Fail: ( 8) aceptable(_G237)
No
buena_comida( jean_luis).
caro(jean_luis).
buena_comida(francesco).
aceptable(Restaurante) :-
not(caro(Restaurante)).
Prolog III 38
Problemas con cut y not
Es mala práctica desarrollar programas que destruyen la correspondencia entre el significado lógico y procedimental de un programa sin una buena razón para hacerlo.
Una solución: especificar la negación como indefinida cuando se realiza el intento de negar untérmino que contiene variables noinstanciadas.
Prolog III 39
Problemas con cut y notbuena_comida( jean_luis).caro(jean_luis).buena_comida(francesco).aceptable(Restaurante) :-
ground(caro(Restaurante)), !,\+ caro(Restaurante);write('No puedo negar algo Indefinido'),nl, fail.
?- buena_comida(X), aceptable(X).X = francesco ;No?- aceptable(X), buena_comida(X).No puedo negar algo IndefinidoNo
Prolog III 40
Sumario.
• True siempre se verifica y Fail siempre falla.
• Cut previene la exploración de alternativas.
• Cut puede mejorar la eficiencia de un programa.
• Cut permite formular conclusiones mutuamente
excluyentes mediante reglas de la forma:
If Condición then Conclusión1 else
Conclusión2
• Cut permite introducir el operador not: La
negación
como fallo.
• Cut y Not deben ser utilizados con prudencia.