Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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).
escribeNovela(X):tipo(L,novela), escritoPor(L,X).
escribeNovela(X):escritoPor(L,X), tipo(L,novela).
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.
2.
3.
4.
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
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.
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
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
1. 2. 3.
Control mediante el orden de relaciones y literales. Control con Cortes. Distintos usos del corte.
4.
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):-
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), !.
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).