La lógica de Hoare ( eng. Lógica de Hoare , también lógica de Floyd-Hoare , o reglas de Hoare ) es un sistema formal con un conjunto de reglas lógicas diseñadas para probar la corrección programas de computadora Fue propuesto en 1969 por el informático y lógico matemático inglés Hoare , desarrollado posteriormente por el propio Hoare y otros investigadores. [1] La idea original fue propuesta por Floyd , quien publicó un sistema similar [2 ] aplicado a diagramas de flujo .
La característica principal de la lógica de Hoare es el triple de Hoare . El triple describe cómo la ejecución de una pieza de código cambia el estado del cálculo. El triple de Hoare tiene la siguiente forma:
donde P y Q son afirmaciones y C es un comando . _ _ P se llama condición previa ( antecedente ) y Q se llama condición posterior ( consecuente ). Si la condición previa es verdadera, el comando hace que la condición posterior sea verdadera. Los enunciados son fórmulas de la lógica de predicados .
La lógica de Hoare tiene axiomas y reglas de inferencia para todas las construcciones de un lenguaje de programación imperativo simple . Además de estas construcciones descritas en el trabajo original de Hoare, Hoare y otros desarrollaron reglas para otras construcciones: ejecución concurrente , llamada a procedimiento , salto y puntero .
La idea principal de Hoare es dar a cada construcción de un lenguaje imperativo una condición previa y una condición posterior , escritas como una fórmula lógica. Por lo tanto, aparece un triple en el nombre : precondición , construcción del lenguaje, poscondición .
Un programa que funcione bien se puede escribir de muchas maneras y, en muchos casos, será eficiente. Esta ambigüedad complica la programación. Para hacer esto, introduce un estilo. Pero esto no es suficiente. Para muchos programas (por ejemplo, aquellos conectados indirectamente con la vida humana), también es necesario probar su corrección. Resultó que la prueba de corrección hace que el programa sea más caro en un orden de magnitud (alrededor de 10 veces).
En la lógica estándar de Hoare, solo se puede probar la corrección parcial, ya que la terminación del programa debe probarse por separado. Además, la regla de no usar partes de programa redundantes no puede expresarse en la lógica de Hoare. La comprensión "intuitiva" del triple de Hoare se puede expresar de la siguiente manera: si P ocurre antes de que se complete C , entonces ocurre Q o C nunca terminará. De hecho, si C no termina, no hay después, por lo que Q puede ser cualquier enunciado. Además, podemos elegir que Q sea falso para mostrar que C nunca terminará.
La corrección completa también se puede probar usando una versión extendida de la regla para la declaración Mientras .
La regla para una declaración vacía establece que la declaración de salto ( sentencia vacía ) no cambia el estado del programa, por lo que una declaración que era verdadera antes de saltar sigue siendo verdadera después de que se ejecuta.
El axioma del operador de asignación establece que después de una asignación, el valor de cualquier predicado con respecto al lado derecho de la asignación no cambia con el reemplazo del lado derecho por el lado izquierdo:
Aquí se entiende la expresión P en la que todas las apariciones de la variable libre x se sustituyen por la expresión E .
El significado del axioma de la asignación es que la verdad es equivalente después de que se ha realizado la asignación. Así, si era cierto antes de la cesión, según el axioma de la cesión será cierto después de la cesión. Por el contrario, si era igual a "falso" antes de la declaración de asignación, debería ser igual a "falso" después.
Ejemplos de triples válidos:
El axioma de asignación en la formulación de Hoare no se aplica cuando más de un identificador se refiere al mismo valor. Por ejemplo,
es falso si x e y se refieren a la misma variable, ya que ninguna condición previa puede asegurar que y sea 3 después de que a x se le haya asignado 2.
La regla de composición de Hoare se aplica a la ejecución secuencial de los programas S y T , donde S se ejecuta antes que T , que se escribe S;T .
Por ejemplo, considere dos instancias del axioma de asignación:
y
De acuerdo con la regla de composición, obtenemos:
Aquí P es un ciclo invariante .
En esta regla, además de preservar la invariancia del bucle, la terminación del bucle se prueba mediante un término llamado variable del bucle (aquí t ), cuyo valor se reduce estrictamente de acuerdo con la relación bien fundada " < " con cada iteración. En este caso, la condición B debe implicar que t no es el elemento mínimo de su dominio, de lo contrario la premisa de esta regla será falsa. Debido a que la relación " < " está completamente bien fundamentada, cada paso del ciclo se define mediante miembros decrecientes de un conjunto ordenado linealmente finito .
La notación de esta regla usa corchetes, no llaves, para indicar la corrección completa de la regla. (Esta es una forma de denotar corrección completa).
Ejemplo 1 |
— basado en el axioma de asignación. |
Como , en base a la regla de inferencia, obtenemos: |
Ejemplo 2 |
— basado en el axioma de asignación. |
Si x y N son enteros, entonces , y basándonos en la regla de inferencia, obtenemos: |
En catálogos bibliográficos |
---|