Verifica di programmi

Documenti analoghi
LA LOGICA DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Verifica dei programmi

Valutazione Lazy. Prefazione alla lezione

Logica proposizionale

Logica per la Programmazione

Logica proposizionale

LOGICA PER LA PROGRAMMAZIONE - a.a Secondo Appello - 11/02/2016 Soluzioni Proposte

04 - Logica delle dimostrazioni

LOGICA DEL PRIMO ORDINE: PROOF SYSTEM. Corso di Logica per la Programmazione A.A. 2013/14 Andrea Corradini

02 - Logica delle dimostrazioni

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Elezione di un leader in una rete ad anello

04 - Numeri Complessi

Calcolare x n = x x x (n volte)

Linguaggi. Claudio Sacerdoti Coen 29,?/10/ : La struttura dei numeri naturali. Universitá di Bologna

Logica. 7: Conseguenza ed equivalenza logica in logica classica proposizionale. Claudio Sacerdoti Coen. Universitá di Bologna

Logica per la Programmazione

Teorema 1.1. (Teorema di Compattezza) Sia Γ un insieme di formule di un linguaggio proposizionale.

Cosa si intende con stato

SeparationLogic. Tecniche Automatiche per la Correttezza del Software

LOGICA MATEMATICA PER INFORMATICA

DIFFERENZIAZIONE. Sia f una funzione reale di variabile reale con dominio un intervallo. Se f è derivabile in un punto x 0, allora: f(x) f(x 0 ) lim

Progetto e analisi di algoritmi

Introduzione alla logica

Logica per la Programmazione

Esercizi per il Corso di Informatica (LT Matematica)

LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13)

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Algoritmi e Strutture Dati

Prerequisiti Matematici

Logica proposizionale

Algoritmi e Strutture Dati - II modulo Soluzioni degli esercizi

LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13)

Un po di logica. Christian Ferrari. Laboratorio di matematica

Fondamenti di Informatica 2

UNIVERSITÀ DEGLI STUDI LA SAPIENZA CORSO DI STUDI IN INFORMATICA ESERCITAZIONI AL CORSO DI LOGICA MATEMATICA LOGICA PROPOSIZIONALE

Problemi e algoritmi. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 (da U. de' Liguoro - Alg. & Spe. 03/04)

CALCOLO PROPOSIZIONALE

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

ANALISI 1 - Teoremi e dimostrazioni vari

PROGRAMMAZIONE STRUTTURATA

C1: L C1 C2: L C2 C: C1 C2

TRADUZIONE STATE AND TRANSITION DIAGRAM UML E CORRETTEZZA DEI PROGRAMMI IN TLA+

Cenni di logica. Hynek Kovarik. Università di Brescia. Analisi Matematica A

Programmazione = decomposizione basata su astrazioni

Introduzione alla programmazione

NOZIONI DI LOGICA PROPOSIZIONI.

Correttezza (prima parte)

Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm

CAPITOLO SECONDO APPLICAZIONI TRA INSIEMI E RELAZIONI DI EQUIVALENZA

Elementi di logica. SCOPO: introdurre nozioni di logica & vocabolario per una corretta interpretazione delle dimostrazioni.

1 Giochi di Ehrenfeucht-Fraissé e Logica del Prim ordine

Richiami di Matematica. 1. Insiemi, relazioni, funzioni. 2. Cardinalitá degli insiemi infiniti e numerabilitá. 3. Notazione asintotica.

Riduzioni che preservano l approssimazione e completezza nelle classi di approssimabilità.

2. Sintassi e Semantica

Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi

DAI NUMERI NATURALI AI NUMERI RAZIONALI

1 Funzioni reali di una variabile reale

I teoremi della funzione inversa e della funzione implicita

Gli insiemi N, Z e Q. I numeri naturali

9. CALCOLO INTEGRALE: L INTEGRALE INDEFINITO

Ragionamento Automatico Richiami di calcolo dei predicati

Logica: materiale didattico

1 Calcolo dei predicati del I ordine. Semantica

Specifica parte IIIC. Specifiche algebriche. Specifiche algebriche. Algebra per definizione di stringhe

Studio degli algoritmi

Ottimizzazione dei Sistemi Complessi

Introduzione ad alcuni sistemi di logica modale

Lezione 6 Introduzione al C++ Mauro Piccolo

Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi

Grammatiche Parse trees Lezione del 17/10/2012

ALGEBRA I: SOLUZIONI QUINTA ESERCITAZIONE 9 maggio 2011

Intelligenza Artificiale I

Esercitazioni per il corso di Logica Matematica

Linguaggi. Claudio Sacerdoti Coen 28/03/ : Deduzione naturale. Universitá di Bologna. Deduzione naturale

Laboratorio di Python

NOTE SULLE FUNZIONI CONVESSE DI UNA VARIABILE REALE

Riferimenti: R.Adams, Calcolo Differenziale 2. Capitoli 3.4, 3.9. Esercizi 3.4, 3.9.

TEORIA DEI SISTEMI SISTEMI LINEARI

La matematica non è un opinione, lo è oppure...?

Algoritmi (9 CFU) (A.A )

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso: Fondamenti di Linguaggi di Programmazione

Maiuscole e minuscole

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine

Sviluppi e derivate delle funzioni elementari

Interpretazione Astratta (cenni) Agostino Cortesi

LOGICA MATEMATICA PER INFORMATICA

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Strutture di controllo iterative

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Rappresentazione con i diagrammi di flusso (Flow - chart)

Esercitazione 6. Array

Macchine di Turing. Francesco Paoli. Istituzioni di logica, Francesco Paoli (Istituzioni di logica, ) Macchine di Turing 1 / 29

1. Funzioni implicite

Alberi: definizioni e dimostrazioni induttive.

Algoritmi e Strutture Dati

Transcript:

Verifica di programmi Informalmente, un programma è corretto se l output prodotto è quello atteso rispetto all input. La correttezza dei programmi può essere espressa mediante formule per la correttezza della forma {p} S {q} dove S è un programma e p, q sono asserzioni. p è detta precondizione e q postcondizione. La precondizione descrive gli insiemi di stati iniziali di S; la postcondizione descrive l insieme di stati finali di S. Studieremo due interpretazioni delle formule per la correttezza: Correttezza parziale: una formula {p} S {q} è vera se ogni computazione convergente di S a partire da un stato che soddisfa p termina in uno stato che soddisfa q. Correttezza totale: una formula {p} S {q} è vera se ogni computazione di S a partire da un stato che soddisfa p termina in uno stato che soddisfa q.

Asserzioni Consideriamo il seguente insieme di asserzioni per descrivere proprietà degli stati: un espressione booleana è un asserzione; se p, q sono asserzioni, allora p, p q, p q, p q, p q sono asserzioni; se x è una variabile semplice e p un asserzione, allora x : p e x : p sono asserzioni. Un occorrenza legata di una variabile semplice x in p è un occorrenza di x che compare nello scope di un quantificatore in p. Un occorrenza di una variabile semplice x in p è libera se non è legata. Tutte le occorrrenze di variabili array sono libere. var(p) denota l insieme di variabili (semplici e array) in p. free(p) denota l insieme di variabili semplici libere in p e variabili array in p.

Semantica delle asserzioni La semantica S[[p]] : Σ {true,false} è definita come segue (dove S[[p]](σ) = true è abbreviato con σ = p): σ = B sse σ(b) = true σ = p sse non σ = p (σ = p) σ = p q sse σ = p e σ = q σ = p q sse σ = p oppure σ = q σ = p q sse σ = p implica σ = q σ = p q sse (σ = p se e solo se σ = q) per x variabile semplice di tipo T, σ = x : p sse σ[x := d] = p per ogni d D T per x variabile semplice di tipo T, σ = x : p sse σ[x := d] = p per qualche d D T

Significato delle asserzioni Definiamo il significato di un asserzione p, [[p]], come: [[p]] = {σ σ Σ e σ = p} p è vera se [[p]] = Σ. p e q sono equivalenti se p q è vera. Per ogni asserzione p, = p, = p, fail = p. Lemma. (i) [[ p]] = Σ \ [[p]] (ii) [[p q]] = [[p]] [[q]] (iii) [[p q]] = [[p]] [[q]] (iv) p q è vera sse [[p]] [[q]] (v) p q è vera sse [[p]] = [[q]]

Interpretazione delle formule per la correttezza Correttezza parziale: la formula {p} S {q} è vera, = {p} S {q}, se M[[S]]([[p]]) [[q]]. Correttezza totale: la formula {p} S {q} è vera, = tot {p} S {q}, se M tot [[S]]([[p]]) [[q]]. In particolare, = tot {p} S {q} implica = {p} S {q}

Dimostrare che una formula per la correttezza è vera utilizzando direttamente la semantica operazionale può essere molto complicato. Un approccio più conveniente consiste nell utilizzare sistemi di regole alla Hoare per derivare formule {p} S {q}. Prima di introdurre sistemi alla Hoare per la correttezza parziale e totale, serve definire la nozione di sostituzione.

Sostituzione di espressioni in espressioni La sostituzione di espressioni in espressioni è una funzione da espressioni in espressioni. Date espressioni s, t e una variabile u semplice o sottoscritta, s[u := t] denota l espressione ottenuta sostituendo in s l espressione t al posto di u. Formalmente, s[u := t] si definisce per induzione sulla struttura di s: se s è una variabile semplice s[u := t] t if s u s otherwise. se s è una costante di tipo base, s[u := t] s se s op(s 1,..., s n ) s[u := t] op(s 1 [u := t],..., s n [u := t])

... sostituzione di espressioni in espressioni se s a[s 1,..., s n ] e u è una variabile semplice o una variabile sottoscritta b[t 1,..., t m ], con a b, s[u := t] a[s 1 [u := t],..., s n [u := t]] se s a[s 1,..., s n ] e u a[t 1,..., t n ], s[u := t] if n i=1 s i [u := t] = t i then t else a[s 1 [u := t],..., s n [u := t]] fi se s if B then s 1 else s 2 fi s[u := t] if B[u := t] then s 1 [u := t] else s 2 [u := t] fi

Sostituzione di espressioni in asserzioni La sostituzione di una variabile u semplice o sottoscritta con un espressione t in un asserzione p è definita per induzione su p: se p s, s espressione booleana, p[u := t] s[u := t] se p q, se p q r, p[u := t] (q[u := t]) p[u := t] q[u := t] r[u := t] se p x : q, p[u := t] y : q[x := y][u := t] dove y non compare in p, t, u e ha lo stesso tipo di x se p x : q, p[u := t] y : q[x := y][u := t] dove y non compare in p, t, u e ha lo stesso tipo di x.

Sostituzione identica Lemma. Siano s, t espressioni, x variabile semplice, a[t 1,..., t n ] variabile sottoscritta. Allora: (i) s[x := t] s, se s non contiene x. (ii) s[a[t 1,..., t n ] := t] s, se s non contiene a.

Lemma di Coincidenza Lemma. Per ogni espressione s, asserzione p, stati propri σ, τ, (i) se σ[var(s)] = τ[var(s)] allora σ(s) = τ(s); (ii) se σ[free(p)] = τ[free(p)] allora σ = p sse τ = p.

Lemma di sostituzione Lemma. Per tutte le espressioni s, t, per tutte le asserzioni p, e tutte le variabili u semplici o sottoscritte dello stesso tipo di t e per tutti gli stati propri σ, (i) σ(s[u := t]) = σ[u := σ(t)](s) (ii) σ = p[u := t] sse σ[u := σ(t)] = p.

Regole per la correttezza parziale di programmi deterministici Sistema formale PD: {p} skip {q} skip {p[u := t]} u := t {p} := {p B} S 1 {q} {p B} S 2 {q} {p} if B then S 1 else S 2 fi {q} {p B} S {p} {p} while B do S od {p B} if while {p} S 1 {r} {r} S 2 {q} {p} S 1 ; S 2 {q} ; p p 1 {p 1 } S {q 1 } q 1 q {p} S {q} L asserzione p nella regola while è chiamata invariante di ciclo. La regola è chiamata regola di conseguenza logica.

Composizionalità di PD Il sistema formale PD è composizionale, in quanto il comportamento di un programma complesso è spiegato in termini del comportamento dei suoi sottoprogrammi.

Esempio 1 Sia S x := x + 1; y := y + 1. Dimostriamo la correttezza in PD della formula {x = y} S {x = y}, (1) cioè dimostriamo che la formula (1) è derivabile in PD. Applichiamo l assioma := due volte: per sostituzione all indietro, (x = y)[y := y + 1] x = y + 1, per l assioma := {x = y + 1} y := y + 1 {x = y} per sostituzione all indietro, (x = y + 1)[x := x + 1] x + 1 = y + 1, per l assioma := {x + 1 = y + 1} x := x + 1 {x = y + 1} per la regola ; {x + 1 = y + 1} x := x + 1; y := y + 1 {x = y} dalla regola di conseguenza, poichè (x = y) (x+1 = y+1), deriviamo la (1).

Esempio 2 Dimostrare che la seguente formula è derivabile in PD: {true} (x := 1; a[1] := 2; a[x] := x) {a[1] = 1}

Esempio 3: iterazione Sia DIV il seguente programma per calcolare quoziente e resto della divisione di due naturali x, y: dove DIV quo := 0; rem := x; S 0 S 0 while rem y do rem := rem y; quo := quo + 1 od L obiettivo è dimostrare che: se x, y sono interi positivi e DIV termina, allora quo è il quoziente intero e rem è il resto della divisione di x per y. Dimostriamo che è derivabile in PD: {x 0 y 0} DIV {quo y + rem = x 0 rem < y} (2)

Ma abbiamo dimostrato la correttezza (parziale) del programma? Ossia: dal fatto che la formula (2) è derivabile in PD possiamo dedurre = {x 0 y 0} DIV {quo y + rem = x 0 rem < y}? Cioè M[[DIV ]]([[x 0 y 0]]) [[quo y + rem = x 0 rem < y]]? Un sistema formale G si dice corretto rispetto alla semantica operazionale, quando la derivabilità G di una formula implica la sua verità.

Correttezza di un sistema formale Sia G un sistema formale per derivare formule {p} S {q} per una classe C di programmi. G è corretto rispetto alla semantica operazionale per la correttezza parziale se, per ogni formula {p} S {q}, con S in C, G {p} S {q} implica = {p} S {q}. G è corretto rispetto alla semantica operazionale per la correttezza totale se, per ogni formula {p} S {q}, con S in C, G {p} S {q} implica = tot {p} S {q}.

Correttezza di PD Teorema. Il sistema formale PD è corretto rispetto alla semantica operazionale per la correttezza parziale di programmi deterministici. dim. Per induzione sull altezza della derivazione in PD. Caso base: gli assiomi sono veri. Passo induttivo: le regole sono corrette, cioè se le premesse sono vere, allora anche la conclusione è vera.