Galería de mapas mentales ANALISIS Y VERIFICACION DE ALGORITMOS
El análisis y verificación de algoritmos es un área importante en la informática, que incluye triplas de Hoare, precondiciones y corrección de programas. Las triplas de Hoare se utilizan para describir los cambios de estado en un programa, y las precondiciones definen el conjunto de estados iniciales válidos, como en una función de división, donde las precondiciones incluyen que los parámetros sean números y que el divisor no sea cero. La verificación de la corrección de programas analiza la lógica y estructura del programa para asegurar que funcione correctamente bajo diferentes condiciones de entrada. A través del análisis y verificación de algoritmos, los científicos de la computación pueden diseñar algoritmos eficientes y confiables, garantizando la estabilidad y seguridad de los sistemas de software.
Editado a las 2021-11-23 22:01:23,ANALISIS Y VERIFICACION DE ALGORITMOS
escenario 1 Triplas de hoare.
tripla de hoare: esta compuesta por un programa junto con su precondición ´poscondición, haore 1969.
precondición: define el conjunto de estados iniciales validos de un programa ejemplo en una función división las precondiciones son que los parámetros . son números y que el divisor sea distinto a “0” cero.
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.
propiedades de las triplas de hoare
Precondición vacía:La tripla {falso}S{R}es válida.}
Ley del milagro excluid La tripla {Q}S{falso} es válida si y solo si [Q ≡ falso]1..
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}
Fortalecimiento de precondiciónSi [P ⇒ Q] y {Q}S{R} es válida, entonces también es válida {P}S{R}
Debilitamiento de poscondición. Si [R ⇒ P] y {Q}S{R} es válida, entonces también es válida {Q}S{P}.
Disyunción de precondiciones Si {Q}S{R} y {P}S{R}son válidas, entonces también es válida{Q ∨ P}S{R}.
{Q} =pre S= programa. {R} pos. es decir el programa S es correcto con respecto a la precondicion Q y ala prencondición R.
pos condicionesrestringe los valores finales de las variables de salida y enuncia las relaciones entre estos valores y los valores iniciales de las variables de entrada. Ejemplo la función división con las precondiciones asignadas, puede asegurar que devolverá un número correspondiente al cociente solicitado
Una Tripla de Hoare es una expresión boleana escrita en la forma , {Q}S{R} donde S es un programa, {Q} es una aserción que describe la precondición del programa, y{R} es una aserción que describe la poscondición del programa. La expresión{Q}S{R} se lee textualmente el programa S es correcto con respecto a la precondición Q y a la poscondición R , o simplemente S es correcto con respecto a su especificación. Operacionalmente hablando, {Q}S{R} es verdadero si y sólo si para todo estado que satisface la precondiciónQ , al ejecutar el programa S , se termina, llegando a un estado que satisface la poscondición R .
ESCENARIO 2 CORRECIÓN DE PROGRAMAS.
Precondición más débil de instrucciones simples: el conjunto esta definido por la precondicion mas debil del programa y la postcondicion ejemplo x =x+1. x >0 ejemplo x>0 primer precondición ejemplo x >-1segunda precondicion mas debil.
Si un programa S comienza en un estado que satisface wp(S,Q) se garantiza que trminara en un estado que satisfaga Q. Todos los programas atisfacen True ningun problema satisface a False.
para una asignación simple: wp(x:=E,Q)= Q[X=E] EJEMPLOS: wp(a:=7,a=7) =(7-7)=true wp(a:=7,a=6)=(7=6)=false wp(a:7,b=c)= (b=c) wp(a:=a-b,a>b)=(a-b>b)=(a>2b) precondición mas debil.
INSTRUCCION VACIA : se hace referencia generalmente a la ausencia de instrucciones.
Instruccion vacia.
[Q ⇒ R] Además, el predicado Q más débil que satisface [Q ⇒ R] es R: wp(<vacío>, R) ≡ R
Asignación. Una asignación es una instrucción de la forma <var>:=<exp>, que reemplaza el valor de la variable <var> por el resultado de la evaluación de la expresión <exp>.
[Q ⇒ R(x:=E)] Además, el predicado Q más débil que satisface [Q ⇒ R(x:=E)] es R(x:=E): wp(x:=E, R) ≡ R(x:=E)
Una instrucción condicional tiene la forma if <condición C> then <conjunto de instrucciones A> else <conjunto de instrucciones B>y permite a un programa decidir entre dos conjuntos de pasos a ejecutar (A o B) de acuerdo con el valor de verdad de una expresión lógica (C). Si C es verdadero, se ejecutará A, en caso contrario, se ejecutará B.
i. Se satisface C, luego después de la ejecución de A se debe satisfacer R: {Q ∧ C}A{R} Esta tripla es equivalente a (por traslación) [Q ∧ C ⇒ wp(A, R)] que a su vez es equivalente a [Q ⇒ (C ⇒ wp(A, R))]
Composición secuencial Puede entenderse un programa como la composición de un conjunto de instrucciones, las cuales son ejecutadas secuencialmente, una después de la otra: <instrucción 1> <instrucción 2> … <instrucción k>
ejemplo de un condicional simple .
Ejemplo 2. Demostrar o refutar que es válida la tripla {Pre Q: true} program ejemplo_2 input: x:ℝ return x {Pos R: x2 ≥ 0} En este caso, el programa consiste en una instrucción vacía (la declaración de variables y la instrucción de retorno definen las entradas y salidas, pero no tiene efecto sobre el estado del programa). Tenemos entonces que {true}<vacío>{x2 ≥ 0} ≡ [true ⇒ wp(<vacío>, x2 ≥ 0)] ≡ [true ⇒ x2 ≥ 0] ≡ [true ⇒ true] ≡ true
escenario3 Corrección de programas iterativos
Para verificar la corrección de programas iterativos se usará el teorema de invarianza, el cual puede ser demostrado a partir del concepto de precondición más débil.
Invariante de ciclo Se evalúa <condición>. Si el resultado de la evaluación es verdadero, se ejecuta el bloque de código <instrucciones> y se repite el proceso. Por el contrario, si el resultado de la evaluación es falso, la ejecución de la instrucción termina. <inicialización> while <condición> do <instrucciones>
Cota de ciclo
es una función entera t cuyo valor disminuye con cada iteración del ciclo y además está acotada inferiormente (es siempre mayor o igual a alguna constante Tmin).
Teorema de invarianza
es un conjunto de reglas que permiten decidir si un programa iterativo es o no correcto.
P se cumple al inicio del ciclo
se debe demostrar que el bloque de código <instrucciones> transforma un estado que satisface P y <condición> en otro que satisface P. En la lógica de Hoare, esto se expresa como {P ⋀ <condición>} <instrucciones> {P}
Al finalizar el ciclo se satisface la poscondición
Habiendo demostrado que P es un invariante del ciclo, es posible discutir la corrección del programa, en particular, que la poscondición se satisface al finalizar la ejecución del ciclo
[P ⋀ ¬<condición> ⇒ R] En el momento en que el ciclo termina, se tiene que <condición> ≡ false. De igual forma, por ser invariante, se tiene P. Se debe demostrar que el estado final del programa satisface la poscondición R. pra que sea verdadera la condición.
EL CICLO TERMINA e la poscondición R se cumple al finalizar la ejecución del ciclo no garantiza la corrección del programa si no se prueba también que el ciclo realmente finalizará.
En sintesis El invariante se cumple antes del inicio del ciclo. {Q} <inicialización> {P} El invariante se cumple justo después de cada iteración del ciclo. {P ⋀ <condición>} <instrucciones> {P} La poscondición se cumple al finalizar la ejecución del ciclo. [P ⋀ ¬<condición> ⇒ R] La cota del ciclo disminuye con cada iteración. {P ⋀ <condición> ⋀ t = T} <instrucciones> {t < T} La cota del ciclo está acotada inferiormente. [P ⋀ <condición> ⇒ t ≥ Tmin]
EJEMPLO El ciclo termina (t ≥ Tmin) [P ⋀ <condición> ⇒ t ≥ Tmin] (reemplazando) = [suma = ⋀ 1≤i≤n+1 ⋀ i≤n ⇒ n+1-i≥0]
Ejemplo 1a. Cálculo de la suma de los números naturales entre 1 y n. program sumatoria input: n:ℤ var: suma:ℤ, i:ℤ suma := 0 i := 1 while i ≤ n do suma := suma + i i := i + 1 return suma
EJEMPLO Ejemplo 1c. Cálculo de la suma de los números naturales entre 1 y n, completamente anotado. {Pre Q: n ≥ 1} program sumatoria input: n:ℤ var: suma:ℤ, i:ℤ suma := 0 i := 1 {Inv P: suma = ⋀ 1≤i≤n+1} {t = (n+1)-i, Tmin = 0} while i ≤ n do suma := suma + i i := i + 1 return suma {Pos R: suma = }