leer wikipedia con nuevo diseño

Lógica 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 corrección de los programas de computadora . Fue propuesto en 1969 por el científico informático y lógico británico Tony Hoare , y posteriormente refinado 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 el triple de Hoare . Un triple describe cómo la ejecución de un fragmento de código cambia el estado del cálculo. Un triple de Hoare es de la forma

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

dónde PAG {\ Displaystyle P} P y Q {\ displaystyle Q} Qson afirmaciones y C {\ Displaystyle C} Ces un comando . [nota 1] PAG {\ Displaystyle P} Pse llama la condición previa y Q {\ displaystyle Q} Qla condición posterior : cuando se cumple la condición previa, la ejecución del comando establece la condición posterior. Las afirmaciones son fórmulas en 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 en el artículo original de Hoare, desde entonces Hoare y muchos otros investigadores han desarrollado reglas para otras construcciones del lenguaje. Hay reglas para la simultaneidad , procedimientos , saltos y punteros .

Corrección parcial y total

Usando la lógica estándar de Hoare, solo se puede probar la corrección parcial , mientras que la terminación debe probarse por separado. Así, la lectura intuitiva de un triple de Hoare es: Siempre que PAG {\ Displaystyle P} P ostenta del Estado antes de la ejecución de C {\ Displaystyle C} C, luego Q {\ displaystyle Q} Q se mantendrá después, o C {\ Displaystyle C} Cno termina. En el último caso, no hay "después", por lo que Q {\ displaystyle Q} Qpuede ser cualquier declaración. De hecho, uno puede elegir Q {\ displaystyle Q} Q ser falso para expresar eso C {\ Displaystyle C} C no termina.

La corrección total también se puede demostrar con una versión extendida de la regla While. [ cita requerida ]

En su artículo de 1969, Hoare utilizó una noción más estrecha de terminación que también implicaba la ausencia de errores en tiempo de ejecución: "La falla en terminar puede deberse a un bucle infinito; o puede deberse a la violación de un límite definido por la implementación, por por ejemplo, el rango de operandos numéricos, el tamaño del almacenamiento o un límite de tiempo del sistema operativo ". [3]

Reglas

Esquema de axioma de declaración vacía

La regla de declaración vacía afirma que el saltar {\ displaystyle {\ textbf {omitir}}} {\displaystyle {\textbf {skip}}} declaración no cambia el estado del programa, por lo tanto, cualquier cosa que sea verdadera antes saltar {\ displaystyle {\ textbf {omitir}}} {\displaystyle {\textbf {skip}}}también es cierto después. [nota 2]

{ PAG } saltar { PAG } {\ displaystyle {\ dfrac {} {\ {P \} {\ textbf {saltar}} \ {P \}}}} {\displaystyle {\dfrac {}{\{P\}{\textbf {skip}}\{P\}}}}

Esquema de 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 es válido para la variable. Formalmente, deja PAG {\ Displaystyle P} P ser una aserción en la que la variable X {\ Displaystyle x} xes gratis . Luego:

{ PAG [ mi / X ] } X : = mi { PAG } {\ Displaystyle {\ dfrac {} {\ {P [E / x] \} x: = E \ {P \}}}} {\displaystyle {\dfrac {}{\{P[E/x]\}x:=E\{P\}}}}

dónde PAG [ mi / X ] {\ Displaystyle P [E / x]} {\displaystyle P[E/x]} denota la aserción PAG {\ Displaystyle P} Pen el que cada ocurrencia libre de X {\ Displaystyle x} xha sido reemplazada por la expresión mi {\ Displaystyle E} E.

El esquema de axioma de asignación significa que la verdad de PAG [ mi / X ] {\ Displaystyle P [E / x]} {\displaystyle P[E/x]} es equivalente a la verdad posterior a la asignación de PAG {\ Displaystyle P} P. Así fueron PAG [ mi / X ] {\ Displaystyle P [E / x]} {\displaystyle P[E/x]} verdadero antes de la asignación, por el axioma de asignación, entonces PAG {\ Displaystyle P} Psería verdadero después de lo cual. Por el contrario, fueron PAG [ mi / X ] {\ Displaystyle P [E / x]} {\displaystyle P[E/x]} falso (es decir ¬ PAG [ mi / X ] {\ Displaystyle \ neg P [E / x]} {\displaystyle \neg P[E/x]} verdadero) antes de la declaración de asignación, PAG {\ Displaystyle P} P luego debe ser falso.

Ejemplos de triples válidos incluyen:

  • { X + 1 = 43 } y : = X + 1 { y = 43 } {\ Displaystyle \ {x + 1 = 43 \} y: = x + 1 \ {y = 43 \}} {\displaystyle \{x+1=43\}y:=x+1\{y=43\}}
  • { X + 1 ≤ norte } X : = X + 1 { X ≤ norte } {\ Displaystyle \ {x + 1 \ leq N \} x: = x + 1 \ {x \ leq N \}} {\displaystyle \{x+1\leq N\}x:=x+1\{x\leq N\}}

Todas las condiciones previas que no son modificadas por la expresión se pueden transferir a la condición posterior. En el primer ejemplo, asignando y : = X + 1 {\ Displaystyle y: = x + 1} {\displaystyle y:=x+1} no cambia el hecho de que X + 1 = 43 {\ Displaystyle x + 1 = 43} {\displaystyle x+1=43}, por lo que ambas declaraciones pueden aparecer en la condición posterior. Formalmente, este resultado se obtiene aplicando el esquema de axioma con PAG {\ Displaystyle P} P ser ( y = 43 {\ Displaystyle y = 43} {\displaystyle y=43} y X + 1 = 43 {\ Displaystyle x + 1 = 43} {\displaystyle x+1=43}), cuyos rendimientos PAG [ ( X + 1 ) / y ] {\ Displaystyle P [(x + 1) / y]} {\displaystyle P[(x+1)/y]} ser ( X + 1 = 43 {\ Displaystyle x + 1 = 43} {\displaystyle x+1=43} y X + 1 = 43 {\ Displaystyle x + 1 = 43} {\displaystyle x+1=43}), que a su vez puede simplificarse a la condición previa dada X + 1 = 43 {\ Displaystyle x + 1 = 43} {\displaystyle x+1=43}.

El esquema de axioma de asignación equivale a decir que para encontrar la condición previa, primero tome la condición posterior y reemplace todas las apariciones del lado izquierdo de la asignación con el lado derecho de la asignación. Tenga cuidado de no intentar hacer esto al revés siguiendo esta forma incorrecta de pensar: { PAG } X : = mi { PAG [ mi / X ] } {\ Displaystyle \ {P \} x: = E \ {P [E / x] \}} {\displaystyle \{P\}x:=E\{P[E/x]\}}; esta regla conduce a ejemplos sin sentido como:

{ X = 5 } X : = 3 { 3 = 5 } {\ Displaystyle \ {x = 5 \} x: = 3 \ {3 = 5 \}} {\displaystyle \{x=5\}x:=3\{3=5\}}

Otra regla incorrecta que parece tentadora a primera vista es { PAG } X : = mi { PAG ∧ X = mi } {\ Displaystyle \ {P \} x: = E \ {P \ wedge x = E \}} {\displaystyle \{P\}x:=E\{P\wedge x=E\}}; conduce a ejemplos sin sentido como:

{ X = 5 } X : = X + 1 { X = 5 ∧ X = X + 1 } {\ Displaystyle \ {x = 5 \} x: = x + 1 \ {x = 5 \ wedge x = x + 1 \}} {\displaystyle \{x=5\}x:=x+1\{x=5\wedge x=x+1\}}

Mientras que una determinada poscondición PAG {\ Displaystyle P} P determina de forma única la condición previa PAG [ mi / X ] {\ Displaystyle P [E / x]} {\displaystyle P[E/x]}, lo contrario no es cierto. Por ejemplo:

  • { 0 ≤ y ⋅ y ∧ y ⋅ y ≤ 9 } X : = y ⋅ y { 0 ≤ X ∧ X ≤ 9 } {\ Displaystyle \ {0 \ leq y \ cdot y \ wedge y \ cdot y \ leq 9 \} x: = y \ cdot y \ {0 \ leq x \ wedge x \ leq 9 \}} {\displaystyle \{0\leq y\cdot y\wedge y\cdot y\leq 9\}x:=y\cdot y\{0\leq x\wedge x\leq 9\}},
  • { 0 ≤ y ⋅ y ∧ y ⋅ y ≤ 9 } X : = y ⋅ y { 0 ≤ X ∧ y ⋅ y ≤ 9 } {\ 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 \}} {\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\}},
  • { 0 ≤ y ⋅ y ∧ y ⋅ y ≤ 9 } X : = y ⋅ y { 0 ≤ y ⋅ y ∧ X ≤ 9 } {\ 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 \}} {\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
  • { 0 ≤ y ⋅ y ∧ y ⋅ y ≤ 9 } X : = y ⋅ y { 0 ≤ y ⋅ y ∧ y ⋅ y ≤ 9 } {\ 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 \} } {\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 de 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 } X : = 2 { y = 3 } {\ Displaystyle \ {y = 3 \} x: = 2 \ {y = 3 \}} {\displaystyle \{y=3\}x:=2\{y=3\}}

está mal si X {\ Displaystyle x} x y y {\ Displaystyle y} yse refieren a la misma variable ( aliasing ), aunque es una instancia adecuada del esquema de axioma de asignación (con ambos { PAG } {\ Displaystyle \ {P \}} {\displaystyle \{P\}} y { PAG [ 2 / X ] } {\ Displaystyle \ {P [2 / x] \}} {\displaystyle \{P[2/x]\}} ser { y = 3 } {\ Displaystyle \ {y = 3 \}} {\displaystyle \{y=3\}}).

Regla de composicion

Verificación de código de intercambio
sin variables auxiliares
Las tres declaraciones siguientes (línea 2, 4, 6) intercambian los valores de las variables a {\ Displaystyle a} a y B {\ Displaystyle b} b, sin necesidad de una variable auxiliar. En la prueba de verificación, el valor inicial de a {\ Displaystyle a} a y B {\ Displaystyle b} b se denota por la constante A {\ Displaystyle A} A y B {\ Displaystyle B} B, respectivamente. Es mejor leer la prueba al revés, comenzando desde la línea 7; por ejemplo, la línea 5 se obtiene de la línea 7 reemplazando a {\ Displaystyle a} a (expresión de destino en la línea 6) por a - B {\ displaystyle ab} a-b(expresión fuente en la línea 6). Algunas simplificaciones aritméticas se utilizan tácitamente, a saber. a - ( a - B ) = B {\ Displaystyle a- (ab) = b} {\displaystyle a-(a-b)=b} (línea 5 → 3), y a + B - B = a {\ Displaystyle a + bb = a} {\displaystyle a+b-b=a} (línea 3 → 1).
NrCódigoAfirmaciones
1:       { a = A ∧ B = B } {\ Displaystyle \ {a = A \ wedge b = B \}} {\displaystyle \{a=A\wedge b=B\}}
2: a : = a + B ; {\ Displaystyle a: = a + b;} {\displaystyle a:=a+b;}      
3: { a - B = A ∧ B = B } {\ Displaystyle \ {ab = A \ wedge b = B \}} {\displaystyle \{a-b=A\wedge b=B\}}
4: B : = a - B ; {\ Displaystyle b: = ab;} {\displaystyle b:=a-b;}
5: { B = A ∧ a - B = B } {\ Displaystyle \ {b = A \ wedge ab = B \}} {\displaystyle \{b=A\wedge a-b=B\}}
6: a : = a - B {\ Displaystyle a: = ab} {\displaystyle a:=a-b}
7: { B = A ∧ a = B } {\ Displaystyle \ {b = A \ wedge a = B \}} {\displaystyle \{b=A\wedge a=B\}}

La regla de composición de Hoare se aplica a programas ejecutados secuencialmente S {\ Displaystyle S} S y T {\ Displaystyle T} T, dónde S {\ Displaystyle S} S se ejecuta antes de T {\ Displaystyle T} T y esta escrito S ; T {\ Displaystyle S; T} {\displaystyle S;T} ( Q {\ displaystyle Q} Qse llama 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 \}} }} {\displaystyle {\dfrac {\{P\}S\{Q\}\quad ,\quad \{Q\}T\{R\}}{\{P\}S;T\{R\}}}}

Por ejemplo, considere las siguientes dos instancias del axioma de asignación:

{ X + 1 = 43 } y : = X + 1 { y = 43 } {\ Displaystyle \ {x + 1 = 43 \} y: = x + 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 \}} {\displaystyle \{y=43\}z:=y\{z=43\}}

Por la regla de secuenciación, se concluye:

{ X + 1 = 43 } y : = X + 1 ; z : = y { z = 43 } {\ Displaystyle \ {x + 1 = 43 \} y: = x + 1; z: = y \ {z = 43 \}} {\displaystyle \{x+1=43\}y:=x+1;z:=y\{z=43\}}

Otro ejemplo se muestra en el cuadro de la derecha.

Regla condicional

{ B ∧ PAG } S { Q } , { ¬ B ∧ PAG } T { Q } { PAG } Si   B   luego   S   demás   T   terminara si { Q } {\ Displaystyle {\ dfrac {\ {B \ wedge P \} S \ {Q \} \ quad, \ quad \ {\ neg B \ wedge P \} T \ {Q \}} {\ {P \} { \ textbf {if}} \ B \ {\ textbf {entonces}} \ S \ {\ textbf {else}} \ T \ {\ textbf {endif}} \ {Q \}}}} {\displaystyle {\dfrac {\{B\wedge P\}S\{Q\}\quad ,\quad \{\neg B\wedge P\}T\{Q\}}{\{P\}{\textbf {if}}\ B\ {\textbf {then}}\ S\ {\textbf {else}}\ T\ {\textbf {endif}}\{Q\}}}}

La regla condicional establece que una poscondición Q {\ displaystyle Q} Q común a luego {\ displaystyle {\ textbf {luego}}} {\displaystyle {\textbf {then}}} y demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte es también una condición posterior del todo Si ⋯ terminara si {\ displaystyle {\ textbf {if}} \ cdots {\ textbf {endif}}} {\displaystyle {\textbf {if}}\cdots {\textbf {endif}}}declaración. En el luego {\ displaystyle {\ textbf {luego}}} {\displaystyle {\textbf {then}}} y el demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte, la condición innecesaria y negada B {\ Displaystyle B} B se puede agregar a la condición previa PAG {\ Displaystyle P} P, respectivamente. La condición, B {\ Displaystyle B} B, no debe tener efectos secundarios. En la siguiente sección se ofrece un ejemplo .

Esta regla no estaba contenida en la publicación original de Hoare. [1] Sin embargo, desde una declaración

Si   B   luego   S   demás   T   terminara si {\ Displaystyle {\ textbf {if}} \ B \ {\ textbf {entonces}} \ S \ {\ textbf {else}} \ T \ {\ textbf {endif}}} {\displaystyle {\textbf {if}}\ B\ {\textbf {then}}\ S\ {\textbf {else}}\ T\ {\textbf {endif}}}

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

bool   B : = cierto ; tiempo   B ∧ B   hacer   S ; B : = falso   hecho ; B : = cierto ; tiempo   ¬ B ∧ B   hacer   T ; B : = falso   hecho {\ Displaystyle {\ textbf {bool}} \ b: = {\ textbf {true}}; {\ textbf {while}} \ B \ wedge b \ {\ textbf {do}} \ S; b: = {\ textbf {falso}} \ {\ textbf {hecho}}; b: = {\ textbf {verdadero}}; {\ textbf {mientras}} \ \ neg B \ wedge b \ {\ textbf {hacer}} \ T; b: = {\ textbf {falso}} \ {\ textbf {hecho}}} {\displaystyle {\textbf {bool}}\ b:={\textbf {true}};{\textbf {while}}\ B\wedge b\ {\textbf {do}}\ S;b:={\textbf {false}}\ {\textbf {done}};b:={\textbf {true}};{\textbf {while}}\ \neg B\wedge b\ {\textbf {do}}\ T;b:={\textbf {false}}\ {\textbf {done}}}

la regla condicional se puede derivar de las otras reglas de Hoare. De manera similar, las reglas para otras construcciones de programas derivados, como por {\ displaystyle {\ textbf {para}}} {\displaystyle {\textbf {for}}} círculo, hacer ⋯ Hasta que {\ displaystyle {\ textbf {hacer}} \ cdots {\ textbf {hasta}}} {\displaystyle {\textbf {do}}\cdots {\textbf {until}}} círculo, cambiar {\ displaystyle {\ textbf {cambiar}}} {\displaystyle {\textbf {switch}}}, rotura {\ displaystyle {\ textbf {descanso}}} {\displaystyle {\textbf {break}}}, Seguir {\ displaystyle {\ textbf {continuar}}} {\displaystyle {\textbf {continue}}}puede reducirse mediante la transformación del programa a las reglas del artículo original de Hoare.

Regla de consecuencia

PAG 1 → PAG 2 , { PAG 2 } S { Q 2 } , Q 2 → Q 1 { PAG 1 } S { Q 1 } {\ 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} \}}}} {\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 fortalecer la condición previa PAG 2 {\ Displaystyle P_ {2}} P_{2} y / o debilitar la poscondición Q 2 {\ Displaystyle Q_ {2}} Q_{2}. Se utiliza, por ejemplo, para lograr condiciones posteriores literalmente idénticas para el luego {\ displaystyle {\ textbf {luego}}} {\displaystyle {\textbf {then}}} y el demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte.

Por ejemplo, una prueba de

{ 0 ≤ X ≤ 15 } Si   X < 15   luego   X : = X + 1   demás   X : = 0   terminara si { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq x \ leq 15 \} {\ textbf {if}} \ x <15 \ {\ textbf {entonces}} \ x: = x + 1 \ {\ textbf {else}} \ x : = 0 \ {\ textbf {endif}} \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq x\leq 15\}{\textbf {if}}\ x<15\ {\textbf {then}}\ x:=x+1\ {\textbf {else}}\ x:=0\ {\textbf {endif}}\{0\leq x\leq 15\}}

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

{ 0 ≤ X ≤ 15 ∧ X < 15 } X : = X + 1 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq x \ leq 15 \ wedge x <15 \} x: = x + 1 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq x\leq 15\wedge x<15\}x:=x+1\{0\leq x\leq 15\}}, o simplificado
{ 0 ≤ X < 15 } X : = X + 1 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq x <15 \} x: = x + 1 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq x<15\}x:=x+1\{0\leq x\leq 15\}}

Para el luego {\ displaystyle {\ textbf {luego}}} {\displaystyle {\textbf {then}}} parte, y

{ 0 ≤ X ≤ 15 ∧ X ≥ 15 } X : = 0 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq x \ leq 15 \ wedge x \ geq 15 \} x: = 0 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq x\leq 15\wedge x\geq 15\}x:=0\{0\leq x\leq 15\}}, o simplificado
{ X = 15 } X : = 0 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {x = 15 \} x: = 0 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{x=15\}x:=0\{0\leq x\leq 15\}}

Para el demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte.

Sin embargo, la regla de asignación para el luego {\ displaystyle {\ textbf {luego}}} {\displaystyle {\textbf {then}}} parte requiere elegir PAG {\ Displaystyle P} P como 0 ≤ X ≤ 15 {\ Displaystyle 0 \ leq x \ leq 15} {\displaystyle 0\leq x\leq 15}; la aplicación de reglas, por tanto, produce

{ 0 ≤ X + 1 ≤ 15 } X : = X + 1 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq x + 1 \ leq 15 \} x: = x + 1 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq x+1\leq 15\}x:=x+1\{0\leq x\leq 15\}}, que es lógicamente equivalente a
{ - 1 ≤ X < 15 } X : = X + 1 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {- 1 \ leq x <15 \} x: = x + 1 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{-1\leq x<15\}x:=x+1\{0\leq x\leq 15\}}.

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

Del mismo modo, para el demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte, la regla de asignación produce

{ 0 ≤ 0 ≤ 15 } X : = 0 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {0 \ leq 0 \ leq 15 \} x: = 0 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{0\leq 0\leq 15\}x:=0\{0\leq x\leq 15\}}, o equivalente
{ cierto } X : = 0 { 0 ≤ X ≤ 15 } {\ Displaystyle \ {{\ textbf {true}} \} x: = 0 \ {0 \ leq x \ leq 15 \}} {\displaystyle \{{\textbf {true}}\}x:=0\{0\leq x\leq 15\}},

por lo tanto, la regla de la consecuencia debe aplicarse con PAG 1 {\ Displaystyle P_ {1}} P_{1} y PAG 2 {\ Displaystyle P_ {2}} P_{2} ser { X = 15 } {\ Displaystyle \ {x = 15 \}} {\displaystyle \{x=15\}} y { cierto } {\ Displaystyle \ {{\ textbf {true}} \}} {\displaystyle \{{\textbf {true}}\}}, respectivamente, para fortalecer nuevamente la condición previa. De manera informal, el efecto de la regla de la consecuencia es "olvidar" que { X = 15 } {\ Displaystyle \ {x = 15 \}} {\displaystyle \{x=15\}} se conoce a la entrada de la demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte, ya que la regla de asignación utilizada para el demás {\ displaystyle {\ textbf {else}}} {\displaystyle {\textbf {else}}} parte no necesita esa información.

Mientras gobierna

{ PAG ∧ B } S { PAG } { PAG } tiempo   B   hacer   S   hecho { ¬ B ∧ PAG } {\ Displaystyle {\ dfrac {\ {P \ wedge B \} S \ {P \}} {\ {P \} {\ textbf {while}} \ B \ {\ textbf {do}} \ S \ {\ textbf {hecho}} \ {\ neg B \ wedge P \}}}} {\displaystyle {\dfrac {\{P\wedge B\}S\{P\}}{\{P\}{\textbf {while}}\ B\ {\textbf {do}}\ S\ {\textbf {done}}\{\neg B\wedge P\}}}}

Aquí PAG {\ Displaystyle P} Pes el ciclo invariante , que debe ser preservado por el cuerpo del ciclo S {\ Displaystyle S} S. Una vez finalizado el ciclo, este invariante PAG {\ Displaystyle P} P todavía se mantiene, y además ¬ B {\ Displaystyle \ neg B} \neg Bdebe haber causado el final del ciclo. Como en la regla condicional, B {\ Displaystyle B} B no debe tener efectos secundarios.

Por ejemplo, una prueba de

{ X ≤ 10 } tiempo   X < 10   hacer   X : = X + 1   hecho { ¬ X < 10 ∧ X ≤ 10 } {\ Displaystyle \ {x \ leq 10 \} {\ textbf {while}} \ x <10 \ {\ textbf {do}} \ x: = x + 1 \ {\ textbf {done}} \ {\ neg x <10 \ cuña x \ leq 10 \}} {\displaystyle \{x\leq 10\}{\textbf {while}}\ x<10\ {\textbf {do}}\ x:=x+1\ {\textbf {done}}\{\neg x<10\wedge x\leq 10\}}

por el momento, la regla requiere probar

{ X ≤ 10 ∧ X < 10 } X : = X + 1 { X ≤ 10 } {\ Displaystyle \ {x \ leq 10 \ wedge x <10 \} x: = x + 1 \ {x \ leq 10 \}} {\displaystyle \{x\leq 10\wedge x<10\}x:=x+1\{x\leq 10\}}, o simplificado
{ X < 10 } X : = X + 1 { X ≤ 10 } {\ Displaystyle \ {x <10 \} x: = x + 1 \ {x \ leq 10 \}} {\displaystyle \{x<10\}x:=x+1\{x\leq 10\}},

que se obtiene fácilmente mediante la regla de asignación. Finalmente, la poscondición { ¬ X < 10 ∧ X ≤ 10 } {\ Displaystyle \ {\ neg x <10 \ wedge x \ leq 10 \}} {\displaystyle \{\neg x<10\wedge x\leq 10\}} se puede simplificar a { X = 10 } {\ Displaystyle \ {x = 10 \}} {\displaystyle \{x=10\}}.

Para otro ejemplo, la regla while se puede usar para verificar formalmente el siguiente programa extraño para calcular la raíz cuadrada exacta X {\ Displaystyle x} x de un número arbitrario a {\ Displaystyle a} a-incluso si X {\ Displaystyle x} x es una variable entera y a {\ Displaystyle a} a no es un número cuadrado:

{ cierto } tiempo   X ⋅ X ≠ a   hacer   saltar   hecho { X ⋅ X = a ∧ cierto } {\ Displaystyle \ {{\ textbf {true}} \} {\ textbf {mientras}} \ x \ cdot x \ neq a \ {\ textbf {do}} \ {\ textbf {saltar}} \ {\ textbf { hecho}} \ {x \ cdot x = a \ wedge {\ textbf {true}} \}} {\displaystyle \{{\textbf {true}}\}{\textbf {while}}\ x\cdot x\neq a\ {\textbf {do}}\ {\textbf {skip}}\ {\textbf {done}}\{x\cdot x=a\wedge {\textbf {true}}\}}

Después de aplicar la regla while con PAG {\ Displaystyle P} P ser cierto {\ Displaystyle {\ textbf {true}}} {\displaystyle {\textbf {true}}}, queda por probar

{ cierto ∧ X ⋅ X ≠ a } saltar { cierto } {\ Displaystyle \ {{\ textbf {true}} \ wedge x \ cdot x \ neq a \} {\ textbf {saltar}} \ {{\ textbf {true}} \}} {\displaystyle \{{\textbf {true}}\wedge x\cdot x\neq a\}{\textbf {skip}}\{{\textbf {true}}\}},

que se sigue de la regla de salto y la regla de consecuencia.

De hecho, el extraño programa es parcialmente correcto: si terminara, es seguro que X {\ Displaystyle x} x debe haber contenido (por casualidad) el valor de a {\ Displaystyle a} araíz cuadrada de. En todos los demás casos, no terminará; por lo tanto, no es del todo correcto.

Mientras que la regla para la corrección total

Si la regla while ordinaria anterior se reemplaza por la siguiente, el cálculo de Hoare también puede usarse para probar la corrección total , es decir, la terminación [nota 3] así como la corrección parcial. Comúnmente, aquí se usan corchetes en lugar de llaves para indicar la noción diferente de corrección del programa.

<   es un pedido bien fundado en el set   D , [ PAG ∧ B ∧ t ∈ D ∧ t = z ] S [ PAG ∧ t ∈ D ∧ t < z ] [ PAG ∧ t ∈ D ] tiempo   B   hacer   S   hecho [ ¬ B ∧ PAG ∧ t ∈ D ] {\ displaystyle {\ dfrac {<\ {\ text {es un ordenamiento bien fundado en el conjunto}} \ D \ quad, \ quad [P \ wedge B \ wedge t \ in D \ wedge t = z] S [ P \ wedge t \ in D \ wedge t ]}>{\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]{\textbf {while}}\ B\ {\textbf {do}}\ S\ {\textbf {done}}[\neg B\wedge P\wedge t\in D]}}}

En esta regla, además de mantener el ciclo invariante, también se prueba la terminación mediante una expresión t {\ Displaystyle t} t, llamada variante de bucle , cuyo valor disminuye estrictamente con respecto a una relación bien fundada < {\ Displaystyle <} < en algún conjunto de dominios D {\ Displaystyle D} Ddurante cada iteración. Desde < {\ Displaystyle <} <está bien fundada, una cadena estrictamente decreciente de miembros de D {\ Displaystyle D} D solo puede tener una longitud finita, por lo que t {\ Displaystyle t} tno puede seguir disminuyendo para siempre. (Por ejemplo, el orden habitual < {\ Displaystyle <} <está bien fundamentado en números enteros positivos norte {\ Displaystyle \ mathbb {N}} \mathbb {N} , pero ni en los enteros Z {\ Displaystyle \ mathbb {Z}} \mathbb {Z} ni en números reales positivos R + {\ Displaystyle \ mathbb {R} ^ {+}} \mathbb {R} ^{+}; todos estos conjuntos se entienden en el sentido matemático, no en el sentido informático, todos son infinitos en particular.)

Dado el ciclo invariante PAG {\ Displaystyle P} P, la condición B {\ Displaystyle B} B debe implicar que t {\ Displaystyle t} tno es un elemento mínimo de D {\ Displaystyle D} D, porque de lo contrario el cuerpo S {\ Displaystyle S} S no pudo disminuir t {\ Displaystyle t} tmás adelante, es decir, la premisa de la regla sería falsa. (Ésta es una de varias notaciones para una corrección total). [Nota 4]

Reanudando el primer ejemplo de la sección anterior , para una prueba de corrección total de

[ X ≤ 10 ] tiempo   X < 10   hacer   X : = X + 1   hecho [ ¬ X < 10 ∧ X ≤ 10 ] {\ displaystyle [x \ leq 10] {\ textbf {while}} \ x <10 \ {\ textbf {do}} \ x: = x + 1 \ {\ textbf {done}} [\ neg x <10 \ cuña x \ leq 10]} {\displaystyle [x\leq 10]{\textbf {while}}\ x<10\ {\textbf {do}}\ x:=x+1\ {\textbf {done}}[\neg x<10\wedge x\leq 10]}

la regla while para la corrección total se puede aplicar con, por ejemplo, D {\ Displaystyle D} D siendo los enteros no negativos con el orden habitual, y la expresión t {\ Displaystyle t} t ser 10 - X {\ Displaystyle 10-x} {\displaystyle 10-x}, que a su vez requiere probar

[ X ≤ 10 ∧ X < 10 ∧ 10 - X ≥ 0 ∧ 10 - X = z ] X : = X + 1 [ X ≤ 10 ∧ 10 - X ≥ 0 ∧ 10 - X < 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 ]}>{\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]}

Hablando informalmente, tenemos que demostrar que la distancia 10 - X {\ Displaystyle 10-x} {\displaystyle 10-x}disminuye en cada ciclo de bucle, mientras que siempre permanece no negativo; este proceso sólo puede continuar durante un número finito de ciclos.

El objetivo de prueba anterior se puede simplificar a

[ X < 10 ∧ 10 - X = z ] X : = X + 1 [ X ≤ 10 ∧ 10 - X < z ] {\ Displaystyle [x <10 \ wedge 10-x = z] x: = x + 1 [x \ leq 10 \ wedge 10-x ]}>{\displaystyle [x<10\wedge 10-x=z]x:=x+1[x\leq 10\wedge 10-x<z]},

que se puede probar de la siguiente manera:

[ X + 1 ≤ 10 ∧ 10 - X - 1 < z ] X : = X + 1 [ X ≤ 10 ∧ 10 - X < z ] {\ Displaystyle [x + 1 \ leq 10 \ wedge 10-x-1 ]>{\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
[ X + 1 ≤ 10 ∧ 10 - X - 1 < z ] {\ Displaystyle [x + 1 \ leq 10 \ wedge 10-x-1 ]}>{\displaystyle [x+1\leq 10\wedge 10-x-1<z]} puede ser fortalecido para [ X < 10 ∧ 10 - X = z ] {\ Displaystyle [x <10 \ wedge 10-x = 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 hay expresión t {\ Displaystyle t} t se puede encontrar que disminuye por el cuerpo del bucle vacío, por lo que no se puede probar la terminación.

Ver también

  • Afirmación (informática)
  • Comunicando procesos secuenciales
  • Diseño por contrato
  • Semántica denotacional
  • Lógica dinámica
  • Edsger W. Dijkstra
  • Invariable de bucle
  • Semántica del transformador de predicados
  • Verificación del programa
  • Cálculo de refinamiento
  • Lógica de separación
  • Cálculo secuencial
  • Análisis de código estático

Notas

  1. ^ Hoare escribió originalmente " PAG { C } Q {\ Displaystyle P \ {C \} Q} {\displaystyle P\{C\}Q}" en vez de " { PAG } C { Q } {\ Displaystyle \ {P \} C \ {Q \}} {\displaystyle \{P\}C\{Q\}}".
  2. ^ Este artículo utiliza unanotación de estilo de deducción natural para las reglas. Por ejemplo, α , β ϕ {\ displaystyle {\ dfrac {\ alpha, \ beta} {\ phi}}} {\displaystyle {\dfrac {\alpha ,\beta }{\phi }}} informalmente significa "Si ambos α {\ Displaystyle \ alpha} \alpha y β {\ Displaystyle \ beta} \beta espera, entonces también ϕ {\ Displaystyle \ phi} \phi sostiene "; α {\ Displaystyle \ alpha} \alpha y β {\ Displaystyle \ beta} \beta se llaman antecedentes de la regla, ϕ {\ Displaystyle \ phi} \phi se llama su sucesor. Una regla sin antecedentes se llama axioma y se escribe como ϕ {\ Displaystyle {\ dfrac {} {\ quad \ phi \ quad}}} {\displaystyle {\dfrac {}{\quad \phi \quad }}}.
  3. ^ "Terminación" aquí se entiende en el sentido más amplio de que el cálculo finalmente se terminará; sí no implica que no hubo violación de límite (por ejemplo, división por cero) puede detener el programa antes de tiempo.
  4. ↑ El artículo de Hoare de 1969 no proporcionó una regla de corrección total; cf. su discusión en la página 579 (arriba a la izquierda). Por ejemplo, el libro de texto de Reynolds ( John C. Reynolds (2009). Teoría de los lenguajes de programación . Cambridge University Press.), Sección 3.4, p.64 da la siguiente versión de una regla de corrección total: PAG ∧ B → 0 ≤ t , [ PAG ∧ B ∧ t = z ] S [ PAG ∧ t < z ] [ PAG ] tiempo   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 ]}>{\displaystyle {\dfrac {P\wedge B\rightarrow 0\leq t\quad ,\quad [P\wedge B\wedge t=z]S[P\wedge t<z]}{[P]{\textbf {while}}\ B\ {\textbf {do}}\ S\ {\textbf {done}}[P\wedge \neg B]}}} Cuándo z {\ Displaystyle z} z es una variable entera que no aparece libre en PAG {\ Displaystyle P} P, B {\ Displaystyle B} B, S {\ Displaystyle S} S, o t {\ Displaystyle t} t, y t {\ Displaystyle t} t es una expresión entera (el nombre de las variables de Reynolds se cambió para adaptarse a la configuración de este artículo).

Referencias

  1. ^ a b Hoare, CAR (octubre de 1969). "Una base axiomática para la programación informática" (PDF) . Comunicaciones de la ACM . 12 (10): 576–580. doi : 10.1145 / 363235.363259 .
  2. ^ RW Floyd . " Asignación de significados a los programas " . Actas de los simposios de la American Mathematical Society sobre matemáticas aplicadas. Vol. 19, págs. 19–31. 1967.
  3. ^ p.579 arriba a la izquierda
  4. ^ Huth, Michael; Ryan, Mark (26 de agosto de 2004). Lógica en Ciencias de la Computación (segunda ed.). TAZA. pag. 276. ISBN 978-0521543101.

Otras lecturas

  • Robert D. Tennent. Especificación de software (un libro de texto que incluye una introducción a la lógica de Hoare, escrito en 2002) ISBN  0-521-00401-2

enlaces externos

  • KeY-Hoare es un sistema de verificación semiautomático construido sobre el demostrador del teorema de KeY . Cuenta con un cálculo Hoare para un lenguaje sencillo mientras.
  • Cálculo j-Algo-modul Hoare : una visualización del cálculo Hoare en el programa de visualización de algoritmos j-Algo

This page is based on a Wikipedia article Text is available under the CC BY-SA 4.0 license; additional terms may apply. Images, videos and audio are available under their respective licenses.


  • Terms of Use
  • Privacy Policy