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

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

Embed Size (px)

Citation preview

Page 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

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: Prolog III1 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 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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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: Prolog III1 III. Exploración en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

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.