Está en la página 1de 12

INTRODUCCIN

La verificacin formal de un algoritmo consiste en un conjunto de tcnicas de


comprobacin que permiten demostrar que un programa puede funcionar correctamente
o no.
La verificacin consiste en todo un proceso de inferencia en el cual cada representacin
formal posee una regla de correspondencia y esta representacin formal se da a travs
de la terna de Hoare.

LOGICA DE HOARE
Es una lgica de predicados de primer orden que permite probar la verdad o
falsedad de propiedades de programas imperativos para razonar sobre la
correccin de programas imperativos construidos sobre una signatura (S, ). Esta
extensin se obtiene introduciendo un lenguaje de comandos con el que se construyen
los programas y una relacin especial para expresar el comportamiento de un
programa, asi como un conjunto de reglas de clculo para la manipulacin de las
expresiones de comportamiento.
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.
Instruccin.
Bloque de instrucciones consecutivas.
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, frmulas de la Lgica de Primer Orden (Lgica de
Predicados).
P Precondicin (se refiere al estado previo a S)
Q Postcondicin (se refiere al estado posterior a S)

Notacin: {P}S{Q}

Sentencias de correccin parcial 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. Para
expresar el comportamiento de un programa normalmente se recurre a una
signatura (S, ) ms amplia que la que se deriva del propio programa,
incorporando tipos y funciones auxiliares que no aparecen en el programa (pero
que deben estar debidamente especificados), y a una familia de variables V ,
tambin ms amplia que la familia de variables de programa incorporando
variables nuevas o variables lgicas que tampoco aparecen en el programa, y se
introduce una relacin especial

REPRESENTACIN FORMAL: TERNAS DE HOARE


Antes de planear el programa, debe realizarse una revisin de la necesidad para la
existencia del programa y definirse de alguna forma los objetivos que desean
lograrse a travs del programa (requerimientos). El proceso de plantacin de un
programa tiene como finalidad lograr el diseo de un programa que cumpla con los
requerimientos. Generalmente es conveniente disear primero la estructura general del
programa y trabajar luego la lgica detallada.
La plantacin de un programa es semejante a la planeacin de un edificio o
una casa. Primero, se realiza un diagrama general en el que se muestran las diferentes
habitaciones (las diferentes funciones que debern realizarse), y la relacin entre
ellos. A continuacin se realiza el diseo detallado de cada habitacin. De manera
similar es necesario que exista una estructura general para el programa de
computadora.
Si C es una parte del cdigo, entonces cualquier asercin {P} se denomina precondicin
de C si {P} slo implica al estado inicial. Cualquier asercin {Q} se denomina
postcondicin si {Q} slo implica el estado final.
PRECONDICIONES Y 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.
Ejemplo:
Programa que calcula la raz cuadrada
Precondicin: Que el argumento de la funcin no sea negativo
Postcondicin: La raz cuadrada de ese argumento.
NOMENCLATURA:
En la mayora de los cdigos el estado final depende del estado inicial esto
sucede tambin en el caso de la precondicin y postcondicin estas no son
independientes entre s.

Existen dos posibles nomenclaturas que permiten reflejar dicha dependencia


entre precondicin y postcondicin:

REPRESENTACIN DEL SUBNDICE: mediante subndices se indica si las


variables representan valores iniciales o finales. {a =b } {b =a } donde
representa el estado final y el estado inicial.

REPRESENTACIN DE LAS VARIABLES OCULTAS: Las variables ocultas son


variables que aparecen o no en el cdigo y que se introducen para almacenar
los valores iniciales de ciertas posiciones de memoria. Su definicin debe
aparecer en la precondicin. {a=A,b=B} h:=a; a:=b; b:=h {a=B, b=A}

1.1.- PROGRAMAS Y CODIGOS


La especificacin de un problema
Programar una solucin no solo es codificar el programa, sino hallar una
solucin (algoritmo), especificar la solucin y luego implementar la solucin.
Especificar consiste en esencia, responder a la pregunta Qu hace el
programa?, no interesa los detalles de cmo sera el programa.
La implementacin de un problema
Despus de que la especificacin ha sido realizada, el siguiente paso consiste
en responder Cmo se consigue la funcin pretendida?, a este paso se le
denomina implementacin
La especificacin de un algoritmo tiene un doble destinatario:
Los usuarios del algoritmo.- La especificacin debe incluir todo lo
necesario para el uso correcto de los programas, as como las
obligaciones del usuario cuando invoque al algoritmo.
El implementador del algoritmo (programador).- La especificacin debe
incluir las restricciones que el implementador debe considerar en el programa.
Una solucin mal especificada producir un programa que no satisface el
requerimiento del problema planteado.
Consideremos un lenguaje hipottico como un conjunto que contiene:
1 Todos los operadores aritmticos y funciones de biblioteca
2 Bloques de sentencias que comienzan con una llave { y termina con un }.
3 La estructura de decisin Si..Entonces.. Fin_si
La estructura repetitiva Mientras hacer .. Fin_Hacer
Los programas en este lenguaje trabajan con estados de programas y estos estados se
modifican por accin de las partes del cdigo. Las partes del cdigo son
funciones que proyecta el estado inicial, que es el estado al comienzo, sobre el
estado final, que es el estado al finalizar la parte del cdigo. Para convertirse en una
funcin, las sentencias que comprenden la parte de un cdigo deben ser
independientes.
Varias partes del cdigo pueden estar concatenadas, lo que significa simplemente que
se ejecutan secuencialmente.

1.2.- ASERCION
Una asercin es cualquier sentencia referente a un estado del programa,
y se
Denota como {A} .
Si P es una parte de un cdigo, entonces:
Una precondicin de P, es cualquier asercin {A} que solo implica el estado
inicial.
Una postcondicin de P, es cualquier asercin {B} que solo implica el estado
final.
Si P tiene como precondicin a {A} y postcondicin a {B}, escribimos la terna:
{A} P {B}, llamada la terna de Hoare.

Ejemplo 1

Queremos especificar un algoritmo que verifique si en una matriz existen


dos
columnas con igual suma de sus elementos.
Definimos TIPO MAT = MATRIZ [1..MAX, 1..MAX] de enteros
A : { 1 M,N MAX , M=N, es decir A es cuadrada}
P : FUN VERIFCACOLU(A:MAT, M,N:entero) DEV (b : booleano)
B : { b p, q {1..n} tal que
}

Ejemplo 2

Queremos especificar un algoritmo que halla la recta L que pase


por dos
puntos P y Q.
Sea el tipo struct punto{ x: real,
y: real}
Sea el tipo struct recta{ m: real,
b: real}
Sea P = (X1,Y1) Q = (X2,Y2) La recta L se define y = m x + b
Donde m es La pendiente de L
A : { P,Q son de tipo punto , P Q}
P : FUN HallarRecta(P,Q: punto) DEV (L : recta)
B : { L : m= (Y2-Y1)/( X2-X1) b = Y1- m X1}

Ejemplo 3

Queremos especificar un algoritmo que calcule el cociente por defecto y


el resto de la divisin entera de dos enteros.

A : { b 0 }
P : FUN DIVIDE (a,b : entero) DEV (q,r:entero)
B : { a =b*q + r }
Una implementacin de divide puede ser :
P : q = 0 ; r = a ,pues satisface la postcondicion B
Sin embargo eso no es lo que se pretende implementar
Reforzamos la precondicion
A : {a 0 , b 0 }
P : FUN DIVIDE (a,b : entero) DEV (q,r:entero)
B : { a = b*q + r r 0 r < b}
Solo existen dos enteros a, b que satisfacen {B}

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
Sentencias de correccin parcial 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. Para
expresar el comportamiento de un programa normalmente se recurre a una
signatura (S, ) ms amplia que la que se deriva del propio programa,
incorporando tipos y funciones auxiliares que no aparecen en el programa (pero
que deben estar debidamente especificados), y a una familia de variables V ,
tambin ms amplia que la familia de variables de programa incorporando
variables nuevas o variables lgicas que tampoco aparecen en el programa, y se
introduce una relacin especial {} {}: F(V ) P RG F(V ) con la que se
expresan formulas o sentencias de correccin parcial. Al primer argumento se le
llama precondicin y al tercero postcondicin; estos argumentos estn sujetos a
una restriccin sobre las variables de programa: dichas variables slo deben
tener apariciones libres o, dicho de otro modo, las variables de programa no
deben aparecer cuantificadas. 2.2. LOGICA DE HOARE. 2-19 La validez de
estas frmulas se define del siguiente modo: {P} {Q} es vlida en una

interpretacin A, para un estado sta, o A |=sta {P} {Q} 2 , si y slo si A |=sta P y


sta[]Asta0 implica A |=sta0 Q Esto significa que {P}{Q} ser vlida cuando la
validez de la precondicin P en el estado sta y el hecho de que cuando parte
del estado sta termina en un cierto estado sta0 implique que la postcondicin Q
es vlida para dicho estado final sta0 . De esta definicin se deduce que una
frmula {P} {Q} puede ser vlida en una interpretacin A, para un estado sta
por alguna de las circunstancias siguientes:
Porque A |=sta P y cuando parte del estado sta termina en un estado sta0 tal
que A |=sta0 Q;
Porque A |=sta P, pero cuando parte del estado sta no termina (el
transformador [] A no est definido en sta), o
Porque A 6|=sta P; lo que significa que la validez de una frmula de correccin
parcial no implica la terminacin del correspondiente programa, y, en algunos
casos, ni siquiera la validez de la precondicin para el estado que se considera.
{P} {Q} se dice que es vlida en la interpretacin A cuando lo es para todos los
estados definibles sobre A, en cuyo caso se escribe A |= {P} {Q} y se dice que
el programa es parcialmente correcto con respecto a la especificacin (P, Q).
Tambin se dice que (P, Q) es una especificacin parcial de .
CORRECIN TOTAL
Como hemos visto, la validez de una sentencia de correccin parcial no implica
que el transformador de estados correspondiente al programa que aparece en la
sentencia est definido para todos los estados denotados por la precondicin.
Esta indefinicin, a nivel terico, slo puede deberse a la aparicin de ciclos
tales que la aplicacin reiterada del transformador asociado al cuerpo del ciclo a
estados en los que es vlida la condicin de control nunca alcanza un estado en
el que no se cumpla dicha condicin. En estos casos se dice que el programa no
termina. El lenguaje de la lgica de Hoare se podra ampliar con frmulas de
correccin total de la forma [P][Q] cuya validez en una interpretacin A, para un
estado sta, se puede establecer de la forma siguiente: A |=sta [P][Q], si y slo si
A |=sta P implica sta[]Asta0 y A |=sta0 Q; y su validez en A se cumplir cuando
sea vlida para todos los estados definibles sobre A; lo que significa que la
validez de una frmula [P][Q] implica la terminacin del 2.3. VERIFICACION DE
PROGRAMAS. 2-27 programa cuando parte de un estado caracterizado por
P y la validez de Q en el estado que se alcanza. Sin embargo, el clculo de
Hoare no se amplia para tratar sentencias de correccin total, sino que la
correccin parcial y la terminacin se suelen tratar por separado. Aunque el
lenguaje de sentencias de Hoare no contempla la posibilidad de expresar la
terminacin normal de programas, en muchos casos se puede recurrir a un
mtodo parcialmente informal derivado del siguiente razonamiento: la posibilidad
de no terminacin de un programa se debe normalmente a la aparicin de
ciclos5 y para que pueda terminar un ciclo es necesario que su cuerpo produzca
algn tipo de evolucin o progreso de los estados hacia situaciones en las que
no se cumpla la condicin de control. Esta idea la podemos concretar
expresando la evolucin del ciclo mediante una funcin de progreso f, con valor
entero, tal que deba ser no negativa para que se ejecute el ciclo y disminuya
estrictamente despus de cada repeticin; como el decrecimiento de la funcin
en estas condiciones no puede ser perpetuo, resulta obvio al menos
intuitivamente que el ciclo debera terminar. Esta idea se formaliza, para un

ciclo WHILE tB DO END con invariante I, buscando una funcin f para la que
se pueda demostrar lo siguiente

1. I tB f 0,
2. {I tB f = A} {f < A}.

CALCULO DE HOARE
El clculo Hoare consiste en declaraciones en el programa de pruebas de su valor
semntico. En el programa de correccin se utiliza para la lgica de predicados de
primer orden. En este caso, las variables individuales corresponden a las variables del
programa y los smbolos funcionales incluyen todas las operaciones que se producen
en las expresiones. La prueba de significacin se realiza incluyendo una declaracin
antes de la orden a probar, llamada pre-condicin, y otro despus de la ejecucin del
comando, llamado post-condicin, de la siguiente manera:
{P} C {Q}
Donde P es la condicin previa, C es el comando de prueba, y Q es la post-condicin.

Por lo tanto, podemos decir que el significado de C est estrechamente vinculado con el
par <P, Q>, que se llama C. Sobre la especificacin de correccin C, es cierto cuando
los valores de entrada pasan por P y generan un cierto para P, C y corre y los valores de
salida pasa por Q y devolver un valor verdadero para P.
El objetivo de este mtodo es la obtencin de reglas de prueba y axiomas que nos
proporcionan el resultado de este comando, por lo axiomas que asocian y pruebas a
ciertas partes de los programas, que a su vez pueden ser diferentes, pero si tienen la
misma evidencia y axiomas asociados son equivalentes. Entonces, dado un cdigo C
que implementa B y una optimizacin del algoritmo C, dicho por C ', que implementa el
mismo algoritmo con algunas modificaciones, sin embargo, con las mismas funciones, y
teniendo en cuenta las afirmaciones iniciales P y extremo Q, por lo que es cierto que:
{P} C {Q} = {P} C {Q}.
REGLAS DEL CALCULO HOARE
Comando SKIP
No hace nada, y no tiene ningn efecto sobre el programa, est representado por el
teorema:
________________
{ P } skip { P }
Debido a que Skype no hace nada, su condicin previa debe ser el mismo que la
postcondicin en el caso P.
Comando de Asignacin

El valor de entrada es vlida para la condicin previa de la subvencin, la variable que


recibe el valor debe validar las mismas condiciones que al principio, pero ahora con esta
condicin despus de la condicin y el predicado del valor de entrada a la variable
recibi una cantidad. Por lo tanto, teniendo por ejemplo V: Z = P y la condicin previa,
tenemos el teorema:
____________________________
{P ( V ) } V := Z { P( Z ) }
As que esto nos dice que las propiedades que el valor V tena antes de la asignacin,
se aplican ahora tambin a Z despus de la asignacin.

Comando If-then-else
Este comando tiene dos caminos para ser probado para una afirmacin, entonces es
necesario que los dos caminos sean ciertos, para cada uno de sus valores. Por lo tanto,
tomando como ejemplo C 'y el cdigo C y B un valor que define que se ejecutar,
tenemos la regla:
{ P ^ B } C { Q } { P ^ B } C { Q }
{ P } if B then C else C fi { Q }.
En este caso, B es una expresin booleana en los estados y en el cdigo de verificacin
de cdigo.
Comando if-then
Similar a la If-then-else, solo que en lugar de else usamos skip, por lo que contina
como est, sin hacer nada. Utilizando los mismos ejemplos de if-then-else tenemos la
regla:
{ P ^ B } C { Q } P ^ B Q (5)
{ P } if B then C fi { Q }.
Comando while
Siguiendo los ejemplos anteriores, tenemos la regla:
_______{ P ^ B } C { P }_______
{ P } while B do C od { P ^ B }
Donde P se llama bucle invariante, que para n iteraciones, while siempre debe ser
vlida.

Definicin de Fuerza
Podemos debilitar la pre-condicin y post-condicin de acuerdo con la necesidad y la
posibilidad de la prueba. Ejemplos:
{ P } C { Q } Q R
{P}C{R}

Estamos debilitando la post-condicin porque a partir de Q R tenemos la certeza de


que Q llegar a R, debilitando as la post-condicin para R.
P Q { Q } C { R }
{P}C{R}
Aqu debilitamos la pre-condicin, partiendo desde P Q tenemos la certeza de que
cualquier trmino que implica Q tambin debilitar la pre-condicin para P.

Restricciones de la semntica axiomtica


En la semntica axiomtica como en la mayora de las semnticas existen limitaciones
que si no se respetan pueden generar resultados inesperados.
No est permitido el uso de funciones, procedimientos, comandos que generen efectos
secundarios.
Las reglas de mbito tambin son difciles de ser descritas en la semntica axiomtica,
a menos que los nombres del mbito sean nicos para cada cdigo generado.
Conclusin
A pesar de sus limitaciones, el clculo Hoare es una tcnica que facilita en gran medida
los algoritmos de correccin, desarrollo de algoritmos de generacin de cdigo de un
programa "limpio y libre de errores" y la semntica esperada en la generacin de un
programa basado en especificaciones de lenguajes. Por lo tanto, es una herramienta
tcnica de gran utilidad para los programadores.

REGLAS RELATIVAS A LAS PRECONDICIONES Y POSTCONDICIONES

CONCLUSIONES

Los mtodos formales permiten que un ingeniero de software especifique,


desarrolle y verifique un sistema basado en computadora aplicando una notacin
rigorosa y matemtica; utilizando est mtodo descubre y corrige
ambigedades, inconsistencias y errores.

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.

La decisin de utilizar mtodos formales debe considerar los costes de arranque,


as como los cambios puntuales asociados a una tecnologa radicalmente
distinta. En la mayora de los casos, los mtodos formales ofrecen los mayores
beneficios para los sistemas de seguridad y para los sistemas crticos para los
negocios.

Lo que se ha pretendido plantear en este trabajo es cmo nos enfrentamos al


reto de determinar si el software que construimos realmente har lo que
esperamos de l. Para ello hemos partido del entorno acadmico (donde lo que
prima es la formalidad y la teora) y hemos llegado hasta el entorno industrial
guiado principalmente por metodologas de desarrollo bien definidas.

BIBLIOGRAFIA

También podría gustarte