La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

III. Exploración en Prolog

Presentaciones similares


Presentación del tema: "III. Exploración en Prolog"— Transcripción de la presentación:

1 III. Exploración en Prolog
Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria Prolog III

2 La exploración en Prolog
Exploració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 Prolog
Consideremos el siguiente programa 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). y la pregunta: ?- a(X). Prolog III

4 La exploración en Prolog
[ 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) ] ] Prolog III

5 La exploración en Prolog
1. Solución X = y [ [ [ b3(X) ] ] [ a2(X) ] ] X = w [ [ [ b3(w) ] ] [ a2(X) ] ] [ [ [ ] ] [ a2(X) ] ] 2. Solución X = w [ [ a2(X) ] ] [ [ a2(w) ] ] [ [ ] ] 3. Solución X = w Prolog III

6 a1 (X) :- b(X). a2 (w). b1 (X) :- c(X), d(X). b2 (y). b3 (w). c(w).
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) 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 = y 2. Solución X = w 3. Solución X = w Prolog III

7 El predicado cut (!) Consideremos la siguiente base de conocimiento ... 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). ?- a(X). 1. Solución X = y 2. Solución X = w 3. Solución X = w Prolog III

8 El predicado cut (!) Introduzcamos una “ligerísima” variación ...
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). Prolog III

9 La exploración en Prolog
[ 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) ] ] [ [ a2(w) ] ] [ [ ] ] 1. Solución X = w ¡¡¡ Una única solución !!! Prolog III

10 El predicado cut (!) a1 (X) :- b(X). a2 (w). b1 (X) :- c(X), !, d(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 T Exit c : ( 9) c(w) ----- PODA b: ------ T Call d : ( 9) d(w)
?- 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) 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 la llamada ( 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)
¿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 ? 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). Prolog III

13 [ [ [ b1(X) ] [ b2(X) ] [ b3(X) ] ] [ a2(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) ] ] [ [ 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 incluido( X, [_ | Y ] ) :- incluido( X, Y).
Ejemplo incluido( X, [X | _ ] ). incluido( X, [_ | Y ] ) :- incluido( X, Y). incluido( X, [X | Y], Y). incluido( X, [_ | Y ], Z) :- incluido( X, Y, Z). ?- incluido(a,[a,b,a,c,o]). true; false. ?- incluido(a,[a,b,a,c,o],R). R = [b, a, c, o] ; R = [c, o] ; false. Prolog III

17 incluido( X, [_ | Y ] ) :- incluido( X, Y).
Ejemplo incluido( X, [X | _ ] ). incluido( X, [_ | Y ] ) :- incluido( X, Y). incluido( X, [X | Y], Y). incluido( X, [_ | Y ], Z) :- incluido( X, Y, Z). ?- incluido(a,[a,b,a,c,o],R). R = [b, a, c, o] ; R = [c, o] ; false. ?- incluido(a,[a,b,a,c,o],R),!. R = [b, a, c, o] ; false. Prolog III

18 Generación de estructuras alternativas
Ejemplo Generación de estructuras alternativas predicado :- condicion, !, accion1. predicado :- accion2 max( X, Y, Z):- X>Y, Z is X. max( X, Y, Z):- Z is Y. max( X, Y, Z):- X>Y, !, Z is X. max( X, Y, Z):- Z is Y. ?- max( 2, 3, Z). Z = 3 ; No ?- max( 2, 3, Z). Z = 3 ; No ?- max( 3, 2, Z). Z = 3 ; Z = 2 ; No ?- max( 3, 2, 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 ( Condición1 -> Acción1 ; Condición2 -> Acción2 …
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 nombres Cuadernos de Lanzarote Ensayo sobre la ceguera El Evangelio según Jesucristo No Prolog III

23 todos_los_libros_de(X) :- libro(Y,X), write(Y), nl, 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 Jesucristo T Exit: ( 8) write('El Evangelio según Jesucristo') T Call: ( 8) nl T Exit: ( 8) nl T Call: ( 8) fail T Fail: ( 8) fail No 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 ceguera T Exit: ( 8) write('Ensayo sobre la ceguera') T Call: ( 8) nl T Exit: ( 8) nl T Call: ( 8) fail T Fail: ( 8) fail T Redo: ( 8) libro(_L143, 'Saramago') T Exit: ( 8) libro('Cuadernos de Lanzarote', 'Saramago') T Call: ( 8) write('Cuadernos de Lanzarote') Cuadernos de Lanzarote T Exit: ( 8) write('Cuadernos de Lanzarote') T Call: ( 8) nl T Exit: ( 8) nl T Call: ( 8) fail T Fail: ( 8) fail ?- 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 nombres T Exit: ( 8) write('Todos los nombres') T Call: ( 8) nl T Exit: ( 8) nl T Call: ( 8) fail T Fail: ( 8) fail 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. animal(X). gusta( maría, X) :- serpiente(X), !, fail ; animal(X). Prolog III

27 La negación: el operador Not
Consideremos otro caso: Intentemos definir el predicado diferente(X,Y): Si X e Y son unificables entonces “diferente( X, Y)” falla, en otro caso “diferente( X, Y)” es verdadero 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 not(P) :- P, !, fail ; true diferente(X, Y) :- X = Y, !, fail ; true. gusta( maría, X) :- serpiente(X), !, fail ; animal(X). 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), \+ serpiente( X ). gusta( maría, X) :- animal(X), not serpiente( X ). gusta( maría, X) :- animal(X), not( 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 ejemplo p :- a, b.
p :- c. El significado declarativo de este programa es: p es cierto si a y b son ciertos o si c es cierto p <==> (a  b)  c Podemos cambiar el orden de las cláusulas sin afectar el 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 es ahora: 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 La base de datos contiene nombres de personajes cuya inocencia o culpabilidad es conocida. 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). Prolog III

35 Problemas con cut y not 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). 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). 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. ?- culpable( heidi). Yes. 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 un término que contiene variables no instanciadas. Prolog III

39 Problemas con cut y not buena_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 Indefinido 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. Prolog III


Descargar ppt "III. Exploración en Prolog"

Presentaciones similares


Anuncios Google