martes, 28 de mayo de 2013

ActividadC5


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.

 

No hay comentarios:

Publicar un comentario