El corte es un predicado predefinido que no recibe argumentos. Se representa mediante un signo de admiraci�n (!). Sin duda, es el predicado m�s dif�cil de entender. El corte tiene la espantosa propiedad de eliminar los puntos de elecci�n del predicado que lo contiene.
Es decir, cuando se ejecuta el corte, el resultado del objetivo (no s�lo la cl�usula en cuesti�n) queda comprometido al �xito o fallo de los objetivos que aparecen a continuaci�n. Es como si a Prolog "se le olvidase" que dicho objetivo puede tener varias soluciones.
Otra forma de ver el efecto del corte es pensar que solamente tiene la propiedad de detener el backtracking cuando �ste se produce. Es decir, en la ejecuci�n normal el corte no hace nada. Pero cuando el programa entra en backtracking y los objetivos se recorren marcha atr�s, al llegar al corte el backtracking se detiene repentinamente forzando el fallo del objetivo.
�Ejemplo
Para entender de manera simple el uso del corte vamos a comparar dos predicados que solamente se diferencian en un corte:
% Sin corte. p(X,Y) :- X > 15, Y > 50. p(X,Y) :- X > Y, % Con corte. q(X,Y) :- X > 15, !, Y > 50. q(X,Y) :- X > Y,
Veamos que ocurre si ejecutamos el objetivo p(25,12):
- Obs�rve que ambas cl�usulas unifican con la cabeza, luego existen dos puntos de elecci�n que se anotan.
- Prolog entra por el primer punto de elecci�n (primera cl�usula) eliminandolo.
- Prolog ejecuta el primer objetivo del cuerpo (X>15), que tiene �xito.
- Prolog ejecuta el segundo objetivo del cuerpo (X>50), que falla.
- Empieza el backtracking.
- Se recorren ambos objetivos hacia atr�s pero no hay variables que se hayan ligado en ellos.
- Encontramos el segundo punto de elecci�n (segunda cl�usula) que detiene el backtracking eliminandolo en el proceso. La ejecuci�n contin�a hacia delante.
- Prolog ejecuta el cuerpo de la segunda cl�usula que consiste en X>Y. Este objetivo tiene �xito.
- El objetivo p(25,12) tiene �xito.
Ahora comprobamos lo que ocurre cuando �xiste el corte, ejecutamos q(25,12):
- Ambas cl�usulas unifican con la cabeza, luego existen dos puntos de elecci�n que se anotan.
- Prolog entra por el primer punto de elecci�n (primera cl�usula) eliminandolo.
- Prolog ejecuta el primer objetivo del cuerpo (X>15), que tiene �xito.
- Se ejecuta el segundo objetivo del cuerpo que es el corte. Por tanto, se eliminan todos los puntos de elecci�n anotados que son debidos al objetivo q(25,12). Solamente ten�amos uno, que se elimina.
- Prolog ejecuta el tercer objetivo del cuerpo (X>50), que falla.
- Empieza el backtracking.
- Se recorren ambos objetivos hacia atr�s pero no hay variables que se hayan ligado en ellos.
- No encontramos ning�n punto de elecci�n porque fueron eliminados por el corte.
- El objetivo p(25,12) falla.
Como puede comprobar, los resultados son sustacialmente diferentes. La segunda cl�usula del predicado q/2 ni siquiera ha llegado a ejecutarse porque el corte ha comprometido el resultado del objetivo al resultado de Y>15 en la primera cl�usula.
�Usos del corte
El corte se utiliza muy frecuentemente, cuanto m�s diestro es el programador m�s lo suele usar. Los motivos por los que se usa el corte son, por orden de importancia, los siguientes:
- Para optimizar la ejecuci�n. El corte sirve para evitar que por culpa del backtracking se exploren puntos de elecci�n que, con toda seguridad, no llevan a otra soluci�n (fallan). Para los entendidos, esto es podar el �rbol de b�squeda de posibles soluciones.
- Para facilitar la legibilidad y comprensi�n del algoritmo que est� siendo programado. A veces se situan cortes en puntos donde, con toda seguridad, no van a existir puntos de elecci�n para eliminar, pero ayuda a entender que la ejecuci�n s�lo depende de la cl�usula en cuesti�n.
- Para implementar algoritmos diferentes seg�n la combinaci�n de argumentos de entrada. Algo similar al comportamiento de las sentencias case en los lenguajes imperativos.
- Para conseguir que un predicado solamente tenga una soluci�n. Esto nos puede interesar en alg�n momento. Una vez que el programa encuentra una soluci�n ejecutamos un corte. As� evitamos que Prolog busque otras soluciones aunque sabemos que �stas existen.
�Corte y fallo
Es muy habitual encontrar la secuencia de objetivos corte-fallo: !,fail. El predicado fail/0 es un predicado predefinido que siempre falla. Se utiliza para detectar prematuramente combinaciones de los argumentos que no llevan a soluci�n, evitando la ejecuci�n de un mont�n de c�digo que al final va a fallar de todas formas.
� Copyright 2000-2001
Angel Fern�ndez Pineda.