Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lectura fundamental
Corrección de programas
Contenido
3 Resumen
Palabras clave: programa, corrección de programas, precondición más débil, triplas de Hoare.
En esta lectura se demuestra el proceso de verificación de la corrección de un programa construido a
partir de estructuras fundamentales de programación. La sección 1 formula la precondición más débil
de instrucciones vacías, asignaciones, condicionales y de programas constituidos por composición de
estas operaciones. La sección 2 presenta un conjunto de ejemplos de demostración de corrección de
programas a partir de los resultados de la sección 1.
En la mayor parte de los lenguajes de programación no existe una instrucción diseñada con la
intención de no tener efecto alguno sobre el estado o la ejecución del programa; al hablar de
instrucción vacía se hace referencia generalmente a la ausencia de instrucciones. El siguiente ejemplo
presenta un programa que contiene una instrucción vacía (un bloque de código vacío):
{Pre Q: a = A}
program ejemplo_inst_vacia
input: a:ℤ
if a ≥ 0 then
//bloque vacío
else
a := -a
return a
{Pos R: a = |A|}
POLITÉCNICO GRANCOLOMBIANO 2
Considérese la tripla {Q}<vacío>{R}. Dado que la instrucción vacía no modifica el estado del
programa, la poscondición debería ser satisfecha antes de la ejecución. Esto quiere decir que todo
estado que cumple Q, también debe cumplir Q:
[Q ⇒ R]
1.2. Asignación
Una asignación es una instrucción de la forma <var>:=<exp>, que reemplaza el valor de la variable
<var> por el resultado de la evaluación de la expresión <exp>. La asignación es la única operación
que modifica de manera directa el estado del programa.
Considérese la tripla {Q}x:=E{R}. La única diferencia entre el estado inicial y el estado final del
programa es que, en el segundo, x es reemplazada por el valor de E. Esto quiere decir que todo estado
que cumple Q también cumple R(x:=E):
[Q ⇒ R(x:=E)]
wp(x:=E, R) ≡ R(x:=E)
POLITÉCNICO GRANCOLOMBIANO 3
y permite a un programa decidir entre dos conjuntos de pasos a ejecutar (A o B) de acuerdo con
el valor de verdad de una expresión lógica (C). Si C es verdadero, se ejecutará A, en caso contrario,
se ejecutará B.
Al unir las conclusiones de I y II se tiene que para que el programa sea correcto debe cumplirse
por lo tanto,
wp(if C then A else B, R) ≡ ((C ⇒ wp(A, R)) ∧ (¬C ⇒ wp(B, R)))
POLITÉCNICO GRANCOLOMBIANO 4
1.4. Composición secuencial
Puede entenderse un programa como la composición de un conjunto de instrucciones, las cuales son
ejecutadas secuencialmente, una después de la otra:
<instrucción 1>
<instrucción 2>
…
<instrucción k>
Para derivar la precondición más débil de dicho programa introduciremos una aserción adicional P que
deberá satisfacerse justo antes de la ejecución de la última instrucción:
{Q}
<instrucción 1>
<instrucción 2>
…
<instrucción k-1>
{P}
<instrucción k>
{R}
Esto nos permite dividir el problema de verificación de corrección de nuestro programa en dos
problemas distintos:
{Q} {P}
<instrucción 1> <instrucción k>
<instrucción 2> {R}
…
<instrucción k-1>
{P}
Note que para que Q sea lo más débil posible sin afectar la corrección del programa, P debe ser
también lo más débil posible. Esto es
P ≡ wp(<instrucción k>, R)
POLITÉCNICO GRANCOLOMBIANO 5
{Q}
<instrucción 1>
<instrucción 2>
…
<instrucción k-1>
{wp(<instrucción k>, R)}
Siguiendo el mismo proceso k veces, se llega a una tripla cuyo programa corresponde a una
instrucción vacía
{Q}
<vacía>
Por lo tanto,
wp(<instrucción 1><instrucción 2>...<instrucción k>, R) ≡
y para k = 3
wp(<instrucción 1>, wp(<instrucción 2>, wp(<instrucción 3>, R)))
POLITÉCNICO GRANCOLOMBIANO 6
2. Ejemplos de verificación de corrección de programas
A continuación, se presentan ejemplos de verificación de corrección de programas a partir de los
resultados presentados anteriormente:
{Pre Q: true}
program ejemplo_2
input: x:ℝ
return x
{Pos R: x2 ≥ 0}
En este caso, el programa consiste en una instrucción vacía (la declaración de variables y la instrucción
de retorno definen las entradas y salidas, pero no tiene efecto sobre el estado del programa). Tenemos
entonces que
{true}<vacío>{x2 ≥ 0}
≡ [true ⇒ x2 ≥ 0]
≡ [true ⇒ true]
≡ true
POLITÉCNICO GRANCOLOMBIANO 7
Ejemplo 3. Demostrar o refutar que es válida la tripla
{Pre Q: true}
program ejemplo_3
input: x:ℝ
return x
{Pos R: x2 ≥ x}
Tenemos que
{true}<vacío>{x2 ≥ x}
≡ false
POLITÉCNICO GRANCOLOMBIANO 8
Ejemplo 4. Demostrar o refutar que es válida la tripla
{Pre Q: true}
program ejemplo_4
input: x:ℝ
x := x*x + 1
return x
{Pos R: x2 ≥ x}
Tenemos que
≡ [(x2 + 1)2 ≥ x2 + 1]
≡ [(x2)2 + 2x2 + 1 ≥ x2 + 1]
≡ [(x2)2 + 2x2 + 1 - x2 + 1 ≥ x2 + 1 - x2 + 1]
≡ [(x2)2 + x2 ≥ 0]
≡ true
POLITÉCNICO GRANCOLOMBIANO 9
Ejemplo 5. Demostrar o refutar que es válida la tripla
{Pre Q: a = A}
program ejemplo_5
input: a:ℤ
if a ≥ 0 then
//bloque vacío
else
a := -a
return a
{Pos R: a = |A|}
Tenemos que
≡ true
POLITÉCNICO GRANCOLOMBIANO 10
Ejemplo 6. Demostrar o refutar que es válida la tripla
{Pre Q: a = A ∧ b = B}
program ejemplo_6
input: a:ℤ, b:ℤ
if a > b then
a := a + b
b := a - b
a := a - b
else
//bloque vacío
return a, b
{Pos R: ((a = A ∧ b = B) ∨ (a = B ∧ b = A)) ∧ a ≤ b}
Tenemos la tripla
{a = A ∧ b = B}
if a > b then
a := a + b
b := a - b
a := a - b
else
//bloque vacío
{Pos R: ((a = A ∧ b = B) ∨ (a = B ∧ b = A)) ∧ a ≤ b}
En este punto, la expresión es muy larga. Se recomienda extraer fragmentos y evaluarlos separadamente.
Para reducir un poco la expresión, evaluaremos primero
wp(a:=a+b ; b:=a-b ; a:=a-b, ((a=A ∧ b=B) ∨ (a=B ∧ b=A)) ∧ a≤b)
POLITÉCNICO GRANCOLOMBIANO 11
Si sustituimos en la precondición más débil del programa original se tiene
≡ true
POLITÉCNICO GRANCOLOMBIANO 12
3. Resumen
La siguiente tabla recopila las fórmulas para obtener la precondición más débil de programas
construidos a partir de las instrucciones fundamentales de un lenguaje de programación imperativo,
con excepción de los ciclos:
S 1
wp(S , wp(S , R))
1 2
S 2
S 1
wp(S , wp(S , wp(S , wp(S , … wp(S , R)))))
1 2 3 4 k
S 2
S k
Para demostrar la validez de la tripla {Q}S{R} es suficiente demostrar que [Q ⇒ wp(S, R)].
POLITÉCNICO GRANCOLOMBIANO 13
Referencias
Hoare, C. A. R. (1969). An axiomatic basis for computer programming. Communications of the ACM 12
(10), 576-580. DOI=http://dx.doi.org/10.1145/363235.363259
Kaldewaij, A. (1990). Programming: The Derivation of Algorithms. Upper Saddle River, NJ, USA:
Prentice-Hall, Inc.
POLITÉCNICO GRANCOLOMBIANO 14
INFORMACIÓN TÉCNICA
POLITÉCNICO GRANCOLOMBIANO 15