La lógica de Hoare (también conocida como lógica de Floyd-Hoare o reglas de Hoare ) es un sistema formal con un conjunto de reglas lógicas para razonar rigurosamente sobre la corrección de los programas informáticos . Fue propuesta en 1969 por el científico informático y lógico británico Tony Hoare , y posteriormente refinada por Hoare y otros investigadores. [ 1 ] Las ideas originales fueron sembradas por el trabajo de Robert W. Floyd , quien había publicado un sistema similar [ 2 ] para diagramas de flujo .
Hoare triple
La característica central de la lógica de Hoare es la tripleta de Hoare . Una tripleta describe cómo la ejecución de un fragmento de código cambia el estado del cálculo. Una tripleta de Hoare tiene la forma
dóndeyson afirmaciones yes un comando . [ nota 1 ]se denomina condición previa yLa postcondición : cuando se cumple la precondición, la ejecución del comando establece la postcondición. Las aserciones son fórmulas en la lógica de predicados .
La lógica de Hoare proporciona axiomas y reglas de inferencia para todas las construcciones de un lenguaje de programación imperativo simple . Además de las reglas para el lenguaje simple descritas en el artículo original de Hoare, desde entonces, Hoare y muchos otros investigadores han desarrollado reglas para otras construcciones del lenguaje. Existen reglas para la concurrencia , los procedimientos , los saltos y los punteros .
Corrección parcial y total
Utilizando la lógica estándar de Hoare, solo se puede probar la corrección parcial . La corrección total requiere además la terminación , que se puede probar por separado o con una versión extendida de la regla While. [ 3 ] Por lo tanto, la lectura intuitiva de una tripleta de Hoare es: Siempre quederechos del estado antes de la ejecución de, entoncesse mantendrá después, ono termina. En este último caso, no hay un "después", así quepuede ser cualquier afirmación. De hecho, uno puede elegirser falso expresar queno termina.
En este artículo, el término «terminación» se entiende en el sentido más amplio de que el cálculo finalmente terminará; es decir, implica la ausencia de bucles infinitos. No implica la ausencia de violaciones de los límites de implementación (por ejemplo, división por cero), que detienen el programa prematuramente. En su artículo de 1969, Hoare utilizó una noción más restringida de terminación, que también implicaba la ausencia de violaciones de los límites de implementación, y expresó su preferencia por la noción más amplia de terminación, ya que mantiene las aserciones independientes de la implementación.
Otra deficiencia en los axiomas y reglas citados anteriormente es que no proporcionan ninguna base para una prueba de que un programa termina correctamente. El fallo de terminación puede deberse a un bucle infinito; o puede deberse a la violación de un límite definido por la implementación, por ejemplo, el rango de operandos numéricos, el tamaño del almacenamiento o un límite de tiempo del sistema operativo. Por lo tanto, la notación “” debe interpretarse “siempre que el programa finalice correctamente, las propiedades de sus resultados se describen porEs bastante sencillo adaptar los axiomas para que no puedan utilizarse para predecir los resultados de programas que no terminan; sin embargo, su uso real dependería del conocimiento de muchas características propias de la implementación, como el tamaño y la velocidad del ordenador, el rango de números y la técnica de desbordamiento empleada. Aparte de las pruebas de que se evitan los bucles infinitos, probablemente sea mejor demostrar la corrección condicional de un programa y confiar en que la implementación emita una advertencia si ha tenido que interrumpir la ejecución del programa debido a la violación de un límite de implementación.
— Hoare 1969 , págs. 578–579
Normas
esquema del axioma de la declaración vacía
La regla de la instrucción vacía afirma que la instrucción skip no cambia el estado del programa; por lo tanto, lo que es verdadero antes de skip también lo es después. [ nota 2 ]
Esquema del axioma de asignación
El axioma de asignación establece que, después de la asignación, cualquier predicado que antes era verdadero para el lado derecho de la asignación ahora se cumple para la variable. Formalmente, sea P una afirmación en la que la variable x es libre . Entonces:
dóndedenota la afirmación P en la que cada aparición libre de x ha sido reemplazada por la expresión E.
El esquema del axioma de asignación significa que la verdad dees equivalente a la verdad posterior a la asignación de P. Por lo tanto, fueronSi P fuera verdadero antes de la asignación, según el axioma de asignación, entonces P sería verdadero después. Por el contrario, si P fuera verdadero antes de la asignación, entonces P sería verdadero después.falso (es decirSi P es verdadero antes de la declaración de asignación, entonces debe ser falso después.
Ejemplos de tríos válidos incluyen:
Todas las precondiciones que no se modifican por la expresión pueden trasladarse a la postcondición. En el primer ejemplo, asignandoeso no cambia el hecho de que, por lo que ambas afirmaciones pueden aparecer en la postcondición. Formalmente, este resultado se obtiene aplicando el esquema axiomático con P siendo (y), lo que produceser (y), que a su vez puede simplificarse a la condición previa dada.
El esquema del axioma de asignación equivale a decir que para encontrar la precondición, primero se toma la postcondición y se reemplazan todas las ocurrencias del lado izquierdo de la asignación con el lado derecho. Tenga cuidado de no intentar hacerlo al revés siguiendo esta forma incorrecta de pensar:; esta regla da lugar a ejemplos sin sentido como:
Otra regla incorrecta que parece tentadora a primera vista es; esto lleva a ejemplos sin sentido como:
Mientras que una postcondición dada P determina de manera única la precondición, lo contrario no es cierto. Por ejemplo:
- ,
- ,
- , y
son instancias válidas del esquema del axioma de asignación.
El axioma de asignación propuesto por Hoare no se aplica cuando más de un nombre puede referirse al mismo valor almacenado. Por ejemplo,
es incorrecto si x e y se refieren a la misma variable ( aliasing ), aunque es una instancia adecuada del esquema del axioma de asignación (con ambosyser).
Regla de composición
La regla de composición de Hoare se aplica a programas ejecutados secuencialmente S y T , donde S se ejecuta antes que T y está escrito( Q se denomina condición intermedia ): [ 4 ]
Por ejemplo, consideremos los dos siguientes casos del axioma de asignación:
y
Según la regla de secuenciación, se concluye:
En el recuadro de la derecha se muestra otro ejemplo.
Regla condicional
La regla condicional establece que una postcondición Q común a la parte then y else también es una postcondición de toda la instrucción if...endif . [ 5 ] En la parte then y else , la condición B no negada y negada se puede agregar a la precondición P , respectivamente. La condición B no debe tener efectos secundarios. Se da un ejemplo en la siguiente sección .
Esta regla no estaba contenida en la publicación original de Hoare. [ 1 ] Sin embargo, dado que una declaración
tiene el mismo efecto que una construcción de bucle de una sola vez
La regla condicional se puede derivar de las demás reglas de Hoare. De manera similar, las reglas para otras construcciones de programas derivadas, como el bucle for , el bucle do...until , switch , break y continue , se pueden reducir mediante la transformación del programa a las reglas del artículo original de Hoare.
Regla de consecuencia
Esta regla permite reforzar la condición previa.y/o debilitar la condición posteriorSe utiliza, por ejemplo, para lograr postcondiciones literalmente idénticas para la parte then y la parte else .
Por ejemplo, una prueba de
necesita aplicar la regla condicional, que a su vez requiere demostrar
- o simplificado
por la parte de entonces , y
- o simplificado
para la otra parte.
Sin embargo, la regla de asignación para la parte entonces requiere elegir P como; la aplicación de la regla produce, por lo tanto,
- , lo cual es lógicamente equivalente a
- .
La regla de consecuencia es necesaria para reforzar la condición previa.obtenido de la regla de asignación arequerido para la regla condicional.
De manera similar, para la parte else , la regla de asignación produce
- o equivalentemente
- ,
por lo tanto, la regla de consecuencia debe aplicarse conysery, respectivamente, para reforzar nuevamente la condición previa. De manera informal, el efecto de la regla de consecuencia es "olvidar" quese conoce al inicio de la parte else , ya que la regla de asignación utilizada para la parte else no necesita esa información.
Mientras que regla
Aquí P es el invariante del bucle , que debe ser preservado por el cuerpo del bucle S. Después de que el bucle haya terminado, este invariante P todavía se cumple, y ademásdebe haber provocado que el bucle terminara. Como en la regla condicional, B no debe tener efectos secundarios.
Por ejemplo, una prueba de
por la regla del mientras que requiere probar
- o simplificado
- ,
que se obtiene fácilmente mediante la regla de asignación. Finalmente, la postcondiciónse puede simplificar a.
Por otro ejemplo, la regla while se puede utilizar para verificar formalmente el siguiente programa extraño para calcular la raíz cuadrada exacta x de un número arbitrario a , incluso si x es una variable entera y a no es un número cuadrado:
Después de aplicar la regla while con P siendo verdadero , queda por demostrar
- ,
lo cual se deduce de la regla de omisión y la regla de consecuencia.
De hecho, el extraño programa es parcialmente correcto: si llegara a terminar, es seguro que x debía contener (por casualidad) el valor de la raíz cuadrada de a . En todos los demás casos, no terminará; por lo tanto, no es del todo correcto.
Si bien la regla para la corrección total
Si se reemplaza la regla while ordinaria anterior por la siguiente, el cálculo de Hoare también puede utilizarse para demostrar la corrección total , es decir, la terminación, así como la corrección parcial. Generalmente, se utilizan corchetes en lugar de llaves para indicar la diferente noción de corrección del programa.
En esta regla, además de mantener el invariante del bucle, también se demuestra la terminación mediante una expresión t , llamada variante del bucle , cuyo valor disminuye estrictamente con respecto a una relación bien fundada < en algún conjunto de dominio D durante cada iteración. Dado que < está bien fundada, una cadena estrictamente decreciente de miembros de D solo puede tener una longitud finita, por lo que t no puede seguir disminuyendo indefinidamente. (Por ejemplo, el orden usual < está bien fundado en enteros positivospero tampoco en los números enterosni en números reales positivos(Todos estos conjuntos se entienden en el sentido matemático, no en el computacional; en particular, todos son infinitos).
Dado el invariante de bucle P , la condición B debe implicar que t no es un elemento mínimo de D , ya que de lo contrario el cuerpo S no podría disminuir t más, es decir, la premisa de la regla sería falsa. (Esta es una de las diversas notaciones para la corrección total). [ nota 3 ]
Retomando el primer ejemplo de la sección anterior , para una prueba de corrección total de
La regla while para la corrección total se puede aplicar con, por ejemplo, D siendo los enteros no negativos con el orden usual, y la expresión t siendo , lo cual a su vez requiere demostrar
En términos informales, tenemos que demostrar que la distanciadisminuye en cada ciclo del bucle, mientras que siempre permanece no negativo; este proceso solo puede continuar durante un número finito de ciclos.
El objetivo de la demostración anterior se puede simplificar a
- ,
lo cual puede demostrarse de la siguiente manera:
- se obtiene mediante la regla de asignación, y
- puede fortalecerse parapor la regla de la consecuencia.
Para el segundo ejemplo de la sección anterior , por supuesto, no se puede encontrar ninguna expresión t que sea disminuida por el cuerpo del bucle vacío, por lo tanto, no se puede probar la terminación.
Véase también
Notas
- ↑ Hoare escribió originalmente "" en vez de "".
- ↑ Este artículo utiliza una notación de estilo deductivo natural para las reglas. Por ejemplo,informalmente significa "Si se cumplen α y β , entonces también se cumple φ "; α y β se denominan antecedentes de la regla, φ se denomina su sucesor. Una regla sin antecedentes se denomina axioma y se escribe como.
- ↑ El artículo de Hoare de 1969 no proporcionó una regla de corrección total; véase su análisis en la página 579 (arriba a la izquierda). Por ejemplo, el libro de texto de Reynolds [ 6 ] ofrece la siguiente versión de una regla de corrección total: cuando z es una variable entera que no aparece libre en P , B , S o t , y t es una expresión entera (variables de Reynolds renombradas para ajustarse a la configuración de este artículo).
Referencias
- 1 2 Hoare 1969 .
- ↑ Floyd 1967 .
- ^ Reynolds 2009 , secc. 3.4, pág. 64.
- ↑ Huth y Ryan 2004 .
- ↑ Apt & Olderog 2019 .
- ↑ Reynolds 2009 .
Bibliografía
- Apt, Krzysztof R.; Olderog, Ernst-Rüdiger (diciembre de 2019). "Cincuenta años de la lógica de Hoare" . Aspectos formales de la computación . 31 (6): 759. doi : 10.1007/s00165-019-00501-3 . S2CID 102351597 .
- Floyd, RW (1967). "Asignación de significados a los programas" (PDF) . Actas de la Sociedad Matemática Americana . Simposios sobre Matemáticas Aplicadas. 19 : 19–31 .
- Hoare, CAR (octubre de 1969). "Una base axiomática para la programación de computadoras" . Communications of the ACM . 12 (10): 576– 583. doi : 10.1145/363235.363259 . S2CID 207726175 .
- Huth, Michael; Ryan, Mark (26 de agosto de 2004). Lógica en informática: modelado y razonamiento sobre sistemas (segunda edición). Cambridge University Press . pp. XIV, 427. ISBN 978-0521543101.
- Reynolds, John C. (2009) [1998]. Teorías de los lenguajes de programación . Cambridge University Press . ISBN 978-0521106979.
- Tennent, Robert D. (2002). Especificación de software . Cambridge University Press . págs. XII, 289. ISBN 978-0521004015
Un libro de texto que incluye una introducción a la lógica de Hoare
.
Enlaces externos
- KeY-Hoare es un sistema de verificación semiautomático construido sobre el demostrador de teoremas KeY . Incorpora un cálculo de Hoare para un lenguaje while sencillo.
- Módulo de cálculo de Hoare de j-Algo ( j-Algo en GitHub , j-Algo en SourceForge ): una visualización del cálculo de Hoare en el programa de visualización de algoritmos j-Algo.
- 1969 en informática
- Lógica del programa
- Análisis estático de programas
- Tony Hoare