Actividad
C5: Control del retroceso (backtracking)
Hemos
visto que el programador puede controlar la ejecución de los programas mediante
la ordenación de cláusulas y metas. Ahora estudiaremos otra forma de controlar
el retroceso (backtracking) en la ejecución mediante el corte (cut).
5.1
Prevención del retroceso
(A).
Estudie el programa de ejemplo cuya ejecución involucra retrocesos
innecesarios.
f(X,0) :- X < 3. % Regla 1
f(X,2) :- 3 =< X,
X < 6. % Regla 2
f(X,4) :- 6 =< X. % Regla 3
f(1,Y), 2<Y.
Su respuesta será false.
Ya que por lo que
entiendo el programa intentara la rama de la primera opción.
(B).
Pruebe el programa anterior con el experimento 1 (el programa falla). Escriba y
analice la segunda versión del programa incluyendo el símbolo del corte (cut) y
pruebe nuevamente esta versión del programa (experimento 1).
El símbolo cut es
PROLOG se denomina con el símbolo de “!”.
f(X,0) :- X < 3,
!. % Regla 1
f(X,2) :- 3 =< X,
X < 6, !. % Regla 2
f(X,4) :- 6 =< X. % Regla 3
f(1,Y), 2<Y.
Su respuesta será false.
Ya que al utilizar
corte, las otras opciones o reglas que hay no serán tomadas en cuenta.
(C).
Estudie el experimento 2 y pruebe la tercera versión del mismo programa.
En este caso ya se ha
cambiado las reglas como vemos a continuación, pero son las mismas que las
iniciales.
f(X,0) :- X < 3,
!.
f(X,2) :- X < 5,
!.
f(X,4).
Como dijimos
anteriormente esta es la forma más reducida de las reglas que utilizamos
anteriormente y eficaz, ya que con el tendremos una respuesta a la pregunta que
nos planteamos desde el principio:
f(1,Y), 2<Y.
Su respuesta es Y=4.
5.2
Ejemplos usando el corte (cut)
Estudie los tres ejemplos de programación definidos utilizando el símbolo del
corte (cut):
- Encuentra el valor máximo de dos números.
max
(X,Y,X) :- X >= Y, !.
max
(X,Y,Y).
En
este caso ingresaremos dos números y
como vemos PROLOG nos dará el máximo de ellos. Pero aquí utilizamos la opción
de corte así PROLOG no nos dará una opción false y así obtendremos un
resultado.
Ya
que si no utilizamos la opción de corte el programa tendrá un problema y por
eso nos daría la opción de false.
- Pertenencia a una lista.
miembro( X, [X | L]) :- !.
miembro( X, [Y | L]) :- miembro(X, L).
- Adicionar un elemento a una lista sin duplicación.
adicionar(X, L, L) :- miembro(X, L),
!.
adicionar(X, L, [X | L]).
5.3
Negación como falla.
Estudie los tres ejemplos definidos utilizando la negación (fail) como falla en
combinación con el símbolo del corte.
