Sei sulla pagina 1di 20

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS

UNIDAD UNO - SEMANA DOS


CORRECCIÓN DE PROGRAMAS ITERATIVOS
AUTOR: ALEJANDRO SOTELO ARÉVALO

TABLA DE CONTENIDO

1. VERIFICACIÓN DE ALGORITMOS 2
2. SEMÁNTICA AXIOMÁTICA 2
3. TEOREMAS DE CORRECCIÓN DE PROGRAMAS 3
3.1. SKIP (INSTRUCCIÓN VACÍA) 3
3.2. ABORT (TERMINACIÓN ANORMAL) 4
3.3. ASIGNACIÓN 5
3.4. CONCATENACIÓN (SECUENCIAS DE PROGRAMAS) 7
3.5. SELECCIÓN (INSTRUCCIONES CONDICIONALES) 8
3.6. REPETICIÓN (CICLOS) 11
EN RESUMEN 19
PARA TENER EN CUENTA 20

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
1
1. VERIFICACIÓN DE ALGORITMOS

La verificación de algoritmos se encarga del estudio de las técnicas necesarias para la


demostración formal de la corrección de programas en base a su especificación, con el
objetivo de probar matemáticamente que un algoritmo funciona en todos los casos, de
acuerdo a su especificación. Se dice que un programa es correcto con respecto a su
especificación si y sólo si para todo estado que satisface su precondición, después de
ejecutar el programa, se termina en un estado que satisface su poscondición.

La teoría que estudiaremos sobre la verificación de programas se utilizará luego para


introducir una metodología que nos permita diseñar programas concebidos para ser
correctos con respecto a su especificación, de tal forma que la demostración de que el
algoritmo funciona esté implícitamente incluida en el proceso que se siguió para construirlo.

2. SEMÁNTICA AXIOMÁTICA

La Semántica Axiomática establece el significado de los programas mediante axiomas


formales que describen bajo qué condiciones éstos son correctos con respecto a su
especificación.

Para demostrar que un programa en GCL es correcto con respecto a una especificación dada
sería poco práctico construir un diagrama de flujo que lo simule, considerar todas las posibles
computaciones en una máquina de prueba, y revisar en cada uno de los flujos de ejecución
que el programa no aborte y que termine en un estado que cumpla la poscondición. La
semántica axiomática ofrece un mecanismo práctico, independiente de la máquina y con
fundamento matemático para demostrar la corrección de programas con respecto a su
especificación.

Durante la lectura, sea IF una abreviación del programa


if B1  S1
[] B2  S2
...
[] Bn  Sn
fi
y DO una abrevación del programa
do B1  S1
[] B2  S2
...
[] Bn  Sn
od

El primer logro consiste en definir recursivamente la función , que representa la


precondición más débil para el programa con respecto a la poscondición .

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
2
Tabla 1: Definición recursiva de la función .
Instrucción Precondición más débil
skip (instrucción vacía)
abort (terminación
anormal)
Asignación
Concatenación
Selección (condicionales)
Repetición (ciclos).
donde

Recordemos que la expresión se lee el programa es correcto con respecto a la


precondición y a la poscondición , o simplemente es correcto con respecto a su
especificación. Operacionalmente hablando, es verdadero si y sólo si para todo
estado que satisface la precondición , al ejecutar el programa , se termina, llegando a un
estado que satisface la poscondición . La propiedad nos
permite enunciar los teoremas de corrección de programas:

Tabla 2: Teoremas de corrección de programas.


Instrucción Precondición más débil
skip (instrucción vacía)
abort (terminación
anormal)
Asignación

Concatenación
Selección (condicionales)
Repetición (ciclos).

En general, como es tedioso el cálculo de precondiciones más débiles, los teoremas de


corrección enunciados para la concatenación, la selección y la repetición no son adecuados.
Nuestro siguiente logro será exhibir teoremas de corrección prácticos y fáciles de aplicar.

3. TEOREMAS DE CORRECCIÓN DE PROGRAMAS

3.1. SKIP (INSTRUCCIÓN VACÍA)

Un skip es correcto con respecto a una especificación dada si y sólo si la precondición implica
a la poscondición.

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
3
Tabla 3: Demostración de la corrección de algunos programas de ejemplo.
Ejemplo 1:
Demuestre la corrección del siguiente programa.
var n: ;
{Pre Q: n3}
skip
{Pos R: n3}
 Probamos que la precondición implica a la poscondición:

= Cálculo proposicional – Reflexividad de : 

Ejemplo 2:
Demuestre la corrección del siguiente programa.
var n: ;
{Pre Q: n5}
skip
{Pos R: n3}
 Probamos que la precondición implica a la poscondición:

= Para todo número real mayor o igual que , se cumple que también es mayor o igual que 

3.2. ABORT (TERMINACIÓN ANORMAL)

Un abort es correcto con respecto a una especificación dada si y sólo si la precondición nunca
se cumple.

Tabla 4: Demostración de la corrección de algunos programas de ejemplo.


Ejemplo 1:
Demuestre la corrección del siguiente programa.
var x: ;
{Pre Q: false}
abort
{Pos R: x=5}
 Probamos que la precondición nunca se cumple:

= Cálculo proposicional – Reflexividad de : 

Ejemplo 2:
Demuestre la corrección del siguiente programa.
var x: ;
{Pre Q: x2<-3}
abort
{Pos R: x=5}

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
4
 Probamos que la precondición nunca se cumple:

=  – siempre es falso porque no existe un número real que al cuadrado sea menor que – 

= Cálculo proposicional – Reflexividad de : 

3.3. ASIGNACIÓN

Una asignación es correcta con respecto a una especificación


dada si y sólo si la precondición implica a la poscondición con la sustitución textual
correspondiente a la asignación.

Es necesario aclarar que el de la izquierda representa una asignación mientras que el de


la derecha representa una sustitución textual. De ahora en adelante, para demostrar
cualquier implicación de la forma , suponemos el antecedente como hipótesis y luego
probamos que la consecuencia se cumple. Este método de demostración se conoce como
suponer el antecedente.

Tabla 5: Demostración de la corrección de algunos programas de ejemplo.


Ejemplo 1:
Demuestre la corrección del siguiente programa.
var x: ;
{Pre Q: true}
x:=5
{Pos R: x=5}
 Probamos que la precondición implica a la poscondición con la sustitución textual correspondiente:
Debemos demostrar que
Suponga el antecedente como hipótesis ( ).
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética – Reflexividad de la igualdad

Ejemplo 2 (SUMA DE NÚMEROS):


Demuestre la corrección del siguiente programa, que suma dos números reales y .
con a: ,b: ;
var r: ;
{Pre Q: true}
r:=a+b
{Pos R: r=a+b}
 Probamos que la precondición implica a la poscondición con la sustitución textual correspondiente:
Debemos demostrar que
Suponga el antecedente como hipótesis ( ).

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
5
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética – Reflexividad de la igualdad

Ejemplo 3 (SWAP):
Demuestre la corrección del siguiente programa, que intercambia el valor de dos variables y (swap).
con A: ,B: ;
var a: ,b: ;
{Pre Q: a=A  b=B}
a,b:=b,a
{Pos R: a=B  b=A}
 Probamos que la precondición implica a la poscondición con la sustitución textual correspondiente:
Debemos demostrar que
Suponga el antecedente como hipótesis ( , ).
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Hipótesis: 

= Hipótesis: 

= Cálculo proposicional – Identidad de : 

Ejemplo 4 (MÁXIMO ENTRE DOS VALORES A PARTIR DEL MÍNIMO):


Demuestre la corrección del siguiente programa, que halla el máximo entre dos valores y conociendo de
antemano el mínimo de éstos.
con a: ,b: ,min: ;
var max: ;
{Pre Q: (min=a  min=b)  mina  minb} // En otras palabras, min=ab
max:=a+b-min
{Pos R: (max=a  max=b)  maxa  maxb} // En otras palabras, max=ab
 Probamos que la precondición implica a la poscondición con la sustitución textual correspondiente:
Debemos demostrar que –
Suponga el antecedente como hipótesis:
 Hipótesis 1:
 Hipótesis 2:
 Hipótesis 3:
A probar que se cumple la consecuencia –

= Aplicación de la sustitución textual
– – – –
= Aritmética – Manipulación de igualdades y de desigualdades
– – – –
= Aritmética – Manipulación de igualdades y de desigualdades

= Aritmética – Manipulación de igualdades y de desigualdades

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
6
= Cálculo proposicional – Conmutatividad de y de 

= Hipótesis 1: ; Hipótesis 2: ; Hipótesis 3: 

= Cálculo proposicional – Identidad de : 

3.4. CONCATENACIÓN (SECUENCIAS DE PROGRAMAS)

Para probar que una secuencia de programas es correcta con respecto a una
precondición y a una poscondición , basta encontrar una aserción intermedia tal que:
1. sea correcto con respecto a la precondición y a la poscondición , y
2. sea correcto con respecto a la precondición y a la poscondición .

En otras palabras, si y sólo si existe un predicado tal que y


.

Colocando los programas de forma vertical es evidente la regla:

Gráfica 6: Corrección de una concatenación.


{Q} // Precondición Debe cumplirse que , es decir, que sea
S1; correcto con respecto a la pre y a la pos .
{C} // Aserción intermedia
S2 Debe cumplirse que , es decir, que sea
{R} // Poscondición correcto con respecto a la pre y a la pos .

Tabla 7: Demostración de la corrección de algunos programas de ejemplo.


Ejemplo 1 (SWAP CON TEMPORAL):
Demuestre la corrección del siguiente programa, que intercambia el valor de dos variables y usando una
variable temporal (swap con temporal).
con A: ,B: ;
var a: ,b: ,temp: ;
{Pre Q: a=A  b=B} // Precondición
temp:=a;
{C1: a=A  b=B  temp=A} // Primera aserción intermedia
a:=b;
{C2: a=B  b=B  temp=A} // Segunda aserción intermedia
b:=temp
{Pos R: a=B  b=A} // Poscondición
1. Probamos que el primer programa es correcto con respecto a su especificación ( ):
Fragmento de código a demostrar:
{Pre Q: a=A  b=B} // Precondición
temp:=a
{C1: a=A  b=B  temp=A} // Primera aserción intermedia
Por el teorema de corrección de asignaciones, debemos demostrar que

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
7
Suponga el antecedente como hipótesis ( , ).
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Hipótesis: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

2. Probamos que el segundo programa es correcto con respecto a su especificación ( ):


Fragmento de código a demostrar:
{C1: a=A  b=B  temp=A} // Primera aserción intermedia
a:=b
{C2: a=B  b=B  temp=A} // Segunda aserción intermedia
Por el teorema de corrección de asignaciones, debemos demostrar que
Suponga el antecedente como hipótesis ( , , ).
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Hipótesis: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

3. Probamos que el tercer programa es correcto con respecto a su especificación ( ):


Fragmento de código a demostrar:
{C2: a=B  b=B  temp=A} // Segunda aserción intermedia
b:=temp
{Pos R: a=B  b=A} // Poscondición
Por el teorema de corrección de asignaciones, debemos demostrar que
Suponga el antecedente como hipótesis ( , , ).
A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Hipótesis: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

3.5. SELECCIÓN (INSTRUCCIONES CONDICIONALES)


Código 8: Instrucción condicional IF anotada con su precondición, con su poscondición, y con aserciones intermedias.
{Pre Q: ...}
if B1  {QB1}S1{R}
[] B2  {QB2}S2{R}
...
[] Bn  {QBn}Sn{R}
fi

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
8
{Pos R: ...}

Para probar que un condicional es correcto con respecto a una precondición y a una
poscondición , demuestre los siguientes hechos por aparte:
1. La precondición implica la disyunción de las guardas : .
2. El primer comando es correcto con respecto a su especificación local : .
3. El segundo comando es correcto con respecto a su especificación local : .
4. ...
5. El -ésimo comando es correcto con respecto a su especificación local : .

En otras palabras, si y sólo si y para todo desde hasta se cumple que


.

Tabla 9: Demostración de la corrección de algunos programas de ejemplo.


Ejemplo 1 (VALOR ABSOLUTO):
Demuestre la corrección del siguiente programa, que calcula el valor absoluto de un número.
con x: ;
var r: ;
{Pre Q: true}
if x0  r:=x
[] x0  r:=-x
fi
{Pos R: r=abs(x)}
1. Probamos que la precondición implica la disyunción de las guardas ( ):

= Aritmética – Todo número real cumple que o que 

= Cálculo proposicional – Cero derecho de : 

2. Probamos que el primer comando es correcto con respecto a su especificación local ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Como gracias a la hipótesis, entonces el valor absoluto de es igual a (es decir, )

3. Probamos que el segundo comando es correcto con respecto a su especificación local


( – ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
9
A probar que se cumple la consecuencia –

= Aplicación de la sustitución textual

= Como gracias a la hipótesis, entonces el valor absoluto de es igual a – (es decir, – )

Ejemplo 2 (MÍNIMO ENTRE DOS VALORES):


Demuestre la corrección del siguiente programa, que halla el mínimo entre dos valores y .
con a: ,b: ;
var r: ;
{Pre Q: true}
if xy  r:=x
[] x>y  r:=y
fi
{Pos R: r=xy}
1. Probamos que la precondición implica la disyunción de las guardas ( ):

= Aritmética – Para todo par de números reales se cumple que ó que 

= Cálculo proposicional – Cero derecho de : 

2. Probamos que el primer comando es correcto con respecto a su especificación local ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Como gracias a la hipótesis, entonces el mínimo entre y es igual a (es decir, )

3. Probamos que el segundo comando es correcto con respecto a su especificación local ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Como gracias a la hipótesis, entonces el mínimo entre y es igual a (es decir, )

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
10
3.6. REPETICIÓN (CICLOS)

Por simplicidad, estudiaremos el teorema de corrección de ciclos de un solo comando


guardado. Ya vimos anteriormente que si el ciclo tiene varios comandos guardados, se puede
traducir en un ciclo con uno solo.

Código 10: Instrucción de repetición con un solo comando guardado.


do B  S
od

Aunque la regla es cierta, no nos ayuda en nada.


Para verificar la corrección de un DO de forma práctica se define:

Una inicialización , que es un programa en GCL que se ejecuta antes de comenzar el


ciclo, y que es muy útil para inicializar las variables del ciclo.
Una cota , que es una expresión de tipo natural que acota el número de iteraciones que le
faltan al ciclo para terminar su ejecución, y que debe decrecer en cada iteración del ciclo.
Una invariante , que es un predicado que debe satisfacerse antes y después de cada
iteración. Tiene gran importancia pues describe formalmente qué hace el ciclo.

Código 11: Instrucción de repetición DO anotada con precondición, poscondición, invariante y cota.
{Pre Q: ...} // Precondición Q
INIC;
{Inv P: ...} // Invariante P
{Cota t=...} // Cota t
do B  S
od
{Pos R: ...} // Poscondición R

Para probar que un ciclo es correcto con respecto a una precondición y a una
poscondición , demuestre los siguientes hechos por aparte:
1. La invariante se cumple antes de comenzar la ejecución del ciclo : .
2. La invariante se mantiene en cada iteración del ciclo : .
3. La poscondición se cumple al terminar la ejecución del ciclo : .
4. El ciclo termina su ejecución después de un número finito de iteraciones:
4.a. La cota siempre es un número natural : .
4.b. La cota decrece en cada iteración : .

Los ítems 1 y 2 se centran en demostrar que el predicado efectivamente es una invariante,


el ítem 4 se centra en demostrar que el ciclo eventualmente termina (mostrando que la
expresión efectivamente es una cota), y el ítem 3 demuestra que el ciclo funciona al
terminar su ejecución.

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
11
Si la cota siempre es un número natural y decrece iteración tras iteración, entonces el ciclo
obligatoriamente debe terminar su ejecución en un número finito de iteraciones. Esto pues,
si el ciclo ejecutara infinitas veces, entonces la cota decrecería infinitas veces y en algún
momento se volvería un número negativo violando así la condición de que la cota siempre es
un valor natural. Es importante aclarar que la cota no necesariamente debe decrecer de a
uno en uno en cada iteración: sólo basta con que decrezca.

Para no sobrecargar el formato de prueba, permitiremos que el ítem 4 sea demostrado


informalmente.

Tabla 12: Demostración de la corrección de algunos programas de ejemplo.


Ejemplo 1 (POTENCIACIÓN EN TIEMPO LINEAL):
Demuestre la corrección del siguiente programa, que calcula una potenciación usando multiplicaciones.
con a: ,n: ;
var r: ,i: ;
{Pre Q: n0  a0}
r,i:=1,0;
{Inv P: r=ai  0in}
{Cota t=n-i}
do in  r,i:=r*a,i+1
od
{Pos R: r=an}
1. La invariante se cumple antes de comenzar la ejecución del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética – Leyes de la potenciación: para todo (por hipótesis sabemos que )

= Aritmética: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

2. La invariante se mantiene en cada iteración del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética – Leyes de la potenciación y de las desigualdades


– –

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
12
= Como y (por hipótesis), entonces – . Por lo tanto, – – es cierto.

= Hipótesis: 

= Aritmética – Reflexividad de la igualdad; Cálculo proposicional – Identidad de : 

3. La poscondición se cumple al terminar la ejecución del ciclo ( ):

= Aritmética: 

Suponga el antecedente como hipótesis ( , , ).


A probar que se cumple la consecuencia

= Hipótesis: 

= Hipótesis: 

4. El ciclo termina su ejecución después de un número finito de iteraciones:


4.a. La cota siempre es un número natural:
La cota – siempre es un número natural porque:
 Como y son números enteros, entonces – es un valor entero.
 Como la invariante garantiza que , entonces –.
4.b. La cota decrece en cada iteración:
La cota – siempre decrece en cada iteración porque es constante y el valor de la variable
crece de a uno en uno en cada iteración gracias a la asignación del cuerpo del ciclo.
Ejemplo 2 (ALGORITMO DE LA DIVISIÓN):
Demuestre la corrección del siguiente programa, que dados dos números enteros tales que y ,
calcula el cociente y el residuo que se obtienen al dividir entre .
con b: ,c: ;
var q: ,r: ;
{Pre Q: b0  c>0}
q,r:=0,b;
{Inv P: b=q*c+r  0r}
{Cota t=r}
do rc  q,r:=q+1,r-c
od
{Pos R: b=q*c+r  0r<c}
1. La invariante se cumple antes de comenzar la ejecución del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
13
2. La invariante se mantiene en cada iteración del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , , ).
A probar que se cumple la consecuencia –

= Aplicación de la sustitución textual
– –
= Aritmética

= Aritmética

= Aritmética

= Hipótesis: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

3. La poscondición se cumple al terminar la ejecución del ciclo ( ):

= Aritmética: 

Suponga el antecedente como hipótesis ( , , ).


A probar que se cumple la consecuencia

= Hipótesis: ; Hipótesis: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

4. El ciclo termina su ejecución después de un número finito de iteraciones:


4.a. La cota siempre es un número natural:
La cota siempre es un número natural porque es un número entero y gracias a la
invariante.
4.b. La cota decrece en cada iteración:
La cota siempre decrece en unidades en cada iteración gracias a la asignación –
del cuerpo del ciclo. Observe que la precondición asegura que .
Ejemplo 3 (ALGORITMO DE EUCLIDES PARA CALCULAR EL MÁXIMO COMÚN DIVISOR):
El máximo común divisor cumple las siguientes propiedades:
 Propiedad 1:
 Propiedad 2:
 Propiedad 3:
 Propiedad 4:
Usando las propiedades de la función , demuestre la corrección del siguiente programa, que dados dos
números naturales y , calcula el máximo común divisor de y .
con a: ,b: ;
var x: ,y: ;

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
14
{Pre Q: true}
x,y:=a,b;
{Inv P: gcd(x,y)=gcd(a,b)  y0}
{Cota t=y}
do y0  x,y:=y,x%y
od
{Pos R: x=gcd(a,b)}
1. La invariante se cumple antes de comenzar la ejecución del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética – Reflexividad de la igualdad

= Como se declaró como una constante natural, entonces 

= Cálculo proposicional – Identidad de : 

2. La invariante se mantiene en cada iteración del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Propiedad 4 del máximo común divisor: 

= Hipótesis: 

=  Como (por hipótesis), entonces está definido; Como (por hipótesis), entonces

= Cálculo proposicional – Identidad de : 

3. La poscondición se cumple al terminar la ejecución del ciclo ( ):

= Aritmética: 

Suponga el antecedente como hipótesis ( , , ).


A probar que se cumple la consecuencia

= Hipótesis: 

= Hipótesis: 

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
15
= Propiedad 3 del máximo común divisor: 

4. El ciclo termina su ejecución después de un número finito de iteraciones:


4.a. La cota siempre es un número natural:
La cota siempre es un número natural porque es un número entero y gracias a la
invariante.
4.b. La cota decrece en cada iteración:
La cota siempre decrece en cada iteración porque según la asignación del cuerpo
del ciclo, se está cambiando por que es menor que porque el residuo siempre es menor que
el divisor. Observe que está definido porque la guarda asegura que .
Ejemplo 4 (FUNCIÓN DE FIBONACCI):
La función de Fibonacci se define por la fórmula

– –
Demuestre la corrección del siguiente programa, que calcula el fibonacci de un número natural .
con n: ;
var a: ,b: ,i: ;
{Pre Q: n0}
a,b,i:=0,1,0;
{Inv P: a=fib(i)  b=fib(i+1)  0in}
{Cota t=n-i}
do i<n  a,b,i:=b,a+b,i+1
od
{Pos R: a=fib(n)}
1. La invariante se cumple antes de comenzar la ejecución del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética

= Definición de la función de Fibonacci: , ; Aritmética: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

2. La invariante se mantiene en cada iteración del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( , , , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
16
= Aritmética
– –
= Como y (por hipótesis), entonces – . Por lo tanto, – – es cierto.

= Definición de la función de Fibonacci: 

= Hipótesis: ; Hipótesis: 

= Aritmética – Reflexividad de la igualdad; Cálculo proposicional – Identidad de : 

3. La poscondición se cumple al terminar la ejecución del ciclo ( ):

= Aritmética: 

Suponga el antecedente como hipótesis ( , , , ).


A probar que se cumple la consecuencia

= Como y (por hipótesis), entonces 

= Hipótesis: 

4. El ciclo termina su ejecución después de un número finito de iteraciones:


4.a. La cota siempre es un número natural:
La cota – siempre es un número natural porque:
 Como y son números enteros, entonces – es un valor entero.
 Como la invariante garantiza que , entonces –.
4.b. La cota decrece en cada iteración:
La cota – siempre decrece en cada iteración porque es constante y el valor de la variable
crece de a uno en uno en cada iteración gracias a la asignación del cuerpo del
ciclo.
Ejemplo 5 (EVALUACIÓN DE UN POLINOMIO):
Sea – un polinomio de grado –
cuyos coeficientes son . Demuestre la corrección del siguiente programa, que evalúa el
polinomio en , retornando como resultado el valor de – .
con n: , b:array[0..n-1] of , a: ;
var sum: , pot: , i: ;
{Pre Q: n0}
sum,pot,i:=0,1,0;
{Inv P: sum=(k|0ki-1:b[k]*ak)  pot=ai  0in}
{Cota t=n-i}
do in  sum,pot,i:=sum+b[i]*pot,pot*a,i+1
od
{Pos R: sum=(k|0kn-1:b[k]*ak)}
1. La invariante se cumple antes de comenzar la ejecución del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( ).


A probar que se cumple la consecuencia

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
17

= Aplicación de la sustitución textual

= Aritmética (supongamos que no hay problema si en la expresión )

=  – porque no existe ningún tal que – ; Rango vacío: 

= Aritmética – Reflexividad de la igualdad; Aritmética: ; Hipótesis: 

= Cálculo proposicional – Identidad de : 

2. La invariante se mantiene en cada iteración del ciclo ( ):

= Teorema de corrección de asignaciones

Suponga el antecedente como hipótesis ( – , , , ).


A probar que se cumple la consecuencia

= Aplicación de la sustitución textual

= Aritmética
– –
= Como y (por hipótesis), entonces – . Por lo tanto, – – es cierto.

= Hipótesis: 

= Aritmética – Reflexividad de la igualdad

= Partición de rango:   –  

= Hipótesis: – 

= Aritmética – Reflexividad de la igualdad; Cálculo proposicional – Identidad de : 

3. La poscondición se cumple al terminar la ejecución del ciclo ( ):

= Aritmética: 

Suponga el antecedente como hipótesis ( – , , , ).


A probar que se cumple la consecuencia

= Hipótesis: 

= Hipótesis: – 

4. El ciclo termina su ejecución después de un número finito de iteraciones:


4.a. La cota siempre es un número natural:

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
18
La cota – siempre es un número natural porque:
 Como y son números enteros, entonces – es un valor entero.
 Como la invariante garantiza que , entonces –.
4.b. La cota decrece en cada iteración:
La cota – siempre decrece en cada iteración porque es constante y el valor de la variable
crece de a uno en uno en cada iteración gracias a la asignación
del cuerpo del ciclo.

EN RESUMEN
La verificación de algoritmos se encarga del estudio de las técnicas necesarias para la demostración
formal de la corrección de programas en base a su especificación, con el objetivo de probar
matemáticamente que un algoritmo funciona en todos los casos, de acuerdo a su especificación.
Se dice que un programa es correcto con respecto a su especificación si y sólo si para todo estado que
satisface su precondición, después de ejecutar el programa, se termina en un estado que satisface su
poscondición.
La semántica axiomática establece el significado de los programas mediante axiomas formales que
describen bajo qué condiciones éstos son correctos con respecto a su especificación.
La semántica axiomática ofrece un mecanismo práctico, independiente de la máquina y con
fundamento matemático para demostrar la corrección de programas con respecto a su
especificación.
Definición recursiva de la función :
Instrucción Precondición más débil
skip (instrucción vacía)
abort (terminación
anormal)
Asignación

Concatenación
Selección (condicionales)
Repetición (ciclos).
donde

Un skip es correcto con respecto a una especificación dada si y sólo si la precondición implica a la
poscondición.

Un abort es correcto con respecto a una especificación dada si y sólo si la precondición nunca se
cumple.

Una asignación es correcta con respecto a una especificación dada si y


sólo si la precondición implica a la poscondición con la sustitución textual correspondiente a la
asignación.

Para probar que una secuencia de programas es correcta con respecto a una precondición ya

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
19
una poscondición , basta encontrar una aserción intermedia tal que:
1. sea correcto con respecto a la precondición y a la poscondición , y
2. sea correcto con respecto a la precondición y a la poscondición .
Para probar que un condicional es correcto con respecto a una precondición y a una
poscondición , demuestre los siguientes hechos por aparte:
1. La precondición implica la disyunción de las guardas : .
2. El primer comando es correcto con respecto a su especificación local : .
3. El segundo comando es correcto con respecto a su especificación local : .
4. ...
5. El -ésimo comando es correcto con respecto a su especificación local : .
Para verificar la corrección de un DO de forma práctica se define:
 Una inicialización , que es un programa en GCL que se ejecuta antes de comenzar el ciclo, y que
es muy útil para inicializar las variables del ciclo.
 Una cota , que es una expresión de tipo natural que acota el número de iteraciones que le faltan al
ciclo para terminar su ejecución, y que debe decrecer en cada iteración del ciclo.
 Una invariante , que es un predicado que debe satisfacerse antes y después de cada iteración.
Para probar que un ciclo es correcto con respecto a una precondición y a una poscondición ,
demuestre los siguientes hechos por aparte:
1. La invariante se cumple antes de comenzar la ejecución del ciclo : .
2. La invariante se mantiene en cada iteración del ciclo : .
3. La poscondición se cumple al terminar la ejecución del ciclo : .
4. El ciclo termina su ejecución después de un número finito de iteraciones:
4.a. La cota siempre es un número natural : .
4.b.La cota decrece en cada iteración : .

PARA TENER EN CUENTA


En la siguiente lectura se tratará una metodología que nos permitirá diseñar programas concebidos
para ser correctos con respecto a su especificación, de tal forma que la demostración de que el
algoritmo funciona esté implícitamente incluida en el proceso que se siguió para construirlo.

ANÁLISIS Y VERIFICACIÓN DE ALGORITMOS


ALEJANDRO SOTELO ARÉVALO
20

Potrebbero piacerti anche