Está en la página 1de 25

Control en la Programacin Lgica

Dra. Gabriela F. Minetti

NILLSON, U. y MALUSZYNSKI, J.: Logic, programming and prolog. Segunda Edicin. John Willey & Sons. Chichester (1995). (Cap. 5). STERLING, L., SHAPHIRO, E., y WARREN, D. H. D.: The art of Prolog. Advanced Programming Techniques (Segunda Edicin). The MIT Press (1994). (Caps. 11 y 14).

1.
2. 3. 4.

Control mediante el orden de relaciones y literales.


Control con Cortes. Distintos usos del corte. Control mediante el uso de la recursividad de cola.

pertenece(X,[X|_]). pertenece(X,[_|Y]):pertenece(X,Y).

pertenece(X,[_|Y]):pertenece(X,Y). pertenece(X,[X|_]).

?- pertenece(X,[a,b,c]).
X=a; X=b; X=c; No X=c; X=b; X=a; No

El orden de las relaciones determina la secuencia en que se obtienen las soluciones, modificando la eficiencia del programa.

Sugerencia: escribir los hechos antes que las reglas del mismo predicado.

escritoPor(tomSawyer,markTwain).

tipo(romeoYjulieta,drama).

escritoPor(oliverTwist,charlesDickens).

tipo(tomSawyer,novela).

escritoPor(romeoYjulieta,williamShakespeare). tipo(oliverTwist,novela). escritoPor(elEscarabajodeOro,edgarAllanPoe). tipo(elEscarabajodeOro,policial)

escribeNovela(X):tipo(L,novela), escritoPor(L,X).

escribeNovela(X):escritoPor(L,X), tipo(L,novela).

?-escribeNovela(Z). Z=markTwain; Z=charlesDickens; No

El orden de los literales en el cuerpo de una regla afecta el espacio de bsqueda y la complejidad de los cmputos lgicos. Sugerencia: para optimizar el orden de bsqueda suele ser necesario reordenar los literales, introduciendo las condiciones de prueba lo antes posible.

1.

Control mediante el orden de relaciones y literales.


1. Predicado de corte. 2. Tipos de corte.

2.

Control con Cortes.

3.

4.

Distintos usos del corte. Control mediante el uso de recursividad de cola.

El predicado de corte (cut) ! limita la bsqueda y el backtracking, eliminando todos los puntos de backtracking anteriores dentro del predicado donde est definido. Existen dos razones fundamentales para utilizar el corte:

1. Para aumentar la eficiencia. Se eliminan puntos de backtracking que se sabe no arriban a ninguna solucin. 2. Para modificar el comportamiento del programa. Se eliminan puntos de backtracking que podran dar soluciones vlidas.

ultimoMayor([X,Y|Xs],[Y|Ys]):X>Y,ultimoMayor([X|Xs],Ys).
ultimoMayor([X,Y|Xs],Ys):X=Y,ultimoMayor([Y|Xs],Ys). ultimoMayor([X,Y|Xs],[X|Ys]):X<Y,ultimoMayor([Y|Xs],Ys). ultimoMayor([X],[X]). ultimoMayor([],[]).

ultimoMayor([X,Y|Xs],[Y|Ys]):X>Y,!,ultimoMayor([X|Xs],Ys). ultimoMayor([X,Y|Xs],Ys):X=Y,!,ultimoMayor([Y|Xs],Ys).

ultimoMayor([X,Y|Xs],[X|Ys]):X<Y,!,ultimoMayor([Y|Xs],Ys).
ultimoMayor([X],[X]). ultimoMayor([],[]).

?-ultimoMayor([2,4,0],Z).

Z=[2,0,4]; No

Operacionalmente, el efecto del corte es el siguiente:

! se satisface y bloquea todas las opciones a

seguir (puntos de backtracking) cuando el objetivo padre se unifica con la cabeza de la clusula que lo contiene.

Las siguientes implicaciones clarifican la definicin anterior: 1. un corte poda todas las clusulas debajo de l. 2. un corte poda todas las soluciones alternativas de la conjuncin de literales que aparezcan a su izquierda en la clusula. 3. el corte no afecta a los literales que estn a su derecha en la sentencia.

Generalizando, el efecto de corte en una clusula C de la forma A:-B1,,BK,!,Bk+1,Bn, es el siguiente:


1.Si el actual objetivo G se unifica con A y B1,,BK, se satisfacen, entonces se fija la eleccin de esta clusula para reducir G; ignorndose cualquier otra alternativa de A que pueda unificarse con G. 2.Adems, si los literales Bi con i>k fallan, la vuelta atrs (bactracking) slo puede hacerse hasta el corte. Podndose del rbol las opciones restantes de Bi con ik.

3.Si el backtracking alcanza el corte, entonces dicho corte fracasa y la bsqueda contina desde la ltima opcin antes de elegir a C.

En la literatura se distinguen dos tipos de corte considerando si afectan o no el significado del programa:
Cortes verdes (green cuts). Cortes rojos (red cuts).

minimo(X,Y,X):-XY. minimo(X,Y,Y):-X>Y.
Versin 2 con corte verde

Versin sin cortes

minimo(X,Y,X):-XY,!. minimo(X,Y,Y):-X>Y.

prog(m,l). prog(m,a). prog(l,c). prog(l,an). prog(a,ma). prog(an,o). antecesor(A,B):-prog(A,B). antecesor(A,B):-prog(A,C), antecesor(C,B). prog(m,l). prog(m,a). prog(l,c). prog(l,an). prog(a,ma). prog(an,o). antecesor(A,B):-prog(A,B). antecesor(A,B):-prog(A,C), !,antecesor(C,B).
Versin con cortes rojo

Versin sin cortes

1. 2. 3.

1. Confirmacin de la eleccin de una clusula. 2. Combinacin corte + fallo. 3. Generacin y Prueba.


1. La negacin como fallo.

Control mediante el orden de relaciones y literales. Control con Cortes. Distintos usos del corte.

4.

Control mediante el uso de recursividad de cola.

La combinacin del predicado de corte, !, y el predicado fail permite descartar opciones tras haberse comprobado una o varias condiciones.

sacerdote(X):sacerdote(X):sacerdote(X):sacerdote(X):-

mujer(X),!,fail. casado(X) ,!,fail. edad(X,E),E<25,!,fail. votos(X).

Se implementa mediante los predicados: call, ! y fail.


not(G):- call(G),!,fail. not(G).

La negacin como fallo

La negacin como fallo La terminacin de not(G) depende de la terminacin de G.


estudianteSoltero(X) :- not(casado(X)),estudiante(X). estudiante(pedro). casado(juan).

El orden de los objetivos influyen en los resultados: La negacin como fallo funciona correctamente cuando G est completamente instanciado.
?-estudianteSoltero(X) No

1. Una serie de objetivos generan soluciones candidatas va backtracking. 2. Otros objetivos verifican dichas soluciones. 3. Se obtiene una solucin que verifique las pruebas.

! es til para culminar una secuencia de generacin y prueba en programas estructurados de la siguiente forma:

ordenar(X,Y):permutar(X,Y), ordenada(Y), !.

% generacin % prueba % obtencin

Control en la Programacin Lgica


1. Control mediante el orden de relaciones y literales. 2. Control con Cortes. 3. Distintos usos del corte. 4. Control mediante el uso de recursividad de cola.

NILLSON, U. y MALUSZYNSKI, J.: Logic, programming and prolog. Segunda Edicin. John Willey & Sons. Chichester (1995). (Cap. 5). STERLING, L., SHAPHIRO, E., y WARREN, D. H. D.: The art of Prolog. Advanced Programming Techniques (Segunda Edicin). The MIT Press (1994). (Caps. 11 y 14).

También podría gustarte