Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Testing
Para asegurar que un programa es correcto es necesario
analizar todos los valores posibles de datos de entrada
(imposible cuando la cantidad es infinita).
• Precondiciones: son los asertos que deben cumplirse a la entrada de una tarea.
Si la tarea o instrucción se realiza sin que la precondición se cumpla no tendremos
garantía de los resultados obtenidos.
Mientras (B)
A
finMientras
(4-a) { I ^ B} ⇒ C≥0
(4-b) { I ^ B ^ C=T} A {C < T}
la acción es correcta.
En los pasos de la verificación del bucle, se
incorpora la invariante para construir triplas de
Hoare.
En los pasos que hay triplas se debe calcular la
pmd y luego probar la implicación.
En los pasos sin tripla, solo se analiza la
implicación.
(1) {P} A0 { I }
(2) {I ^ B} A {I}
(3) {I ^ ~B} ⇒ Q
(4-a) { I ^ B} ⇒ C≥0
(4-b) { I ^ B ^ C=T} A {C < T}
Verificar que el siguiente algoritmo, que calcula la suma de los elementos
de un arreglo con un recorrido de derecha a izquierda, cumple la
especificación para el siguiente invariante.
I = {x=(∑ i: n≤i <N: V[i]) ^ ( 0≤n≤N ) }
Constante N
entero V [N], x, n
{P: N≥0}
n=N I establece relación entre las variables del
bucle y además describe los distintos
x=0 estados por los que pasa el bucle
Mientras ( n ≠0)
x=x+V[n-1]
n=n-1
finMientras
{Q : x=(∑ i: 0≤i < N : V[i])}
El invariante se satisface antes de la primer iteración {P} A0 {I}
Esto es probar que la terna {P} n=N; x=0 {I} es correcta.
{P} ⇒ pmd ( n=N; x=0, I )
I
0 N
{P: N≥0}
pmd ≡ x n ≡ ( (0≤n≤N ) ^ x=( ∑ i: n ≤ i < N : V[i]) x0)n N n=N
x=0
Mientras ( n ≠0)
(I) x0≡ ( (0≤n≤N ^ 0=( ∑ i: n ≤ i < N : V[i]) ) I = {x=(∑ i: n ≤i <N: V[i]) ^ ( 0≤n≤N ) }
Dado que {P} ⇒ pmd las inicializaciones n=N y x=0 son correctas
El invariante se mantiene al ejecutar el cuerpo A del bucle {I ^ B} A {I}
Para demostrar que la terna {I ^ B} A {I} es correcta,
se debe probar que {I ^ B} ⇒ pmd ( A, I )
I^B ( 1)
n T
x=x+V[n-1]
n 1 x v[ n 1] n=n-1
n-1 < T x
x v[ n 1]
n x ≡ finMientras
≡ n -1 <T (1)
Hemos verificado que este algoritmo que suma los elementos de un arreglo de N
enteros, a partir del último elemento, cumple con la especificación dada, es decir
es correcto para ella.
Es un proceso que permite construir las instrucciones a partir
de la especificación preocupándose a lo largo de este proceso
de su corrección.
{I ^ B } A { I}
{P}
A0 condiciones iniciales. Se calcula pmd con incógnita
Mientras (B )
A1 Instrucción del cuerpo del bucle que se encarga
de mantener cierto el invariante Se calcula pmd con
incógnita
A2 representa las instrucciones que hacen que las variables
que intervienen en la expresión B avancen hacia la
condición de salida del bucle ( ¬B) ( hace que decrezca la
función cota). Al construir la Invariante se identifica A2
finMientras
{Q}
1. Obtener el invariante I y la condición del bucle B a partir de la postcondición Q,
teniendo en cuenta que se debe satisfacer
{I ^ ¬ B } => Q
En este paso se identifica la acción A2
2. Inicializar las variables (Diseñar A0 ) de tal manera que el invariante sea cierto al
comienzo del bucle y que cumpla que
{ P} A0 { I } Garantiza el cumplimiento del invariante al comenzar el ciclo
Acá se calcula la pmd, se introduce la incógnita . Una vez encontrado el valor de
inicialización se debe probar la implicación para asegurar que la acción es correcta.
3. Obtener el cuerpo del bucle A
{I ^ B } A1 { I}
Se calcula la pmd, se introduce la incógnita . Una vez identificada la expresión, se
debe probar la implicación para asegurar que la acción es correcta.
4. Diseñar la función cota C de la manera que
{I ^ B }=> C≥ 0 Se razona la implicación
5. Asegurarse que la función cota decrezca (garantiza la finalización del ciclo)
{I ^ B ^ C =T) } A2 {C<T} se calcula la pmd y luego se prueba la
implicacion
Derivar un programa que calcule la suma de los elementos de un arreglo
que contiene N componentes enteras , recorriendo el arreglo de derecha
a izquierda
Especificación
const int N
entero x
entero a[0..N)
{P: N ≥ 0}
A
{Q: x= (∑i: 0 ≤ i < N: a[i])}
Obtener invariante y guarda
Como la postcondición no está en forma conjuntiva, se utiliza la sustitución de una
constante por una variable. En la postcondición aparecen las constantes N y 0. Por
tanto, utilizando la técnica de reemplazo de constantes por variables
{Q: x= (∑i: 0 ≤ i < N: a[i])}
Se puede introducir una nueva variable que sustituya en la postcondición a una constante. En
este caso el invariante será la postcondición generalizada con esa nueva variable y la
condición del bucle será la negación de la igualdad entre la variable y la constante
sustituida.
Como el recorrido es de derecha a izquierda se reemplaza la cte 0 por la variable n
{I : x= <∑i: n ≤ i < N: a[i]>} {P}
B : ~( n=0) ≡ n ≠ 0 A0
Es necesario reforzar el invariante agregando el rango de Mientras (n ≠ 0)
variación de la variable n A1
{I : x= (∑i: n ≤ i < N: a[i]) ^ ( 0 ≤ n ≤ N )} A2
la guarda es entonces B: n ≠ 0 finMientras
{Q}
Inicializar las
variables, es decir diseñar A0 de modo que el invariante sea
cierto; esto es {P} A0 {I}
{I : x= ∑i: n ≤ i < N: a[i]> ^ ( 0 ≤ n ≤ N )}
Se debe inicializar x y n, variables que aparecen en el invariante. Se debe elegir
expresiones enteras E y F tales que se garantice el cumplimiento del
invariante, esto es encontrar la precondición más débil.
pmd (x= F, n = E, I) ≡ (F= ∑i: E≤i<N: a[i]) ^ (0≤ E ≤ N) ) {P: N ≥ 0}
{P}
x x + a[n-1] (2) (1)
n= N
De (3): (0 < n ≤ N) ≡ (0 ≤ n-1< N) (0 ≤ n-1 ≤ N) (3) (1) x=0
Mientras (n ≠ 0 )
Como {I y B} (1) x= x + a[n-1]
n= n-1
x= x + a[n-1] ; n= n-1 son asignaciones corretas
finMientras
{Q}
Diseñar la función cota tal que I ^ B=> C≥0 B: n ≠ 0
{ I: x= (∑i: n ≤ i < N: a[i]) ^ (0 ≤ n ≤ N)}
La cota debe definirse teniendo en cuenta las variables que intervienen en la
guarda de tal manera de asegurar su decrecimiento con cada ejecución del
bucle. B: n ≠ 0
como n es la única variable que aparece en el bucle y debe decrecer dentro de
él dado que su valor inicial es N, elegimos como cota C(n)= n
Esto es porque se recorre el arreglo desde la última posiciona hasta la primera.
Si se lo recorre desde el principio al fin, la funcion Cota seria: C = N – n