Tema 3.2.2

La seleccion if-then-else, se utiliza para evaluar condiciones segun el sentido que le quiera dar el programador o el usuario.

Se interpreta en dos condiciones con la condicion If-then y la parte else.

Se utiliza la if-then para indicar si la instruccion es verdadera segun la condicion que se halla instalado.

Y el else se utiliza para evaluar la instruccion si no fuese verdadera.

Dependiendo la evaluacion de cada condicion se programa que es lo que se va a hacer con cada caso sea el del if-then o el del else.

Tema Anterior: 3.2.1 Secuencias
Siguiente Tema: 3.2.3 Mientras While
Regresar al TEMARIO: Matematicas Computacion


REGLA DE PRUEBA DE IF THEN

Sea una instrucción IF-THEN:

{P}

    IF  B THEN S 

{Q}

Es decir la Instrucción

IF-THEN tiene dos partes, para las cuales se debe realizar lo que a continuación se indica:

a) El lado Then: Que ocurre cuando B se cumple y, se ejecuta la instrucción S terminando el estado de las variables de acuerdo con Q. Esta parte tiene como precondición dada {P & B} la cual representa el estado de las variables antes de que S se ejecute. Una vez que S se ejecuta, se tiene como postcondición a {Q}, es decir la postcondición de toda la instrucción IF-THEN. Esto significa que una condición necesaria (pero no suficiente) para que sea correcta la instrucción {P} IF THEN S {Q} es que la instrucción {P & B} S {Q} sea correcta. Esto puede verificarse, siguiendo los tres pasos de la Regla de Prueba en Reversa (RPR). El primer paso de RPR es simple, ya que Pdada es simplemente {P&B}. La obtención de la precondición derivada Pder para el lado del Then, se obtiene entonces a partir del conjunto {S,Q}. La verificación de Pdada => Pder se puede realizar entonces usando una tabla de verdad o, por resolución.

b) El lado Falso: Que ocurre cuando B no se cumple. Esta parte los programadores, por lo general, no la consideran como parte del Then, no obstante que formalmente está presente. Puesto que el lado falso de la instrucción IF-THEN, no contiene ninguna instrucción, no tenemos fragmento de código a verificar. Sin embargo se debe cumplir la fórmula P & ~B =>Q. Esto se debe a que para que el control de ejecución tome el camino de lado falso se debe haber cumplido la fórmula P y luego la fórmula ~B; de esta forma durante el camino del lado falso se debe cumplir P & ~B. Una vez que se llega al final del Then se debe cumplir la postcondición Q, de modo que la implicación de P &~B => debe ser una fórmula válida.

En resumen, de acuerdo con lo anterior un IF-THEN se verifica de la siguiente manera

PASO1: VERIFICACION DEL LADO DEL THEN.

      1-A: IDENTIFICACION Pdada: 

               Pdada == { P & B} 

1-B: DETERMINACION DE Pder.

               Pder se obtiene con  Q y el fragmento de código S del lado del then.

Esto se expresa en la forma:

                     {Q, S} |- Pder 

que significa que a partir de la postcondición Q y el fragmento de código S del lado del Then se deduce (o debe deducirse) la precondición derivada Pder del lado del Then (el símbolo |- se lee se “se deduce”).

1-C: VERIFICAR SI ES VALIDO:

                   Pdado |-  Pder 

PASO 2: VERIFICACION DEL LADO ELSE.

Cuando la condición B no se cumple, no se entra al lado then, de modo que se debe verificar si es válido:

   (P & ~B) → Q 

EJEMPLO

Verificar si el siguiente fragmento de código es correcto:

P = = { X = X’}

IF X < 0 then X = -X

Q= = { (X’ < 0 => X = - X’) & (X’ >= 0 => X = X’) }

SOLUCION

PASO 1:PRUEBA P1(VERIFICACION DEL LADO DEL THEN)

1-A

Pdada = = {P & B}

 == { (X = X’ & X <0} 

1-B:

Pder = = { (X’ < 0 => X = - X’) & (X’ >= 0 => X = X’) } [X := -X]

= = { (X’ < 0 => -X = - X’) & (X’ > =0 => -X = X’) }

1-C Verificar Pdada → Pder

Construimos una tabla de verdad con 1-A y con una 1-B:

(X = X’ & X <0) => (X’ < 0 =>-X = - X’) & (X’ >= 0 => -X = X’)

      V           V                 V             V                 F 


              V                             V                                     V 


              V                                                  V 

                              V 

PASO 2: VERIFICAR P & ~B => Q

X = X’ & ~( X <0) => (X’ < 0 => X = - X’) & (X’ >= 0 => X = X’)

   V         V     F 

            V                             F              V                 V                 V 

             V                                 V                                    V 

             V                                                       V 

                                  V 

En consecuencia, este programa es correcto.

REGLA DE PRUEBA DE IF THEN ELSE

Dada una instrucción if-then-else, de la forma:

{P}

IF B THEN

         S1 

ELSE

        S2 

{Q}

Para verificar esta instrucción se deben realizar dos pruebas:

PASO1: VERIFICAR

{P & B } S1 {Q}

PASO 2: VERIFICAR

{P & ~B} S2 {Q}

EJEMPLO

{TRUE}

IF X>= Y THEN MAX := X ELSE MAX:= Y

{X >=Y & MAX = X) OR (X<Y & MAX = Y)

SOLUCION

PRUEBA 1:

Se debe probar si el siguiente programa es correcto:

{TRUE & X>= Y } MAX := X {X >= Y & MAX = X) OR (X<Y & MAX = Y)

donde:

Pdada =={ X>=Y}

y Pder se obtiene reemplazando X en lugar de MAX en la postcondición, es decir:

Pder = = {{X >= Y & X= X) OR (X<Y & X = Y)}

Ahora verificamos si Pdada => Pder es una fórmula válida. Para ello usamos la tabla de verdad:

[X>= Y ] => {X >= Y & X= X) OR (X<Y & X = Y}

     V                     V           V                F 

     V                            V                       F 

     V                                            V 

                  V 

En consecuencia el programa es correcto.

DETERMINACION DE UNA PRECONDICION DE UN IF-THEN-ELSE

Dada una instrucción IF-THEN-ELSE para la cual no contamos con su precondición:

{?} IF B THEN S1 ELSE S2 {Q}

La precondición se obtiene como sigue:

P= (P1 & B) OR (P2 & ~B)

Donde:

P1= precondición derivada del lado del then.

P2= precondición derivada del lado del else.

EJEMPLO:

{?} If x <0 then y := x else y := x-2 {−1 < = y < = 4}

Solución:

La precondición derivada del lado se obtiene reemplazando en la postcondición x por y para obtener P1 del lado del then, mientras que se reemplaza y por x-2 para obtener P2 del lado del else. Es decir:

P1 == {−1 < = y < = 4} [y:=x] =={−1 < = x < = 4}

P2 =={−1 < = y < = 4} [y:=x-2]

== {−1 < = x-2 < = 4}

== {1 < = x < = 6} De esta forma la precondición buscada es:

P =={−1 < = x < = 4} or {1 < = x < = 6}

EJERCICIO:

Verificar si es correcto el siguiente fragmento de programa:

3 < =

IF X <0 THEN Y := -X ELSE Y:= X

{2 < = Y < = 4}