









Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
esto te ayudara en aprender cosas muy importnates que te serviran en un futuro no muy lejano
Tipo: Resúmenes
1 / 16
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!










Palabras clave : programa, especificación de programas, corrección de programas, triplas de Hoare.
Programa y estado de programa Triplas de Hoare Resumen Especificación de un programa Ejemplos de triplas de Hoare
Cuando se desea verificar si un programa es correcto, i. e., sus salidas son las esperadas, una estrategia es construir un conjunto de casos de prueba suficientemente exhaustivo para escrutar todos los posibles errores que pudiese tener el programa. Esta estrategia es aplicada ampliamente en la industria, principalmente por su bajo costo. No obstante, el uso de casos de prueba no garantiza en un 100% la corrección del programa, ya que es posible que el equipo encargado de las pruebas haya pasado por alto alguna situación en la que el programa pudiera comportarse de manera distinta a la esperada. En la mayor parte de las aplicaciones computacionales, una probabilidad pequeña de fallo puede ser tolerada, e. g., si un Xbox se bloquea en medio de un juego, esto no genera mayor costo y el problema seguramente se resolverá reiniciando la consola; además, dado que la probabilidad de que el problema se presente es baja, difícilmente causará una demanda al fabricante. Por otra parte, en aplicaciones críticas, un error, por simple que sea, puede tener costos incalculables. Suponga, por ejemplo, que el controlador de un avión no tripulado calcula con un error mayor al tolerable el ángulo que debe virar; las consecuencias de este error incluyen la pérdida total de la aeronave (y posiblemente también de la confidencialidad de su diseño). Cuando se requiere una garantía absoluta de la corrección de un programa, se debe hacer una demostración formal de la misma. En esta lectura se introducen los conceptos de especificación de programas y triplas de Hoare, que brindarán el lenguaje suficiente para realizar dichas demostraciones. La sección 1 repasa conceptos fundamentales de la programación, en una forma adecuada para abordar los temas subsiguientes. La sección 2 explica qué son la precondición y poscondición de un programa, elementos que forman su especificación. Luego, en la sección 3 se presentan las triplas de Hoare, elementos del lenguaje fundamentales para poder demostrar formalmente la corrección de programas. Finalmente, en la sección 4 se exponen ejemplos de triplas de Hoare correspondientes a programas que resuelven tareas sencillas encontradas frecuentemente en aplicaciones reales.
La precondición es un predicado que define el conjunto de estados iniciales válidos de un programa, i. e., restringe los valores iniciales de las variables de entrada. De manera similar, la poscondición es un predicado que define el conjunto de estados finales aceptados del programa, i. e., restringe los valores finales de las variables de salida y enuncia las relaciones entre estos valores y los valores iniciales de las variables de entrada. En adelante, la precondición y poscondición se expresarán como {Pre Q: <precondición> } y {Pos R: <poscondición>}. Dado que en la poscondición se hará referencia a los valores iniciales de las variables de entrada, una práctica común es representar estos valores mediante variables semánticas en la precondición. Las variables semánticas no hacen parte del programa y por tanto no pueden ser modificadas por este. Comúnmente, se distinguen las variables semánticas de las variables del programa denotando las primeras con letras mayúsculas y las segundas con letras minúsculas. Ejemplo 2. Considerando el programa del ejemplo 1, puede observarse que en su descripción se indica que sus valores de entrada deben ser no negativos. Adicionalmente, dado que MCD(0, 0) no está definido, los valores de entrada no pueden ser simultáneamente 0. La precondición para el programa sería entonces la siguiente: {Pre Q: a ≥ 0 ^ b ≥ 0 ∧ a + b > 0 ∧ a = A ∧ b = B} De igual forma, el valor final de a debe corresponder a MCD(A, B). Esto se indica en la poscondición como {Pos R: a = MCD(A, B)} o, usando cuantificación, como {Pos R: a = (max m : m|A ∧ m|B : m)} La pareja formada por la precondición y la poscondición de un programa es llamada la especificación del programa. Note que la especificación establece qué debe hacer el programa, mas no el cómo debe hacerlo.
Una tripla de Hoare está compuesta por un programa junto con su precondición y poscondición (Hoare, 1969). Una tripla de Hoare se denota como {Q}S{R}, donde S representa el programa, Q su precondición y R su poscondición. La tripla {Q}S{R} es una expresión lógica que es válida cuando el programa S es correcto con respecto a su especificación Q y R. El programa S es correcto si y solo si al ser ejecutado sobre cualquier estado inicial que satisface la precondición, produce un estado final que satisface la poscondición. La tripla {Q}S{R} no es válida (y, por lo tanto, el programa incorrecto) si existe al menos un estado e que satisface Q tal que al ejecutar S sobre dicho estado:
3.1.3. Fortalecimiento de precondición Si [P ⇒ Q] y {Q}S{R} es válida, entonces también es válida {P}S{R}. [P ⇒ Q] significa que el conjunto de estados que cumplen P es subconjunto del conjunto de estados que cumplen Q. {Q}S{R} implica que todo estado que satisface Q es transformado por S en un estado que satisface R. Por lo tanto, todo estado que satisface P es transformado por S en un estado que satisface R,i.e.,{P}S{R}. Figura 2. Ilustración de la propiedad de fortalecimiento de precondición Fuente : elaboración propia 3.1.4. Debilitamiento de poscondición Si [R ⇒ P] y {Q}S{R} es válida, entonces también es válida {Q}S{P}. [R ⇒ P] significa que el conjunto de estados que cumplen R es subconjunto del conjunto de estados que cumplen P.{Q}S{R} implica que todo estado que satisface Q es transformado por S en un estado que satisface R. Por lo tanto, todo estado que satisface Q es transformado por S en un estado que satisface P,i.e.,{Q}S{P}. Q P R
Figura 3. Ilustración de la propiedad de debilitamiento de poscondición Fuente : elaboración propia. 3.1.5. Conjunción de poscondiciones Si {Q}S{R} y {Q}S{P} son válidas, entonces también es válida {Q}S{R ∧ P}. {Q}S{R} implica que todo estado que satisface Q es transformado por S en un estado que satisface R.{Q}S{P} implica que todo estado que satisface Q es transformado por S en un estado que satisface P. Por lo tanto, todo estado que satisface Q es transformado por S en un estado que satisface tanto R como P,i.e.,{Q}S{R ∧ P}. Q (^) R P
Figura 6. Sir Charles Antony Richard Hoare dando una charla en el EPFL el 20 de junio de 2011. Fuente : Rama, (s.f.). ¿Sabía que...? Las triplas de Hoare deben su nombre a su creador, Tony Hoare, quien publicó en 1969 un artículo (Hoare, 1969) que describe un conjunto de reglas lógicas para razonar sobre la corrección de programas, llamado Lógica de Hoare. Entre sus valiosas contribuciones a las ciencias de la computación se encuentran también los algoritmos de ordenamiento Quicksort y de selección Quickselect. Hoare fue galardonado con el Premio A. M. Turing de la ACM (Association for Computing Machinery ), el más importante en ciencias de la computación, en el año 1980.
Ejemplo 3. Note que a = A tiene como único fin asociar la variable semántica A al valor inicial de a pero no impone ninguna restricción sobre dicho valor, por lo que el programa acepta cualquier estado como inicial. Puede demostrarse por contraejemplo que la tripla no es válida (A = 0). {Pre Q: a = A} program ejemplo_ input : a:R var : b:R b := 1 / a return b {Pos R: Ab = 1} Ejemplo 4. El programa calcula el inverso multiplicativo de la entrada a. Dado que la precondición restringe el caso A = 0, puede verse (aunque no corresponda esto a una demostración formal) que el programa es correcto. {Pre Q: a > 0 ∧ a = A} program ejemplo_ input : a:R var: b:R b := 1 / a return b {Pos R: Ab = 1}
Ejemplo 7. El programa calcula AB. Posteriormente, se analizará su corrección. {Pre Q: b ≥ 0 ∧ a = A ∧ b = B} program ejemplo_ input: a:R, b:ℤ var: p:R p := 1 while b > 0 do p := p * a b := b - 1 return p {Pos R: p = Ab} Ejemplo 8. El programa calcula el máximo valor en el arreglo de entrada. Posteriormente, se analizará su corrección. {Pre Q: a = A} program ejemplo_ input: n:ℤ, a:ℝ[n] var: m:R m := -∞ k := 0 while k < n do if m < a[k] m := a[k] k := k + 1 return m {Pos ℝ: m = (max i | 0≤i<n : A[i])}
Se denomina estado del programa al conjunto de valores de las variables del programa en un momento dado. Puede entenderse un programa entonces como un conjunto de transformaciones de su estado y, en particular, como una transformación de un estado inicial en un estado final. La precondición de un programa es un predicado que define el conjunto de estados iniciales válidos de un programa, i. e., restringe los valores iniciales de las variables de entrada. La poscondición de un programa es un predicado que define el conjunto de estados finales aceptados del programa, i. e., restringe los valores finales de las variables de salida y enuncia las relaciones entre estos valores y los valores iniciales de las variables de entrada. La precondición y poscondición de un programa forman su especificación. Las variables semánticas son variables que no hacen parte del programa, pero sí de su especificación. Estas variables son usadas para hacer referencia a los valores iniciales de las variables de entrada en la poscondición. Una convención común es nombrar las variables semánticas usando letras mayúsculas y las variables de programa usando letras minúsculas. Una tripla de Hoare es una expresión lógica compuesta por un programa y su especificación, denotada como{Q}S{R}, donde S corresponde al programa y Q y R a su especificación. Una tripla de Hoare es válida si y solo si el programa es correcto con respecto a la especificación. Un programa es correcto con respecto a su especificación si y solo si al ser ejecutado sobre cualquier estado inicial que satisface la precondición, produce un estado final que satisface la poscondición. Las triplas de Hoare satisfacen las siguientes propiedades:
INFORMACIÓN TÉCNICA Módulo: Análisis y Verificación de Algoritmos Unidad 1: Verificación de programas Escenario 1: Triplas de Hoare Autor: Edwin Andrés Niño Asesor Pedagógico: Edwin Mojica Diseñador Gráfico: Andrés Felipe Figueroa Asistente: Eveling Patricia Peñaranda Este material pertenece al Politécnico Grancolombiano. Prohibida su reproducción total o parcial.