Control

Antes solo un recordatorio: las variables lógicas no permiten asignación destructiva. Una vez asignado un valor ese se le queda a menos que se le quite por medio de backtracking

Toda la manipulación de datos se hace por medio de unificación

El programador puede afectar la ejecución de un programa cambiando el orden de las clásulas y de las metas

Prolog tiene un predicado especial llamado ``CUT'' (!) que puede afectar el comportamiento procedural de los programas

Con el ! podemos prevenir Backtracking

Función principal: reducir el espacio de búsqueda de soluciones cortandolo dinámicamente

Puede eliminar fácilmente el sentido declarativo de los programas!!,

Para ver su uso más fácil, consideremos una función que tiene predicados mutuamente exclusivos. e.g., una función escalón:

f(X,0) :- X < 3.
f(X,2) :- X >= 3, X < 6.
f(X,4) :- X >= 6.
Si preguntamos: ?- f(1,Y), 2 < Y. Prolog a través del backtracking trata 2 soluciones que se ven que van a fallar

Las 3 reglas son mutuamente exclusivas por lo que en el momento de que una jala, no tiene sentido en tratar con las otras 2. Esto puede hacerse con el !.

f(X,0) :- X < 3, !.
f(X,2) :- X >= 3, X < 6, !.
f(X,4) :- X >= 6.

Todavía podemos reducir más el código: Idea: si la primera cláusula falla ya sabemos que $X >= 3$ (lo mismo para la primera condición de la tercera cláusula)

f(X,0) :- X < 3, !.
f(X,2) :- X < 6, !.
f(X,4).
En principio da el mismo resultado, pero le quitamos el sentido lógico (si le quitamos los cuts nos da varias soluciones)

Para entender más claramente la función del CUT:

Meta Padre: la meta que apareó la cabeza de la cláusula que tiene el !

Cuando se encuentra el ! como meta, ésta se cumple, pero ``compromete'' al sistema a todas las opciones hechas entre la meta padre y el ! (i.e., las otras posibles opciones entre la meta padre y el ! se eliminan)


\begin{displaymath}H :- B_1, B_2, \ldots, B_n, !, B_{n+1}, \ldots, B_z. \end{displaymath}

e.g., (poner árbol AND/OR)

P :- Q, R. 
P :- S, !, T. 
P :- U, V.
A :- B, P, C.
Afecta el comportamiento de ``P'' pero no de ``A''

Usos:

Que hace ! ?

e.g.,

max(X,Y,X) :- X >= Y, !.
max(X,Y,Y) :- X < Y.
De hecho Bratko en su libro quita la condición de la 2a cláusula, sin embargo esto solo funciona si preguntas por el Max, pero falla si preguntas: ?- max(4,2,2).

Posible solución:

max(X,Y,Z) :- X >= Y, !, Z = X.
max(X,Y,Y).

Puede servir para salirse al encontrar la 1a. solución

member_ck(H,[H|_]) :- !.
member_ck(H,[_|T]) :-
     member_ck(H,T).

Añade un elemento, pero solo si no está en la lista:

anade(E,L,L) :- member(E,L), !.
anade(E,L,[E|L]).
Es difícil hacer lo mismo sin el !



Subsections
emorales 2012-05-03