Algoritmos y Estructuras de Datos I Verificación de programas

Anuncio
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
Descargar