Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
2. SEMÁNTICA AXIOMÁTICA
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.
Concatenación
Selección (condicionales)
Repetición (ciclos).
Un skip es correcto con respecto a una especificación dada si y sólo si la precondición implica
a la poscondición.
Ejemplo 2:
Demuestre la corrección del siguiente programa.
var n: ;
{Pre Q: n5}
skip
{Pos R: n3}
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
Un abort es correcto con respecto a una especificación dada si y sólo si la precondición nunca
se cumple.
Ejemplo 2:
Demuestre la corrección del siguiente programa.
var x: ;
{Pre Q: x2<-3}
abort
{Pos R: x=5}
3.3. ASIGNACIÓN
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
= Hipótesis:
= Hipótesis:
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 .
= Hipótesis: ; Hipótesis:
= Hipótesis: ; Hipótesis:
= Hipótesis: ; Hipótesis:
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 : .
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 : .
= Aritmética: ; Hipótesis:
= Hipótesis:
= Aritmética:
= Hipótesis:
= Hipótesis:
= Aritmética: ; Hipótesis:
= Aritmética
= Hipótesis: ; Hipótesis:
= Aritmética:
= Hipótesis:
= Como (por hipótesis), entonces está definido; Como (por hipótesis), entonces
= Aritmética:
= Hipótesis:
= Hipótesis:
– –
Demuestre la corrección del siguiente programa, que calcula el fibonacci de un número natural .
con n: ;
var a: ,b: ,i: ;
{Pre Q: n0}
a,b,i:=0,1,0;
{Inv P: a=fib(i) b=fib(i+1) 0in}
{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 ( ):
= Aritmética
= Hipótesis: ; Hipótesis:
= Aritmética:
= Hipótesis:
= Hipótesis:
= Partición de rango: –
–
= Hipótesis: –
= Aritmética:
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.
Para probar que una secuencia de programas es correcta con respecto a una precondición ya