Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DEFINICION:
Desarrollada por C.A.R. Hoare (1969), es una lgica que permite probar la verdad o
falsedad de propiedades de programas imperativos (especialmente correccin y
terminacin) sin concurrencia o paralelismo. Est basada en la idea de diagrama de
flujo anotado.
S es una frase de cdigo en un programa de alto nivel, con una nica entrada y
una nica salida normal.
o Instruccin.
o Bloque de instrucciones consecutivas.
o Un programa o subprograma.
Cada frase S denota una relacin entre dos estados en un espacio de estados
definido por el producto cartesiano de los valores de las variables del programa.
Es decir, al ejecutar una instruccin o secuencia de instrucciones S, se modifica
el valor de una o varias variables, transitando de un estado a otro.
P y Q son anotaciones, formulas de la Lgica de Primer Orden (Lgica de
Predicados).
o P Precondicin (se refiere al estado previo a S)
o Q Postcondicion (se refiere al estado posterior a S)
Notacin: {P }S{Q}
SIGNIFICA:
Bucle infinito.
REGLAS GENERALES
Si R y S son dos aserciones entonces se dice que R es ms fuerte que S si R S. Si R es ms
fuerte que S entonces se dice que S es ms dbil que R. Ejemplo: i>1 es ms fuerte que i>0 ya
que siempre que i>1 esto implica que i>0. Por tanto i>1 i>0. Si una asercin R es ms fuerte
que una asercin S entonces todos los estados que satisfacen R tambin satisfacen S pero no
viceversa. Un fortalecimiento de la asercin disminuye el nmero de estados que la pueden
satisfacer. Ms fuerte ms selectivo, ms especfico. Ms dbil menos selectivo, ms
general. La asercin ms dbil es { } que recoge todos los estados posibles. Constante lgica V
(true). La asercin ms fuerte ser por tanto F (false), ya que representa que ningn estado
satisface dicha condicin.
REGLAS
Conjuncin
La siguiente regla permite reforzar la precondicin y postcondicin de forma
simultnea.
Definicin: Si C es una parte de un cdigo y se ha establecido que
{P1}C{Q1} y {P 2}C{Q 2} se puede afirmar que {P1 P 2}C{Q1 Q 2}.
Formalmente esto se expresa como:
Ejemplo:
Aplicar las ternas { }i:=i+1 {i :=i +1}, {i >0 }i:=i+1 {i >0},
para demostrar que: {i>0 }i:=i+1 {i>1}
Disyuncin
ASIGNACION
Ejm:
Demostrar que: { }if a>b then m:=a else m:=b{(m a) (m b)}
{ a>b}m:=a {(m a) (m b)}
P={m=a, (m a) (m b)} {a a, a b}
{a=a} {a a}, {a=a, a b} {a b}
{ a>b} {a b} {Fortalecimiento PreC.} { a >b}
m: =a {(m a) (m b)}
{ (a>b)}m:=b {(m a) (m b)}
P={m=b,(m a) (m b)} {b a, b b}
{b=b} {b b}, {b a, b=b} {b a}
{ (a>b)} {b a}
{ b a}m:=b {(m a) (m b)}
Con lo que queda demostrado.
Ejm:
Demostrar que:
{ }ifmax<a then max:=a {(maxa)}
{(max<a)}{(maxa)} lo que es obvio.
CONCATENACION DE CDIGO
Ejemplo:
Demostrar que el siguiente cdigo es correcto:
{ }c:=a+b; c:=c/2 {c=(a+b)/2}
{ P}c:=c/ 2 {c=(a+b)/2}
P={c =c/2,c =(a+b)/2} {c/2=(a+b)/2}
{ c/2=(a+b)/2}c:=c/2 {c=(a+b)/2}
INVARIANTE DE UN CDIGO
Cualquier asercin que es a la vez precondicin y postcondicin de una parte del cdigo
se denomina invariante.
Ejemplo: Demostrar que r=2i es un invariante del siguiente cdigo:
i:=i+1; r:=r*2.
{ P}r:=r* 2 {r=2i }
P={r=r*2, r=2i } {r*2=2i } {r=2i-1 }
{r=2i-1} r:=r*2 {r=2i }
{P} i:=i+1 {r=2i-1 }
P={i=i+1, r=2i-1 } {r=2i+1-1} {r=2i }
{r=2i}i:=i+1 {r=2i-1 }
Con lo que queda demostrado
BUCLES
Mientras que todos los programas sin bucles terminan, no se puede decir lo mismo de
aquellos que si lo poseen o son recursivos. Por ahora slo nos preocupar la correccin
parcial.
El invariante del bucle es un aserto que captura las caractersticas que no varan al
ejecutarse un bucle.
El variante de un bucle es una expresin que mide el progreso realizado por el bucle
hasta satisfacer la condicin de salida.
Las estructuras iterativas elegidas para establecer su correccin son:
o while B do C, donde B es la condicin de entrada y C es el cdigo contenido
dentro del bucle.
o repeat C until B, donde B es la condicin de salida y C es el cdigo contenido
dentro del bucle.
Como podremos comprobar en cada iteracin el bucle debe progresar hacia la
postcondicin final, que debe derivarse del invariante cuando la condicin de entrada no
se cumple (condicin de salida).
CONCEPTO DE CORRECCIN
Si {P}C{Q} es un cdigo con la precondicin {P} y la postcondicin {Q}, entonces {P}C{Q}
es correcto si cada estado inicial posible que satisfaga {P} da como resultado un estado final
que satisface {Q}.
Dentro de este concepto debemos distinguir entre correccin total y parcial.
CORRECION PARCIAL
Se dice que {P}C{Q} es parcialmente correcto si el estado final de C, cuando termina el
programa (aunque no se le exige esta premisa), satisface {Q} siempre que el estado inicial
satisface {P}.
En un programa real, aparecen declaraciones de tipo y declaraciones de variables as como
implementaciones de funciones (pueden ser implementaciones incorporadas al sistema o hechas
por el usuario) que determinan la signatura del programa, adems el segundo argumento de un
comando de asignacin puede ser cualquier expresin del correspondiente tipo s construida con
constantes y funciones implementadas, y el primer argumento de un comando de seleccin o de
iteracin puede ser cualquier expresin del tipo BOOL. En nuestros programas, aunque no
vamos a considerar declaraciones de tipo ni de variables, supondremos que existe una
declaracin de signatura donde aparecen los tipos y las constantes y funciones necesarias con
propiedades conocidas, as como una asignacin de tipo a cada variable de programa.
EJEMPLO
Probar la correccin del siguiente algoritmo respecto de su especificacin:
P {x > 1}
xx+1
Q {x > 2}
sp(x x + 1, x > 1)
(y) x = (x + 1)[x : y] (x > 1)[x : y]
(y) x = y + 1 y > 1
x>2
CORRECIN TOTAL
Correccin total implica correccin parcial. Sin embargo, en muchas ocasiones se demuestra
primero la segunda y, a partir de ella la primera.
Teorema de la Recursin
El siguiente teorema, llamado el teorema de la recursin, formaliza la existencia de una
funcin definida de manera recursiva.
Teorema 1 (Teorema de la recursin) Dados el conjunto A, el elemento
a A y la funcion h : A A, existe una unica funcion f : N A tal que
1. f(0) = a, y
2. para todo n N, f(n + 1) = h(f(n))
Prueba. Usamos [0, n] para denotar el conjunto {0, 1, 2, . . . , n}. Primero
probamos por induccion sobre n que existe una funcion unica fn : [0, n] A tal
que
(1) fn(0) = a, y
(2) para todo m [0, n 1], fn(m + 1) = h(fn(m))
Para el caso base, note que f0 debe ser {(0, a)}. Ahora nos ocupamos del paso
inductivo de n a n + 1. Definimos fn+1 : [0, n + 1] A de la siguiente manera
(a) para m [0, n] se tiene fn+1(m) = fn(m)
(b) fn+1(n + 1) = h(fn(n))
Veamos que fn+1 satisface (1) y (2): para (1) tenemos fn+1(0) = fn(0) = a
por definicion de fn+1(0) e hipotesis de induccion (fn satisface (1)); para (2)
tenemos para todo m [0, n 1] que
fn+1(m + 1) = fn(m + 1) = h(fn(m)) = h(fn+1(m))
usando la definicin de fn+1 (caso (a)) y la hiptesis de induccin (fn satisface (2));
y finalmente
fn+1(n + 1) = h(fn(n)) = h(fn+1(n))
usando la definicion de fn+1 (caso (b), y caso (a) para m = n). La funcion
definida fn+1 es unica en [0, n] con condiciones (1) y (2) porque es identica a
fn
en [0, n] la cual es unica, y el valor de fn+1(n + 1) esta entonces determinado por el
caso (b) de la definicion.
Ahora con las funciones fn consideradas como relaciones (son conjuntos
de pares (n, x) donde n N y x A) definimos
f = U fn
n N
Esta relacion f es una funcion porque si (m, x), (m, y) f, entonces (m, x)
fn1 y (m, y) fn1 para algunos n1 y n2. Si n1 = n2 = n entonces debe ser
x = y porque n es una funcion. De los contrario supongamos n1 < n2. Entonces por la
unicidad de las fn, la restriccion de fn2 a [0, n1] debe ser igual a fn1 y por
lo tanto x = y. Es claro que el dominio de f es N (porque n dom(fn)) y que f
satisface necesariamente (1) y (2) del enunciado. Finalmente, f es unica: si f y f t son dos
tales funciones diferentes, sea n tal que f(n) = ft(n); pero entonces f y f t
restringidas a [1, n] resulta en dos funciones diferentes
que tienen las mismas propiedades (1) y (2) de fn arriba, lo que es una
contradiccion.
No todos los ejemplos que hemos visto se adaptan a la forma simple de recursion
del anterior teorema. El siguiente ejemplo muestra como este teorema se puede usar para
justificar la existencia para definiciones recursivas ms complicadas.
Ahora veamos la verificacin del algoritmo o sub-problema recursivo:
Sabemos que la ejecucin de los algoritmos o subprograma recursivo hacen, en general, que
ste sea llamado varias veces. Para asegurar que este proceso termina es necesario que el
subprograma recursivo definido cumpla las siguientes condiciones:
1) Hay al menos una posible llamada al subprograma que produce un resultado sin
provocar una nueva llamada recursiva. A esto se le llama caso base de la recursin. En
el caso de la funcin Factorial el caso base es n=0.
La siguiente definicin de la funcin Factorial no es correcta ya que no posee caso
base:
PROCEDURE Factorial (n : CARDINAL) : CARDINAL;
BEGIN
RETURN n * Factorial(n-1)
END Factorial;
2) Todas las llamadas recursivas se refieren a un caso que es ms cercano al caso base. En
el caso de la funcin Factorial, cada llamada disminuye en uno el valor del argumento,
por lo que ste se va acercando a cero, que es el caso base.
A partir de la expresin n!= (n 1)! n , y la sustitucin n = m + 1 se obtiene que (m
+1)!= m! (m +1) , de donde despejando se deduce m!= (m + 1)! / (m + 1). Con esta
expresin podemos construir el siguiente subprograma recursivo:
PROCEDURE Factorial (m : CARDINAL) : CARDINAL;
BEGIN
IF m = 0 THEN
RETURN 1
ELSE
RETURN Factorial(m+1) DIV (m+1)
END
END Factorial;
Este subprograma presenta un caso base, sin embargo no es correcto ya que no
cumple la condicin 2). Cada llamada recursiva incrementa en uno el valor del
argumento por lo que ste se va alejando del caso base y la recursin nunca termina.
3) El caso base debe acabar alcanzndose.
El siguiente subprograma cumple las condiciones 1) y 2), pero no es correcto. Si lo
llamamos con un argumento cuyo valor sea impar, el caso base nunca se alcanza.
PROCEDURE Factorial (n : CARDINAL) : CARDINAL;
BEGIN
IF n = 0 THEN
RETURN 1
ELSE
RETURN n * (n-1) * Factorial(n-2)
END
END Factorial;
Para algunos algoritmos recursivos el caso base puede ser mltiple. Un ejemplo es la sucesin
de Fibonacci, que se define del siguiente modo: el primer nmero de Fibonacci es 0, el segundo
es 1 y cualquier otro nmero de Fibonacci se obtiene sumando los dos nmeros de Fibonacci
que le preceden:
0
,si n = 1
Fibonacci(n) =
si n = 2
1,
Fibonacci(n 1)
+ Fibonacci(n 2),
caso
en otro
Los casos bases en este ejemplo son n = 1 y n = 2. Una funcin en Modula-2 que calcule el nsimo nmero de Fibonacci segn esta definicin es:
. . . {Pn1}Sn{Pn}
anotacion
{P1 }
S2
anotacion
...
{Pn1 } anotacion
Sn
{Pn }
anotacion
al principio de la secuencia,
0 P
Al final del proceso, obtenemos una formula
que garantiza que al ejecutar S se verifica la postcondicion Pn . Debemos
chequear
si P puede obtenerse a partir de la precondicion P0 mediante la regla
de reforzamiento de la precondicion.
0 P , usando cualquiera
En este caso, deberamos demostrar que P0
de los sistemas deductivos de logica de predicados. En general, ese
tipo de demostraciones, que aparecen al usar las dos reglas de la
implicacion, suelen omitirse en la secuencia de anotaciones e instrucciones.
Si se demuestra que P R, la practica habitual es simplemente escribir
la segunda condicion debajo de la primera.
{P }
{R}
S
{Q}
{P B}S{P }
{P }while B do S{P B}
Si tenemos una precondicion R y una postcondicion Q, y queremos demostrar:
|=par {R}while B do S{Q}
Debemos encontrar una formula P del LF que verifique:
1. Comenzar
Conclusion
Tenemos que tomar en cuenta que los mtodos formales estn presentes en
bastantes campos y no solo los referidos a la ingeniera y la informtica, los
mtodos formales tienen un amplio recorrido y su utilidad y eficiencia en
desarrollo crticos estn demostradas. Sus herramientas proporcionan el soporte
automatizado necesario para la integridad, trazabilidad, verificabilidad,
reutilizacin y para apoyar la evolucin de los requisitos, los puntos de vista
diversos
y
la
gestin
de
las
inconsistencias.
Los mtodos formales pueden ser aplicados en las empresas para mejorar sus
procedimientos y productos.
BIBLIOGRAFA
VERIFICACIN FORMAL DE ALGORITMOS - J.V.Alvarez(Departamento de Informtica
Universidad de Valladolid Campus de Segovia)
Programming with TopSpeed Modula-2. Barry Cornelius. Addison-Wesley.
Pascal y estructuras de datos. Nell Dale y Susan C. Lilly. McGraw-Hill.
Fundamentos de programacin . L. Joyanes. McGraw-Hill.