Articulo de referencia

Lógica de Hoare

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 co...

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

{PAG}do{Q}{\displaystyle \{P\}C\{Q\}}

dóndePAG{\displaystyle P}yQ{\displaystyle Q}son afirmaciones ydo{\displaystyle C}es un comando . [ nota 1 ]PAG{\displaystyle P}se denomina condición previa yQ{\displaystyle Q}La 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 quePAG{\displaystyle P}derechos del estado antes de la ejecución dedo{\displaystyle C}, entoncesQ{\displaystyle Q}se mantendrá después, odo{\displaystyle C}no termina. En este último caso, no hay un "después", así queQ{\displaystyle Q}puede ser cualquier afirmación. De hecho, uno puede elegirQ{\displaystyle Q}ser falso expresar quedo{\displaystyle C}no 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 “PAG{Q}R{\displaystyle P\{Q\}R}” debe interpretarse “siempre que el programa finalice correctamente, las propiedades de sus resultados se describen porR{\displaystyle R}Es 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 ]

{PAG}saltar{PAG}{\displaystyle {\dfrac {}{\{P\}{\texttt {omitir}}\{P\}}}}

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:

{PAG[mi/incógnita]}incógnita:=mi{PAG}{\displaystyle {\dfrac {}{\{P[E/x]\}x:=E\{P\}}}}

dóndePAG[mi/incógnita]{\displaystyle P[E/x]}denota 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 dePAG[mi/incógnita]{\displaystyle P[E/x]}es equivalente a la verdad posterior a la asignación de P. Por lo tanto, fueronPAG[mi/incógnita]{\displaystyle P[E/x]}Si 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.PAG[mi/incógnita]{\displaystyle P[E/x]}falso (es decir¬PAG[mi/incógnita]{\displaystyle \neg P[E/x]}Si P es verdadero antes de la declaración de asignación, entonces debe ser falso después.

Ejemplos de tríos válidos incluyen:

  • {incógnita+1=43}y:=incógnita+1{y=43}{\displaystyle \{x+1=43\}y:=x+1\{y=43\}}
  • {incógnita+1norte}incógnita:=incógnita+1{incógnitanorte}{\displaystyle \{x+1\leq N\}x:=x+1\{x\leq N\}}

Todas las precondiciones que no se modifican por la expresión pueden trasladarse a la postcondición. En el primer ejemplo, asignandoy:=incógnita+1{\displaystyle y:=x+1}eso no cambia el hecho de queincógnita+1=43{\displaystyle x+1=43}, 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=43{\displaystyle y=43}yincógnita+1=43{\displaystyle x+1=43}), lo que producePAG[(incógnita+1)/y]{\displaystyle P[(x+1)/y]}ser (incógnita+1=43{\displaystyle x+1=43}yincógnita+1=43{\displaystyle x+1=43}), que a su vez puede simplificarse a la condición previa dadaincógnita+1=43{\displaystyle x+1=43}.

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:{PAG}incógnita:=mi{PAG[mi/incógnita]}{\displaystyle \{P\}x:=E\{P[E/x]\}}; esta regla da lugar a ejemplos sin sentido como:

{incógnita=5}incógnita:=3{3=5}{\displaystyle \{x=5\}x:=3\{3=5\}}

Otra regla incorrecta que parece tentadora a primera vista es{PAG}incógnita:=mi{PAGincógnita=mi}{\displaystyle \{P\}x:=E\{P\wedge x=E\}}; esto lleva a ejemplos sin sentido como:

{incógnita=5}incógnita:=incógnita+1{incógnita=5incógnita=incógnita+1}{\displaystyle \{x=5\}x:=x+1\{x=5\wedge x=x+1\}}

Mientras que una postcondición dada P determina de manera única la precondiciónPAG[mi/incógnita]{\displaystyle P[E/x]}, lo contrario no es cierto. Por ejemplo:

  • {0yyyy9}incógnita:=yy{0incógnitaincógnita9}{\displaystyle \{0\leq y\cdot y\wedge y\cdot y\leq 9\}x:=y\cdot y\{0\leq x\wedge x\leq 9\}},
  • {0yyyy9}incógnita:=yy{0incógnitayy9}{\displaystyle \{0\leq y\cdot y\wedge y\cdot y\leq 9\}x:=y\cdot y\{0\leq x\wedge y\cdot y\leq 9\}},
  • {0yyyy9}incógnita:=yy{0yyincógnita9}{\displaystyle \{0\leq y\cdot y\wedge y\cdot y\leq 9\}x:=y\cdot y\{0\leq y\cdot y\wedge x\leq 9\}}, y
  • {0yyyy9}incógnita:=yy{0yyyy9}{\displaystyle \{0\leq y\cdot y\wedge y\cdot y\leq 9\}x:=y\cdot y\{0\leq y\cdot y\wedge y\cdot y\leq 9\}}

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,

{y=3}incógnita:=2{y=3}{\displaystyle \{y=3\}x:=2\{y=3\}}

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 ambos{PAG}{\displaystyle \{P\}}y{PAG[2/incógnita]}{\displaystyle \{P[2/x]\}}ser{y=3}{\displaystyle \{y=3\}}).

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á escritoS;T{\displaystyle S;T}( Q se denomina condición intermedia ): [ 4 ]

{PAG}S{Q},{Q}T{R}{PAG}S;T{R}{\displaystyle {\dfrac {\{P\}S\{Q\}\quad ,\quad \{Q\}T\{R\}}{\{P\}S;T\{R\}}}}

Por ejemplo, consideremos los dos siguientes casos del axioma de asignación:

{incógnita+1=43}y:=incógnita+1{y=43}{\displaystyle \{x+1=43\}y:=x+1\{y=43\}}

y

{y=43}z:=y{z=43}{\displaystyle \{y=43\}z:=y\{z=43\}}

Según la regla de secuenciación, se concluye:

{incógnita+1=43}y:=incógnita+1;z:=y{z=43}{\displaystyle \{x+1=43\}y:=x+1;z:=y\{z=43\}}

En el recuadro de la derecha se muestra otro ejemplo.

Regla condicional

{BPAG}S{Q},{¬BPAG}T{Q}{PAG}si B entonces S demás T fin si{Q}{\displaystyle {\dfrac {\{B\wedge P\}S\{Q\}\quad ,\quad \{\neg B\wedge P\}T\{Q\}}{\{P\}{\texttt {if}}\ B\ {\texttt {then}}\ S\ {\texttt {else}}\ T\ {\texttt {endif}}\{Q\}}}}

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

si B entonces S demás T fin si{\displaystyle {\texttt {if}}\ B\ {\texttt {then}}\ S\ {\texttt {else}}\ T\ {\texttt {endif}}}

tiene el mismo efecto que una construcción de bucle de una sola vez

booleano b:=verdadero;mientras Bb hacer S;b:=FALSO hecho;b:=verdadero;mientras ¬Bb hacer T;b:=FALSO hecho{\displaystyle {\texttt {bool}}\ b:={\texttt {true}};{\texttt {while}}\ B\wedge b\ {\texttt {do}}\ S;b:={\texttt {false}}\ {\texttt {done}};b:={\texttt {true}};{\texttt {while}}\ \neg B\wedge b\ {\texttt {do}}\ T;b:={\texttt {false}}\ {\texttt {done}}}

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

PAG1PAG2,{PAG2}S{Q2},Q2Q1{PAG1}S{Q1}{\displaystyle {\dfrac {P_{1}\rightarrow P_{2}\quad ,\quad \{P_{2}\}S\{Q_{2}\}\quad ,\quad Q_{2}\rightarrow Q_{1}}{\{P_{1}\}S\{Q_{1}\}}}}

Esta regla permite reforzar la condición previa.PAG2{\displaystyle P_{2}}y/o debilitar la condición posteriorQ2{\displaystyle Q_{2}}Se utiliza, por ejemplo, para lograr postcondiciones literalmente idénticas para la parte then y la parte else .

Por ejemplo, una prueba de

{0incógnita15}si incógnita<15 entonces incógnita:=incógnita+1 demás incógnita:=0 fin si{0incógnita15}{\displaystyle \{0\leq x\leq 15\}{\texttt {if}}\ x<15\ {\texttt {then}}\ x:=x+1\ {\texttt {else}}\ x:=0\ {\texttt {endif}}\{0\leq x\leq 15\}}

necesita aplicar la regla condicional, que a su vez requiere demostrar

{0incógnita15incógnita<15}incógnita:=incógnita+1{0incógnita15}{\displaystyle \{0\leq x\leq 15\wedge x<15\}x:=x+1\{0\leq x\leq 15\}}o  simplificado
{0incógnita<15}incógnita:=incógnita+1{0incógnita15}{\displaystyle \{0\leq x<15\}x:=x+1\{0\leq x\leq 15\}}

por la parte de entonces , y

{0incógnita15incógnita15}incógnita:=0{0incógnita15}{\displaystyle \{0\leq x\leq 15\wedge x\geq 15\}x:=0\{0\leq x\leq 15\}}o  simplificado
{incógnita=15}incógnita:=0{0incógnita15}{\displaystyle \{x=15\}x:=0\{0\leq x\leq 15\}}

para la otra parte.

Sin embargo, la regla de asignación para la parte entonces requiere elegir P como0incógnita15{\displaystyle 0\leq x\leq 15}; la aplicación de la regla produce, por lo tanto,

{0incógnita+115}incógnita:=incógnita+1{0incógnita15}{\displaystyle \{0\leq x+1\leq 15\}x:=x+1\{0\leq x\leq 15\}},  lo cual es lógicamente equivalente a
{1incógnita<15}incógnita:=incógnita+1{0incógnita15}{\displaystyle \{-1\leq x<15\}x:=x+1\{0\leq x\leq 15\}}.

La regla de consecuencia es necesaria para reforzar la condición previa.{1incógnita<15}{\displaystyle \{-1\leq x<15\}}obtenido de la regla de asignación a{0incógnita<15}{\displaystyle \{0\leq x<15\}}requerido para la regla condicional.

De manera similar, para la parte else , la regla de asignación produce

{0015}incógnita:=0{0incógnita15}{\displaystyle \{0\leq 0\leq 15\}x:=0\{0\leq x\leq 15\}}o  equivalentemente
{verdadero}incógnita:=0{0incógnita15}{\displaystyle \{{\texttt {true}}\}x:=0\{0\leq x\leq 15\}},

por lo tanto, la regla de consecuencia debe aplicarse conPAG1{\displaystyle P_{1}}yPAG2{\displaystyle P_{2}}ser{incógnita=15}{\displaystyle \{x=15\}}y{verdadero}{\displaystyle \{{\texttt {true}}\}}, respectivamente, para reforzar nuevamente la condición previa. De manera informal, el efecto de la regla de consecuencia es "olvidar" que{incógnita=15}{\displaystyle \{x=15\}}se 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

{PAGB}S{PAG}{PAG}mientras B hacer S hecho{¬BPAG}{\displaystyle {\dfrac {\{P\wedge B\}S\{P\}}{\{P\}{\texttt {while}}\ B\ {\texttt {do}}\ S\ {\texttt {done}}\{\neg B\wedge P\}}}}

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ás¬B{\displaystyle \neg B}debe haber provocado que el bucle terminara. Como en la regla condicional, B no debe tener efectos secundarios.

Por ejemplo, una prueba de

{incógnita10}mientras incógnita<10 hacer incógnita:=incógnita+1 hecho{¬incógnita<10incógnita10}{\displaystyle \{x\leq 10\}{\texttt {while}}\ x<10\ {\texttt {do}}\ x:=x+1\ {\texttt {done}}\{\neg x<10\wedge x\leq 10\}}

por la regla del mientras que requiere probar

{incógnita10incógnita<10}incógnita:=incógnita+1{incógnita10}{\displaystyle \{x\leq 10\wedge x<10\}x:=x+1\{x\leq 10\}}o  simplificado
{incógnita<10}incógnita:=incógnita+1{incógnita10}{\displaystyle \{x<10\}x:=x+1\{x\leq 10\}},

que se obtiene fácilmente mediante la regla de asignación. Finalmente, la postcondición{¬incógnita<10incógnita10}{\displaystyle \{\neg x<10\wedge x\leq 10\}}se puede simplificar a{incógnita=10}{\displaystyle \{x=10\}}.

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:

{verdadero}mientras incógnitaincógnitaa hacer saltar hecho{incógnitaincógnita=averdadero}{\displaystyle \{{\texttt {true}}\}{\texttt {while}}\ x\cdot x\neq a\ {\texttt {do}}\ {\texttt {skip}}\ {\texttt {done}}\{x\cdot x=a\wedge {\texttt {true}}\}}

Después de aplicar la regla while con P siendo verdadero , queda por demostrar

{verdaderoincógnitaincógnitaa}saltar{verdadero}{\displaystyle \{{\texttt {true}}\wedge x\cdot x\neq a\}{\texttt {skip}}\{{\texttt {true}}\}},

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.

< es un pedido bien fundamentado en el conjunto D,[PAGBtDt=z]S[PAGtDt<z][PAGtD]mientras B hacer S hecho[¬BPAGtD]{\displaystyle {\dfrac {<\ {\text{is a well-founded ordering on the set}}\ D\quad ,\quad [P\wedge B\wedge t\in D\wedge t=z]S[P\wedge t\in D\wedge t<z]}{[P\wedge t\in D]{\texttt {while}}\ B\ {\texttt {do}}\ S\ {\texttt {done}}[\neg B\wedge P\wedge t\in D]}}}

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 positivosnorte{\displaystyle \mathbb {N} }pero tampoco en los números enterosZ{\displaystyle \mathbb {Z} }ni en números reales positivosR+{\displaystyle \mathbb {R} ^{+}}(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

[incógnita10]mientras incógnita<10 hacer incógnita:=incógnita+1 hecho[¬incógnita<10incógnita10]{\displaystyle [x\leq 10]{\texttt {while}}\ x<10\ {\texttt {do}}\ x:=x+1\ {\texttt {done}}[\neg x<10\wedge x\leq 10]}

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 10incógnita{\displaystyle 10-x}, lo cual a su vez requiere demostrar

[incógnita10incógnita<1010incógnita010incógnita=z]incógnita:=incógnita+1[incógnita1010incógnita010incógnita<z]{\displaystyle [x\leq 10\wedge x<10\wedge 10-x\geq 0\wedge 10-x=z]x:=x+1[x\leq 10\wedge 10-x\geq 0\wedge 10-x<z]}

En términos informales, tenemos que demostrar que la distancia10incógnita{\displaystyle 10-x}disminuye 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

[incógnita<1010incógnita=z]incógnita:=incógnita+1[incógnita1010incógnita<z]{\displaystyle [x<10\wedge 10-x=z]x:=x+1[x\leq 10\wedge 10-x<z]},

lo cual puede demostrarse de la siguiente manera:

[incógnita+11010incógnita1<z]incógnita:=incógnita+1[incógnita1010incógnita<z]{\displaystyle [x+1\leq 10\wedge 10-x-1<z]x:=x+1[x\leq 10\wedge 10-x<z]}se obtiene mediante la regla de asignación, y
[incógnita+11010incógnita1<z]{\displaystyle [x+1\leq 10\wedge 10-x-1<z]}puede fortalecerse para[incógnita<1010incógnita=z]{\displaystyle [x<10\wedge 10-x=z]}por 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

  1. Hoare escribió originalmente "PAG{do}Q{\displaystyle P\{C\}Q}" en vez de "{PAG}do{Q}{\displaystyle \{P\}C\{Q\}}".
  2. Este artículo utiliza una notación de estilo deductivo natural para las reglas. Por ejemplo,α,βϕ{\displaystyle {\dfrac {\alpha ,\beta }{\phi }}}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ϕ{\displaystyle {\dfrac {}{\quad \phi \quad }}}.
  3. 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:PAGB0t,[PAGBt=z]S[PAGt<z][PAG]mientras B hacer S hecho[PAG¬B]{\displaystyle {\dfrac {P\wedge B\rightarrow 0\leq t\quad ,\quad [P\wedge B\wedge t=z]S[P\wedge t<z]}{[P]{\texttt {while}}\ B\ {\texttt {do}}\ S\ {\texttt {done}}[P\wedge \neg B]}}} 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

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 . 
  • 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.
  • Tennent, Robert D. (2002). Especificación de software . Cambridge University Press . págs.  XII, 289. ISBN 978-0521004015Un libro de texto que incluye una introducción a la lógica de Hoare .
  • 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.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Hoare_logic&oldid=1359292368 "