Semantica operazionale dei linguaggi di Programmazione Le espressioni con stato Rosario Culmone, Luca Tesei Lucidi tratti dalla dispensa “Elementi di Semantica Operazionale” R. Barbuti, P. Mancarella e F. Turini Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.1/43 Espressioni con variabili Espandiamo il sistema →exp in modo da trattare il nuovo caso sintattico Exp ::= Ide: Exp ::= Num | Ide | (Exp) | Exp Op Exp Op ::= + | - | * | / | % Num ::= ... Ide ::= ... Con questa grammatica possiamo scrivere espressioni che contengono variabili indicate con i nomi generabili da Ide Es: x + 2, 3 ∗ pippo + 45 % y, tmp, . . . Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.2/43 Espressioni con variabili Quale può essere il significato da associare a questi oggetti sintattici? Quello che ci aspettiamo è che le variabili presenti nell’espressione abbiano un certo valore associato Se questo è vero possiamo di nuovo associare all’espressione un valore seguendo la logica del sistema nella versione precedente Per far questo introduciamo il concetto di stato Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.3/43 Lo stato: forma semplice Nella sua forma più semplice, uno stato non è altro che un insieme di associazioni del tipo hnome, vali dove val è un valore Indichiamo genericamente con Val l’insieme dei valori: per quanto visto sino ad ora Val è il dominio semantico IN Uno stato ϕ può essere visto come una funzione ϕ : Ide 7→ Val Dato un nome x viene restituito il valore associato ad x in ϕ Questa forma semplice di stato la chiameremo frame Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.4/43 Lo stato: forma semplice In generale un frame ϕ è una funzione parziale sul dominio Ide Utilizziamo ϕ, ϕ0 , ϕ′ , ϕ′′ , . . . come metavariabili per denotare generici frame. Usiamo Φ per indicare l’insieme di tutti i possibili frame Adottiamo l’usuale notazione funzionale ϕ(x) per denotare il valore associato ad x nel frame ϕ Dato un frame ϕ che non contiene alcuna associazione per l’identificatore x scriviamo ϕ(x) =⊥ Indichiamo con ω un frame vuoto, ovvero tale che ϕ(x) =⊥ qualunque sia x Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.5/43 Rappresentazione funzionale Una possibile rappresentazione di un frame, in forma funzionale, è la seguente Siano x1 , x2 , . . . , xk tali identificatori e siano v1 , v2 , . . . , vk i valori ad essi associati nello stato ϕ Definiamo ϕ come la seguente funzione: v1 se x = x1 se x = x2 v2 ϕ(x) = . . . se x = xk vk ⊥ altrimenti Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.6/43 Rappresentazione estensiva Un modo alternativo di rappresentare il frame consiste nell’elencare le associazioni presenti in ϕ come segue: ϕ = {x1 7→ v1 , x2 7→ v2 , . . . , xk 7→ vk } In questa notazione è essenziale che gli identificatori x1 , x2 , . . . , xk siano tutti distinti tra loro Non è importante l’ordine in cui vengono elencate le associazioni xi 7→ vi all’interno delle parentesi graffe Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.7/43 Rappresentazione grafica Graficamente indicheremo un frame in questo modo: x1 v1 x2 v2 ϕ= ... xk vk Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.8/43 Miglioriamo il sistema →exp Per poter calcolare la semantica delle espressioni formate con la nuova grammatica dotiamo le configurazioni non terminali del sistema di transizioni di uno stato nella sua forma semplice: Γexp = {hE, ϕi | E ∈ Exp, ϕ ∈ Φ} ∪ {n | n ∈ IN } Texp = {n | n ∈ IN } Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.9/43 Regole Rispetto alla versione precedente del sistema c’è una sola regola in più La nuova regola gestisce il caso sintattico di base Ide Un qualsiasi albero sintattico di Exp può avere quindi come foglie delle stringhe di Num o dei nomi di variabili Ide Dato un certo stato ϕ e una espressione E, quest’ultima deve essere valutata tenendo presente i valori associati da ϕ ai nomi Quindi ϕ deve essere disponibile in tutte le chiamate ricorsive del sistema Sexp Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.10/43 Regole Vediamo quindi la regola (expide ) per gestire il nuovo caso sintattico ϕ(x) = n hx, ϕi →exp n La premessa ϕ(x) = n esprime il fatto che ϕ deve associare al nome x un valore naturale e quindi diverso da ⊥ Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.11/43 Regole Tutte le altre regole restano invariate tranne che adesso nelle configurazioni c’è anche lo stato Ogni regola diversa da (expide ) non usa direttamente lo stato Le regole ricorsive si limitano a passarlo tale e quale alle istanze ricorsive del sistema che costruiscono sottoderivazioni La regola (expn ) non lo usa: hn, ϕi →exp n Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.12/43 Regole Vediamo alcuni esempi delle altre regole hE, ϕi →exp n hE′ , ϕi →exp n′ m = n + n′ (exp+ ) hE+E′ , ϕi →exp m hE, ϕi →exp n hE′ , ϕi →exp n′ m = n × n′ (exp∗ ) hE*E′ , ϕi →exp m hE, ϕi →exp n hE′ , ϕi →exp n′ n ≥ n′ m = n − n′ (exp− ) hE-E′ , ϕi →exp m Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.13/43 Derivazione Facciamo una derivazione usando questo sistema Prendiamo ϕ = {x 7→ 5, y 7→ 2} h(x+8) / y, ϕi →exp { (expdiv ), (d1): h(x+8), ϕi →exp 13, (expide ): hy, ϕi →exp 2 2 6= 0, 13 div 2 = 6 } 6 Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.14/43 Sottoderivazioni (d1): h (x+8) , ϕi →exp { (exp() ), (d2): hx+8, ϕi →exp 13 } 13 (d2): h x+8 , ϕi →exp { (exp+ ), ((expide )): hx, ϕi →exp 5, ((expn )): h8, ϕi →exp 8, 13 = 5 + 8 } 13 Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.15/43 Funzione di valutazione semantica Alla luce di questo nuovo sistema e dell’introduzione dello stato cambia anche la funzione di valutazione semantica Il significato di una espressione aritmetica contentente dei nomi di variabili dipende anche dallo stato Formalmente la funzione di valutazione semantica E ha questo nuovo tipo: E: Exp → (Φ → IN ) Ciò significa che ad ogni espressione E viene associata una funzione Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.16/43 Funzione di valutazione semantica La funzione associata all’espressione E, dato un certo stato ϕ, restituisce un numero naturale n che rappresenta il valore dell’espressione nello stato ϕ Formalmente lo scriviamo utilizzando questa notazione: E[[E]]ϕ = n Possiamo, al solito, definire questa funzione utilizzando l’ultima versione del sistema di transizioni Sexp : E[[E]]ϕ = n se e solo se hE, ϕi →exp n Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.17/43 Strutturazione dello stato Modellare lo stato come un semplice frame non basta Il linguaggio Java ha dei meccanismi di scope delle variabili associati ai blocchi e ai sottoblocchi annidati Per trattare correttamente questi meccanismi abbiamo bisogno di un modello di stato più complesso Il modo giusto di trattare lo stato è quello di modellarlo come pila di frame Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.18/43 Pila di frame Ogni frame della pila si comporta esattamente come abbiamo visto sopra Per rappresentare una pila di frame possiamo usare una notazione grafica: x 31 ϕ2 y 12 σ z 8 ϕ1 x 25 Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.19/43 Il nuovo stato Nella figura precedente il frame più in basso nella pila è ϕ1 Il frame in testa alla pila è ϕ2 Una pila di frame verrà indicata con le metavariabili σ, σ ′ , σ1 , σ2 , . . . Indichiamo con Ω lo stato vuoto (ovvero la pila vuota di frame) L’insieme Σ degli stati è definito induttivamente come segue: Σ = {Ω} ∪ {ϕ.σ|ϕ ∈ Φ, σ ∈ Σ} Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.20/43 Il nuovo stato Una formalizzazione dello stato σ della figura di prima è la sequenza: ϕ2 .ϕ1 .Ω dove ϕ1 e ϕ2 sono le funzioni: ( 8 ϕ1 (v) = 25 ⊥ ( 12 ϕ2 (v) = 31 ⊥ se v =z se v =x altrimenti se v =y se v =x altrimenti Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.21/43 Nomi pluridefiniti Nella definizione di stato che abbiamo dato potrebbero esserci delle variabili a cui sono associati valori diversi in frame diversi Ad esempio nella figura di prima x ha valore 8 in ϕ1 e 31 in ϕ2 Questa possibilità deriva da una semplificazione che facciamo nel nostro linguaggio Java didattico Nel linguaggio Java completo questo non può mai accadere poiché il compilatore vieta di dichiarare nei sottoblocchi delle variabili con dei nomi che sono già presenti nell’attivazione corrente Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.22/43 Frame e blocchi Nel nostro caso risolviamo il conflitto seguendo la logica della pila di frame Ogni frame, vedremo, contiene le variabili definite in un certo blocco Il frame che è in testa alla pila rappresenta le associazioni fatte più di recente, cioè quelle dell’ultimo blocco aperto Scendendo in basso nella pila di un frame troviamo le variabili dichiarate nel blocco a cui quello corrente è annidato e così via Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.23/43 Ricerca del valore di una variabile Diciamo che il valore di un identificatore, in generale, è quello dell’associazione più recente Tale valore si trova ricercandolo nei frame dello stato dall’alto verso il basso Nell’esempio, il valore dell’identificatore x è 31 Il frame ϕ2 è stato infatti impilato sul frame ϕ1 Sempre nell’esempio, il valore dell’identificatore z è 8 Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.24/43 Formalizziamo Dato uno stato σ ed un identificatore x indichiamo con σ(x) il valore associato ad x in σ Diamo una definizione ricorsiva di questa operazione: se σ = Ω ⊥ σ(x) = ϕ(x) se σ = ϕ.σ ′ e ϕ(x) 6= ⊥ ′ σ (x) se σ = ϕ.σ ′ e ϕ(x) = ⊥ Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.25/43 Esempio Consideriamo ancora l’esempio precedente, con σ = ϕ2 .ϕ1 .Ω Abbiamo: σ(x) = 31 poiché ϕ2 (x) = 31 σ(z) = 8 poiché ϕ2 (z) = ⊥ e ϕ1 (z) = 8 Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.26/43 Regole Con la nuova definizione di stato strutturato, le regole di Sexp cambiano Le configurazioni del sistema di transizione hE, ϕi vanno cambiate in hE, σi In ogni regola dobbiamo mettere σ al posto di ϕ Vediamo come esempio la regola (expide ): σ(x) = n hx, σi →exp n Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.27/43 Modifica dello stato Come vedremo in seguito il significato di un programma è quello di eseguire transizioni di stato Ci si aspetta che tali transizioni modifichino lo stato in accordo al significato del programma (semantica) e allo stato iniziale (input) Definiamo quindi precisamente le operazioni di modifica dello stato Per cominciare definiremo una operazione che modifica un frame, poi ci occuperemo di definire la modifica di uno stato vero e proprio, cioè una pila di frame Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.28/43 Modifica di un frame Un frame ϕ è rappresentato da una funzione parziale La modifica di un frame corrisponde quindi alla modifica di una funzione parziale Per questo tipo di operazione si usa spesso la notazione ϕ[v /x ] La funzione denotata da questa espressione corrisponde alla funzione ϕ originale che: resta invariata per tutti gli identificatori diversi da x restituisce il valore v per l’identificatore x Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.29/43 Modifica di un frame In notazione matematica: ϕ(y) ϕ[v /x ](y) = v se y = 6 x se y = x Si noti che se ϕ(x) =⊥ invece ϕ[v /x ](x) = v Cioè l’operazione di modifica, oltre a modificare il valore di un identificatore presente in un frame ϕ, può essere usata per aggiungere un nuovo identificatore nel frame, dandogli un valore iniziale Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.30/43 Modifica in parallelo La notazione può essere estesa per trattare la modifica di un frame su più identificatori in parallelo Se ϕ è un frame, x1 , . . . xk sono k identificatori distinti e v1 , . . . vk sono k elementi in Val, la notazione ϕ[v1 /x1 , . . . ,vk /xk ] denota il frame: ϕ[v1 /x1 , . . . ,vk /xk ](y) = v 1 v2 vk ϕ(y) se y = x1 se y = x2 ... se y = xk altrimenti Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.31/43 Modifica in parallelo Ad esempio: dato il frame ϕ = {x 7→ 5, y 7→ 2} detto ϕ1 il frame ϕ[4 /x ,3 /y ] avremo che ϕ1 (x) = 4, ϕ1 (y) = 3 ϕ1 (z) =⊥ per ogni altro identificatore z Da rimarcare ancora il fatto che gli identificatori modificati in parallelo devono essere tutti distinti Se così non fosse non il risultato della modifica non sarebbe più una funzione (ci sarebbero più valori possibili per lo stesso identificatore) Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.32/43 Modifiche multiple Se fosse necessario rappresentare modifiche successive per lo stesso identificatore, non potremo utilizzare la notazione appena introdotta per modifiche multiple Ad esempio, saremo autorizzati a scrivere ϕ′ = (ϕ[10 /x ])[20 /x ] Sarebbe sbagliato invece scrivere ϕ′′ = ϕ[10 /x ,20 /x ] Dalla definizione è chiaro che ϕ′ è una funzione e che ϕ′ (x) = 20 Invece ϕ′′ non è una funzione da Ide in Val Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.33/43 Modifiche multiple: esempio Sia ϕ = {x 7→ 5, y 7→ 2} Il frame ϕ[4 /x ,3 /z ] è uguale a ϕ′ = {x 7→ 4, y 7→ 2, z 7→ 3} Verificarlo per esercizio Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.34/43 Modifica dello stato Passiamo ora a modificare lo stato vero e proprio, cioè una pila di frame σ Utilizzeremo la stessa notazione per indicare l’operazione di modifica Tuttavia chiariamo subito che l’operazione sarà di natura diversa da quella definita sui frame Sappiamo che il valore associato ad un identificatore x in uno stato è quello che si determina trovando una associazione per x a partire dal frame più recente Definiamo la modifica σ[v /x ] in modo che riguardi l’associazione più recente per x Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.35/43 Modifica dello stato Detto altrimenti, nello stato σ[v /x ] viene modificato il frame più recente che contiene una associazione per x Consideriamo ad esempio uno stato σ del tipo ϕ1 .ϕ2 . . . ϕi . . . ϕk .Ω Se ϕi è il primo frame nella sequenza che contiene una associazione per x cioè ϕ1 (x) = ϕ2 (x) = . . . = ϕi−1 (x) = ⊥ e ϕi (x) 6= ⊥) Allora lo stato σ[v /x ] non è altro che la sequenza modificata ϕ1 .ϕ2 . . . ϕi [v /x ] . . . ϕk .Ω Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.36/43 Modifica dello stato Si noti che, se nessun frame nello stato contiene una associazione per x, la modifica non ha alcun effetto Nell’esempio, se ϕ1 (x) = ϕ2 (x) = . . . = ϕk (x) = ⊥, allora σ[v /x ] = σ In questo sta la maggiore differenza tra la modifica di un frame e la modifica di uno stato L’operazione di modifica di un frame può essere usata per introdurre nuovi identificatori nel frame (dichiarazione) Invece l’operazione di modifica di una pila di frame non può introdurre nuovi identificatori nello stato Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.37/43 Modifica dello stato L’operazione così definita non segnala nessun eventuale errore nel caso di modifica di un identificatore non esistente L’operazione si limita ad avere effetto nullo sullo stato Questo tipo di definizione di modifica è sufficiente per essere usata nel nostro sistema di transizioni che definisce la semantica Esso infatti non prevede una gestione degli errori di questo tipo Questo comportamento può essere cambiato qualora si volesse espandere il sistema e introdurre una gestione degli errori Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.38/43 Modifica dello stato Diamo una definizione formale della modifica di una pila di frame Utilizziamo la struttura ricorsiva della pila per definire ricorsivamente la modifica nel modo che abbiamo precedentemente illustrato informalmente σ[v /x ] = ( ϕ[v /x ].σ ′ ϕ.σ ′ [v /x ] Ω se σ = ϕ.σ ′ e ϕ(x) 6= ⊥ se σ = ϕ.σ ′ e ϕ(x) = ⊥ se σ = Ω La notazione può essere estesa facilmente per trattare la modifica di una sequenza di identificatori distinti, che indicheremo con σ[v1 /x1 , . . . ,vk /xk ]. Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.39/43 Modifica dello stato: esempio Consideriamo come esempio lo stato σ = ϕ2 .ϕ1 .Ω, dove ϕ1 e ϕ2 sono i frame seguenti: ( ( se v =z 8 12 se v =y ϕ1 (v) = 25 se v =x ϕ2 (v) = 31 se v =x ⊥ altrimenti ⊥ altrimenti Lo stato σ[50 /z ,40 /x ] è la sequenza ϕ′2 .ϕ′1 .Ω, con ϕ′1 = ϕ1 [50 /z ] e ϕ′2 = ϕ2 [40 /x ] D’altra parte, lo stato σ[10 /w ] = σ dal momento che ϕ2 e ϕ1 non contengono una associazione per w Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.40/43 Notazioni riguardanti lo stato Nelle premesse delle regole e nella discussione sulla semantica dei comandi utilizzeremo spesso delle equazioni che hanno come componenti parti di uno stato o di un frame Analizziamone alcune e chiariamo da subito il loro significato Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.41/43 Notazioni riguardanti lo stato 1. ϕ(x) = v (risp. σ(x) = v) stabilisce semplicemente che il valore associato ad x nel frame ϕ (risp. nello stato σ ) è v, mentre è ignoto (e non necessariamente indefinito) il valore associato ad ogni altro identificatore che non sia x 2. ϕ(x) = v non equivale a dire che il frame ϕ contiene una sola associazione (quella per l’identificatore x): non corrisponde cioè a stabilire che ϕ = {x 7→ v} 3. La scrittura {x 7→ v} indica un frame in cui il valore associato ad x è v, mentre è indefinito (⊥) il valore associato ad ogni altro identificatore Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.42/43 Notazioni riguardanti lo stato 4. Entrambe le scritture precedenti non equivalgono a ϕ[v /x ], in quanto quest’ultima sta ad indicare un frame che associa ad x il valore v e si comporta come ϕ, qualunque esso sia, in corrispondenza di ogni altro identificatore 5. Infine, mentre ϕ[v /x ] rappresenta comunque un frame diverso da ϕ (con la particolarissima eccezione in cui ϕ(x) = v), σ[v /x ] può essere una pila di frame identica a σ Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.43/43