III. Exploración en Prolog

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

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 Presentation

Transcript of III. Exploración en Prolog

Page 1: III. Exploración en Prolog

Prolog III 1

III. Exploración en

Prolog

Jorge Cabrera GámezDepartamento de Informática y Sistemas

Universidad de Las Palmas de Gran Canaria

Page 2: III. Exploración en Prolog

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

Page 3: III. Exploración en Prolog

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).

Page 4: III. Exploración en Prolog

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

Page 5: III. 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

Page 6: III. 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

Page 7: III. Exploración en Prolog

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

Page 8: III. Exploración en Prolog

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 ...

Page 9: III. Exploración en Prolog

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 !!!

Page 10: III. Exploración en Prolog

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).

Page 11: III. Exploración en Prolog

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

Page 12: III. Exploración en Prolog

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 ?

Page 13: III. Exploración en Prolog

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

Page 14: III. Exploración en Prolog

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

Page 15: III. Exploración en Prolog

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

Page 16: III. Exploración en Prolog

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.

Page 17: III. Exploración en Prolog

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.

Page 18: III. Exploración en Prolog

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

Page 19: III. Exploración en Prolog

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.

Page 20: III. Exploración en Prolog

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).

Page 21: III. Exploración en Prolog

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.

Page 22: III. Exploración en Prolog

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

Page 23: III. Exploración en Prolog

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

Page 24: III. Exploración en Prolog

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.

Page 25: III. Exploración en Prolog

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

Page 26: III. Exploración en Prolog

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).

Page 27: III. Exploración en Prolog

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.

Page 28: III. Exploración en Prolog

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

Page 29: III. Exploración en Prolog

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 ).

Page 30: III. Exploración en Prolog

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.

Page 31: III. Exploración en Prolog

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

Page 32: III. Exploración en Prolog

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)

Page 33: III. Exploración en Prolog

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)

Page 34: III. Exploración en Prolog

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.

Page 35: III. Exploración en Prolog

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).

Page 36: III. Exploración en Prolog

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.

Page 37: III. Exploración en Prolog

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)).

Page 38: III. Exploración en Prolog

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.

Page 39: III. Exploración en Prolog

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

Page 40: III. Exploración en Prolog

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.