Verificación de programas Algoritmos y Estructuras de Datos I I Primer cuatrimestre de 2016 Semánticas formales: 1. Operacional: Simular la ejecución del programa en una máquina virtual. Departamento de Computación - FCEyN - UBA 2. Denotacional: Convertir el programa en una función matemática y analizar la función resultante. 3. Axiomática: Visualizar el programa como el resultado de la aplicación de un conjunto de axiomas y reglas de inferencia. Programación imperativa - clase 14 Semántica axiomática Verificación automática de programas 1 Semántica axiomática 2 Semántica axiomática I Sistema de axiomas y reglas de inferencia ideado para la verificación de programas imperativos. I Basado en triplas de Hoare: I Definimos un lenguaje imperativo basado en variables y las siguientes instrucciones: 1. Nada: Instrucción skip que no hace nada. 2. Asignación: Instrucción x := E. {P} codigo {Q} I I Esta tripla de Hoare corresponde al cumplimiento de la especificación por parte del código: Además, tenemos las siguientes estructuras de control: 1. Secuencia: S1; S2 es un programa, si S1 y S2 son dos programas. 2. Condicional: if B then S1 else S2 es un programa, si B es una expresión lógica y S1 y S2 son dos programas. 3. Ciclo: while B do S es un programa, si B es una expresión lógica y S es un programa. 1. Si el programa comienza en un estado que cumple P ... 2. ... entonces termina luego de un número finito de pasos ... 3. ... en un estado que cumple Q. 3 4 Demostraciones de corrección I I Precondición más débil Buscamos un mecanismo para demostrar “automáticamente” la corrección de un programa respecto de una especificación (es decir, la validez de una tripla de Hoare). I Definición. La precondición más débil de un programa S respecto de una postcondición Q es el predicado P más débil posible tal que {P}S{Q}. I Notación. wp(S, Q). I Ejemplo: Una tripla no válida: {x ≥ 4} x := x + 1 {x ≥ 7} {wp(x := x+1, Q)} x := x + 1 I Una tripla válida: {Q : x ≥ 7} {x ≥ 4} I x := x + 1 Tenemos que wp(x := x+1, Q) ≡ x ≥ 6. {x ≥ 5} 6 5 Precondición más débil I Asignación I Otro ejemplo: Definición. Dada una expresión E , llamamos def(E ) a las condiciones necesarias para que E esté definida. {wp(S2, Q2)} 1. 2. 3. 4. S2: x := 2 * abs(x) + 1 {Q2 : x ≥ 5} I wp(S2, Q2) ≡ x ≥ 2 ∨ x ≤ −2. I I Otro más: def(x + y ) ≡ true. def(x/y √ ) ≡ y 6= 0. def( x) ≡ x ≥ 0. def(a[i] + 3) ≡ 0 ≤ i < |a|. Definición. Dado un predicado Q, el predicado QEx se obtiene reemplazando en Q todas las apariciones libres de la variable x por E. {wp(S3, Q3)} 1. Q ≡ 0 ≤ i < j < n ∧ a[i] ≤ x < a[j]. Qki ≡ 0 ≤ k < j < n ∧ a[k] ≤ x < a[j]. i Qi+1 ≡ 0 ≤ i + 1 < j < n ∧ a[i + 1] ≤ x < a[j]. S3: x := y*y {Q3 : x ≥ 0} I 2. Q ≡ 0 ≤ i < n ∧ (∀i) a[i] == x. Qki ≡ 0 ≤ k < n ∧ (∀i) a[i] == x. wp(S3, Q3) ≡ true. 7 8 Asignación Asignación I Axioma 1. wp(x := E, Q) ≡ def(E ) ∧ QEx . I Ejemplo: I I Este axioma está justificado por la siguiente observación. Si buscamos la precondición más débil para el siguiente programa ... {??} {??} x := x + 1 x := E {Q : x ≥ 7} {Q : x = 25} Tenemos que ... wp(x := x+1, Q) ≡ def(x + 1) ∧ QEx ≡ true ∧ (x + 1) ≥ 7 ≡ x ≥6 I ... entonces tenemos wp(x := E, Q) ≡ def(E ) ∧ E = 25. I Es decir, si luego de x := E queremos que x = 25, entonces se debe cumplir E = 25 antes de la asignación! 10 9 Asignación I Asignación Otro ejemplo: I Un ejemplo más: {??} {??} x := 2 * abs(x) + 1 x := y*y {Q2 : x ≥ 5} I {Q3 : x ≥ 0} Tenemos que ... wp(x := 2 * abs(x) + 1, Q2) I ≡ def(2|x| + 1) ∧ Q2xE ≡ true ∧ 2|x| + 1 ≥ 5 ≡ |x| ≥ 2 ≡ x ≥ 2 ∨ x ≤ −2 11 Tenemos que ... wp(x := y*y, Q3) ≡ def(y ∗ y ) ∧ Q3xE ≡ true ∧ y ∗ y ≥ 0 ≡ true 12 Demostraciones de corrección I I Más axiomas I Axioma 2. wp(skip, Q) ≡ Q. I Axioma 3. wp(S1; S2, Q) ≡ wp(S1, wp(S2, Q)). I Ejemplo: Definición. Decimos que {P} S {Q} si P ⇒ wp(S, Q). Por ejemplo, la siguiente tripla de Hoare es válida ... {P : x ≥ 10} {wp(y := 2*x, R)} ≡ {def(2 ∗ x) ∧ 2 ∗ x ≥ 6} ≡ {x ≥ 3} S: x := x+3 y := 2*x; {Q : x 6= 4} I {wp(x := y+1, Q)} ≡ {def(y + 1) ∧ y + 1 ≥ 7} ≡ {y ≥ 6} ... puesto que wp(S, Q) ≡ x 6= 1 y P ⇒ x 6= 1. x := y + 1 {Q : x ≥ 7} 13 Alternativas I Alternativas Axioma 4. Si S = if B then S1 else S2, entonces wp(S, Q) ≡ (B ∧ wp(S1, Q)) ∨ (¬B ∧ wp(S2, Q)) I 14 Ejemplo: I La definicion operacional que usamos en la materia para demostrar la corrección de una alternativa es ahora un teorema derivado de este axioma! I Teorema. Si {??} S: if (x > 0) then y := x else y := -x {P ∧ B} S1 {Q} {P ∧ ¬B} S2 {Q} {Q : y ≥ 2} entonces I Tenemos que ... {P} if B then S1 else S2 {Q}. wp(S, Q) ≡ (x > 0 ∧ x ≥ 2) ∨ (x ≤ 0 ∧ −x ≥ 2) ≡ (x ≥ 2) ∨ (x ≤ −2) ≡ |x| ≥ 2 15 16 Ciclos Verificación de programas I Supongamos que tenemos el ciclo while B do S. I Definición. Definimos Hk (Q) como el predicado que define el conjunto de estados a partir de los cuales la ejecución del ciclo termina en exactamente k iteraciones: I 1. Dados el programa y su especificación: {P} S {Q}, ... 2. ... calculamos wp(S, Q), ... 3. ... y tratamos de demostrar que P ⇒ wp(S, Q). H0 (Q) ≡ ¬B ∧ Q, Hk+1 (Q) ≡ B ∧ wp(S, Hk (Q)) para k ≥ 0. I I Axioma 5. wp(while B do S, Q) ≡ (∃k) k ≥ 0 ∧ Hk (Q). I El teorema del invariante se demuestra a partir de este axioma, proponiendo un invariante y una función variante para el ciclo. Tenemos ahora un sistema formal para demostrar la corrección de un programa respecto de su especificación: Esto abre la posibilidad de tener verificadores automáticos de programas! 17 Verificación de programas 18 Dafny I Existen diversos verificadores automáticos de corrección. Uno de ellos es Dafny, desarrollado en Microsoft Research. 1. http://research.microsoft.com/dafny 2. http://www.rise4fun.com/dafny I 19 Utiliza un lenguaje intermedio especializado en verificación llamado Boogie y un demostrador automático de teoremas llamado Z3. 20