La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria."— Transcripción de la presentación:

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

2 Prolog III2 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

3 Prolog III3 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). y la pregunta: ?- a(X). a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), d(X). b 2 (y). b 3 (w). c(w). d(z).

4 Prolog III4 [ a(X) ] [ [ a 1 (X) ] [ a 2 (X) ] ] [ [ [ b 1 (X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ c(X), d(X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = w [ [ [ c(w), d(w) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ d(w) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] Fail, backtrack [ [ [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = y [ [ [ b 2 (y) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ ] [ b 3 (X) ] ] [ a 2 (X) ] ] 1. Solución X = y [ [ [ b 3 (X) ] ] [ a 2 (X) ] ] La exploración en Prolog

5 Prolog III5 1. Solución X = y [ [ [ b 3 (X) ] ] [ a 2 (X) ] ] X = w [ [ [ b 3 (w) ] ] [ a 2 (X) ] ] [ [ [ ] ] [ a 2 (X) ] ] 2. Solución X = w [ [ a 2 (X) ] ] X = w [ [ a 2 (w) ] ] [ [ ] ] 3. Solución X = w La exploración en Prolog

6 Prolog III6 ?- a(X). T Calla1: ( 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 Redob3: ( 8) b(_G93) T Exitb3: ( 8) b(w) T Exit: a1: ( 7) a(w) X = w ; T Redoa2: ( 7) a(_G93) T Exita2: ( 7) a(w) X = w ; No a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), d(X). b 2 (y). b 3 (w). c(w). d(z). 1. Solución X = y 2. Solución X = w 3. Solución X = w

7 Prolog III7 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). a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), d(X). b 2 (y). b 3 (w). c(w). d(z). 1. Solución X = y 2. Solución X = w 3. Solución X = w

8 Prolog III8 El predicado cut (!) a(X) :- b(X). a(w). b(X) :- c(X), !, d(X). b(y). b(w). c(w). d(z). a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), !, d(X). b 2 (y). b 3 (w). c(w). d(z). Introduzcamos una ligerísima variación...

9 Prolog III9 [ a(X) ] [ [ a 1 (X) ] [ a 2 (X) ] ] [ [ [ b 1 (X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ c(X), !, d(X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = w [ [ [ c(w), !, d(w) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ !, d(w) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ d(w) ] ] [ a 2 (X) ] ] Fail, backtrack [ [ a 2 (X) ] ] X = w [ [ a 2 (w) ] ] [ [ ] ] 1. Solución X = w La exploración en Prolog ¡¡¡ Una única solución !!!

10 Prolog III10 El predicado cut (!) ?- a(X). T Calla 1 : ( 7) a(_G93) T Callb 1 : ( 8) b(_G93) T Callc : ( 9) c(_G93) T Exitc : ( 9) c(w) PODA b: T Calld : ( 9) d(w) T Faild : ( 9) d(w) T Failb 1 : ( 8) b(_G93) --- b 2 y b 3 han sido podadas --- T Redoa 2 : ( 7) a(_G93) T Exita 2 : ( 7) a(w) X = w ; No a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), !, d(X). b 2 (y). b 3 (w). c(w). d(z).

11 Prolog III11 ?- a(X). T Calla 1 : ( 7) a(_G93) T Call b 1 : ( 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 b 2 : ( 8) b(_G93) T Exit b 2 : ( 8) b(y) T Exit a 1 : ( 7) a(y) X = y ; T Redob 3 : ( 8) b(_G93) T Exitb 3 : ( 8) b(w) T Exit: a 1 : ( 7) a(w) X = w ; T Redoa 2 : ( 7) a(_G93) T Exita 2 : ( 7) a(w) X = w ; No ?- a(X). T Calla 1 : ( 7) a(_G93) T Callb 1 : ( 8) b(_G93) T Callc : ( 9) c(_G93) T Exitc : ( 9) c(w) PODA b: T Calld : ( 9) d(w) T Faild : ( 9) d(w) --- b 2 y b 3 han sido podadas --- no hay backtracking posible para la llamada ( 8) por lo que falla. T Failb 1 : ( 8) b(_G93) T Redoa 2 : ( 7) a(_G93) T Exita 2 : ( 7) a(w) X = w ; No

12 Prolog III12 El predicado cut (!) (como ejercicio) a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), d(X). b 2 (y). b 3 (w). c 1 (y). c 2 (z). d(z). a 1 (X) :- b(X). a 2 (w). b 1 (X) :- c(X), !, d(X). b 2 (y). b 3 (w). c 1 (y). c 2 (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 ?

13 Prolog III13 [ a(X) ] [ [ a 1 (X) ] [ a 2 (X) ] ] [ [ [ b 1 (X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [[[ c 1 (X), d(X) ] [ c 2 (X), d(X) ]] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = y [ [[[ c 1 (y), d(y) ] [ c 2 (X), d(X) ]] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [[[ d(y) ] [ c 2 (X), d(X) ]] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] Fail, backtrack [ [ [ c 2 (X), d(X) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = z [ [ [c 2 (z), d(z) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [d(z) ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ ] [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] 1. Solución X = z

14 Prolog III14 [ [ [ b 2 (X) ] [ b 3 (X) ] ] [ a 2 (X) ] ] X = y [ [ [ b 2 (y) ] [ b 3 (X) ] ] [ a 2 (X) ] ] [ [ [ ] [ b 3 (X) ] ] [ a 2 (X) ] ] 2. Solución X = y [ [ [ b 3 (X) ] ] [ a 2 (X) ] ] X = w [ [ [ b 3 (w) ] ] [ a 2 (X) ] ] [ [ [ ] ] [ a 2 (X) ] ] 3. Solución X = w [ [ a 2 (X) ] ] X = w [ [ a 2 (w) ] ] [ [ ] ] 4. Solución X = w

15 Prolog III15 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

16 Prolog III16 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; false. ?- incluido(a,[a,b,a,c,o],R). R = [b, a, c, o] ; R = [c, o] ; false.

17 Prolog III17 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.

18 Prolog III18 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

19 Prolog III19 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.

20 Prolog III20 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 ).

21 Prolog III21 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.

22 Prolog III22 ?- 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

23 Prolog III23 ?- 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 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 Lanzarote T Exit: ( 8) write('Cuadernos de Lanzarote') 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('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('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

24 Prolog III24 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.

25 Prolog III25 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

26 Prolog III26 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).

27 Prolog III27 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.

28 Prolog III28 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

29 Prolog III29 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 ).

30 Prolog III30 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.

31 Prolog III31 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

32 Prolog III32 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)

33 Prolog III33 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)

34 Prolog III34 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.

35 Prolog III35 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).

36 Prolog III36 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.

37 Prolog III37 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)).

38 Prolog III38 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.

39 Prolog III39 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 No

40 Prolog III40 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.


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

Presentaciones similares


Anuncios Google