Logica per la Programmazione

Documenti analoghi
Logica per la Programmazione

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Logica per la Programmazione

Logica per la Programmazione

LOGICA PER LA PROGRAMMAZIONE - a.a Primo Appello - 20/01/2017 Soluzioni Proposte

Logica per la Programmazione

Logica per la Programmazione

LOGICA PER LA PROGRAMMAZIONE (A,B) - a.a SOLUZIONI PROPOSTE SECONDO APPELLO - 7/02/2012

Logica per la Programmazione

TRIPLE DI HOARE: ESEMPI ED ESERCIZI. Corso di Logica per la Programmazione A.A. 2012/13

Logica per la Programmazione

INTRODUZIONE ALLA LOGICA DI HOARE. Corso di Logica per la Programmazione A.A. 2013/14

Logica per la Programmazione

Logica per la Programmazione

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

Linguaggi di programmazione: sintassi e semantica Sintassi fornita con strumenti formali: Semantica spesso data in modo informale

INTRODUZIONE ALLA LOGICA DI HOARE. Corso di Logica per la Programmazione

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

Logica per la Programmazione

REGOLE DI INFERENZA PER TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2012/13

Logica per la Programmazione

Logica per la Programmazione

REGOLE DI INFERENZA PER TRIPLE DI HOARE: ASSEGNAMENTO, SEQUENZA E CONDIZIONALE. Corso di Logica per la Programmazione A.A. 2013/14

Logica per la Programmazione

REGOLE DI INFERENZA PER TRIPLE DI HOARE: ASSEGNAMENTO, SEQUENZA E CONDIZIONALE. Corso di Logica per la Programmazione

Logica per la Programmazione

Logica per la Programmazione

Informatica

Logica per la Programmazione

Logica per la Programmazione

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2016/17

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2015/16

Informatica

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

Logica per la Programmazione

Informatica

Verifica di programmi

contiene il valore e nel range [l, u]. Funziona correttamente solo se 0 l e u a.

Informatica

CALCOLO PROPOSIZIONALE. Corso di Logica per la Programmazione Andrea Corradini

CALCOLO PROPOSIZIONALE: CENNI

Logica per la Programmazione

Specifica, progetto e verifica della correttezza di algoritmi iterativi

SmallC: Definizione ed Implementazione

Logica per la Programmazione

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2015/2016

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2016/2017

Fondamenti di Programmazione Recupero Primo Parziale 30 Gennaio 2008 Traccia A

IL CALCOLO DEL PRIMO ORDINE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Logica per la Programmazione

Logica per la Programmazione

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2017/2018

Semantica operazionale dei linguaggi di Programmazione

Tecniche di prova per induzione

Logica per la Programmazione

Logica per la Programmazione

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2018/19

interpretazione astratta

FONDAMENTI DI PROGRAMMAZIONE ESERCITAZIONI Corso di Laurea in MATEMATICA a.a. 2018/19

Fondamenti teorici e programmazione

Espressività e limitazioni delle grammatiche regolari

Testing, correttezza e invarianti

Istruzioni Condizionali

COMANDI ITERATIVI. Ivan Lanese

Approfondimenti sul ciclo while

QUANTIFICATORI FUNZIONALI: MINIMO, MASSIMO, SOMMATORIA, CARDINALITA. Corso di Logica per la Programmazione A.A. 2013/14

LOGICA DEL PRIMO ORDINE CON INSIEMI E INTERVALLI. Corso di Logica per la Programmazione

Ragionamento Automatico Richiami di tableaux proposizionali

Logica per la Programmazione

Strutture di controllo condizionali in Matlab

Programmazione II. Lezione 3. Daniele Sgandurra 26/10/2010.

Le strutture di controllo

Strutture di controllo in C++

LOGICA DEL PRIMO ORDINE: SEMANTICA. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

LOGICA PER LA PROGRAMMAZIONE a.a. 2016/17 Seconda esercitazione - 11/10/16 - Soluzioni Proposte

Note di semantica assiomatica

Appunti di informatica. Lezione 8 anno accademico Mario Verdicchio

Due osservazioni sulle variabili

LOGICA DEL PRIMO ORDINE CON INSIEMI E INTERVALLI. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Logica per la Programmazione

Introduzione alla logica matematica. Logica matematica. Paolo Bison

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

Verso i puntatori: Cosa è una variabile?

5 Puntatori. Nel linguaggio che stiamo analizzando, frammento del linguaggio C, le variabili hanno quattro proprietà: 1. un nome (identificatore)

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Logica: materiale didattico

Fondamenti dell Informatica. Esercizi di preparazione al secondo compitino

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Aritmetica dei puntatori

Transcript:

Logica per la Programmazione Lezione 15 Sistema di Dimostrazioni per le Triple di Hoare Sequenze (Array) e Aggiornamento Selettivo A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 275

Sequenze: Sintassi Estendiamo il linguaggio per usare array o sequenze Con a : array [0,n) of T diciamo che a è una variabile di tipo: sequenza di elementi di tipo T con dominio [0,n) dove T può essere int o bool Il dominio di a viene indicato come dom(a) Scriviamo a[e] per denotare l elemento di a di posizione E. Ad esempio: a[0], a[4], a[2*x+1], a[a[0]+a[4]],... La sintassi delle espressioni diventa: Exp ::= Const Id Ide[Exp] (Exp) Exp Op Exp not Exp A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 276

Sequenze: Semantica Ricordiamo che uno stato σ è una funzione σ : Ide (Z B) Estendiamo il concetto di stato: se a è un array di tipo T, allora { σ(a) : dom(a) B se T = bool σ(a) : dom(a) Z se T = int Esempio: a: array [0,4) of int 2 1 10 6 σ(a) : [0, 4) int σ(a) = {0 2, 1 1, 2 10, 3 6} Estendiamo la funzione di interpretazione semantica: E(Ide[Exp], σ) = σ(ide)(e(exp, σ)) se E(Exp, σ) dom(ide) Esempio: E(a[0], σ) = σ(a)(e(0, σ)) = σ(a)(0) = 2 A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 277

Sequenze: Semantica (2) Esempio: valutazione di a[a[0]+a[1]] nello stato σ tale che σ(a) : [0, 4) int σ(a) = {0 2, 1 1, 2 10, 3 6} 2 1 10 6 E(a[a[0] + a[1]], σ) = σ(a)(e(a[0] + a[1], σ)) = σ(a)(e(a[0], σ) + E(a[1], σ)) = σ(a)(σ(a)(0) + σ(a)(1)) = σ(a)(2 + 1) = σ(a)(3) = 6 A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 278

Sequenze: Semantica (3) Attenzione: Ide[Exp] non è sempre definito Estendiamo la funzione def: def (Ide[Exp]) = def (Exp) Exp dom(ide) Quindi abbiamo i seguenti casi in cui un espressione potrebbe non essere definita: def (E mod E ) = def (E div E ) = def (E) def (E ) E 0 def (Ide[Exp]) = def (Exp) Exp dom(ide) A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 279

Sequenze: Ridefinizione locale di sequenza Sia a: array [0,n) of T una sequenza. Con a[e 1 /E 2 ] intendiamo l array a modificato in modo tale che nella posizione E 2 abbia il valore E 1. Quindi la valutazione di a[e 1 /E 2 ][E] in uno stato σ è data da: { E(E1, σ) se E(E, σ) = E(E E(a[E 1 /E 2 ][E], σ) = 2, σ) E(a[E], σ) altrimenti Nota: le operazioni non possono essere applicate a sequenze, ma solo a singoli elementi di sequenze. Per esempio, possiamo scrivere a[2] < b[3], a[2] y + x ma non a + b! A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 280

Aggiornamento Selettivo Ogni elemento di una sequenza è una variabile, quindi può comparire a sinistra di un assegnamento. Es: a[3] := 5 Estendiamo il comando di assegnamento: Ide List := Exp List Formalmente, cambia la definizione di Ide List come segue: Ide List ::= Ide Ide, Ide List Ide[Exp] Ide[Exp], Ide List Un comando di assegnamento del tipo v[e] := E aggiornamento selettivo. è chiamato L effetto è di transire, a partire da uno stato σ, allo stato σ[w/v], dove w = v[e(e, σ)/e(e, σ)], a patto che le due espressioni E ed E siano definite in σ, e che il valore di E in σ stia nel dominio di v. A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 281

Aggiornamento Selettivo: Semantica La semantica del comando di aggiornamento selettivo è data dal seguente assioma (AGG-SEL): {def (E) def (E ) E dom(v) P[w/v]} v[e] := E {P} dove w = v[e /E] Domanda: Perché l assioma (ASS) non funzionerebbe in questo caso? Si può usare anche la seguente regola derivata (da (AGG-SEL) e (PRE)): R def (E) def (E ) E dom(v) P[w/v] {R} v[e] := E {P} w = v[e /E] A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 282

Esempio: Aggiornamento selettivo Si verifichi la seguente tripla di Hoare (assumendo a: array [0, n) of int): {k [1, n) ( i. i [0, k) (a[i] = (Σx : x [0, i].x)) ) } a[k] := a[k-1] + k { ( i. i [0, k] (a[i] = (Σx : x [0, i].x)) ) } Per dimostrare le tripla applichiamo la regola dell Aggiornamento Selettivo (o l Assioma dell Aggiornamento selettivo e la Regola di Inferenza PRE). Quindi dobbiamo dimostrare la seguente implicazione: k [1, n) ( i. i [0, k) (a[i] = (Σx : x [0, i]. x)) ) def (k) def (a[k 1] + k) k dom(a) ( i. i [0, k] (b[i] = (Σx : x [0, i]. x)) ) dove b = a [ a[k 1]+k / k ]. A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 283

Soluzione Partiamo dalla conseguenza: def (k) def (a[k 1] + k) k dom(a) ( i. i [0, k] (b[i] = (Σx : x [0, i].x)) ) {definizione di def} k 1 dom(a) k dom(a) ( i. i [0, k] (b[i] = (Σx : x [0, i].x)) ) {Ip: k [1, n) dom(a) = [0, n) } ( i. i [0, k] (b[i] = (Σx : x [0, i].x))) {(Intervallo- )} ( i. i [0, k) (b[i] = (Σx : x [0, i].x)) b[k] = (Σx : x [0, k].x) {def di b, Ip:( i. i [0, k) (a[i] = (Σx : x [0, i].x))), ( i. i [0, k) i k) } b[k] = (Σx : x [0, k].x) {Ip: def di b, sostituzione} a[k 1] + k = (Σx : x [0, k].x) {(Intervallo-Σ)} a[k{ 1] ( + k = (Σx : x [0, k).x) + k )} Ip: i. i [0, k) (a[i] = (Σx : x [0, i].x)) (Σx : x [0, k 1].x)) + k = (Σx : x [0, k).x) + k {calcolo} T A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 284

Esempio: Incremento di Sequenza Si consideri il seguente programma annotato che incrementa tutti gli elementi di un array a: array [0, n) of int. {n 0 a : array[0, n) of int ( k. k [0, n) a[k] = V [k])} x := 0; { Inv : x [0, n] ( k. k [0, x) a[k] = V [k] + 1) ( k. k [x, n) a[k] = V [k]) }{t : n x} while x < n do a[x] := a[x] + 1; x := x + 1 endw { Inv (x < n)} {( k. k [0, n) a[k] = V [k] + 1)} Si analizzi l invariante, cercando di capirne la stuttura Scrivere e dimostrare la Condizione di Invarianza Scrivere e dimostrare la Condizione di Terminazione Scrivere e dimostrare la Condizione di Progresso A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 285

Incremento di Sequenza: Condizione di Invarianza { x [0, n] ( k. k [0, x) a[k] = V [k] + 1) ( k. k [x, n) a[k] = V [k]) x < n} a[x] := a[x] + 1; x := x + 1 { x [0, n] ( k. k [0, x) a[k] = V [k] + 1) ( k. k [x, n) a[k] = V [k]) def (x < n)} Per la regola della sequenza dobbiamo determinare R in modo che siano verificate: 1. { Inv x < n} a[x] := a[x] + 1 {R} 2. {R} x := x + 1 { Inv def (x < n)} Per l assioma (ASS), la seconda tripla è verificata per R def (x + 1) x + 1 [0, n] ( k. k [0, x + 1) a[k] = V [k] + 1) ( k. k [x + 1, n) a[k] = V [k]) A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 286

Incremento di Sequenza: Condizione di Invarianza Per la prima tripla, applicando la regola dell aggiornamento selettivo dobbiamo mostrare x [0, n] ( k. k [0, x) a[k] = V [k] + 1) ( k. k [x, n) a[k] = V [k]) x < n x + 1 [0, n] ( k. k [0, x] b[k] = V [k] + 1) ( k. k (x, n) b[k] = V [k]) x [0, n] def (a[x] + 1) con b = a[a[x] + 1/x] Alcune osservazioni: 1. def (a[x] + 1) x [0, n) che quindi possiamo omettere 2. ( k. k [0, x) k (x, n) b[k] = a[k]) 3. b[x] = a[x] + 1 A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 287

Incremento di Sequenza: Condizione di Invarianza Partiamo dalla conseguenza: x + 1 [0, n] ( k. k [0, x] b[k] = V [k] + 1) ( k. k (x, n) b[k] = V [k]) x [0, n] def (a[x] + 1) {Ip : x [0, n], x < n quindi x + 1 [0, n]} ( k. k [0, x] b[k] = V [k] + 1) ( k. k (x, n) b[k] = V [k]) {(Intervallo- ), x [0, x]} ( k. k [0, x) b[k] = V [k] + 1) b[x] = V [x] + 1 ( k. k (x, n) b[k] = V [k]) {Osservazioni (2) e (3) precedenti} ( k. k [0, x) a[k] = V [k] + 1) a[x] + 1 = V [x] + 1 ( k. k (x, n) a[k] = V [k]) {Ip : k. k [0, x) a[k] = V [k] + 1} a[x] + 1 = V [x] + 1 ( k. k (x, n) a[k] = V [k]) {calcolo, intervallo- al contrario} ( k.k [x, n) a[k] = V [k]) vero per ipotesi A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a. 2016/17 pag. 288