You are on page 1of 18

Unidad N 4 Verificacin Formal de Algoritmos

Algoritmos y Resolucin de Problemas


1
Unidad N 4 Verificacin Formal de Algoritmos
4.1. Conceptos Introductorios acerca de correccin de programas
En la unidad I vimos que un problema est definido por un estado inicial o de partida. Resolver un
problema requiere transformar mediante un proceso (algoritmo), los datos de entrada para obtener
la salida requerida.



En la etapa de anlisis de un algoritmo, en la que se determina qu hacer?, se deben realizar la
Especificacin del problema. Vimos que Especificar un problema significa determinar en forma
clara y precisa los requisitos o requerimientos del cliente, as como los datos necesarios para
cumplirlos. Por ello se habla de Especificaciones de salida y Especificaciones de Entrada.

Anlisis
Qu hacer?
Especificacin de Salidas
Especificacin de Entradas

La validacin permite comprobar que un programa cumple con sus especificaciones, es decir
resuelve correctamente el problema para el que fue diseado.
Los mtodos de validacin se pueden clasificar en dos grandes grupos:
- Validacin mediante pruebas
- Validacin mediante verificacin o Validacin formal
La Validacin mediante pruebas consiste en ejecutar el programa con lotes de prueba para
comprobar si los resultados obtenidos coinciden con los esperados.
Los resultados anmalos debern ser analizados para detectar su causa, la que se eliminar en la
etapa de depuracin del programa. El procedimiento prueba - depuracin se repite hasta que no se
detectan errores y se tenga confianza que el programa fue lo suficientemente probado. El problema
de este tipo de validacin es determinar si el juego de pruebas es lo suficientemente confiable. Lo
ideal sera contar con el caso de pruebas perfecto que permita asegurar que el programa se
ejecutar correctamente para cualquier entrada posible.
Algunos autores denominan a este tipo de Validacin a posteriori. Esto quiere decir que, hasta que
no se prueba el programa no aparecen los errores.
Una prueba de un programa con juegos de ensayos exhaustivos ayuda a detectar errores, pero no
puede concluir su inexistencia y por tanto la correccin del programa.
La Validacin por verificacin consiste en demostrar formalmente que el programa es correcto, sin
ejecutarlo. Caracteriza todas las ejecuciones. Se la conoce como verificacin a priori.
La verificacin de programas es un rea importante en el rea de investigacin de la informtica
terica. Para llevar cabo la verificacin y localizar las partes incorrectas de un programa se dispone
tanto de tcnicas de verificacin formal aplicables a mano como la ayuda de herramientas
automticas.

4.2. Aprender a disear programas correctos
Una manera de programar no muy generalizada, consiste en desarrollar los programas en forma
metdica a partir de especificaciones. La lgica matemtica es la herramienta que se utiliza para la
especificacin y desarrollo de programas.
Es importante distinguir entre verificar y derivar programas. En ambos casos los programas sern
frmulas lgicas.


Entrada



Proceso -
Algoritmo




Salida



Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
2
- Verificar consiste en demostrar que el programa construido es correcto respecto de la
especificacin dada.
Hoare realiza un trabajo pionero en el que establece axiomas y reglas de inferencia (utilizando
lgica de primer orden, llamada tambin lgica de predicados) para demostrar formalmente que
un programa satisface una especificacin. De esta manera es posible determinar que un
programa es correcto con una certeza dada por una demostracin matemtica. Este
sistema de demostracin permite hacer demostraciones de la correccin del programa,
pero no ayuda a construirlo.

- Derivar o deducir un programa permite construir un programa a partir de su especificacin, de
forma que se obtiene un algoritmo correcto por construccin, es decir el algoritmo se disea y se
verifica a la vez.
Dijkstra, sienta las bases para la aplicacin de la lgica de Hoare al desarrollo sistemtico de
programas. A travs de estos mtodos no slo se construye una demostracin de la correccin
del programa sino que la misma demostracin que se est construyendo sirve para construir el
programa.















En este curso realizaremos slo verificacin formal de programas, la derivacin de programas se
realizar en cursos ms avanzados de la carrera, cuando se cuente con las herramientas lgicas
adecuadas para su tratamiento.

4.3. Verificacin formal de programas
La verificacin formal de programas consiste en un conjunto de tcnicas de comprobacin
formales que permiten demostrar si un programa funciona correctamente.
Esta afirmacin requiere el anlisis de algunos conceptos:
Tcnicas de comprobacin formales: La verificacin consiste en un proceso de inferencia. Cada
tipo de sentencia que constituye un programa, posee una regla de inferencia, las que sern
analizadas ms adelante.
Un programa es una secuencia de sentencias que transforman el estado inicial en un estado final.



Problema
Especificacin
Formal

Programa
Lgica
Matemtica
utiliza
VERIFICAR
(Demostrar pograma)
DERIVAR
(Disear y Verificar
Programa)

LOGICA DE HOARE
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
3












Un estado est dado por el conjunto de valores que toman en ese instante las variables que
conforman la estructura de datos del problema. En particular se puede hablar de:
El estado inicial es el estado anterior a la ejecucin de un cdigo.
El estado final es el estado posterior a la ejecucin de dicho cdigo.
El estado intermedio viene determinado por los valores de las variables en cada momento.
Las aserciones o asertos son expresiones lgicas que hacen referencia a un estado del programa.
stas son llamadas Frmulas lgicas o Predicados en la lgica proposicional.
Para indicar que una expresin es un aserto se encierra dicha expresin entre llaves, por ejemplo
{P}.
Se dice que un Programa funciona correctamente si cumple con especificaciones dadas.
El objetivo de toda especificacin de algoritmos, formal o no, es el de expresar de forma correcta
y sin ambigedades qu es lo que debe hacer un algoritmo y bajo qu condiciones se puede
ejecutar.

Ejemplo 1:
Escribir un algoritmo que realice la divisin de un entero a por otro entero b distinto de cero,
devolviendo el cociente entero en q y el resto en r.
En este ejemplo se realiza la especificacin (no formal) de lo que se quiere obtener a partir del
algoritmo as como y cules son las condiciones iniciales de los datos para su ejecucin. Ms
adelante veremos cmo se realiza la especificacin formal de estas condiciones.

El objetivo de la verificacin formal es que se puedan establecer asertos sobre lo que se pretende
que realice el programa, basndose en las especificaciones y requerimientos, y demostrar, mediante
argumentos razonados, que un determinado diseo cumple los asertos preestablecidos en lugar de
esperar la ejecucin del programa.
Para escribir especificaciones claras y precisas se necesita un lenguaje formal, con sintaxis y
semntica perfectamente definidas.
Qu elementos intervienen en una especificacin formal?
- Variables significativas, con su tipo
- Precondicin
- Postcondicin

4.3.1 Precondiciones y postcondiciones:
Durante el desarrollo de un programa, es importante determinar qu condiciones deben darse al
comienzo o entrada de la tarea y cules se espera deben ser ciertas al finalizar la misma, es decir a
la salida.
Aserciones
expresado mediante
expresado mediante
PROGRAMA
Estado inicial
Estado Final
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
4
Los asertos que deben cumplirse a la entrada de una tarea reciben el nombre de Precondiciones.
Si la operacin, tarea o instruccin se realiza sin que la precondicin se cumpla no tendremos
garanta de los resultados obtenidos.
Del mismo modo los asertos acerca de los resultados que se esperan de la salida, se llaman
postcondiciones.
Las precondiciones indican las condiciones que deben satisfacer los datos de entrada
para que el programa pueda cumplir su tarea.
Las postcondiciones indican las condiciones de salida que son aceptables como
soluciones correctas del problema en cuestin.

Como se dijo, tanto la precondicin como la postcondicin se especifican mediante predicados
lgicos. Un predicado lgico es una frmula cuya evaluacin slo puede dar dos resultados:
Verdadero o Falso. Para escribir las pre y post condicin se utiliza la lgica de primer orden llamada
tambin lgica de predicados.

En este momento es necesario recordar algunos conceptos vistos en la unidad I as como en la
asignatura Matemtica Bsica:
Proposicin es una sentencia declarativa de la cual puede decirse si es verdadera o falsa.
Son ejemplos de proposiciones: Julia es alta; 4 >2, dado que se puede indicar si son verdaderas
o falsas.
Afirmaciones tales como: x es alta, y >2 no son proposiciones dado que no se puede indicar su
valor de verdad, se conocen con el nombre de predicados lgicos.
Si se asignan valores concretos a las variables x e y, se transforman en proposiciones ya que se
podr indicar si son verdaderas o falsas.
Un Predicado Lgico es una afirmacin que expresa una propiedad de variables. Estas
afirmaciones sern verdaderas o falsas cuando se reemplazan las variables por valores
especficos. Se los conoce tambin como frmulas lgicas.
Las variables x e y de los predicados ejemplificados se conocen como variables libres. Si se les
asigna valores, transformndose en una proposicin, se conocen como variable ligadas.

La especificacin pre/post se basa en contemplar un algoritmo S como una caja negra. S acta
como una funcin de estados en estados, comienza su ejecucin en un estado inicial vlido, descrito
por el valor de las variables de entrada, y termina en un estado final en el que los variables de
salida contienen los resultados esperados.
Es por ello que un programa es una secuencia de sentencias que transforman el estado inicial en un
estado final.

Ejemplo 2:
Determinar las condiciones iniciales que deben cumplir las variables que intervienen en la sentencia
x=2*y+1, de tal manera que al ejecutarse se verifique que x<=7 (Postcondicin).
Para que se cumpla la postcondicin x<=7:
Reemplazando x por la sentencia resulta: 2*y+1<=7 y se obtiene y<=3.
De esto se infiere que para que se cumpla la postcondicin {x<=7}, {y<=3} debe ser verdadero, por
lo tanto es la precondicin buscada. Obtenindose as las aserciones requeridas.

Podemos simbolizar el proceso realizado de la siguiente manera:
{ y<=3} x=2*y+1 {x<=7}
{P} S {Q}

Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
5


Esto se interpreta de la siguiente manera: Si la ejecucin de la sentencia S, x=2*y+1, empieza en
un estado inicial caracterizado por la precondicin P {y<=3} entonces terminar en un estado final
caracterizado por la postcondicin Q {x<=7}.

Ejemplo 3: Dado un programa que calcula la raz cuadrada
Precondicin: el argumento de la funcin es un nmero real no negativo
Postcondicin: La raz cuadrada de ese argumento.

-Ejemplo 4: Para un programa que realice la divisin de dos nmeros enteros.
Precondicin: a y b nmeros enteros y b distinto de cero.
Postcondicin: Cociente q entre a y b, r el resto de la divisin entre a y b y r<b.

Una especificacin tiene dos destinatarios, el usuario que vaya a utilizar el algoritmo y el
programador.
En la precondicin se especifican las restricciones que tienen que cumplir las variables de entrada
para que el algoritmo produzca el resultado deseado. Es donde se expresan las obligaciones que
debe cumplir el usuario.
En la postcondicin se especifica la relacin que deben cumplir las variables de entrada y las de
salida para que el algoritmo produzca el resultado deseado. Es donde se expresan las obligaciones
del programador.

En el ejemplo 4 el usuario se tiene que asegurar que b tiene que ser distinto de cero. El
programador desarrollar el algoritmo suponiendo que el usuario ingresa los valores adecuados de
las variables.
En la mayora de los cdigos el estado final depende del estado inicial. Por tanto Precondicin y
Postcondicin no son independientes entre s.

4.3.2 Cmo escribir las especificaciones utilizando Cuantificadores?
Un predicado puede construirse a partir de frmulas atmicas (constantes o variables booleanas),
expresiones relacionales (construidas con los operadores de relacin), expresiones lgicas
(construidas con los operadores lgicos) y los cuantificadores universal ( ) y existencial ( - ).
Para realizar la especificacin formal de las pre y postcondiciones se utilizarn los cuantificadores
existencial y universal. Tambin se describirn otros que permiten abreviar expresiones, como los
cuantificadores (sumatoria) ,( producto), mx( mximo) y min( mnimo)
Se debe notar que otra forma de ligar variables es a travs de los cuantificadores
- Cuantificador universal: x : P(x),

donde P(x) representa un predicado que depende de x
Esto significa que para toda variable x correspondiente al rango especificado, se satisface el
predicado P
Este cuantificador se puede trabajar de dos maneras:
Indicando el tipo de la variable cuantificada
< x : x e T : P(x)>
Por ejemplo: < x : x e Z : x < y+2 >

Indicando el rango de la variable cuantificada
< x : R(x) : P(x)>
S P Q
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
6
donde R(x) es un predicado que define el rango de la variable x, es decir representa el universo
donde esa variable toma valores, P(x) es tambin un predicado.
Ejemplo:
<


x : 0<x < 45 : x < y+2 >

- Cuantificador existencial , -x : P(x),
<
-x : x eT : P(x) >
o
<
-x : R(x) : P(x) >
Esto significa que para alguna variable x correspondiente al rango especificado, se satisface el
predicado P

- Cuantificador Sumatoria
. (

i : R( i) : e[i] )
Con esta expresin se indica la suma de los elementos e(i) para valores de i que satisfacen el rango
R( i) .
Cuando el rango de la variable i es vaco, la sumatoria es 0, el elemento neutro de la suma.

- Cuantificador Producto
( i : R( i) : e[i] )
Con esta expresin se indica el producto de las valores e(i) para valores de i que satisfacen el rango
R( i)
Cuando el rango de la variable i es vaco, el producto es el valor 1, el elemento neutro del producto.

- Cuantificador Mximo
Este cuantificador se utiliza para expresar el mximo sobre una serie de valores
(max i : R( i): e(i)).
El cuantificador evala e(i) para cada valor de i en el rango R(i) y devuelve el mximo de estas
evaluaciones. Para que siempre pueda devolver un valor, el rango de este cuantificador no puede
ser vaco.

Ejemplos: Dada la siguiente declaracin entero v [N], donde v es un arreglo de componente enteras
y N>1, formalizar las siguientes aserciones
x aparece como componente de v.
Podemos utilizar el cuantificador existencial, para decir que existe una posicin del vector donde
aparece el valor x:
( -i : 0 i N-1 : v[i] ==x),

v se anula en algn punto.
( -i : 0 i < N : v[i] == 0).

- v tiene valores positivos en todas sus componentes.
( i : 0 i N-1 : v[i] > 0).

x aparece una sola vez como componente de v.
Utilizando el cuantificador existencial y el universal podemos escribir
( -i : 0 i < N : v[i] == x) . ( j : 0 j N-1 .j = i : v[j]
!=
x)).
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
7
x es la suma de las variables de v.
x= (

i : 0 i < N : v[i]).

x es el mximo de las componentes de v.
Esta asercin se puede expresar utilizando los operadores universal y existencial:
( -i : 0 i N-1 : x == v[i]) . ( j : 0 j N-1 : v[j] x).
Tambin se puede utilizar el cuantificador max, de la siguiente forma general:
x = (max i : 0 i N-1 : v[i]). Siendo el rango 0 i N-1 no vaco

m es el menor ndice de v que contiene el valor x.
m = (min i : 0 i N-1 . v[i] == x : i ).

El valor de cada componente de v es el doble de su ndice.
Podemos expresarlo, con un cuantificador universal, de la siguiente manera:
( i : 0 i N-1 : v[i] == 2 * i).

w es la imagen especular de v.
La imagen especular significa que w es la imagen reflejada en un espejo .Por tanto los elementos
sealados mediante las flechas deben ser iguales.





0 N-1 0 N-1

Se debe comparar la primera componente de w (w [0]) con la ltima de v (v [N-1]) , la segunda de w
(w [1]) con la penltima de v [N-2])
En general la posicin i debe compararse con la posicin N - i - 1.
Utilizamos un cuantificador universal, la especificacin es:
(

i : 0 i N-1 : w[i] == v[N - i - 1])



Ejercicios propuestos
Formalizar las siguientes aserciones
- Todas las componentes del vector V son pares
- Cada componente del vector V es la suma de su antecesor y su sucesor
- Todas las componentes del vector V son mltiplos de la anterior
- El vector V tiene alguna componente negativa
- El vector V tiene un mnimo (nico)


4.3.3 Traduciendo un programa en un teorema:
Para demostrar formalmente que un programa es correcto, es necesario representarlo como una
frmula de alguna lgica.

w
v
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
8
El programa es visto como un conjunto de axiomas y reglas de inferencias. Para la verificacin de
programas Imperativos se utiliza un sistema de reglas basado en la tripla de Hoare, que permite
especificar los algoritmos basndose en lgica de predicados de primer orden. El programa, en la
lgica de Hoare, se especifica mediante frmulas denominadas aserciones que relacionan las
entradas y salidas del programa.



























Se utiliza una expresin del tipo {P} S {Q}, siendo S, un programa o parte de un programa y P y Q
aserciones de la lgica. Esta expresin se interpreta, si la precondicin P es cierta antes de la
ejecucin del programa y dicho programa termina, entonces la postcondicin Q es cierta tras la
ejecucin de dicho programa. Es decir que si se garantiza que la entrada actual satisface las
restricciones de entrada (precondiciones) la salida satisface las restricciones de salida
(postcondiciones).
El programa S acta como una funcin de estados en estados: comienza su ejecucin en un estado
inicial vlido, descrito por el valor de los parmetros de entrada, y termina en un estado final en el
que los parmetros de salida contienen los resultados esperados.
Considerando nuevamente el ejemplo 4, referido a la divisin entre dos nmeros enteros a y b, la
especificacin formal de la precondicin y postcondicin son:
Precondicin: a y b nmeros enteros y b distinto de cero.
{P: (a e Z) y (b e Z) y ( b !=0)}

Postcondicin: Cociente q entre a y b, r el resto de la divisin entre a y b y r<b.
{Q: (a==b*q+r) y ( r<b) y ( r>=0)}
Problema
Especificacin
Formal

Programa
Lgica
Matemtica
utiliza
VERIFICAR
Demostracin programa
Representar programa como
frmula de alguna lgica
Lgica de Hoare

necesita
utiliza
Reglas relativas a las pre y post condiciones
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
9
Correccin total y parcial
Correccin parcial: se dice que {P} S {Q} es parcialmente correcto si el estado final de S, cuando
termina el programa (aunque no se le exige esta premisa), satisface {Q} siempre que el estado inicial
satisface {P}.
Correccin total: Se da cuando un cdigo adems de ser correcto parcialmente, termina.

Los cdigos sin bucles siempre terminan, por lo que la correccin parcial implica la correccin total.
Esta distincin es esencial slo en el caso de cdigos que incluyan bucles o recursiones.

Implicacin de predicados
Un predicado P implica un predicado Q, y se simboliza PQ , si el conjunto de estados para los que
P es verdadero es subconjunto del conjunto de estados para los que Q es verdadero.

El sistema formal de Hoare es un sistema de reglas de inferencia que permiten razonar sobre las
instrucciones de un algoritmo, ya sea para calcularlas o para verificar su correccin.
Estas reglas son las siguientes:
Reglas generales relativas a las precondiciones y postcondiciones
- Si R y S son dos aserciones entonces se dice que R es ms fuerte que S si RS
- Si R es ms fuerte que S entonces se dice que S es ms dbil que R.

Un predicado R es ms fuerte (ms restrictivo) que otro S, si el conjunto de estados que satisface R
es un subconjunto de los estados que satisface S
El siguiente diagrama de Venn grafica la relacin de los predicados R y S







Ejemplo 5
{ i>1 } es ms fuerte que {i >0 } ya que todo valor de la variable i (estado) que hace verdadero el
predicado {i >1}, tambin hace verdadero al predicado { i>0}, sin embargo no se cumple la relacin
inversa.
Por tanto {i>1} { i >0}.

Grficamente, la relacin entre los predicados es la siguiente:
0 1


i >1

i > 0

Ejemplo 6: { x 2 } {x 1 }
{x 2} es ms fuerte que {x 1} ya que todo valor de la variable x que satisface el predicado { x 2}
tambin hace verdadero el predicado {x 1}. <sin embargo no todos los valores que verifican el
estado {x 1 } tambin verifica el estado {x 2 }.

R
S
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
10
En sntesis:
Si una asercin R es ms fuerte que una asercin S entonces todos los estados que satisfacen R
tambin satisfacen S pero no viceversa.






La asercin ms dbil es { } que recoge todos los estados posibles, corresponde a la constante
lgica V (true).
La asercin ms fuerte ser por tanto F (false), ya que representa que ningn estado satisface
dicha condicin.

Ejemplo 7: Predicados ms dbil y fuerte
Si x e y son variables enteras, establecer ms dbil ( : ) o ms fuerte ( ) entre los siguientes
predicados. { P
1
: x >0}
{P
2
: (x >0) . (y >0) }
{P
3
: (x >0) v (y >0) }
{P
4
: y >0 }
{P
5
: (x >0) . (y >0) }
- P
2
P
1
dado que si bien los dos predicados exigen que la variable x sea estrictamente positiva,
mientras P
1
admite cualquier valor de y, P
2
slo admite valores positivos para ella. Por tanto
cualquier asignacin de valores a las variables x e y (cualquier estado) que haga cierto a P
2
tambin hace cierto a P
1,
pero no

al revs.



- P
1
P
3
por que la disyuncin debilita un predicado




- Entre P
1
y

P
4
no hay relacin ya que se refieren a variables disjuntas, esto es existen estados que
cumplen P
1
y

no

P
4
(x==5 , y== -1) y estados que cumplen P
4
y no

P
1
(x==0 , y== 0)

- Entre P
1
y

P
5
tampoco hay relacin
,
ya

que si bien los dos predicados hacen referencia a la misma
variable x , el estado que asigna los valores (x==5 , y= =-5) satisface P
1
pero no

P
5
, y el estado
que asigna los valores (x==0 , y== 5) satisface P
5
pero no

P
1


Actividad 1:
Determinar la relacin entre:
-
P
2
y

P
3
-
P
2
y

P
4
-
P
2
y

P
5
-
P
3
y

P
5
-
P
4
y

P
5
Ms fuerte ms selectivo, ms especfico
Ms dbil menos selectivo, ms general.
Si R es ms fuerte que S R c S
Si S es ms dbil que R S R
En general, una conjuncin es ms fuerte que cada una de sus partes.
P.Q P cualesquiera sean los predicados P y Q
En general, una disyuncin es ms dbil que cada una de sus partes.
P PvQ cualesquiera sean los predicados P y Q
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
11
4.4 Enfoques para la verificacin Formal:
Existen dos enfoques de verificacin Backward y Forward , siendo el primero el ms usado.
La verificacin Backward es proceder de atrs hacia delante. Conceptualmente todo el proceso de
verificacin se basa en la definicin de la precondicin ms dbil: pmd (weakest precondition: wp),
la menos restrictiva. Esto es, vamos a intentar definir cules son los estados tales que desde ellos
y ejecutando el programa S se llega a Q. Estos estados se pueden caracterizar por una serie de
condiciones, o sea, por una asercin pmd que cumplir:
{pmd} S {Q}
Esto se lee Precondicin ms dbil se S respecto de Q.
Por tanto si la precondicin {P} es ms fuerte que pmd, se concluye que el algoritmo es correcto
Salvo en el caso de la iteracin, las otras sentencias utilizan la precondicin ms dbil como
mtodo para verificar y derivar programas

Como regla general:
Se debe formular la precondicin ms dbil que asegure que se cumple una cierta postcondicin
dada, de esta forma cualquier precondicin que implique lo anterior ser satisfecha
automticamente.


4.5 Verificacin de cdigos sin bucles
Para demostrar la correccin de las partes de un programa se parte de la postcondicin del cdigo,
es decir de las condiciones que deben satisfacer los resultados. A partir de ah se deduce la
precondicin.
Recordemos que el cdigo se verificar en sentido contrario a como se ejecuta.

PreC.1 = PreC. Inicial VERIFICACION
Cdigo 1
PostC. 1 = PreC2.
Cdigo 2
PostC. 2 = PreC. 3
Cdigo 3
EJECUCION PostC. 3 = PostC. Final


4.5.1. Reglas para instrucciones del lenguaje
Se describen a continuacin las reglas de verificacin para las acciones en seudocdigo imperativo,
que usamos para escribir los algoritmos. Se determinar adems de la regla para cada instruccin,
la forma de encontrar su precondicin ms dbil con respecto a una postcondicin dada.

4.5.1.1. Sentencias de asignacin
Las sentencias de asignacin son sentencias de la forma V = E, en donde V es una variable y E es
una expresin.
{ pmd } V=E { Q }


Regla de la asignacin: Si S es una sentencia de la forma V=E con la postcondicin {Q}, entonces
la precondicin de S puede hallarse sustituyendo en Q todos los casos de V por E. Esto se simboliza
(Q)
V
E

Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
12
Simblicamente lo podemos expresar:
{pmd} V=E {Q} { pmd } = (Q)
v

E
(Q)
v
E
V=E {Q}








Como encontrar la precondicin ms dbil:
Ejemplo 8 Determinar la precondicin ms dbil para que la terna siguiente sea correcta:
{pmd} i=2*i {i<6}
pmd (Q)v
E
=> (i<6)
i
2*i
(2*i < 6) (i<3)
{pmd} = {i<3}

Esto se interpreta que la variable i tomar un valor menor que 6 despus de ejecutar la instruccin i=
2*i si inicialmente (antes de la ejecucin de la sentencia) toma un valor menor que 3.

Actividad 2: Indicar cuales precondiciones hacen verdadero el algoritmo del ejemplo anterior.
Justificar.
1. { i> 0} i=2*i {i<6}
2. { i<2} i=2*i {i<6}
3. { i==5} i=2*i {i<6}

Ejemplo 9 Determinar la precondicin ms dbil para que la terna siguiente sea correcta
{pmd} j=i+1 {j>0}

La precondicin se obtiene sustituyendo en la postcondicin j>0, la variable j por i+1
Lo expresado se formaliza:
{pmd}= {Q}v
E
{pmd }=

> 0

J
I+1

i+1 > 0

i > -1
{pmd} = {i >-1 }
Esto se interpreta: para que la variable j sea mayor que 0 despus de ejecutarse la sentencia j=i+1,
inicialmente la variable i debe ser mayor que -1.

Con este resultado indicar en qu casos el algoritmo es correcto:
1. { i> 0} j=i+1 {j>0}
2. { i<0 } j=i+1 {j>0}
3. { i> -2} j=i+1 {j>0}
4. { i<-3} j=i+1 {j>0}

Ejemplo 10 Determinar la precondicin para que la terna siguiente sea correcta:
{pmd} y = x
2
{y>1}
{pmd}= {Q} v
E
( )
2
y>1
x
y

(x
2
>1) (x >1 ) V (x < -1)


V=E
(Q)
v
E


Q
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
13
Actividad 3: Indicar dos precondiciones para las cuales el algoritmo del ejemplo anterior es vlido
y dos para las que no lo sean

Ejemplo 11 Determinar la precondicin para que la terna siguiente sea correcta:
{pmd} x=1/x {x>0}
{pmd} = {Q}v
E
(x>0) x
1/x
(1/ x > 0) ( x >0)

Actividad 4: Indicar una precondicin para la que el algoritmo del ejemplo anterior es vlido y otra
para las que no lo es.

Actividad 5: Sea x una variable entera, indicar si el algoritmo es vlido para la especificacin dadas
{ x >-2 } x=x+2 {x >0}. Justifique.

Actividad 6: Sea x una variable entera, indicar si el algoritmo es vlido para las especificaciones
dadas. Justifique.
1. { x s 4 } x=3*x {x s21}
2. { x > 4 } x=3*x {x s21}
3. { x ==7 } x=3*x {x s21}

Sustitucin simultnea Vs Sustitucin en forma consecutiva
Respecto de la sustitucin se debe tener en cuenta que en general no es lo mismo realizar una
sustitucin simultnea de dos variables que hacerlas en forma consecutiva, una despus de la otra.

Ejemplo 12: sean x e y variables enteras, las dos sustituciones siguientes no producen el mismo
resultado.

( )
x-y, z
x, y
3*x+y =
( )
( )
3*x+y
z
x y
x
y





El resultado de la sustitucin simultnea es:
( )
x-y, z
x, y
3*x+y = 3*(x-y) +z
La sustitucin consecutiva resulta:
( )
( )
3*x+y
z
x y
x
y

=
( )
z
y
3* (x-y) +y =3*(x-z) +z


Ejemplo 13: Probar que ( == 3( ==
2
))
,
,
( == 3( ==
2
)


2 ,
x, y
((x == 3) (y == m ))
y x
.

=
( )
2
x
(x = =3) (y == m )
x
y
y
.
a - ( == 3( ==
2
))
,
,

El resultado de la sustitucin simultnea es: y == 3 x = =m
2
.
Para que este predicado sea cierto hace falta que y tenga valor 3; m puede tomar cualquier valor
pero x debe ser su cuadrado.

Sustitucin
Simultanea
Sustitucin
Consecutiva
3*(x-y) +z = 3*(x-z) +z
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
14
b- ( == 3( ==
2
)


En este caso tenemos dos sustituciones secuenciales. Primero se lleva a cabo la ms interna:
( )
2
x
(x == 3 y == m )
x
y
y
.
( )
2
(y == 3 ) (y == m )
x
y
. (x == 3 ) ( x == m
2
)
El hecho de que este predicado sea cierto es independiente del valor de y pero x debe valer 3 y por
tanto m debe valer 3.

4.5.1.2. Sentencia compuesta: Concatenacin de cdigo
La concatenacin significa que las partes del programa se ejecutan secuencialmente de tal forma
que el estado final de la primera parte de un cdigo se convierte en el estado inicial de la segunda
parte del programa.

Regla de la concatenacin
Sean C1y C2 dos partes de un cdigo y sea C1; C2 su concatenacin. Si {P} C1{R} y {R}C2{Q}
son ternas de Hoare correctas entonces se puede afirmar que:
{P} C1 {R}
{R} C2 {Q}
{ P} C1; C2 {Q}

Esto significa que para demostrar que la terna { P} C1; C2 {Q} es correcta, se debe encontrar el
predicado intermedio { R } que es postcondicin de C1 y precondicin de C2

Ejemplo 14: Demostrar que el siguiente cdigo es correcto
{ } c=a+b; c=c/2 {c==(a+b)/2}

Para esta demostracin se deben realizar 2 pasos: { } c=a+b; { P } c=c/2 {c=(a+b)/2}

a- En primer lugar se tiene que encontrar la precondicin de c=c/2 a la que llamaremos {P},
sabiendo que se cumple la poscondicin {c==(a+b)/2}
{ P} c=c/2 {c==(a+b)/2}

P=

(c=
a+b
2
)
c
c
2
c/2=(a+b)/2
Por tanto { P}= {c==(a+b)}

b- { P} = { c==a+b } es la poscondicin de c=a+b, ahora es necesario encontrar la precondicin P, tal
que:
{P} c=a+b {c=a+b}
Entonces {P}={c

==a+b, c==a+b } (c=a+b)
c
a+b
(a+b)=(a+b)}
{Pmd }= { }
1
dado que la igualdad es vlida para cualquier estado.
Entonces: { } c=a+b {c/2==(a+b)/2} como queramos probar.

Ejemplo 15 Demostrar que el siguiente cdigo es correcto:
{ } s=1; s=s+r; s=s+r*r {s==1+r+r2}
1 2 3


1
Representa la asercin vaca que se puede entender como verdadero para todos los estados.
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
15
En este caso se deben realizar 3 pasos para encontrar { P} y { P} tal que
{ } s=1; { P} s=s+r; { P}s=s+r*r {s==1+r+r
2
}
1 2 3
Comenzamos encontrando la precondicin de la ltima parte del cdigo, la parte 3:
3
{P} s =s + r*r {s =1 + r + r
2
}
{P} = ( =1 + +
2
)

+
+ = 1 + +
2
+
2
= 1 + +
2
= 1 +
{ P} = {s ==1 + r}
Por tanto { s ==1 + r } s =s + r*r {s ==1 + r + r
2
}

2
La precondicin encontrada { P}= {s==1+r } es la postcondicin de la segunda parte del cdigo , se
debe por lo tanto encontrar la precondicin: { P}
{P} s=s+r {s==1+r}
{P} = ( =1 + +
2
)

+
+ = 1 + s =1 {P} = {s==1}
{P} = { s=1}
{ s ==1 } s =s+r { s ==1+r }

1
La precondicin encontrada {s==1} es la postcondicin de la primer parte de la sentencia
compuesta, entonces la precondicin ser:
{P} s =1 { s ==1}
{P} = ( = 1)

1
1 = 1 { }
{ } s:=1 { s= =1}
Queda demostrado que { } s =1; s =s + r; s =s + r*r {s = =1 + r + r
2
} es correcto


Ejemplo 16 Demostrar que el siguiente cdigo, que permite el intercambio de valores es correcto:
{a==A,b==B} h=a; a=b; b=h {a==B,b==A}
1 2 3

Considerando las tres acciones que constituyen la sentencia compuesta dada, es necesario
encontrar { P} y { P}
{a==A, b==B} h=a; { P} a=b; { P} b=h {a==B,b==A}
1 2 3
Encontremos en primer lugar la precondicin de la tercer sentencia { P} b=h {a==B,b==A}
{P} = ( = , = )

{ == , == }
Entonces { a ==B , h ==A } b=h {a ==B, b ==A }
Encontremos ahora la precondicin de la parte 2, es decir { P}
{P} a=b { a=B, h=A}
{P} = ( = , = )

{ == , == }
{b==B , h==A } a=b { a==B ,h==A}

Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
16
Finalmente encontramos la precondicin de la parte 1
{P} h =a {b ==B, h ==A}
{P} = ( = , = )

{ == , == }
{a ==A, b ==B} h =a {b==B, h==A}
Se demuestra entonces que {a==A, b==B} h =a; a =b; b =h {a ==B, b ==A} es correcto

Ejemplo 17 Podras decir que realiza el siguiente algoritmo?
Sean x e y variables enteras
entera x, y
x= x-y
y= x+y
x= y-x
Para conocer el efecto de este segmento de algoritmo usamos la postcondicin general: x=A .
y=B para indicar los valores de las variables x e y despus de la ejecucin de la accin.
Encontremos la precondicin ms dbil:
pmd(x= x-y ; y= x+y; x= y-x , x=A . y=B )
( )
( )
x=A y=B
x y
x y
y x
x
y
x

| |
|
\ .
( )
( )
y-x=A y=B
x y
x y
y
x

+
( ) x+y-x=A x+y=B
x y
x


( ) y=A x+y=B
x y
x

y=A . x-y+y=B y=A . x=B


Como se observa, el algoritmo permite el intercambio entre los valores de la variable

4.5.1.3. Sentencias de Seleccin
Si C1y C2 son dos partes de un programa y si B es una condicin, entonces la accin
Si (B )
Entonces C1
Sino C2
Finsi
se interpreta de la siguiente forma: si B es verdadero se ejecuta C1, si es falso se ejecuta C2.
Si ahora se desea demostrar la correccin de una sentencia SI con una precondicin {P} y una
postcondicin {Q} tendremos dos posibilidades:
Si el estado inicial satisface B adems de P entonces se ejecutar C1 y por tanto la verificacin
equivaldr a demostrar que
{P B} C1 {Q} es correcto.

Si el estado inicial no satisface B entonces se ejecutar C2 y por tanto la verificacin equivaldr
a demostrar que
{P B} C2 {Q} es correcto.

Esto es, se debe probar




{P B } pmd( C1, Q ) { {P B} pmd( C2, Q )
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
17
Regla para condiciones con clusula sino
{P B} C1 {Q}
{P B} C2 {Q}
{P} SI B entonces C1 sino C2 {Q}












Ejemplo 18 Mximo entre 2 nmeros
Demostrar que: { } SI (a>b) entonces m=a sino m=b Finsi {(ma) (m b)}
a. Primero debemos demostrar que {P B} C1 {Q} es cierto, esto es
{ } { a > b} m =a {(m a) (m b)} es vlido
Encontremos la precondicin pmd
{pmd} = ( )


(a a) (a b)
Como a a es verdadero, {pmd} = {a b}
Como a >b ( a b)
Entonces queda demostrado {a > b} m =a {(m a) (m b)}
b. Ahora se debe demostrar
{P B} C2 {Q}, es decir {{ } (a>b)} pmd (m=b, (ma) (m b)}
{pmd} = ( )


{ b a, b b }
Como b b es verdadero {b a} { (a > b)} debe ser verdadero
Entonces queda demostrado {b a} m =b {(m a) (m b)}


Ejemplo 19 Sean x e y variable enteras, encontrar el predicado ms dbil que satisfaga la sigui ente
especificacin:
{P} si (x >0) entonces y =x sino y = -x finsi {y =4}
Se debe encontrar pmd (si (x >0) entonces y =x , y =4)
Y pmd ( si (x < 0) entonces y = -x , y =4)

Es decir se debe probar (x >0) pmd ( y=x , y=4) (x
<
0) pmd ( y= -x , y=4)
B
P
P B P B
C2

C1
P
Q
Unidad N 4 Verificacin Formal de Algoritmos
Algoritmos y Resolucin de Problemas
18
(x >0) . pmd ( = 4)

(x >0 . x=4)
Entonces si x >0 inicialmente x debe ser igual a 4.
(x < 0) . pmd

( = 4)



(x < 0 . -x =4) (x < 0 . x = -4)

Entonces si x <0 , inicialmente debe ser igual a 4.

Como se observa para que y valga 4 despus de la ejecucin de esta instruccin, x debera valer 4
o -4 antes de su ejecucin. Es decir que la instruccin hace que y tome le valor absoluto de x.

Ejemplo 20: Calcular la precondicin ms dbil del siguiente fragmento de programa:
Si ( y == 0 )
entonces x = 0
sino x = y 1
finsi
{ x ==y }

(y =0) pmd ( x=0 , x=y) (y != 0) pmd ( x= y-1 , x=y)
((y =0) (0=y) ) ((y 0) falso)
verdadero ( (y=0) verdadero)
( ( y=0) verdadero) entonces pmd= { y==0 }
Esto significa que la precondicin para que el fragmento del programa sea vlido es { y==0 }


4.6 Bibliografa
- Backhouse Roland.( 2008.) Algorithim Problem Solving.
- Backhouse Roland (2003.) Program Construction: Calculating Implementations from
specifications. The University of Nottingham. UK. Wiley
- Blanco, Javier,Smith.S y Barsotti.D .(2008) Clculo de Programas Facultad de Matemtica,
Astronoma y Fsica. Universidad Nacional de Crdoba.
- Mart Oliet Narciso, Segura Daz C y Verdejo Lpez Jos (2006). Especificacin, derivacin y
anlisis de algoritmos. Pearson Prentice Hall.
- Mart Oliet Narciso, Narciso y otros. Lgica matemtica para informticos. Edit. Pearson
Prentice Hall. Idioma: Espaol

Documentos de Internet
- Verificacin de programas http://www.exa.unicen.edu.ar/catedras/ccomp2/Verificacion.pdf
- Verificacin de Programas imperativos http://ccia.ei.uvigo.es/docencia/VF/tema6.pdf
- Verificacin Formal de Algoritmos. http://www.infor.uva.es/~jvalvarez/docencia/tema8.pdf
- La verificacin formal http://trevinca.ei.uvigo.es/~alma/docencia/mfes/TEMA3.pdf
- Especificacin de algoritmos Rafael del Vado Vrseda Dpto. de Sistemas Informticos y
ComputacinUniversidad Complutense de Madrid
http://www.fdi.ucm.es/profesor/rmartine/EDI/Especificacion.pdf
v
v