MSSC1314

333
Università degli Studi di Firenze Scuola di Scienze Matematiche Fisiche e Naturali Corso di Laurea Magistrale in Informatica Note per il corso di MODELLI DI SISTEMI SEQUENZIALI E CONCORRENTI 17 dicembre 2013 Rocco De Nicola — Rosario Pugliese Anno Accademico 2013–2014

Transcript of MSSC1314

Page 1: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 1/332

Università degli Studi di Firenze

Scuola di Scienze Matematiche Fisiche e NaturaliCorso di Laurea Magistrale in Informatica

Note per il corso di

MODELLI DI SISTEMI SEQUENZIALI E CONCORRENTI

17 dicembre 2013

Rocco De Nicola — Rosario Pugliese

Anno Accademico 2013–2014

Page 2: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 2/332

Page 3: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 3/332

Indice

1 Introduzione 71.1 Il problema della correttezza dei sistemi informatici . . . . . . . . . . . . . . 71.2 Approcci alla semantica dei linguaggi di programmazione sequenziali . . . . 81.3 Sistemi concorrenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.4 Calcoli di processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.5 Schema delle note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

I Preliminari Matematici 21

2 Nozioni preliminari 23

2.1 Insiemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2 Relazioni e funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3 Principi di induzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.3.1 Induzione matematica . . . . . . . . . . . . . . . . . . . . . . . . . . 292.3.2 Induzione strutturale . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

2.4 Sistemi di inferenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.4.1 Induzione sulle derivazioni . . . . . . . . . . . . . . . . . . . . . . . . 372.4.2 Induzione sulle regole . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

2.5 Contesti e congruenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3 Sintassi e modelli semantici 43

3.1 Grammatiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.2 Sintassi concreta e sintassi astratta . . . . . . . . . . . . . . . . . . . . . . . 503.3 Espressioni aritmetiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.4 Automi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.5 Sistemi di transizioni etichettate e strutture di Kripke . . . . . . . . . . . . . 573.6 Semantica operazionale delle espressioni aritmetiche . . . . . . . . . . . . . . 603.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

4 Sintassi e denotazioni 65

4.1 Notazioni sintattiche e denotazioni semantiche . . . . . . . . . . . . . . . . . 654.2 Una calcolatrice tascabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Page 4: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 4/332

4 Indice

4.3 Il linguaggio della calcolatrice tascabile . . . . . . . . . . . . . . . . . . . . . 704.4 Semantica denotazionale della calcolatrice tascabile . . . . . . . . . . . . . . 73

4.5 Espressioni regolari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774.5.1 Semantica denotazionale . . . . . . . . . . . . . . . . . . . . . . . . . 774.5.2 Semantica operazionale . . . . . . . . . . . . . . . . . . . . . . . . . . 794.5.3 Semantica assiomatica . . . . . . . . . . . . . . . . . . . . . . . . . . 85

4.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

II Sistemi Sequenziali 89

5 λ-calculus 91

5.1 La λ-convenzioni semplificative . . . . . . . . . . . . . . . . . . . . . . . . . . 92

5.2 Il principio di estensionalità . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.3 Operatori di n-upla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965.4 Operatori di composizione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985.5 Il sistema di calcolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

5.5.1 Sintassi del λ-calculus . . . . . . . . . . . . . . . . . . . . . . . . . . . 995.5.2 Semantica del λ-calculus . . . . . . . . . . . . . . . . . . . . . . . . . 101

5.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

6 Domini per la semantica denotazionale 109

6.1 Esempi d’uso dei domini nella semantica denotazionale . . . . . . . . . . . . 1106.2 Insiemi parzialmente ordinati completi . . . . . . . . . . . . . . . . . . . . . 113

6.3 Funzioni continue e minimo punto fisso . . . . . . . . . . . . . . . . . . . . . 1176.4 Costruzioni di domini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226.4.1 Domini elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226.4.2 Prodotti finiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1236.4.3 Somma disgiunta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1276.4.4 Spazio delle funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

6.5 Un metalinguaggio per la definizione di funzioni di interpretazione . . . . . . 1326.5.1 Una classe di domini . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336.5.2 Il metalinguaggio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

6.6 Esempi di funzioni sul dominio dei naturali . . . . . . . . . . . . . . . . . . . 1396.7 Sistemi di equazioni mutuamente ricorsive . . . . . . . . . . . . . . . . . . . 143

6.8 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

7 Un semplice linguaggio funzionale 147

7.1 Sintassi di un semplice linguaggio funzionale . . . . . . . . . . . . . . . . . . 1477.2 Semantica operazionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1487.3 Semantica denotazionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1527.4 Relazioni tra semantica operazionale e denotazionale . . . . . . . . . . . . . 1567.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

8 Un semplice linguaggio imperativo 163

8.1 Il linguaggio TINY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1638.2 Semantica operazionale di TINY . . . . . . . . . . . . . . . . . . . . . . . . . 164

Page 5: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 5/332

Indice 5

8.3 Semantica denotazionale di TINY . . . . . . . . . . . . . . . . . . . . . . . . 1678.4 Semantica delle espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

8.5 Semantica dei comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1738.6 Equivalenza fra le semantiche . . . . . . . . . . . . . . . . . . . . . . . . . . 1758.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

9 Linguaggi con contesti 181

9.1 Il linguaggio SMALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1819.2 Ambienti e locazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1829.3 Domini semantici per SMALL . . . . . . . . . . . . . . . . . . . . . . . . . . 1849.4 Semantica di SMALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1879.5 Semantica dei programmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1909.6 Semantica delle dichiarazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

9.7 Semantica delle espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1919.8 Semantica dei comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1939.9 Considerazioni conclusive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1949.10 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

III Sistemi Concorrenti 197

10 Operatori per concorrenza e nondeterminismo 19910.1 Azioni esterne ed interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19910.2 Operatori sui processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

10.3 Processi di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20110.4 Operatori di sequenzializzazione . . . . . . . . . . . . . . . . . . . . . . . . . 20210.5 Operatori di scelta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20410.6 Operatori di parallelismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20610.7 Operatori di astrazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21010.8 Operatori per definire comportamenti infiniti . . . . . . . . . . . . . . . . . . 21310.9 Sincronia ed asincronia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21710.10 Operatori che manipolano valori . . . . . . . . . . . . . . . . . . . . . . . . . 21910.11 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

11 Equivalenze comportamentali e preordini di raffinamento 225

11.1 Osservatori, equivalenze e preordini . . . . . . . . . . . . . . . . . . . . . . . 22511.2 Relazioni forti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

11.2.1 Equivalenza basata sulle tracce . . . . . . . . . . . . . . . . . . . . . 22711.2.2 Bisimilarità forte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23011.2.3 Equivalenze basate su testing . . . . . . . . . . . . . . . . . . . . . . 23511.2.4 Preordini di raffinamento . . . . . . . . . . . . . . . . . . . . . . . . . 23711.2.5 Altre equivalenze forti . . . . . . . . . . . . . . . . . . . . . . . . . . 239

11.3 Relazioni deboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24011.3.1 Equivalenza basata sulle tracce deboli . . . . . . . . . . . . . . . . . . 24111.3.2 Bisimulazione debole . . . . . . . . . . . . . . . . . . . . . . . . . . . 24211.3.3 Bisimulazione di branching . . . . . . . . . . . . . . . . . . . . . . . . 24611.3.4 Relazioni basate su testing . . . . . . . . . . . . . . . . . . . . . . . . 248

Page 6: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 6/332

6 Indice

11.3.5 Relazioni basate sui fallimenti . . . . . . . . . . . . . . . . . . . . . . 25411.4 Trattamento della divergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

11.5 Gerarchie tra le relazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25711.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

12 Calculus of Communicating Systems (CCS) 26112.1 Sintassi di CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26112.2 Semantica operazionale di CCS . . . . . . . . . . . . . . . . . . . . . . . . . 26512.3 CCS con passaggio di valori . . . . . . . . . . . . . . . . . . . . . . . . . . . 26812.4 Equivalenze e preordini osservazionali per CCS . . . . . . . . . . . . . . . . . 270

12.4.1 Bisimulazioni e bisimilarità forte . . . . . . . . . . . . . . . . . . . . . 27012.4.2 Bisimulazioni, bisimilarità e congruenza debole . . . . . . . . . . . . . 27412.4.3 Equivalenze basate su testing . . . . . . . . . . . . . . . . . . . . . . 280

12.5 Ragionamento equazionale in CCS . . . . . . . . . . . . . . . . . . . . . . . . 28112.5.1 Assiomatizzazione di ∼ . . . . . . . . . . . . . . . . . . . . . . . . . . 28212.5.2 Assiomatizzazione di ∼= . . . . . . . . . . . . . . . . . . . . . . . . . . 29212.5.3 Assiomatizzazione di vc

test, vcM e vm . . . . . . . . . . . . . . . . . . 298

12.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

13 Logiche per i sistemi concorrenti 301

13.1 Logiche e proprietà di sistemi . . . . . . . . . . . . . . . . . . . . . . . . . . 30113.2 Logiche proposizionali, loro interpretazioni e modelli . . . . . . . . . . . . . . 30313.3 Logiche modali proposizionali . . . . . . . . . . . . . . . . . . . . . . . . . . 30513.4 La logica HML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

13.5 Logiche temporali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31113.6 La logica ACTL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31513.7 Proprietà infinitarie: HML con ricorsione . . . . . . . . . . . . . . . . . . . . 31813.8 Il µ-calculus modale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

Bibliografia 325

A Tabelle 329A.1 Elenco degli operatori per la concorrenza . . . . . . . . . . . . . . . . . . . . 329A.2 Alcuni calcoli di processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

Page 7: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 7/332

Capitolo 1

Introduzione

SOMMARIOQuesto capitolo introduttivo presenta le problematiche principali legate alla verifica della correttezza dei sistemi informatici e di quelli concorrenti in particolare.

1.1 Il problema della correttezza dei sistemi informatici

Il problema della correttezza dei sistemi informatici, siano essi composti da componenti soft-ware e/o hardware, cioè il problema di accertare se un sistema informatico si comporta ef-fettivamente in accordo alle sue specifiche, è uno dei problemi cruciali dell’Informatica e staacquistando un’importanza sempre maggiore. Infatti, i sistemi informatici sono vitali per

la società moderna dal momento che, ad esempio, gestiscono gli aspetti finanziari, regolanole comunicazioni e la produzione di energia, controllano il traffico aereo e i processi indu-striali, anche quelli critici da un punto di vista della sicurezza, ed elaborano informazionicritiche. Inoltre, computer e microprocessori sono ormai usati per controllare ogni sorta didispositivo d’uso giornaliero, dai tablet ai telefonini, dalle automobili agli elettrodomestici.In pratica si sta realizzando un nuovo modello di interazione persona-computer, denominatoubiquitous computing (o anche pervasive computing ), in cui l’elaborazione dell’informazione ècompletamente integrata in tutti gli oggetti, le attività e gli aspetti della vita quotidiana.

Tuttavia, malgrado la sua importanza sia da un punto di vista scientifico che pratico, ilproblema di garantire la correttezza dei sistemi informatici non sempre riceve l’attenzione chemerita. Spesso si privilegia l’esigenza di mantenere bassi i costi di sviluppo. Di conseguenza

abbiamo che i sistemi informatici si guastano con una certa frequenza e talvolta tali guastihanno ripercussioni molto serie sia da un punto di vista economico che da quello della sicurezzaper la vita dell’uomo. Due esempi tra tutti sono il bug che ha afflitto il processore Pentium-IIdella Intel (1994), nel quale secondo una stima della rivista Byte l’unità che si occupava delladivisione in virgola mobile generava un errore ogni nove miliardi di operazioni, e l’esplosionedel vettore spaziale Ariane-5 (1996), la cui costruzione è costata 7 miliardi di dollari all’AgenziaSpaziale Europea, causata da un overflow nella conversione di alcuni dati da rappresentazionein virgola mobile in interi con segno a 16-bit. Tant’è che solo qualche anno fa il premio TuringTony Hoare scriveva:

programming is the only engineering profession that spends half its time and e ff ort on detecting and correcting mistakes made in the other half of its time [BHH +06].

Page 8: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 8/332

8 Capitolo 1 – Introduzione

Negli ultimi anni però, i metodi formali per la descrizione, la costruzione, l’analisi e laverifica dei moderni sistemi informatici, basati soprattutto sulla logica ed altri strumen-

ti matematici, sono diventati più maturi. Secondo la definizione data da R. W. Butler(Wikipedia),

in computer science, specifically software engineering and hardware engineering, formal methods are a particular kind of mathematically-based techniques for the specification, development and verification of software and hardware systems.

Tali metodi possono fornire un supporto fondamentale alla validazione dei sistemi informaticifin dalle prime fasi del loro sviluppo. Sono praticamente indispensabili soprattutto nell’ambitodella verifica di sistemi critici da un punto di vista della sicurezza o da quello del costo. Sonosempre più usati in pratica e c’è da aspettarsi che in un prossimo futuro essi complementino,ed in parte rimpiazzino, i metodi tradizionali dell’ingegneria del software.

Lo scopo principale di queste note è quello di introdurre alcuni dei metodi formali utilizzatiper la verifica della correttezza dei programmi, sia sequenziali che concorrenti.

La prima parte di queste note è dedicata alla introduzione di alcune nozioni preliminarinecessarie per la comprensione e lo sviluppo dei metodi formali che saranno introdotti nelledue parti successive. Più precisamente, tali nozioni riguardano matematica discreta e tecnichedi prova (Capitolo 2), grammatiche, sintassi, automi a stati finiti e sistemi di transizionietichettate (Capitolo 3), denotazioni e funzioni di interpretazione semantica (Capitolo 4).

1.2 Approcci alla semantica dei linguaggi di programmazione

sequenzialiNel caso dei linguaggi di programmazione sequenziali introdurremo alcune tecniche ormaiben consolidate per la definizione precisa e non ambigua della loro semantica. Diversamentedal linguaggio naturale, che evolve nel tempo e risulta ricco di ambiguità, un linguaggio diprogrammazione deve avere una definizione precisa e non ambigua, essendo progettato peristruire una macchina priva di capacità di apprendimento e discernimento. D’altra parteun linguaggio di programmazione ha in comune col linguaggio naturale alcune importanticaratteristiche. Ogni linguaggio ha una sua sintassi ed una sua semantica: la sintassi definiscela struttura delle frasi del linguaggio, la semantica attribuisce un significato a tali frasi.

La teoria riguardante le tecniche per specificare la sintassi è stata sviluppata a lungo edha portato a risultati chiari e importanti. I requisiti matematici di supporto alla specificasintattica (espressioni regolari, grammatiche libere dal contesto, ecc.) sono ormai ben noti edampiamente applicati.

Per attribuire un significato a una frase di un linguaggio di programmazione bisognaspecificare il comportamento, in esecuzione, del programma che la frase rappresenta. Losviluppo di metodologie per specificare precisamente (ossia, formalmente) il comportamentodi programmi in esecuzione è risultato storicamente complesso. È per questo che inizialmentela semantica di un linguaggio di programmazione veniva data attraverso descrizioni informali,in linguaggio naturale, dei vari costrutti. Tuttavia un tale approccio aveva gravi difetti. Inprimo luogo il linguaggio naturale è ambiguo, per cui capitava che implementazioni diversedello stesso linguaggio mostrassero comportamenti diversi. In secondo luogo le descrizioniinformali non potevano essere trattate formalmente con strumenti matematici per dimostrare

Page 9: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 9/332

1.2 Approcci alla semantica dei linguaggi di programmazione sequenziali 9

proprietà del linguaggio in questione o per dimostrare proprietà di programmi scritti con talelinguaggio.

È per questo motivo che sono stati sviluppati strumenti teorici atti a dare definizionimatematiche degli aspetti dinamici dei linguaggi di programmazione.

Descriviamo ora i tre approcci principali che si possono adottare per attribuire una se-mantica esatta ad un linguaggio di programmazione. Tali approcci vanno sotto il nome di

“semantica denotazionale”, “semantica operazionale” e “semantica assiomatica (o algebrica)”.

Semantica denotazionale

Le idee alla base dell’approccio denotazionale alla semantica dei linguaggi di programmazionesono due: definire delle funzioni che associano ad ogni frase del linguaggio un appropriatooggetto matematico, che costituisce la semantica del frammento di programma rappresentato

dalla frase, e realizzare tale associazione in modo composizionale , ossia in modo che l’ogget-to associato ad un costrutto del linguaggio sia costruito a partire dagli oggetti associati allecomponenti del costrutto stesso. Le funzioni suddette sono dette funzioni di interpretazione semantica , i loro codomini sono detti domini semantici , e gli elementi di questi ultimi so-no detti denotazioni . Le denotazioni sono oggetti matematici (insiemi, funzioni, ecc.) chepermettono di “ragionare” formalmente sui programmi. Ad esempio, le denotazioni possonoessere utilizzate per dimostrare la correttezza di un programma rispetto a determinate spe-cifiche, per dimostrare la correttezza di determinate trasformazioni da un programma ad unaltro, e per dimostrare l’equivalenza semantica di programmi diversi.

Generalmente una semantica denotazionale cerca di catturare il significato intrinseco deitermini del linguaggio piuttosto che definire una strategia di valutazione dei termini stessi.

Il significato di un termine è, secondo questo approccio, l’oggetto matematico ad esso asso-ciato (ossia l’oggetto matematico che esso implicitamente denota); per cui due termini sonoequivalenti se ad essi è associato lo stesso oggetto matematico.

Questo approccio è adatto a trasformare le questioni riguardanti i programmi in problemimatematici. Come vedremo, nell’ambito dei linguaggi per la descrizione di sistemi concorrentiquesto approccio risulta poco utilizzabile perché esso tende a interpretare un programma comeuna funzione che produce un valore e quindi, difficilmente, cattura il concetto di interazionetra programmi.

Semantica operazionaleL’approccio operazionale mette l’accento su come i vari costrutti di un linguaggio possonoessere eseguiti da un’ipotetica macchina astratta. Il significato dei costrutti viene spiegato intermini di passi elementari della macchina. Tipicamente, come modello per le macchine astrat-te, vengono usati gli automi a stati finiti o i sistemi di transizioni etichettate. Un passo di unatale macchina consiste nel passaggio da uno stato all’altro del sistema tramite una transizione.Una semantica operazionale può quindi essere vista come una formalizzazione matematica diuna strategia di implementazione del linguaggio. In tal senso la semantica operazionale nondefinisce completamente il significato dei termini ma ne descrive solo l’esecuzione per mezzodi computazioni.

Per definire completamente il significato dei termini è possibile, come vedremo ampia-mente nei prossimi capitoli, eff ettuare un processo di astrazione e definire una “semanticaosservazionale” che identifichi due termini se nessun “osservatore esterno”, interagendo con le

Page 10: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 10/332

10 Capitolo 1 – Introduzione

macchine associate a tali termini, può distinguere il comportamento operazionale delle duemacchine.

Semantica assiomatica (o algebrica)

L’approccio della semantica assiomatica (o algebrica) consiste nel definire un insieme di regole(ossia un sistema di inferenza) che permette di dedurre quando due termini sono equivalenti.Due termini avranno quindi lo stesso significato e saranno considerati interscambiabili seusando il sistema di inferenza è possibile dimostrare la loro equivalenza.

L’ambito in cui la semantica assiomatica assume un ruolo più rilevante è quello dellaverifica di proprietà di programmi, infatti per mezzo della semantica assiomatica le questioniriguardanti i programmi possono essere ricondotte a problemi di una qualche logica.

Osserviamo come, indipendentemente dall’approccio, dietro ad ogni possibile definizionedi una semantica, ci sia un concetto di equivalenza :

• la semantica denotazionale identifica i programmi che denotano uno stesso oggettomatematico,

• la semantica operazionale identifica i programmi le cui macchine astratte associate dannoluogo alle stesse computazioni,

• la semantica osservazionale identifica i programmi che risultano indistinguibili ad ogniosservatore che interagisca con le corrispettive macchine astratte,

• la semantica assiomatica identifica i programmi che il sistema di inferenza può provareessere equivalenti.

In altre parole non sempre si riesce a dire fino in fondo qual è il significato dei programmima si riesce comunque a stabilire quando due programmi hanno lo stesso significato. Facendoun salto di astrazione si potrebbe dire che il significato di un programma è la classe di tuttii programmi ad esso equivalenti secondo una certa relazione di equivalenza1. La relazione diequivalenza risulterà tanto più plausibile quanto più essa sarà in qualche modo in accordo coni costrutti del linguaggio e con il significato intuitivo ad essi associato.

La seconda parte di queste note è dedicata alla semantica operazionale e denotazionale di

linguaggi sequenziali. A tale scopo, prima introdurremo la λ

-notazione, nel Capitolo 5, e iconcetti di base della teoria dei domini, nel Capitolo 6. Quindi, nel Capitolo 8 presenteremola semantica denotazionale di TINY, un semplice linguaggio imperativo, e poi una semanticaoperazionale equivalente. Infine, nel Capitolo 9 definiremo una semantica denotazionale perSMALL, una estensione di TINY che prevede la dichiarazione esplicita di variabili e costantiusate all’interno di un programma, la strutturazione in blocchi dei programmi stessi, e ladichiarazione e l’uso di funzioni e procedure.

1È un po’ come se uno dicesse che il colore rosso è in realtà l’insieme di tutti gli oggetti rossi. Questopuò risultare strano ma se facciamo lo sforzo di pensare a quando abbiamo imparato le parole da bambini ciaccorgiamo che il processo è simile: dopo che ci sono stati indicati molti oggetti dicendoci che erano rossi, lanostra mente ha eff ettuato involontariamente un’operazione di quoziente, ossia si è chiesta “qual è l’unica cosain comune tra questi oggetti?”. Il nome di questa cosa comune è la parola “rosso”.

Page 11: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 11/332

1.3 Sistemi concorrenti 11

1.3 Sistemi concorrenti

La nozione di “sistema concorrente” non è esclusiva del mondo dei computer; una colonia diformiche ed un aggregato di particelle elementari sono esempi di sistemi concorrenti nel campodella biologia e della fisica. Da un punto di vista informatico, un sistema concorrente puòastrattamente essere visto come un insieme di componenti autonome, hardware o software,che possono interagire e comunicare.

L’utilizzo di sistemi concorrenti si è molto ampliato negli ultimi decenni. Ciò grazie alfatto che la programmazione concorrente off re diversi vantaggi potenziali, quali, ad esempio,performance (per via di un migliore sfruttamento del parallelismo off erto dall’hardware ), di-stribuzione (poiché alcuni problemi richiedono soluzioni distribuite, si pensi ad esempio alleapplicazioni client-server ), facilità di programmazione (poiché alcuni problemi hanno una so-luzione naturale di tipo concorrente), risposte più rapide, maggiore throughput , ed in generale

migliore strutturazione dei sistemi che interagiscono con l’ambiente, controllano varie attivitàe gestiscono eventi multipli (per il fatto di essere organizzati in più thread di controllo).

La concorrenza, tradizionalmente ingrediente essenziale di componenti software quali siste-mi operativi, basi di dati e sistemi di comunicazione, ha assunto un ruolo sempre più rilevanteanche nell’area delle applicazioni. Per trarre vantaggio, anche a livello di programmazione,del maggiore parallelismo disponibile, molti linguaggi di programmazione di più recente con-cezione (per esempio, OCCAM, CML, Facile, Obliq, Telescript, Pict, Java, Aglets, Odissey)sono stati dotati di primitive per la descrizione ed il controllo dell’interazione tra le variecomponenti.

Data la loro naturale capacità di modellizzare la realtà, i sistemi concorrenti sono usati,per esempio, per gestire processi industriali, per il controllo del traffico aereo o per il controllo

di robot.Naturalmente, così come la programmazione sequenziale, anche la programmazione con-

corrente è soggetta ad errori. Due esempi tra tutti sono il Therac-25, una macchina perradioterapia controllata da un calcolatore che negli anni tra il 1985 ed il 1987 ha subito per-lomeno sei incidenti che hanno causato gravi danni e persino la morte di alcuni pazienti (lacommissione di indagine ha concluso che il progetto del software era tale che fosse realisti-camente impossibile testarlo in maniera chiara ed automatica), ed il rover Mars Pathfinder(1997), in cui un problema ben noto in programmazione concorrente col nome di ‘inversionedella priorità’ tra task concorrenti ha causato un continuo riavvio del computer di bordo,riducendo così la disponibilità per l’esplorazione e la capacità della batteria, cosa che ha poiimpedito definitivamente la comunicazione dei dati raccolti alla base terrestre. Inoltre, atutti noi sarà capitato di dover riavviare il calcolatore a causa del verificarsi di una qualchesituazione anomala che impediva di poter continuare ad usarlo!

Quindi, eventuali errori nelle applicazioni del tipo summenzionato possono avere impor-tanti ripercussioni per la vita dell’uomo. Ne deriva che lo studio formale e la comprensio-ne del comportamento dei sistemi concorrenti ha assunto un’estrema importanza, così comeagli albori dell’informatica si rese necessario comprendere il comportamento dei programmisequenziali. Come spesso accade l’esigenza di una teoria nasce dalla pratica.

Lo studio di tecniche per la descrizione e l’analisi dei sistemi concorrenti è emerso comeun’area della ricerca in informatica in risposta alle difficoltà incontrate dai progettisti disistemi concorrenti. Uno dei principali fattori alla base di tali difficoltà è la presenza di piùcomponenti, o thread di controllo, all’interno di uno stesso sistema che possono interagire in

Page 12: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 12/332

12 Capitolo 1 – Introduzione

maniera subdola ed imprevista. Mentre un programma sequenziale è caratterizzato da unsingolo thread di controllo, un programma concorrente è caratterizzato da più thread che gli

permettono di eseguire varie attività di calcolo in parallelo e di controllare simultaneamentediverse attività esterne. La complessità si origina dai modi in cui le diverse parti possonointeragire. Il progetto di tali sistemi richiede quindi delle tecniche che permettano di teneresotto controllo tali interazioni. La concorrenza, per la sua stessa natura, introduce fenomeniche non sono presenti in programmazione sequenziale, quali il deadlock , dove un certo numerodi componenti sono ciascuna in attesa di una qualche interazione da qualche altra componenteprima di poter esse stesse continuare, ed il livelock , dove alcune componenti avviano unasequenza infinita di interazioni tra loro escludendo di fatto altre componenti e l’ambienteesterno. Tali fenomeni non si originano dalle singole componenti ma dal modo in cui essesono combinate insieme.

Anche il nondeterminismo si origina in maniera naturale dalla composizione parallela dipiù componenti, per esempio quando si hanno delle race condition . Una race condition è uncomportamento anomalo causato da una dipendenza imprevista dal susseguirsi di eventi neltempo. Essa si verifica quando due o più thread sono in grado di accedere dati condivisie tentano di modificarli simultaneamente, cioè i thread gareggiano per accedere/modificarei dati. Poiché l’algoritmo di scheduling della CPU può causare uno switch tra i thread inqualsiasi momento della loro esecuzione, non è possibile conoscere a priori l’ordine con cui ithread accederanno eff ettivamente i dati condivisi. Perciò, il risultato della modifica dei datiè dipendente dall’algoritmo di scheduling .

Illustriamo questo problema con un semplice esempio in cui due componenti, P e Q,condividono una variabile intera x inizializzata con un certo valore v0, ed eseguono ciascuno

il seguente frammento di codice:x := 1;x := x + 1;

Se P e Q vengono eseguiti sequenzialmente, fatto che denotiamo con P ; Q, allora possiamoaff ermare con certezza che il valore di x dopo l’esecuzione di P ; Q sarà 2. Più in dettaglioabbiamo:

x = v0x := 1; (P )

x = 1

x := x + 1; (P )x = 2

x := 1; (Q)x = 1

x := x + 1; (Q)x = 2

dove indichiamo tra · le asserzioni sul valore assunto da x e tra (·) la componente che esegueuna data istruzione.

Supponiamo invece di eseguire P e Q simultaneamente, fatto che denotiamo come P |Q;in questo caso c’è anche la possibilità che il valore finale di x sia 3, e non 2, infatti si potrebbe

Page 13: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 13/332

1.3 Sistemi concorrenti 13

avere, per esempio, la computazione seguente:

x = v0x := 1; (P )

x = 1x := 1; (Q)

x = 1x := x + 1; (P )

x = 2x := x + 1; (Q)

x = 3

Riassumendo, abbiamo che:

x = v0 x = v0P ; Q e P |Qx = 2 x = 2 ∨ x = 3

Possiamo quindi concludere che il comportamento di P ; Q è deterministico, mentre quellodi P |Q è non deterministico e quindi non predicibile staticamente. In eff etti, non è difficileconvincersi che la più stringente asserzione che è possibile fare sul valore di x alla fine dell’e-secuzione di P |Q è proprio x = 2 ∨ x = 3 infatti, ogni possibile interleaving delle istruzioni diP e di Q porta a uno di questi due valori.

Il comportamento complessivo di un sistema concorrente è quindi il risultato delle intera-zioni, non sempre prevedibili, delle sue componenti individuali. L’ordine con cui le azioni dellesingole componenti sono eseguite dipende da vari fattori, come le interazioni con l’ambienteesterno o lo scheduling dei processi nella CPU. Tutto ciò fa si che un sistema concorrenteabbia un certo numero (spesso elevato) di computazioni possibili e che il suo comportamentosia non deterministico. Risulta perciò difficile capire staticamente quale sarà l’evoluzione diun tale sistema.

Un’altra delle complicazioni insite nella programmazione concorrente è il fatto che moltisistemi concorrenti, quali ad esempio i sistemi operativi, i data base, i sistemi di controllodi impianti, sono sistemi che non lavorano isolatamente ma che, durante lo svolgimento deipropri compiti, interagiscono con altri sistemi e reagiscono alle loro richieste. Per questomotivo, tali sistemi sono stati anche chiamati sistemi reattivi [HP85]. Per i sistemi reattivi,l’aspetto importante è la capacità di interagire e di rispondere agli stimoli dell’ambiente esternomentre, diff erentemente dai classici programmi sequenziali, non risulta essere in alcun modoimportante il risultato finale da essi prodotto al punto che, in molti casi, essi sono progettatiper eff ettuare una serie infinita di interazioni con l’ambiente senza raggiungere uno statoterminale.

Il nondeterminismo (necessario nella descrizione di molti sistemi concorrenti per evitareassunzioni restrittive sull’ambiente di esecuzione) e la necessità di modellare la natura reat-tiva di molti sistemi, hanno impedito che gli approcci formali sviluppati per la descrizionee l’analisi di sistemi sequenziali potessero essere utilizzati anche per i sistemi concorrenti.Approcci basati sulla descrizione delle funzioni che modellano le corrispondenze tra inputed output, sulla semantica denotazionale con continuazioni o sulla semantica assiomatica conpre e post-condizioni non risultano adeguati per garantire la “composizionalità”, per modellare

Page 14: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 14/332

14 Capitolo 1 – Introduzione

l’interattività e per tener conto del fatto che non sempre i sistemi concorrenti sono progettatiper raggiungere uno stato terminale o perché il risultato eventualmente prodotto sia unico.

Sistemi concorrenti, anche piccoli, possono essere difficili da analizzare. Perciò abbiamobisogno di rispondere ad alcune domande:

1. Come possiamo sviluppare/progettare un sistema che funzioni correttamente?

2. Come possiamo analizzare/verificare tale sistema?

Nel campo dell’informatica teorica, si è quindi presentata la necessità di estendere la teoria,valida per i processi sequenziali algoritmici, a sistemi dove la concorrenza e l’interazionegiocano un ruolo essenziale ed a volte predominante. È necessaria a tale scopo una teoria della concorrenza che comprenda:

1. modelli matematici per la descrizione e l’analisi formale di sistemi concorrenti;

2. linguaggi formali per la specifica del possibile comportamento dei sistemi;

3. strumenti di verifica (semi-)automatici e relative tecniche di implementazione.

L’ambizione degli studiosi è quella di fare per i sistemi concorrenti quello che agli alboridella scienza dei calcolatori è stato fatto per spiegare il comportamento dei programmi se-quenziali ed algoritmici. Allora furono sviluppati modelli computazionali basati sulle attivitàelementari di leggere e scrivere in memoria (macchine di Turing ) e sulla possibilità di defi-nire ed invocare funzioni (λ-calcolo). Nel caso dei sistemi e dei programmi concorrenti, loscopo è quindi quello di sviluppare un modello con un piccolo numero di concetti di base, in

termini dei quali sia possibile spiegare il comportamento interattivo e concorrente di diversecomponenti.

Uno dei primi modelli, sviluppato negli anni ’60, sono le reti di Petri , che generalizzano lateoria degli automi e permettono la descrizione dell’occorrenza contemporanea di più azioni(transizioni tra stati). Nel modello delle reti di Petri, particolare attenzione è riservata allenozioni di conflitto, indipendenza e dipendenza causale tra azioni.

È però negli ultimi tre decenni che la teoria della concorrenza ha avuto il massimo sviluppo,soprattutto grazie all’approccio basato sui calcoli di processo (o algebre di processo). Uncalcolo di processi è costituito da una notazione per descrivere sistemi concorrenti e da uninsieme di strumenti matematici (algebrici o logici) che aiutano a studiare le proprietà deisistemi descritti con tale notazione. Un sistema concorrente è rappresentato in termini di

processi e la sua evoluzione consiste quindi nella trasformazione di un processo in un altrotramite l’esecuzione di un’azione. Tale visione, dovuta a Tony Hoare e Robin Milner (1980),può essere riassunta nel motto “qualsiasi cosa è (o può esser vista come) un processo”. Tuttele componenti di un sistema, sia attive che passive, quali ad esempio canali di comunicazione,bu ff er di memoria, memoria condivisa, spazi di tuple, mittenti, destinatari, client , server ,sono processi.

1.4 Calcoli di processo

Tra i vari modelli e metodi proposti per descrivere ed analizzare sistemi concorrenti, uno diquelli che ha riscosso più successo è l’approccio basato sui calcoli di processo.

Page 15: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 15/332

1.4 Calcoli di processo 15

Le idee alla base dei calcoli di processo sono due. Da un lato il principio secondo il qualela comunicazione tra due processi debba essere di tipo “handshake” (stretta di mano), ossia

debba avvenire grazie ad azioni simultanee eseguite dai processi che comunicano attraversoun canale (interfaccia). Dall’altro l’idea che il linguaggio associato ad un calcolo di processidebba basarsi su un numero ristretto di operatori corrispondenti ciascuno ad una qualche ideaintuitiva di composizione tra processi (quale, ad esempio, composizione sequenziale, compo-sizione nondeterministica, composizione parallela) e sufficienti nel loro insieme a raggiungereun potere espressivo completamente generale.

Alcuni autori parlano di algebre di processo piuttosto che di calcoli, per alludere aglistrumenti dell’algebra che sono utilizzati da questi formalismi; noi preferiamo però chiamarlicalcoli perché molti di tali formalismi, oltre all’algebra, utilizzano strumenti di altre branchedella matematica (come, ad esempio, della logica). Un altro nome utilizzato in letteraturaè linguaggi di descrizione di processi , ma anche questo è riduttivo per le motivazioni che

abbiamo appena illustrato.Il lavoro di Robin Milner sul “Calculus of Communicating Processes” (CCS, [Mil80, Mil89]

è generalmente riconosciuto come l’iniziatore e il punto di riferimento di questa area. Ispiratodal λ-calcolo, ma anche dal linguaggio CSP (un semplice linguaggio di programmazione con-corrente basato sullo scambio esplicito di messaggi, [Hoa78]), CCS è basato su un linguaggioper la descrizione di processi con pochi costrutti primitivi ciascuno dei quali riflette sempliciidee operazionali: interazione sincrona tra processi concorrenti tramite canali di comunica-zione, composizione sequenziale, parallela e non-deterministica, astrazione e ridenominazionedi canali, processi ricorsivi. I costrutti scelti sono quindi notevolmente diversi da quelli delλ-calcolo. Ciò è dovuto ai diff erenti obiettivi dei due calcoli: mentre il λ-calcolo studia lefunzioni ed il loro comportamento applicativo, quindi descrive essenzialmente computazioni

sequenziali, il CCS è rivolto alle computazioni concorrenti, per cui interazione e parallelismosono le idee fondamentali.

Parallelamente al CCS, sono stati sviluppati altri calcoli di processo che condividono lemotivazioni del CCS; tra questi CSP [BHR84], ACP [BK84a, BK84b], Meije [AB84] e (ISO-Standard) LOTOS [BB87].

Un calcolo di processi è generalmente costituito da una sintassi per la descrizione formaledei sistemi concorrenti, una semantica e un insieme di strumenti (tipicamente costituiti daequivalenze e logiche) utili per studiare e dimostrare proprietà dei sistemi descritti con lanotazione off erta dal calcolo.

A livello linguistico, vengono messi a disposizione un certo numero di costrutti che miranoa cogliere il concetto di “interazione” tra processi concorrenti, il concetto di “composizione”modulare dei processi per mezzo di operatori di composizione sequenziale, parallela o nonde-terministica ed il concetto di “astrazione” per descrivere i sistemi a livelli di dettaglio diff erenti.Una novità rispetto ai modelli di calcolo sequenziali è l’introduzione di operatori di astrazione che permettono di fornire descrizioni di sistemi a diversi livelli di dettaglio e di concentrarsisugli aspetti più rilevanti ai fini della validazione di specifiche proprietà dei sistemi. Unadescrizione astratta potrà essere vista come una specifica , mentre una descrizione più det-tagliata, che dà informazioni sulla struttura logico/fisica del sistema, sarà vista come unaimplementazione .

Per definire un modello adeguato per la programmazione concorrente, una questione im-portante a cui bisogna rispondere è quella di chiarire quando due sistemi hanno “comporta-menti equivalenti”, nel senso che possiamo sostituire l’uno all’altro all’interno di un ambiente

Page 16: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 16/332

16 Capitolo 1 – Introduzione

di esecuzione e non notare alcuna diff erenza. Questa è una questione teorica che risulta divitale importanza nella pratica. Finché non viene stabilito con precisione il significato di

similarità o diff erenza di comportamento di sistemi, non siamo in grado di dire cosa fa esatta-mente un certo sistema. Inoltre, la nozione di equivalenza di comportamenti può essere usatacome mezzo per specificare come si dovrebbe comportare un sistema implementato: il sistemaimplementato si potrà dire “corretto” se il suo comportamento eff ettivo sarà equivalente allaspecifica del comportamento.

Cerchiamo di chiarire con un esempio l’utilità pratica della nozione di equivalenza dicomportamenti. In questo esempio introduciamo informalmente il CCS, che tratteremo inmaniera completa e dettagliata nel Capitolo 12.

Supponiamo che due processi A1 ed A2 debbano eseguire una porzione del loro programmain mutua esclusione perché si tratta di sezioni critiche. Per far questo, si servono di unsemaforo S , realizzato tramite un altro processo. Per semplicità, rappresentiamo una sezione

critica semplicemente con la sequenza di azioni b.e di inizio e termine della sezione critica. InCCS, possiamo scrivere A1, A2 e S nel modo seguente:

A1 , p.b1.e1.v.A1

A2 , p.b2.e2.v.A2

S , p.v.S

In generale, se a è un canale (o porta) di comunicazione, l’azione di input sul canale è rap-presentata da a e quella di output corrispondente da a. Il processo A1, per esempio, esegue:un output su p, l’azione b1, l’azione e1, un output su v e poi ritorna allo stato iniziale. L’ideaè che le primitive standard sui semafori sono qui realizzate tramite sincronizzazioni sui canali

p e v (in questo semplice esempio utilizziamo sincronizzazione pura sui canali, cioè sincroniz-zazione senza scambio di dati). Il sistema complessivo risulta dalla composizione parallela ditutti e tre i processi:

Sys , (A1 | S | A2) \ p, v

In realtà, si vuole anche indicare che i canali p e v sono destinati ad uso interno del sistema,per questo si usa l’operatore di restrizione (\), che li rende invisibili all’esterno.

A questo punto si pone il problema di verificare se il sistema ottenuto Sys si comportacorrettamente, cioè se il semaforo è utilizzato correttamente. In pratica, ciò vuol dire che lesezioni critiche dei processi A1 e A2 non sono mai sovrapposte (per esempio, non accade maiche il sistema eff ettui la sequenza di azioni b1.b2.e1.e2). In altre parole, le uniche sequenze diazioni permesse devono essere quelle del tipo (b1.e1 + b2.e2)∗. Possiamo specificare questo

comportamento corretto come il processoS pec , b1.e1.S pec ⊕ b2.e2.S pec

in grado di eff ettuare la sequenza b1.e1 o la sequenza b2.e2 per poi in ogni caso tornare allostato iniziale (⊕ denota la composizione non-deterministica interna). Ci serve quindi unateoria matematica che ci permetta di dimostrare che il sistema Sys e la specifica S pec sonoequivalenti:

S pec ≈ Sys

ossia che, a meno di sincronizzazioni interne (sui canali p e v), i due sistemi esibiscono lo stessocomportamento esterno. Questo è proprio il ruolo degli strumenti matematici che trattano ilconcetto di equivalenza tra processi.

Page 17: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 17/332

1.4 Calcoli di processo 17

Concludiamo questa breve introduzione ai calcoli di processo descrivendo il loro poterecomputazionale ed espressivo. I calcoli di processo, come è naturale aspettarsi, risultano

avere perlomeno lo stesso potere computazionale delle macchine di Turing. Essi sono anche “naturalmente completi”, nel senso che possono essere estesi con altri costrutti (facilmen-te esprimibili in termini dei costrutti di base) per dare origine a veri e propri linguaggi diprogrammazione concorrente. Per esempio, OCCAM (il linguaggio di programmazione deitransputer) è derivato dal CSP mentre il linguaggio di programmazione Pict è derivato dalπ-calculus.

Se nel caso dei linguaggi funzionali il λ-calcolo [Chu41] gioca il ruolo di modello di rife-rimento, nel caso dei linguaggi di programmazione di sistemi concorrenti , non è al momentoemerso alcun modello canonico. Il fatto è che i sistemi concorrenti possono essere descrit-ti in termini di diff erenti costrutti: per creare processi (fork/wait, cobegin/coend, . . . ), perl’interazione tra processi (message-passing, memoria condivisa, . . . ) e per gestire l’uso di

risorse condivise (semafori, monitor, transazioni, . . . ). Una ulteriore complicazione è chementre nel caso della programmazione funzionale, per stabilire se due funzioni sono equi-valenti, è sufficiente osservare il comportamento input-output delle funzioni, nel caso dellaprogrammazione concorrente il problema di cosa debba essere osservato di un sistema cambiaa seconda delle circostanze e ciò porta a diff erenti nozioni di equivalenza tra sistemi, tutteugualmente ragionevoli. Possibili proprietà osservabili sono le sequenze di azioni che un siste-ma può eff ettuare, le circostanze che conducono al deadlock, la robustezza nei confronti deifallimenti, ecc.

Questa problematica ha dato origine a vari calcoli di processo, ciascuno con un proprioinsieme di primitive ed una propria teoria matematica della concorrenza. Essi dovrebberosvolgere per i linguaggi concorrenti un ruolo simile a quello svolto dal λ-calcolo per i linguaggifunzionali. Lo scopo della terza parte delle note è quello di presentare i più noti calcoli diprocesso in un framework semantico unico. In tale framework , la semantica di ogni operatoreè definita in uno stile noto come Structural Operational Semantics (SOS) che utilizza insiemidi regole di inferenza per descrivere le evoluzioni dei termini. Tali regole associano ad ognitermine un grafo delle transizioni cosicché i comportamenti del termine sono dati da un insiemedi stati e transizioni tra stati. I due tipi di grafi più comunemente utilizzati sono le strutture di Kripke (KS) ed i sistemi di transizioni etichettati (LTS). Entrambi saranno introdotti nellaSezione 3.5. Nel primo caso si etichettano gli stati del grafo per descrivere l’eff etto delletransizioni su di essi o sulle loro variabili; nel secondo caso, si etichettano le transizioni conle azioni che causano il passaggio da uno stato all’altro. Noi useremo il secondo approccio.

La terza parte di queste note è dedicata alla teoria della concorrenza che segue l’approcciobasato sui calcoli di processo. A tale scopo, nel Capitolo 10 descriveremo alcuni degli ope-ratori utilizzati dai calcoli di processo più conosciuti. Nel Capitolo 11 introdurremo diverserelazioni per confrontare sistemi di transizioni etichettate, alcune saranno delle equivalenze,altre dei preordini. Nel Capitolo 12 presenteremo CCS (Calculus of Communicating Systems,Milner 1980), probabilmente il più noto calcolo di processi, ed alcune teorie della concorrenzasviluppate specificamente per esso. Nel Capitolo 13 introdurremo alcune logiche modali e tem-porali e mostreremo come utilizzarle per specificare proprietà dei sistemi concorrenti. Infine,in Appendice A presenteremo un elenco degli operatori per la concorrenza, in Sezione A.1,ed una lista dei calcoli di processo più noti con l’insieme degli operatori usato da ciascuno diessi, in Sezione A.2.

Page 18: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 18/332

18 Capitolo 1 – Introduzione

1.5 Schema delle note

Queste note sono divise in tre parti. La prima parte introduce alcune nozioni preliminaririguardanti matematica discreta e tecniche di prova, grammatiche e sintassi, automi a statifiniti e sistemi di transizioni etichettate. La seconda parte verte su semantica operazionale edenotazionale di linguaggi sequenziali; a tale scopo introduce anche la λ-notazione e i concettidi base della teoria dei domini. La terza ed ultima parte presenta alcuni formalismi perprogettare, specificare, implementare, analizzare e dimostrare proprietà di sistemi concorrentie distribuiti. Tali formalismi includono operatori per formare processi e calcoli di processo,equivalenze comportamentali e logiche modali e temporali.

Il resto di queste note è organizzato come segue.

Capitolo 2: Nozioni preliminari. Si introducono alcune nozioni matematiche preliminari:

insiemi, relazioni, funzioni, induzione e sistemi di inferenza. Particolare attenzione èdedicata alle proprietà delle relazioni, a vari principi di induzione, ai sistemi di inferenzaed al concetto di congruenza. Tali argomenti giocheranno infatti un ruolo fondamentalenel seguito.

Capitolo 3: Sintassi e modelli semantici. Si introducono alcune nozioni della teoria deilinguaggi (grammatiche ed automi) e si definiscono i sistemi di transizioni etichettate.Si mostra un esempio che illustra sintassi e semantica operazionale delle espressioniaritmetiche.

Capitolo 4: Sintassi e denotazioni. Si introducono alcune nozioni e definizioni prelimi-nari di semantica denotazionale e li si illustra tramite due esempi di descrizione della

semantica di semplici formalismi. Si mostrano anche i tre approcci alla semantica nelcaso del linguaggio delle espressioni regolari.

Capitolo 5: λ-calculus. Si presenta il λ-calculus, un sistema formale che ha un ruolo im-portante nello studio dei fondamenti dei linguaggi di programmazione. Il λ-calculusfornisce infatti sia una notazione semplice per la rappresentazione di funzioni nonché dialtri importanti concetti di programmazione, sia un sistema di calcolo basato su un in-sieme di regole di riduzione che consente di studiare le proprietà semantiche di funzionie programmi.

Capitolo 6: Domini per la semantica denotazionale. Si presentano le basi matemati-

che per la semantica denotazionale dei linguaggi di programmazione. Vengono primaintrodotti i concetti di insieme parzialmente ordinato completo, funzione continua, mi-nimo punto fisso e soluzione di un sistema di equazioni mutuamente ricorsive. Quindi sipresentano i concetti di base della teoria dei domini ed alcuni operatori che permettonodi costruire domini a partire da domini più semplici. Infine, viene definito un metalin-guaggio per esprimere le funzioni utilizzate per descrivere la semantica denotazionale diuna vasta classe di linguaggi di programmazione e viene dimostrato che tutti i costruttidel metalinguaggio preservano la continuità.

Capitolo 8: Un semplice linguaggio imperativo. Si presentano alcuni concetti comunia vari linguaggi di programmazione e le tecniche utilizzate per la loro descrizione formale.Si considera TINY, un semplice linguaggio di programmazione imperativo, di cui viene

Page 19: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 19/332

1.5 Schema delle note 19

presentata una semantica operazionale ed una semantica denotazionale. Viene infinedimostrata l’equivalenza delle due semantiche.

Capitolo 9: Linguaggi con contesti. Si introduce un altro linguaggio di programmazione,SMALL, che è una semplice estensione del linguaggio TINY considerato nel capitoloprecedente. Rispetto a TINY, il linguaggio SMALL prevede la dichiarazione esplicitadi variabili e costanti usate all’interno di un programma e la strutturazione in blocchidei programmi stessi; inoltre SMALL permette la dichiarazione e l’uso di funzioni eprocedure. Pertanto, SMALL si avvicina notevolmente al linguaggio Pascal.

Capitolo 10: Operatori per concorrenza e nondeterminismo. Si presenta un’ampiapanoramica degli operatori ricorrenti nei linguaggi concorrenti. Di ogni operatore èmostrata l’utilità ed è definita la semantica operazionale.

Capitolo 11: Equivalenze comportamentali e preordini di raffinamento. Si in-troducono alcuni criteri per confrontare sistemi di transizioni etichettate. Alcunidi questi criteri costituiscono delle relazioni di equivalenza sull’insieme dei sistemidi transizioni, altri invece costituiscono dei preordini. Tutti comunque sono basatisull’idea che due sistemi vanno considerati equivalenti se nessun osservatore esterno lipuò distinguere, cioè se i due sistemi hanno lo stesso insieme di osservazioni. Ci sonoperò diverse ragionevoli nozioni di osservazione e ciò dà origine a relazioni diff erenti. Inparticolare si studiano l’equivalenza a tracce, la bisimulazione, e l’equivalenza testing.Di ciascuna di esse viene considerata una versione “forte” che considera le azioniinvisibili alla stessa stregua delle altre azioni ed una versione “debole” che tratta leazioni invisibili in maniera speciale.

Capitolo 12: Calculus of Communicating Systems (CCS). Vine presentato il Calcu-lus of Communicating Systems (CCS), uno dei calcoli di processo più conosciuti edutilizzati, ed alcune teorie della concorrenza sviluppate specificamente per esso. Vengo-no presentate sintassi e semantica operazionale di CCS, ed una variante con passaggiodi valori. Quindi vengono presentate specificamente per CCS alcune delle equivalenze edei preordini comportamentali visti nel capitolo precedente, con particolare attenzioni aquelle relazioni che sono preservate dagli operatori del calcolo. Infine, viene introdottoun altro approccio alla definizione della semantica dei sistemi concorrenti, quello al-gebrico (o assiomatico), tramite caratterizzazioni (dis)equazionali alternative di alcunedelle relazioni osservazionali introdotte.

Capitolo 13: Logiche per i sistemi concorrenti. Si introducono alcune logiche modali etemporali e si mostra come utilizzarle per specificare proprietà dei sistemi concorrenti.Vengono descritte in dettaglio la logica HML, la logica ACTL e il µ-calculus modale.Viene anche esaminata la corrispondenza tra le equivalenze indotte dalle logiche e leequivalenze comportamentali presentate nel Capitolo 11.

Per ulteriori approfondimenti si consiglia di consultare i seguenti testi: [Bar90, Gor79,Sch86, Win99, Win09, Mil89, Hen88, Fok00, Hoa85, Sch99, HM85, AILS07, CGP99] ed iriferimenti in essi contenuti.

Page 20: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 20/332

20 Capitolo 1 – Introduzione

Page 21: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 21/332

Parte I

Preliminari Matematici

Page 22: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 22/332

Page 23: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 23/332

Capitolo 2

Nozioni preliminari

SOMMARIO

Questo capitolo introduce alcune nozioni preliminari di matematica. Particolare attenzione è dedicata alle proprietà delle relazioni, a vari principi di induzione, ai sistemi di inferenza ed al concetto di congruenza. Tali argomenti giocheranno infatti un ruolo fondamentale nel seguito.

2.1 Insiemi

Un insieme A è una qualunque collezione di oggetti, chiamati elementi di A.1 Un insieme nonpuò contenere più di una copia di un suo elemento e l’ordine degli elementi in un insieme nonha alcuna rilevanza. Due insiemi A e B sono uguali se ogni elemento di A è anche elemento

di B , e viceversa. La relazione di appartenenza di un elemento ad un insieme viene denotataattraverso il simbolo ∈. Se indichiamo con A l’insieme dei numeri pari, 4 ∈ A e 7 6∈ A.Scriveremo A ⊆ B e diremo che A è contenuto in B (anche, A è un sottoinsieme di B ) se

ogni elemento di A è anche elemento di B (B ⊇ A è sinonimo di A ⊆ B). Scriveremo inveceA ⊂ B quando A ⊆ B ed esiste un elemento di B che non appartiene ad A. Chiaramente A

è uguale a B , e scriveremo A = B , quando A ⊆ B e B ⊆ A.L’insieme vuoto è l’insieme che non contiene alcun elemento e viene indicato con il sim-

bolo ∅ (o, in taluni contesti, con la notazione ). Gli insiemi finiti (vedremo tra breve ladefinizione di insieme finito) possono essere descritti attraverso la sequenza dei loro elementiracchiusa fra parentesi graff e. Ad esempio, 0, 1, 2 rappresenta l’insieme finito i cui elementisono i numeri 0, 1 e 2.

Una proprietà è un predicato P che ad ogni elemento o insieme x associa un valore diverità. Scriveremo P (x) per significare che x soddisfa il predicato P e, in tal caso, diremoanche che “P (x) vale”.

Gli insiemi possono anche essere descritti utilizzando proprietà dei loro elementi: lanotazione

x | P (x)

rappresenta l’insieme costituito da tutti gli elementi x che soddisfano la proprietà P . Conquesta notazione è possibile descrivere anche insiemi infiniti come

x | x ∈ N e x ≥ 3.

1Le nozioni di “insieme” e di “appartenenza” a un insieme sono le uniche nozioni che le teorie matematicheassumono come primitive e di cui non danno una definizione.

Page 24: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 24/332

24 Capitolo 2 – Nozioni preliminari

La notazionex

∈X | P (x)

è sinonimo dix | x ∈ X e P (x).

Le operazioni definite solitamente su insiemi sono le seguenti.

1. L’unione di A e B è l’insieme

A ∪ B = x | x ∈ A oppure x ∈ B.

Più in generale se Ai è una famiglia di insiemi, al variare di i in un certo insieme diindici I ,l’unione degli Ai è l’insieme

[i∈I

Ai = x | ∃ i ∈ I tale che x ∈ Ai.

2. L’intersezione di A e B è l’insieme

A ∩ B = x | x ∈ A e x ∈ B.

Più in generale se Ai è una famiglia di insiemi, al variare di i in un certo insieme diindici I , l’intersezione degli Ai è l’insieme\

i∈I

Ai = x | x ∈ Ai per ogni i ∈ I .

3. La di ff erenza di A e B è l’insieme

A − B = x | x ∈ A e x 6∈ B.

4. Il prodotto cartesiano di A e B è l’insieme

A × B = (a, b) | a ∈ A e b ∈ B.

ossia l’insieme delle coppie ordinate (a, b) tali che a ∈ A e b ∈ B.2

Più in generale se A1, . . . An sono n insiemi, il prodotto cartesiano degli Ai è l’insieme

n

×i=1 Ai = (a1, . . . , an) | ai ∈ Ai per i = 1, . . . , n.3

Nel caso in cui A1, . . . An siano tutti uguali a un certo insieme A, il prodotto cartesianodegli Ai si indica con An.

2Volendo essere rigorosi bisognerebbe definire formalmente anche il concetto di coppia ordinata. Ci ac-contenteremo tuttavia di fare affidamento all’idea intuitiva che in generale si ha di tale concetto. Basti soloricordare che, contrariamente a quanto avviene per gli insiemi, una coppia ordinata (o, in generale, una n-upla)è una struttura in cui l’ordine degli elementi è rilevante così come la loro molteplicità. In tal senso (a, a) èuna coppia ordinata valida e (a, b) 6= (b, a) quando a 6= b. Due coppie (a, b) e (c, d) sono uguali se e solo sea = c e b = d. Per le coppie si usa in taluni contesti la notazione < a,b >.

3È possibile anche definire il prodotto cartesiano tra un numero infinito di insiemi ma la definizione risultapiuttosto sofisticata. Non ne avremo comunque bisogno.

Page 25: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 25/332

2.2 Relazioni e funzioni 25

5. L’insieme potenza o insieme delle parti di A è l’insieme

2A

= X | X ⊆ A.

ossia l’insieme i cui elementi sono tutti i sottoinsiemi di A. Per questo insieme si usanotalvolta anche le notazioni Pow(A) o P (A).

Esempio 2.1. Siano A = 1, 2 e B = 2, 3. Allora

A ∪ B = 1, 2, 3, A ∩ B = 2, A − B = 1,

A × B = (1, 2), (1, 3), (2, 2), (2, 3), 2A = ∅, 1, 2, A.

Due insiemi A e B si dicono avere la stessa cardinalità se esiste una funzione biunivoca fraA e B (si veda la prossima sezione per la definizione di funzione biunivoca). Questa definizionecoglie il concetto intuitivo di “insiemi con lo stesso numero di elementi”.

Diremo che un insieme A è finito se esiste n ∈ N tale che A può essere messo in corri-spondenza biunivoca con l’insieme i ∈ N | 1 ≤ i ≤ n; in tal caso n sarà detto cardinalitàdi A. La cardinalità di un insieme A si indica con |A| o con #A.

Diremo che A è infinito se non è finito. Si consideri l’insieme dei numeri naturali Ne l’insieme dei numeri pari P . Essi hanno la stessa cardinalità, infatti la funzione che alnumero n associa il numero 2n è una funzione biunivoca tra tali insiemi, tuttavia risultaanche P ⊂ N. Il fatto che un insieme possa essere messo in corrispondenza biunivoca con unsuo sottoinsieme proprio è caratterizzante degli insiemi infiniti e potrebbe essere preso come

definizione di insieme infinito.Un insieme si dice numerabile se può essere messo in corrispondenza biunivoca conl’insieme N dei numeri naturali.

Se A e B sono finiti con |A| = n e |B| = m allora abbiamo

|2A| = 2n |A × B| = n · m

2.2 Relazioni e funzioni

In questa sezione introduciamo la nozione di relazione e ne studiamo le proprietà.

Definizione 2.2 (Relazione). Una relazione binaria R tra due insiemi (non necessariamente distinti) A e B è un sottoinsieme del prodotto cartesiano A × B. Per indicare che (a, b) ∈ Rsi usa spesso la notazione R(a, b) o la notazione aRb.

Più in generale una relazione n-aria tra gli insiemi A1, . . . , An è un sottoinsieme del

prodotto cartesianon×

i=1Ai.

Tra tutte le relazioni possibili tra due insiemi A e B ve ne sono due speciali che sonola relazione vuota ∅ e la relazione totale A × B. Inoltre, ad ogni insieme A è associata larelazione (funzione) identità I dA dove I dA = (a, a) | a ∈ A.

Introduciamo ora alcune operazioni sulle relazioni.

Definizione 2.3 (Operazioni sulle relazioni).

Page 26: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 26/332

26 Capitolo 2 – Nozioni preliminari

• Data una relazione binaria R ⊆ A×B, la sua inversa , denotata con R−1, è la relazione

R−1

= (y, x) | (x, y) ∈ R ⊆ B × A.

• Date due relazioni binarie R1 ⊆ A × B e R2 ⊆ B × C , la loro composizione, denotata con R1 · R2 o anche con R1R2, è la relazione binaria

R1 · R2 = (x, z) | ∃ y ∈ B tale che (x, y) ∈ R1 e (y, z) ∈ R2 ⊆ A × C.

• Se R ⊆ A × A è una relazione binaria si pone

R0 = IdA,Rn+1 = R · Rn,R∗ = Sn≥0

Rn

R+ = Sn≥1 Rn.

Si osservi che R1 = R · R0 = R, R∗ = I dA ∪ R+ e

R+ = (x, y) | ∃n, ∃x1, . . . , xn con xiRxi+1 (1 ≤ i ≤ n − 1), x1 = x, xn = y .

• Data una relazione binaria R ⊆ A × B ed un sottoinsieme X di A si dice immagine di X tramite R, e la si denota con R(X ), l’insieme

R(X ) = b ∈ B | ∃x ∈ X tale che (x, b) ∈ R .

Si dice immagine di R l’insieme R(A).• Data una relazione binaria R ⊆ A×B ed un sottoinsieme Y di B si dice retroimmagine

di Y tramite R l’immagine di Y tramite R−1, ossia l’insieme

R−1(Y ) = a ∈ A | ∃y ∈ Y tale che (a, y) ∈ R .

• Siano R ed S due relazioni tra A e B. Si dice che S estende R o che R implica S se R ⊆ S .

Studiamo adesso alcune proprietà delle relazioni binarie.

Definizione 2.4 (Proprietà delle relazioni binarie). Sia R

⊆A

×A una relazione binaria su

un insieme A. Si dice che R è

• riflessiva: se ∀x ∈ A, (x, x) ∈ R,

• simmetrica: se ∀x, y ∈ A, (x, y) ∈ R implica (y, x) ∈ R,

• antisimmetrica: se ∀x, y ∈ A, (x, y) ∈ R e (y, x) ∈ R implica x = y;

• transitiva: se ∀x,y ,z ∈ A, (x, y) ∈ R e (y, z) ∈ R implicano (x, z) ∈ R.

Quando una relazione R non soddisfa una proprietà P può avere senso considerare unarelazione in qualche modo legata a R e che soddisfa P . Questo è lo scopo della prossimadefinizione.

Page 27: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 27/332

2.2 Relazioni e funzioni 27

Definizione 2.5. Sia R una relazione binaria su un insieme A.

• La chiusura riflessiva di R è la più piccola relazione riflessiva che contiene R, essa puòessere caratterizzata come la relazione

R ∪ IdA.

• La chiusura simmetrica di R è la più piccola relazione simmetrica che contiene R, essa può essere caratterizzata come la relazione

R ∪ R−1.

• La chiusura transitiva di R è la più piccola relazione transitiva che contiene R, essa puòessere caratterizzata come la relazione

R+.

• Il nucleo simmetrico di R è la più grande relazione simmetrica contenuta in R, esso puòessere caratterizzato come la relazione

R ∩ R−1.

Si osservi che se R è riflessiva o simmetrica anche la chiusura transitiva di R è riflessiva osimmetrica. Data una generica relazione R, spesso saremo interessati alla chiusura riflessiva e transitiva di R e tale chiusura coincide con la relazione R∗.

È facile dimostrare che il nucleo simmetrico di una relazione riflessiva è una relazioneriflessiva e che che il nucleo simmetrico di una relazione transitiva è una relazione transitiva.

Vi sono alcuni tipi di relazioni che giocano un ruolo speciale ed ai quali sono stati datidei nomi specifici (si veda anche la Tabella 2.1).

riflessiva simmetrica antisimmetrica transitivaEquivalenza * * *Ordine * * *Preordine * *

Tabella 2.1: Proprietà delle relazioni di equivalenza, di ordine e di preordine.

Definizione 2.6 (Relazione di preordine). Una relazione binaria R su un insieme A è un preordine se è riflessiva e transitiva.

Definizione 2.7 (Relazione di ordine). Una relazione binaria R su un insieme A è un ordinese è riflessiva, antisimmetrica e transitiva.

Definizione 2.8 (Relazione di equivalenza). Una relazione binaria R su un insieme A è una equivalenza se è riflessiva, simmetrica e transitiva.

Page 28: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 28/332

28 Capitolo 2 – Nozioni preliminari

Esempi di relazioni di equivalenza su N sono

IdN

eS = (x, y) ∈ N × N | x mod 3 = y mod 3

Data una relazione di equivalenza su un insieme A, ha senso considerare gli elementi di A ameno di tale equivalenza. Più formalmente si pone la seguente definizione (si veda anche laFigura 2.1).

Definizione 2.9 (Classi di equivalenza e insieme quoziente). Sia R una relazione di equiva-lenza su un insieme A. Si definisce classe di equivalenza della relazione R ogni sottoinsieme X di A tale che

• x, y ∈ X =⇒ xRy ( X è coerente rispetto a R),

• x ∈ X, xRy =⇒ y ∈ X ( X è saturo rispetto a R).

Si definisce insieme quoziente di A modulo R, e lo si indica con A/R, l’insieme delle classi di equivalenza, ossia

A/R = X ⊆ A | X è una classe di equivalenza rispetto a R .

Figura 2.1: Quoziente di un insieme A rispetto a una relazione di equivalenza R. Ogni classedi equivalenza contiene elementi in relazione fra loro. Gli elementi di una classe non sono inrelazione con quelli di un’altra classe

È facile provare che le classi di equivalenza di una relazione di equivalenza su A costitui-

scono una partizione di A nel senso che ogni elemento di A appartiene ad una ed una solaclasse di equivalenza.

Definizione 2.10 (Relazione di ordine). Una relazione binaria R su un insieme A si dice essere una relazione d’ordine (parziale) se è riflessiva, antisimmetrica e transitiva. La rela-zione R si dice relazione d’ordine totale se R è una relazione d’ordine e se per ogni x, y ∈ A

risulta (x, y) ∈ R o (y, x) ∈ R.

Un esempio di ordine parziale è la relazione R sull’insieme delle parti di un insieme Adefinita dall’inclusione, vale a dire (X, Y ) ∈ R se X ⊆ Y per X, Y ⊆ A.

Definizione 2.11 (Preordine). Una relazione binaria R su un insieme A si dice essere un preordine se è riflessiva e transitiva.

Page 29: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 29/332

2.3 Principi di induzione 29

Poiché un preordine è una relazione binaria è possibile definire il nucleo simmetrico di unpreordine. Spesso diremo semplicemente nucleo di preordine omettendo di specificare che si

tratta del nucleo simmetrico. Si ha il seguente facile ma utile risultato: il nucleo simmetricodi un preordine è una relazione di equivalenza .

Questo modo di generare una relazione di equivalenza a partire da un preordine saràutilizzato spesso nel seguito.

Concludiamo questa sezione con il concetto di funzione.

Definizione 2.12 (Funzione). Una funzione è costituita da un insieme A detto dominio,da un insieme B detto codominio e da una relazione binaria f tra A e B (ossia, da un sottoinsieme di A × B) con la proprietà che per ogni elemento a ∈ A esiste un unico elementob tale che (a, b) ∈ f . Comunemente si identifica una funzione con la relazione che la definisce.

Scriveremo f : A → B per dire che f è una funzione da A a B e, per a ∈ A, scriveremof (a) per indicare l’unico elemento b di B tale che (a, b) ∈ f . Una funzione da An in A è dettaoperatore n-ario su A.

Definizione 2.13 (Proprietà delle funzioni). Sia f : A → B una funzione.

• La funzione f si dice suriettiva se l’immagine di f è B, ossia se risulta f (A) = B.

• La funzione f si dice iniettiva se per ogni a, a0 ∈ A si ha che f (a) = f (a0) implica a = a0. Se f è iniettiva, l’inversa di f come relazione è una funzione da f (A) in A.

• La funzione f si dice biunivoca se è suriettiva e iniettiva.

Definizione 2.14 (Composizione di funzioni). Siano f : A → B e g : B → C due funzioni. La funzione composta, indicata con g f , è la funzione da A a C definita da (g f )(a) = g(f (a)).

Si osservi l’inversione dell’ordine con cui appaiono f e g rispetto alla composizione di relazioni.

2.3 Principi di induzione

I procedimenti induttivi, ossia che fanno uso del principio di induzione, sono strumenti fon-damentali per descrivere insiemi infiniti o per dimostrarne le proprietà. Illustreremo in questasezione le forme di induzione più comunemente usate: l’induzione matematica e l’induzione

strutturale .

2.3.1 Induzione matematica

Cominciamo con il classico principio di induzione matematica.

Teorema 2.15 (Principio di induzione matematica). Una proprietà P è vera per ogni numeronaturale n ∈ N se

1. P (0) è vera (caso base),

2. P (k) implica P (k + 1) per ogni k

∈N (caso induttivo).

Page 30: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 30/332

30 Capitolo 2 – Nozioni preliminari

Dimostrazione. Supponiamo per assurdo che P non valga per tutti i numeri naturali e sia hil più piccolo numero naturale tale che P (h) non vale. Abbiamo che h

6= 0 (dato che P (0)

vale) quindi h = h + 1 per un certo h. Siccome h è il più piccolo numero naturale per il qualeP non vale, abbiamo che P (h) vale ma allora, per il punto 2, P (h + 1) = P (h) vale e questoè assurdo.

Il teorema aff erma che per dimostrare che una proprietà P è vera per un qualsiasi numeronaturale n, è sufficiente dimostrare che la proprietà vale per il numero 0 e che il fatto che siavera per un numero k implica che è vera per il numero successivo.

Esempio 2.16. Si dice che quando era bambino, Gauss derivò la seguente formula

s um(n) =n

Xi=1 i = n(n + 1)

2

per la somma dei primi n interi non-negativi. Proviamo la correttezza di questa formula perinduzione usando lo schema descritto in precedenza.

Scopo: Dimostrare s um(n) = n(n+1)2 per ogni numero naturale n.

Caso base: Dobbiamo provare che s um(0) = 0(0+1)2 = 0. Questo è vero perché la somma

dei numeri da 0 a 0 è 0.Passo induttivo: Dobbiamo provare che per ogni naturale n, se s um(n) = n(n+1)

2 allora

s um(n + 1) = (n+1)(n+2)2 . Assumiamo allora che s um(n) = n(n+1)

2 per un n arbitrario eproviamo che la formula è valida per il successivo numero naturale n + 1. Siccome la sommadei primi n+1 naturali non è altro che la somma dei primi n cui viene aggiunto n +1, abbiamo

s um(n + 1) = s um(n) + (n + 1). Applichiamo a questo punto l’ipotesi induttiva, vale a dires um(n) = n(n+1)2 . Otteniamo

s um(n + 1) = s um(n) + (n + 1) = n(n + 1)

2 + (n + 1)

e completiamo la prova osservando che

n(n + 1)

2 + (n + 1) =

(n + 1)(n + 2)

2 .

Vi è una forma leggermente diversa, ed apparentemente più forte, di induzione matematica,detta principio di induzione matematica completa , che dice che una proprietà P vale per tutti

i numeri naturali se1. P (0) è vera (caso base),

2b. P (0), . . . , P (k) implicano P (k + 1) per ogni k ∈ N (caso induttivo).

ossia se è vera per il numero 0 e se dal fatto che sia vera per i numeri minori di k + 1 si riescea dedurre che è vera per il numero k + 1.

Non è difficile provare il principio di induzione matematica completa mimando la dimo-strazione data per il principio di induzione matematica. Sussiste in realtà un risultato piùforte che dice che i due principi sono equivalenti nel senso che se è possibile provare unacerta proprietà dei numeri interi con l’induzione completa allora è possibile provare la stessaproprietà anche con l’induzione standard (e viceversa). Abbiamo infatti il seguente risultato.

Page 31: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 31/332

2.3 Principi di induzione 31

Proposizione 2.17 (Equivalenza tra induzione e induzione completa). Il principio di in-duzione matematica (PIM) e il principio di induzione matematica completa (PIMC) sono

equivalenti, ossia, per ogni proprietà P sui numeri naturali risulta

P è dimostrabile con PIM se e solo se è dimostrabile con PIMC.

Dimostrazione. ⇒) È ovvio che se una proprietà P soddisfa i punti 1) e 2) del PIM allorasoddisfa anche i punti 1) e 2b) del PIMC.

⇐) Sia ora P una proprietà che soddisfa i punti 1) e 2b) del PIMC, vogliamo provare cheP (n) è vera per ogni n usando solo il PIM. Sia Q(n) la proprietà

P (k) vale per ogni k ≤ n.

Vogliamo dimostrare (usando il PIM) che Q(n) vale per ogni n, dobbiamo quindi provare cheQ(0) vale e che Q(k) implica Q(k + 1) per ogni k. Dato che Q(0) asserisce che P (0) vale e

che P soddisfa il punto 1), Q(0) vale. L’implicazione “Q(k) =⇒ Q(k + 1)” si traduce inP (0), . . . , P (k) =⇒ P (0), . . . , P (k + 1)

ma questo è vero perché

P (0), . . . , P (k) =⇒ P (0), . . . , P (k)

e, per il punto 2b),P (0), . . . , P (k) =⇒ P (k + 1).

Quindi abbiamo provato che Q(n) vale per ogni n e ciò, per definizione di Q(n), implica cheP (n) vale per ogni n.

Osserviamo che le condizioni 1) e 2b) del principio di induzione matematica completapossono essere riscritte con un’unica condizione nel modo seguente:

P (i) per ogni i < k =⇒ P (k), per ogni k ∈ N.

Tale condizione infatti si riduce, per k = 0, a

∅ =⇒ P (0),

ossia a “P (0) vale”.Il principio di induzione matematica completa può risultare utile quando per provare che

il numero k + 1 soddisfa una certa proprietà è necessario ricorrere alla stessa proprietà deinumeri più piccoli come nel caso seguente.

Esempio 2.18. Vogliamo provare che ogni numero naturale maggiore di 1 è prodotto dinumeri primi. Sia P la seguente proprietà

P (n) = “n ≤ 1 oppure esistono dei primi p1, . . . , pk tali che n = p1 . . . pk” .

Usando il principio di induzione matematica completa è sufficiente provare, per k arbitrario,che se P (i) vale per ogni i < k allora P (k) vale. Sia allora k un numero naturale. Se k ≤ 1

oppure se k è un numero primo è immediato concludere che P (k) vale. Altrimenti, k deveessere maggiore di 1 e deve essere il prodotto di due numeri, ossia k = k1k2 con k1 e k2entrambi maggiori di 1. L’ipotesi induttiva è che P (i) è vera per ogni i < k, per cui, essendok1, k2 < k e k1, k2 > 1, abbiamo che k1 e k2 sono entrambi prodotti di primi. Ne deriva cheanche k deve essere un prodotto di primi.

Page 32: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 32/332

32 Capitolo 2 – Nozioni preliminari

Per capire meglio la natura del principio di induzione matematica consideriamo la famigliadi tutti gli insiemi X che soddisfano

a) 0 ∈ X ,

b) k ∈ X =⇒ k + 1 ∈ X , per ogni k.

Elementi di tale famiglia sono per esempio N, Z, R. La particolarità di N, rispetto a tutti glialtri insiemi X che soddisfano a) e b), è di essere l’insieme più piccolo (ossia, se X soddisfaa) e b) allora N ⊆ X ).

Proposizione 2.19. Il principio di induzione matematica implica che N è il più piccolo tra gli insiemi X che soddisfano a) e b).

Dimostrazione. Sia X un insieme che soddisfa a) e b); dobbiamo dimostrare che, nell’ipotesiche il principio di induzione matematica valga, N ⊆ X . Si consideri la proprietà P (n) definitada “n ∈ X ”. Poiché X soddisfa a) e b), si ha che P (n) soddisfa i punti 1) e 2) del principiodi induzione matematica. L’applicazione del principio ci permette di concludere che P (n) èvera per ogni n ∈ N e quindi, per definizione di P (n), che N ⊆ X .

Possiamo anche dimostrare l’asserzione opposta.

Proposizione 2.20. Se N è il più piccolo tra gli insiemi X che soddisfano a) e b), allora il principio di induzione matematica vale.

Dimostrazione. L’ipotesi ‘N è il più piccolo tra gli insiemi X che soddisfano a) e b)’ implicache ‘se X è un insieme che soddisfa a) e b) allora N

⊆ X ’. Sia ora P (n) una proprietà

che verifica i punti 1) e 2) del principio di induzione matematica. Dimostrare la validitàdel principio stesso equivale a dimostrare che P (n) è vera per ogni n ∈ N. Poniamo oraX = k : P (k). Abbiamo che X soddisfa a) e b), quindi N ⊆ X . Da ciò, per definizione diX , segue che P (n) è vera per ogni n ∈ N, che è quanto volevamo dimostrare.

Il fatto che N sia il più piccolo insieme che soddisfa a) e b) e che per N valga il principiodi induzione matematica non è una coincidenza fortuita ma un caso particolare di uno schemapiù generale che illustriamo nella prossima sezione.

2.3.2 Induzione strutturale

La situazione vista nella sezione precedente per N vale più in generale per gli insiemi definitiper induzione tramite costruttori. Spiegheremo il significato di queste parole in questa sezione.Cominciamo prima con qualche esempio4.

Esempio 2.21. L’insieme Lists(N) delle liste di elementi in N può essere definito come ilpiù piccolo insieme tra gli insiemi X tali che

a. [ ] ∈ X ,

b. ` ∈ X implica n :: ` ∈ X , per ogni n ∈ N .

4Non saremo eccessivamente formali in questa sezione per non off uscare le idee che stanno dietro ai principicon pesanti formalismi.

Page 33: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 33/332

2.3 Principi di induzione 33

dove [ ] indica la lista vuota e n :: ` indica la lista ottenuta aggiungendo n in testa a `.Il principio di induzione strutturale associato all’insieme delle liste con elementi in N è il

seguente: una proprietà P è vera per tutti gli ` ∈ Lists(N) se

1. P ([]) è vera,

2. P (`) implica P (n :: `) per ogni ` ∈ Lists(N ) e n ∈ N .

Possiamo usare il principio appena enunciato per dimostrare, per esempio, la seguenteproprietà:

sum(`) ≤ max(`) ∗ len(`), per ogni ` ∈ Lists(N )

dove sum(`) indica la somma degli elementi della lista `, max(`) indica il più grande elementodi ` (con max([ ]) = 0) e len(`) indica il numero di elementi di `.Ponendo P (x) = “ sum(x)

≤max(x)

∗len(x)”, abbiamo che:

1) P ([]) è vera, infatti 0 = sum([]) ≤ max([]) ∗ len([ ]) = 0,2) “P (`) implica P (n :: `)” è vera, infatti supponendo sum(`) ≤ max(`) ∗ len(`) abbiamo

sum(n :: `) = n + sum(`) ≤ n + max(`) ∗ len(`)

≤ max(n :: `) + max(n :: `) ∗ len(`)

= max(n :: `) ∗ (1 + len(`)) = max(n :: `) ∗ len(n :: `).

La tesi è quindi dimostrata.

Prima di enunciare il principio generale vediamo un altro esempio.

Esempio 2.22. L’insieme Trees(N) degli alberi le cui foglie sono elementi di N può esseredefinito come il più piccolo insieme tra gli insiemi X tali che

a. n ∈ X per ogni n ∈ N,

b. t1, . . . , tk ∈ X implica T k(t1, . . . , tk) ∈ X , per ogni k ∈ N,

dove T k è la “funzione”, o meglio il costruttore, che dati k alberi t1, . . . , tk costruisce l’alberoche ha t1, . . . , tk come sottoalberi della radice.

Il principio di induzione strutturale associato all’insieme degli alberi con foglie in N è ilseguente: una proprietà P è vera per tutti i t ∈ Trees(N) se

1. P (n) è vera per ogni n ∈ N (ossia è vera per le foglie),2. P (t1), . . . , P (tk) implicano P (T k(t1, . . . , tk)), per ogni k ∈ N e per ogni t1, . . . , tk ∈

Trees(N).

Non entreremo qui nella discussione di capire quando una definizione per induzione è benposta e nel problema di definire formalmente che cos’è un costruttore. Diremo solo che uncostruttore di arietà k è una sorta di funzione che a partire da k valori (che possono esserenumeri, insiemi o qualunque altro oggetto matematico) costruisce un nuovo valore.5 Sono

5Non si può parlare di funzione perché il dominio e il codominio di un costruttore possono non essereinsiemi. Si consideri per esempio il costruttore che ad ogni insieme A associa l’insieme A. Esso ha comedominio la famiglia di tutti gli insiemi ma si può dimostrare che tale famiglia non è un insieme.

Page 34: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 34/332

34 Capitolo 2 – Nozioni preliminari

esempi di costruttori: il costruttore che, presi A e B, costruisce la coppia (A, B); il costruttoreche, senza prendere valori, rende il numero 0; il costruttore che, fissato n

∈N e preso `, rende

la scrittura formale n :: `.6È facile definire gli analoghi degli insiemi visti negli esempi precedenti per mezzo di costrut-

tori. Consideriamo per esempio l’insieme degli alberi con foglie in N. Detto σ(n)0 il costruttore

che, presi 0 valori, rende il numero n e detto σk il costruttore che, presi k valori A1, . . . , Ak,rende la k-pla (A1, . . . , Ak), abbiamo che l’insieme degli alberi con foglie in N può esseredefinito come il più piccolo insieme tra gli insiemi X tali che

a. σ(n)0 ( ) ∈ X per ogni n ∈ N (ossia, n ∈ X per ogni n ∈ N),

b. t1, . . . , tk ∈ X implica σk(t1, . . . , tk) ∈ X , per ogni k ∈ N.

In questa rappresentazione gli alberi sono oggetti del tipo (1, (2, (3)), (5, 5)).

Definizione 2.23 (Definizione per induzione tramite costruttori). Un insieme Y è definitoper induzione tramite la famiglia di costruttori Σ se la sua definizione è della forma

Y è il più piccolo tra gli insiemi X che soddisfano:s1, . . . , sk ∈ X =⇒ σk(s1, . . . , sk) ∈ X per ogni σk ∈ Σ

dove k è l’arietà di σk.

In altre parole Y è il più piccolo insieme “chiuso” (si veda Definizione 2.32) rispetto a ogniσ ∈ Σ.

Siamo ora in grado di enunciare il principio di induzione strutturale nella sua formagenerale.

Teorema 2.24 (Principio di induzione strutturale). Una proprietà P è vera per tutti gli elementi di un insieme S definito per induzione tramite una famiglia di costruttori Σ se

P (s1), . . . , P (sk) =⇒ P

σk(s1, . . . , sk)

per ogni σk ∈ Σ e per ogni s1, . . . , sk ∈ S , dove k è l’arietà di σk.

Nel caso di Lists(N), abbiamo il costruttore [ ] (di arietà 0, non prende argomenti e rendela lista vuota) e la famiglia dei costruttori della forma n :: _ (di arietà 1, prendono una listae rendono la lista con in più il numero n in testa). Se istanziato sulle liste di naturali, ilprincipio di induzione strutturale aff erma che per dimostrare che una proprietà è vera pertutte le liste di naturali è sufficiente dimostrare che essa è vera per la lista vuota e che èpreservata da tutti i costruttori utilizzati per formare liste di naturali.

Anche il principio di induzione matematica può essere visto come un caso particolare delprincipio di induzione strutturale. Infatti abbiamo visto che N può essere caratterizzato comeil più piccolo insieme tra gli insiemi X che soddisfano

a) σ(0)0 () ∈ X

6Una scrittura formale può essere identificata con una ennupla. Per esempio, la scrittura formale n :: `può essere identificata con la terna (n, cod(::), `) dove cod(::) rappresenta il numero associato al carattere “ ::”secondo una qualche codifica.

Page 35: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 35/332

2.4 Sistemi di inferenza 35

b) n ∈ X =⇒ σ1(n) ∈ X , per ogni n

dove σ

(0)

0 è il costruttore di arietà 0 che rende il numero 0 e σ1 è il costruttore di arietà 1che preso n rende n + 1. Da questa caratterizzazione applicando il principio di induzionestrutturale discende il comune principio di induzione matematica.

L’idea alla base della dimostrazione del principio di induzione strutturale è molto semplice:nelle ipotesi del teorema, se ci fosse un elemento minimale (rispetto al numero di costruttoriusati nella sua costruzione) che non soddisfa la proprietà P allora le sue sottocomponen-ti soddisferebbero la proprietà P (perché esso è minimale) e quindi esso stesso (in quantocomposizione) dovrebbe soddisfare la proprietà P .7

Riassumendo: per dimostrare che una proprietà vale per tutti gli elementi di un insiemecostruito in modo induttivo è sufficiente dimostrare che la proprietà vale per un elementoqualsiasi tutte le volte che essa vale per tutti i suoi componenti.

2.4 Sistemi di inferenza

I sistemi di inferenza costituiscono una notazione descrittiva e intuitiva per le definizioniinduttive di insiemi (o relazioni).

Un sistema di inferenza è formato da un insieme di regole di inferenza. Una regola di inferenza , a sua volta, è formata da un insieme (o, meglio, una n-pla) di premesse ( p1, . . . , pn)e da una conclusione q . Una regola viene scritta come

p1, · · · , pn

q

oppure come ( p1, . . . , pn)/q .Sia le premesse che le conclusioni sono (nel nostro contesto) predicati della forma

t ∈ X

dove t è un termine che può avere delle variabili libere ed X è l’insieme che stiamo definendo.Talvolta le conclusioni e le premesse vengono scritte omettendo la parte “∈ X ”.

Una regola va intesa come una implicazione: se le premesse sono vere per certi valori dellevariabili libere, allora la conclusione è vera per gli stessi valori delle variabili libere.

Una regola che ha un insieme di premesse vuoto viene detta assioma e viene scritta come

q oppure come ∅/q .

Chiariamo le idee con qualche esempio.

Esempio 2.25. Consideriamo il seguente insieme di regole:

0 ∈ N

k ∈ N

k + 1 ∈ N

Esse possono essere tradotte in7La dimostrazione formale richiederebbe di definire rigorosamente i costruttori per cui la omettiamo: l’idea

comunque resta quella esposta.

Page 36: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 36/332

36 Capitolo 2 – Nozioni preliminari

a) 0 ∈ N ,

b) k ∈ N =⇒ k + 1 ∈ N .

e il loro scopo è quello di definire N come il più piccolo insieme che soddisfa a) e b).

Una regola può avere delle condizioni collaterali per poter essere applicata. Le condizionicollaterali vengono scritte accanto alla regola.

Esempio 2.26. Consideriamo la definizione dell’insieme Lists(N) della Sezione 2.3.2;utilizzando le regole di inferenza essa diventa:

1.[ ] ∈ Lists(N)

2. l ∈ Lists(N)

n :: l ∈ Lists(N)n ∈ N

Esempio 2.27. Il sistema di regole:

0 ∈ Q

k ∈ Q

k + 1 ∈ Q

k ∈ Q, h ∈ Q

k/h ∈ Qh 6= 0

è un modo di descrivere l’insieme Q di tutte le frazioni maggiori o uguali a 0.

Un’istanza di una regola è il risultato della sostituzione, in una regola, delle variabili liberecon valori specifici. Anche le istanze vengono scritte con la stessa notazione usata per le regole.Per esempio,

3 ∈ Q, 4 ∈ Q

3/4 ∈ Q

è un’istanza dell’ultima regola dell’esempio precedente.Dato un insieme R di regole e un insieme R di istanze di tali regole, una R-derivazione D

di y è:

• un’istanza ∅/y ∈ R di un assioma di R, oppure

• una scrittura della forma (D1, . . . , Dn)/y dove D1, . . . , Dn sono R-derivazioni dix1, . . . , xn con (x1, . . . , xn)/y ∈ R.8

Scriveremo D R y per indicare che D è una R-derivazione di y , ossia scriviamo

• ∅/y R y se ∅/y ∈ R,

• (D1, . . . , Dn)/y R y se (x1, . . . , xn)/y ∈ R e Di R xi.

8Si osservi che l’insieme delle R-derivazioni è un insieme definito per induzione.

Page 37: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 37/332

2.4 Sistemi di inferenza 37

Diremo anche che y deriva dall’insieme di istanze R, e scriveremo, R y, se esiste una R-derivazione D di y. Quando non è rilevante, o quando è chiaro dal contesto, si omette di

specificare l’insieme R delle istanze usato in una derivazione.Le derivazioni (anche dette “dimostrazioni”) vengono rappresentate in maniera naturale

come alberi.

Esempio 2.28. Consideriamo il sistema di regole

0 ∈ Q

k ∈ Q

k + 1 ∈ Q

k ∈ Q, h ∈ Q

k/h ∈ Qh 6= 0

La seguente è una derivazione, rappresentata con un albero, di 1/2 ∈ Q

0 ∈ Q

1 ∈ Q

0 ∈ Q

1 ∈ Q

2 ∈ Q

1/2 ∈ Q

Esempio 2.29. Sia DI V la più piccola relazione binaria R che soddisfa le seguenti dueregole:

1. n R 0 n ∈ N

2. n R k

n R n + kn, k ∈ N

Allora,(assioma 1)

3 DIV 0(regola 2)

3 DIV 3(regola 2)

3 DIV 6

è una derivazione di 3 DIV 6.Abbiamo anche, per esempio, che non esiste una derivazione di 3 DIV 4 poiché cercando

di applicare un’istanza della regola 2 per provarlo otteniamo che per farlo ci serve dimostrare3 DIV 1 ma 3 DIV 1 non è istanza dell’assioma 1 e non può essere generato sfruttando la 2.

2.4.1 Induzione sulle derivazioni

Definiamo, ricorsivamente, la profondità (o lunghezza ) di una derivazione nel modo seguente:

• la profondità di una derivazione della forma ∅/y è 0,

• la profondità di una derivazione della forma (D1, . . . , Dn)/y è il massimo delle profonditàdelle derivazioni D1, . . . , Dn incrementato di 1.

Page 38: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 38/332

38 Capitolo 2 – Nozioni preliminari

Se D e D 0 sono R-derivazioni diremo che D 0 è una sottoderivazione diretta di D, e scriveremoD0

≺1 D , se D è della forma (D1, . . . , Dn)/y e D 0 coincide con uno dei Di. Indicata con

≺ la

chiusura transitiva di ≺1, diremo che D 0 è una sottoderivazione di D se D 0 ≺ D.Teorema 2.30 (Principio di induzione sulle derivazioni). Sia R un insieme di regole e sia Run insieme di istanze di regole in R. Sia P una proprietà delle derivazioni, allora

P (D) vale per ogni R-derivazione D

se e solo se

P (D0) per ogni D0 ≺1 D =⇒ P (D) vale per ogni R-derivazione D.

Dimostrazione. Dimostriamo solo la parte “se” poiché l’altra è ovvia. Supponiamo per assurdoche la proprietà P non valga per tutte le R-derivazioni e sia D una R-derivazione di profonditàminima tra quelle per cui la proprietà non vale.

La derivazione D non può avere profondità 0 perché in tal caso D non avrebbe sottode-rivazioni e quindi per ipotesi avremmo che P (D) vale. Supponiamo allora che D sia dellaforma (D1, . . . , Dn)/y. Poiché D1, . . . , Dn hanno profondità minore di D, abbiamo, per laminimalità di D, che P (D1), . . . , P (Dn) valgono, ma allora per ipotesi P (D) vale e questocontraddice l’ipotesi che P (D) non vale.

2.4.2 Induzione sulle regole

Vi è anche un principio di induzione sulle regole. Tale principio è utile per dimostrare cheuna proprietà è vera per tutti gli elementi che appartengono ad un insieme definito tramiteregole. L’idea è che se una proprietà è preservata nel passaggio dalle premesse alla conclusione

di tutte le istanze di regole usate in una derivazione, allora la proprietà resta valida anche perla conclusione della derivazione.

Sia R un insieme di regole e sia X il più piccolo insieme che le soddisfa. Dato un insiemeR di istanze di regole, è di interesse considerare l’insieme delle conclusioni che si possonoderivare usando tali istanze, più precisamente poniamo

I (R) =

x : R x

.

Si osservi che I (R) ⊆ X (stiamo identificando una conclusione della forma x ∈ X conl’elemento x).

Teorema 2.31 (Principio di induzione sulle regole). Sia R un insieme di istanze di regole e sia P una proprietà. Allora

P (x) vale per ogni x ∈ I (R)

se e solo se

P (x1), . . . , P (xn) =⇒ P (x) vale per ogni (x1, . . . , xn)/x ∈ R con xi ∈ I (R).

Dimostrazione. Dimostreremo la parte “se”, l’altra è ovvia. Procediamo per induzione sullaprofondità dell’albero di derivazione. Sia x ∈ I (R) e sia D una R-derivazione di x. Se Dè della forma ∅/x (ossia D ha altezza 0) allora ∅/x ∈ R e quindi per ipotesi P (x) vale. Seinvece D è della forma (D1, . . . , Dn)/x dove D1, . . . , Dn sono R-derivazioni di x1, . . . , xn con(x1, . . . , xn)/x ∈ R, allora, per induzione, P (x1), . . . , P (xn) valgono e quindi, per ipotesi,P (x) vale.

Page 39: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 39/332

2.5 Contesti e congruenze 39

Vogliamo adesso mostrare che l’insieme I (R) soddisfa una proprietà di chiusura rispettoalle istanze in R. Poniamo a questo scopo la seguente definizione.

Definizione 2.32. Sia R un insieme di istanze di regole. Un insieme Q si dice chiuso rispettoa R, o semplicemente R-chiuso, se per ogni (x1, . . . , xn)/x ∈ R si ha

x1, . . . , xn ∈ Q =⇒ x ∈ Q.

In altre parole, un insieme Q è R-chiuso se ogni volta che le premesse di un’istanza inR appartengono a Q anche la conclusione vi appartiene. In particolare, un insieme R-chiusodeve contenere tutte le conclusioni delle istanze degli assiomi in R.

Dimostriamo ora che I (R) è il minimo insieme chiuso rispetto ad R.

Proposizione 2.33. Sia R un insieme di istanze di regole. Allora

1. I (R) è R-chiuso,

2. se Q è un insieme R-chiuso allora I (R) ⊆ Q.

Dimostrazione. (1.) Sia (x1, . . . , xn)/x ∈ R con xi ∈ I (R). Dobbiamo provare che x ∈ I (R).Per definizione di I (R) esistono D1, . . . , Dn tali che Di R xi per ogni i. Ne segue che(D1, . . . , Dn)/x è una R-derivazione di x, cioè x ∈ I (R).(2.) È sufficiente considerare la proprietà P (x), definita per x ∈ I (R), e data da “ x ∈ Q”,cioè P (x) = x ∈ Q|x ∈ I (R) ed applicare il Teorema 2.31.

Il risultato precedente può essere usato quando si deve provare che una proprietà vale per

ogni elemento di I (R), infatti sarà sufficiente provare che l’insieme Q degli elementi per cuila proprietà vale è R-chiuso per ottenere che I (R) ⊆ Q e quindi che la proprietà vale in tuttoI (R).

Fin’ora abbiamo immaginato che un insieme di regole servisse a definire un unico insieme.Nulla impedisce di generalizzare il meccanismo e considerare definizioni mutuamente ricorsivedi insiemi.

Esempio 2.34. Si considerino le regole

0

∈P 1

∈D

k ∈ P

k + 1

∈D

k ∈ D

k + 1

∈P

Esse definiscono simultaneamente l’insieme P dei numeri pari e l’insieme D dei numeri dispari.

Vedremo che la definizione simultanea di più insiemi è molto frequente quando si ha a chefare con la definizione di categorie sintattiche di grammatiche.

2.5 Contesti e congruenze

Un insieme definito per induzione tramite costruttori (si veda la Sezione 2.3.2) può essere este-so per mezzo dell’aggiunta di altri costruttori. In questa sezione descriviamo una particolarecostruzione di cui avremo bisogno in seguito.

Page 40: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 40/332

40 Capitolo 2 – Nozioni preliminari

Sia X un insieme definito per induzione tramite una famiglia Σ di costruttori. Sia c0 ilcostruttore senza argomenti che rende la scrittura formale [ ]9. Posto Σ0 = Σ

∪c0, definiamo

X [ ] come il più piccolo insieme chiuso rispetto ai costruttori di Σ0. Gli elementi di X [ ] sarannodetti contesti di X .

Esempio 2.35. Abbiamo visto che l’insieme Trees(N) degli alberi con foglie in N può esseredefinito per induzione tramite costruttori (si veda Sezione 2.3.2). Aggiungendo il costruttorec0 che rende l’elemento [ ], le regole diventano

a. [ ] ∈ X ,

b. n ∈ X per ogni n ∈ N,

c. t1, . . . , tk ∈ X implica (t1, . . . , tk) ∈ X , per ogni k ∈ N,

Il più piccolo insieme che soddisfa tali regole è l’insieme Trees (N)[ ] dei contesti degli albericon foglie in N. Gli elementi di Trees(N)[ ] sono oggetti del tipo (1, ([ ], 3), (5, [ ], (8))), ossiaalberi le cui foglie sono elementi di N o l’elemento speciale [ ].

Gli elementi di X [ ] vengono scritti nella forma c[ ] per indicare che possono avere al lorointerno dei “buchi” ossia, delle occorrenze di [ ]. Un elemento c[ ] ∈ X [ ] può essere visto comeuna funzione da X in X , infatti dato x ∈ X indichiamo con c[x] l’elemento di X ottenutorimpiazzando in c[ ] ogni occorrenza del buco [ ] con x.

Tornando all’esempio degli alberi, se

c[ ] = ( 1, ([ ], 3), (5, [ ], (8))) =

1

[ ] 3 5 [ ]

8

e

t = (2, 7) =

2 7

allora

c[t] = c[(2, 7)] = (1, ((2, 7), 3), (5, (2, 7), (8))) =

1

2 7

3 5

2 7 8

In seguito avremo bisogno delle seguenti definizioni.

Definizione 2.36 (Sostitutività). Sia R una relazione binaria su un insieme X costruito per induzione tramite costruttori. Si dice che R è sostitutiva rispetto ai contesti di X se per ogni contesto c[ ] ∈ X [ ] e per ogni x, x0 ∈ X si ha che

x R x0 =⇒ c[x] R c[x0].9Non si confonda questa notazione con quella usata per indicare la lista vuota.

Page 41: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 41/332

2.6 Esercizi 41

Definizione 2.37 (Congruenza e precongruenza). Sia X un insieme definito per induzio-ne tramite costruttori. Una congruenza su X è una relazione di equivalenza su X che sia

sostitutiva rispetto ai contesti di X .Una precongruenza su X è una relazione di preordine su X che sia sostitutiva rispetto ai

contesti di X .

2.6 Esercizi

2.1 Data la relazione binaria ≺ su N definita da a ≺ b se b = a + 1, se ne determini la chiusurariflessiva, quella transitiva, e quella riflessiva e transitiva.

2.2 Siano R ⊆ A × B e S, T ⊆ B × C relazioni. Si provi che

1. (R · S )−1 = S −1 · R−1;

2. R · (S ∪ T ) = R · S ∪ R · T ;

3. R · (S ∩ T ) ⊆ R · S ∩ R · T e che non vale necessariamente il viceversa.

2.3 Sia X un insieme e P una proprietà definita sui sottoinsiemi di X . La proprietà P si dice chiusa

per intersezioni se

1. P (X ) vale,

2. se P (Y i) vale per certi Y i ⊆ X allora P (∩i∈I Y i) vale.

Si dimostri che le proprietà di riflessività, simmetria e transitività sono chiuse per intersezioni.In altre parole: dato un insieme A, l’insieme A × A è una relazione riflessiva su A e se R ed S sono relazioni riflessive su A anche R ∩ S lo è (ed analogamente per le altre proprietà).

2.4 Sia X un insieme e P una proprietà definita sui sottoinsiemi di X . La proprietà P si dice chiusa per unioni se

1. P (∅) vale,

2. se P (Y i) vale per certi Y i ⊆ X allora P (∪i∈I Y i) vale.

Si dimostri che la proprietà di simmetria è chiusa per unioni mentre la transitività e la riflessivitànon lo sono.

2.5 Sia P una proprietà definita sui sottoinsiemi di un certo insieme X e assumiamo che P siachiusa per intersezioni (vedere Esercizio 2.3). Se Y ⊆ X , si definisce chiusura di Y rispetto alla

proprietà P il sottoinsieme Y di X tale che

1. ¯Y ⊇ Y ,

2. P (Y ) vale,

3. se Z ⊇ Y e P (Z ) allora Z ⊇ Y .

ossia il più piccolo sottoinsieme di X tale che P (Y ) vale e Y ⊇ Y . Si dimostri che risulta

Y =\

P (Z ), Z ⊇Y

Z.

2.6 Sia P una proprietà definita sui sottoinsiemi di un certo insieme X e assumiamo che P sia chiusaper unioni (vedere Esercizio 2.4). Se Y ⊆ X , si definisce nucleo di Y rispetto alla proprietà P il sottoinsieme Y di X tale che

Page 42: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 42/332

42 Capitolo 2 – Nozioni preliminari

1. Y ⊆ Y ,

2. P (Y ) vale,

3. se Z ⊆ Y e P (Z ) allora Z ⊆ Y .

ossia il più grande sottoinsieme di X tale che P (Y ) vale e Y ⊆ Y . Si dimostri che risulta

Y =[

P (Z ), Z ⊆Y

Z.

2.7 Sia R una relazione binaria su A.

1. Si provi che la chiusura riflessiva di R coincide con la relazione

R ∪ IdA

dove I dA = (x, x) : x ∈ A.

2. Si provi che la chiusura simmetrica di R coincide con la relazione

R ∪ R−1.

3. Si provi che la chiusura transitiva di R coincide con la relazione

(x, y) : ∃x1, . . . , xn con xi R xi+1 per 1 ≤ i ≤ n − 1, x1 = x e xn = y.

2.8 Si provi che il nucleo simmetrico di un preordine è una relazione di equivalenza.

2.9 Sia ∼ una relazione di equivalenza su un insieme A e sia R una relazione binaria su A. Si dice

relazione indotta da R sul quoziente A/ ∼ la relazione

R/ ∼ = (X, Y ) ∈ (A/ ∼) × (A/ ∼) : ∃x ∈ X, y ∈ Y tali che xRy .

Ossia, due classi sono in relazione secondo R/ ∼ se esiste un elemento x della prima classe cheè in relazione R con un elemento y della seconda classe.

1. Provare che se R è riflessiva allora R/ ∼ è riflessiva.

2. Provare che se R è transitiva ed ∼⊆ R allora R/ ∼ è transitiva.

2.10 Sia R un preordine su un insieme A. Detto K R il nucleo simmetrico di R e indicata con R/K R larelazione indotta (vedere Esercizio 2.9) si provi che R/K R è una relazione d’ordine su A/K R.

2.11 Si dimostri per induzione che Pni=0 i2 = n(n+1)(2n+1)

6 .

2.12 Si dimostri, mimando la dimostrazione del principio di induzione matematica, il principio diinduzione matematica completa.

2.13 Formalizzare e provare la validità dell’induzione strutturale mutua , che consente ladimostrazione simultanea di diverse proprietà per diverse categorie sintattiche.

Page 43: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 43/332

Capitolo 3

Sintassi e modelli semantici

SOMMARIOQuesto capitolo introduce gli strumenti per definire la sintassi e la semantica operazionale deilinguaggi che studieremo in seguito. Cominceremo con i concetti riguardanti grammatiche e sintassi, concreta e astratta. Quindi introdurremo gli automi a stati finiti, i sistemi ditransizioni etichettate e le strutture di Kripke, che risulteranno fondamentali per definire la semantica operazionale di vari linguaggi. In particolare, studieremo i linguaggi come insiemidi termini ben formati, le grammatiche come strumenti per generare tali insiemi e i sistemi ditransizioni come strumenti per definire la semantica operazionale. Concludiamo il capitolo con un esempio che illustra sintassi e semantica operazionale delle espressioni aritmetiche.

3.1 GrammaticheIn questa sezione daremo la definizione formale di grammatica1 e di linguaggio da essa generatoed introdurremo brevemente la classificazione delle grammatiche in base alla forma delle loroproduzioni.

Sia A un insieme finito non vuoto di simboli, detto alfabeto. Si indica con A∗ l’insieme ditutte le possibili sequenze finite di simboli, dette stringhe , costruite sull’alfabeto A, inclusala stringa vuota, che viene denotata dal simbolo ε. Un linguaggio L su A è un qualsiasisottoinsieme di A∗. Si definisce lunghezza di una stringa w, e la si denota con |w|, il numerodi simboli che la compongono; così se w = a1 . . . an, allora |w| = n, in particolare |ε| = 0.Inoltre, se w = a1 . . . an e z = b1 . . . bm sono due stringhe, la loro concatenazione , denotatacon wz, è la stringa ottenuta giustapponendo w e z , ossia

wz = a1 . . . anb1 . . . bm.

La concatenazione di una qualsiasi stringa con ε è la stringa stessa.Il concetto di grammatica , più precisamente di grammatica generativo-trasformazionale ,

è uno sviluppo delle ricerche condotte dal linguista americano Noam Chomsky (1928-) apartire dagli anni ’50 del secolo scorso. Il suo fine fondamentale è quello di pervenire ad unadescrizione formale delle regole che, in singole lingue storico-naturali, consentono la produzionedi tutte le frasi che i parlanti considerano corrette e rendono possibile l’individuazione di quelle

1(Diz.) Grammatica: studio degli elementi costitutivi di una lingua, dal greco “grammatike techne”, ossia “arte (techne) dello scritto (gramma)”.

Page 44: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 44/332

44 Capitolo 3 – Sintassi e modelli semantici

che non sono ritenute tali. Un’importante applicazione delle grammatiche è la specifica dellasintassi dei linguaggi di programmazione: le grammatiche costituiscono, infatti, una notazione

concisa per descrivere la sintassi di un tipico linguaggio di programmazione.

Definizione 3.1 (Grammatica). Una grammatica è una quadrupla G , hA,V,S,P i dove:

1. A è un alfabeto i cui simboli sono detti terminali,

2. V è un alfabeto, i cui simboli sono detti nonterminali, e V ∩ A = ∅,

3. S ∈ V è un simbolo nonterminale, detto simbolo iniziale,

4. P ⊆ (A ∪V )∗× (A ∪V )∗ è un insieme di coppie, dette produzioni, tali che se (u, v) ∈ P allora u contiene almeno un simbolo nonterminale.

Una produzione (u, v) viene generalmente scritta u → v o anche u ::= v. Per comodità,se diverse produzioni hanno lo stesso membro sinistro, esse possono essere raggruppate inun’unica produzione il cui membro destro è costituito dalla sequenza dei membri destri delleproduzioni originarie, separati dal simbolo | . Così, se (u, v1), (u, v2), . . . , (u, vn) ∈ P , si scrive

u → v1 | v2 | . . . | vn

o ancheu ::= v1 | v2 | . . . | vn.

Questo modo di rappresentare un insieme di produzioni è detto forma di Backus-Naur ,

abbreviato in BNF.Per convenzione, useremo lettere minuscole o sequenze di lettere minuscole per indicare

i terminali della grammatica e lettere maiuscole o stringhe inizianti con la lettera maiuscolaper indicare i nonterminali. Questo permetterà di presentare una grammatica fornendo solol’insieme delle produzioni della grammatica stessa: i simboli terminali e non terminali sarannoriconoscibili grazie alla suddetta convenzione mentre si assumerà che il simbolo iniziale sia ilprimo simbolo nonterminale del membro sinistro della prima produzione.

Inoltre talvolta aggiungeremo dei pedici alle varie occorrenze di uno stesso nonterminaleper poterle distinguere e nominare.

Il seguente è un esempio di grammatica:

P ::= aD | εD ::= aP

Per poter definire il linguaggio generato da una grammatica abbiamo bisogno di specificareformalmente il meccanismo di riscrittura di una stringa in un’altra. Le prossime due definizionisono dedicate a questo scopo.

Definizione 3.2. Sia G , hA,V,S,P i una grammatica, e siano y, z ∈ (A ∪ V )∗.

1. Scriviamo y → z, e diciamo che z deriva direttamente (o in un passo) da y, se zpuò essere ottenuta da y rimpiazzando in y un’occorrenza del membro sinistro di una produzione con il membro destro di tale produzione.

Page 45: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 45/332

3.1 Grammatiche 45

2. Indichiamo con ∗→ la chiusura riflessiva e transitiva di →, e diciamo che z deriva da y

se y ∗

→z, ossia se z può essere ottenuta da y tramite una sequenza finita (eventualmente

vuota) di derivazioni dirette.

Considerando la grammatica dell’esempio precedente, abbiamo per esempio

P → aD → aaP → aa

e quindiP ∗→ aa

Definizione 3.3. Sia G , hA,V,S,P i una grammatica. Il linguaggio generato da G, indicatocon L(G) è l’insieme di tutte le stringhe derivabili da S costituite solo da simboli terminali,ossia

L(G) , nw | w

∈A∗ tale che S

→wo .

Vediamo, grazie ad un paio di esempi, che tipo di ragionamento utilizzare per dimostrareche un dato linguaggio è generato da una data grammatica.

Esempio 3.4. Sia G1 la grammatica le cui produzioni sono

S ::= ab aSb.

Vogliamo far vedere che L(G1) = L1 dove L1 , anbn|n ≥ 1.

• Cominciamo col dimostrare che L1 ⊆ L(G1), cioè che una stringa anbn con n ≥ 1qualsiasi può essere generata da G1. A questo proposito basta esibire una derivazioneper anbn a partire da S , come ad esempio la seguente:

S → aSb → aaSbb ∗→ an−1Sbn−1 → anbn

dove tutte le derivazioni utilizzano la prima produzione in G1, esclusa l’ultima cheutilizza la seconda produzione.

• Dimostriamo ora che stringhe che non sono del tipo anbn non possono essere generateda G1. Infatti, allo scopo di ottenere una stringa che non sia del tipo anbn dobbiamo co-minciare con la prima produzione (la seconda produrrebbe direttamente ab); dopodichédovremmo continuare ad applicare la stessa produzione perché altrimenti otterremmoaabb e questo ragionamento vale anche per i passi successivi. In pratica non c’è mododi produrre in un numero finito di passi una stringa di terminali che non sia della forma

an

bn

.Esempio 3.5. Consideriamo di nuovo la grammatica G con le seguenti produzioni

P ::= aD | ε

D ::= aP

Lasciamo come esercizio la prova del fatto che il linguaggio generato da G è costituito da tuttele stringhe di lunghezza pari sull’alfabeto composto dal solo simbolo a, ossia

L(G) =

w | w ∈ a∗ tale che |w| è pari

.

Si potrebbe anche dimostrare che se si considera D come simbolo iniziale, allora il linguaggiogenerato è costituito da tutte le stringhe di lunghezza dispari sull’alfabeto composto dal solosimbolo a.

Page 46: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 46/332

46 Capitolo 3 – Sintassi e modelli semantici

La forma generale delle produzioni è insufficiente per definire completamente i linguagginaturali (da cui lo studio di Chomsky ha preso spunto) con tutte le loro innumerevoli sotti-

gliezze ed è d’altro canto troppo generale per essere impiegata nella definizione dei linguaggi diprogrammazione (nella teoria dei linguaggi formali si dimostra infatti che i linguaggi generatidalle grammatiche “generali” non sono decidibili). Da qui l’idea di imporre delle restrizio-ni sulla forma delle produzioni di una grammatica in modo da ottenere varie sottoclassi digrammatiche. Cominciamo a discutere alcune di queste sottoclassi. Poi organizzeremo lesottoclassi in una gerarchia (quella di Chomsky, appunto).

Una grammatica G è dipendente da contesto se tutte le sue produzioni sono del tipo:

1. yU z → ywz , con U ∈ V , y , z ∈ (V ∪ A)∗ e w ∈ (V ∪ A)+, oppure

2. S → ε, a patto che S non compaia nella parte destra di nessuna produzione.

Un linguaggio generato da una grammatica dipendente da contesto è detto anch’essodipendente da contesto.

Notiamo che la clausola (1) ci dice, informalmente, che il simbolo U può essere rimpiazzatoda w a patto che appaia nel contesto y_z. La clausola (2) ci dice invece che la stringa vuotaε può essere generata solo all’inizio di una derivazione (dato che il simbolo iniziale S non puòcomparire nel lato destro di alcuna produzione). Poiché l’analisi sintattica di questi linguaggipuò richiedere l’esame di una vasta porzione del contesto ogni volta che si deve scegliere unaproduzione da applicare, linguaggi di programmazione dipendenti da contesto presentano ingenere notevoli difficoltà di traduzione.

Imponiamo allora vincoli ancora più restrittivi sulle produzioni di una grammatica.Otteniamo così la sottoclasse costituita dalle grammatiche libere dal contesto.

Una grammatica si dice libera dal contesto, o semplicemente libera , se ogni sua produzioneha il membro sinistro costituito da un solo nonterminale, ossia è della forma

U → w,

con w ∈ (A ∪ V )∗ e U ∈ V . Un linguaggio generato da una grammatica libera dal contesto èdetto anch’esso libero dal contesto, o semplicemente libero.

Da un punto di vista strettamente formale non ogni grammatica libera è dipendente dacontesto; le prime possono infatti contenere produzioni del tipo U → ε (con U 6= S ) che nonsono permesse invece nel caso delle grammatiche dipendenti da contesto. Tuttavia, si puòdimostrare che ogni linguaggio libero è anche dipendente da contesto, nel senso che esiste una

grammatica dipendente da contesto che lo genera.Le applicazioni delle grammatiche libere sono estremamente importanti; per esempio, di-

versamente da quanto accade per le grammatiche dipendenti dal contesto, le grammatichelibere non richiedono l’esame del contesto circostante per scegliere una produzione da ap-plicare, quindi vengono spesso usate nella descrizione formale della sintassi dei linguaggi diprogrammazione.

Le derivazioni ottenute da questo tipo di grammatiche possono essere rappresentatetramite alberi etichettati, chiamati alberi di derivazione , aventi le seguenti caratteristiche:

1. la radice è etichettata con il simbolo iniziale della grammatica,

2. ogni nodo interno dell’albero è etichettato con un simbolo non terminale,

Page 47: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 47/332

3.1 Grammatiche 47

S

A

a A

ε

S

c

B

b B

b B

ε

Figura 3.1: Un albero di derivazione

3. se un nodo interno è etichettato con A ed i suoi immediati discendenti sono eti-

chettati con A1, . . . , Ak, allora la grammatica possiede una produzione della formaA → A1 . . . Ak,

4. ogni foglia dell’albero è etichettata con un simbolo terminale oppure con ε.

Leggendo le foglie di un albero di derivazione da sinistra a destra (e saltando le foglieetichettate con ε) si ottiene una stringa del linguaggio generato dalla grammatica.

La Figura 3.1 illustra l’albero di derivazione di S ∗→ acbb per la grammatica

S ::= ASB | cA ::= aA | ε

B ::= bB | ε

Si osservi come lo stesso albero possa rappresentare diverse derivazioni, che diff eriscono l’unadall’altra per l’ordine di applicazione delle produzioni. Per esempio, le derivazioni

S → ASB → aASB → aSB → aSbB → aSbbB → aSbb → acbb

S → ASB → AcB → AcbB → AcbbB → Acbb → aAcbb → acbb

sono rappresentate dallo stesso albero.La struttura di un albero di derivazione è essenziale per assegnare un significato alle

stringhe di un linguaggio. Essa permette di individuare univocamente le componenti di unastringa e quindi di determinare l’ordine in cui esse vanno “interpretate”. L’insieme degli alberi

di derivazione di tutte le stringhe prodotte da una grammatica si indica con T (G).Le grammatiche che permettono di derivare una stringa tramite due alberi diversi sono

dette ambigue . La grammaticaS ::= aS | Sb | ε

è ambigua infatti gli alberi mostrati in Figura 3.2 sono due alberi distinti per la derivazioneS ∗→ ab.

Si noti comunque che già la grammatica

S ::= ASB | cA ::= aA | ε

B ::= bB | ε

Page 48: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 48/332

48 Capitolo 3 – Sintassi e modelli semantici

S

a S

S

ε

b

S

S

a S

ε

b

Figura 3.2: Due alberi di derivazione per la derivazione S ∗→ ab

è ambigua. Ecco un altro albero di derivazione per la stringa acbb.

S

A

ε

S

A

a A

ε

S

c

B

ε

B

b B

b B

ε

Si osservi che non esiste una relazione fra l’ambiguità di una grammatica ed il fatto cheun albero di derivazione possa essere il risultato di diverse sequenze di derivazioni.

I linguaggi generati dai simboli non terminali di una grammatica libera dal contesto pos-

sono essere visti come una famiglia di insiemi definiti in maniera mutuamente ricorsiva permezzo di regole, dove le regole sono date dalle produzioni della grammatica. Vale quindi perle grammatiche il principio di induzione strutturale che nello specifico viene talvolta dettoprincipio di induzione sui termini . Vediamo un esempio.

Esempio 3.6. Data la grammatica

E ::= a | E 1 + E 2 | (E )

dove i pedici, come detto, servono a dare un nome alle diverse occorrenze del nonterminaleE , proviamo, per induzione sulla struttura2 di E , che tutti gli elementi di L(E ) hanno unnumero uguale di parentesi sinistre e destre.

Caso a. Questo caso è banale, non essendoci alcuna parentesi nel terminale a.

Caso E 1 + E 2. Per ipotesi induttiva abbiamo che E 1 ed E 2 hanno un numero uguale diparentesi destre e sinistre, diciamo n per E 1, ed m per E 2. Abbiamo che E 1 + E 2 ham + n parentesi sinistre ed m + n parentesi destre.

Caso (E ). Per l’ipotesi induttiva E ha lo stesso numero di parentesi sinistre e destre, diciamon; chiaramente (E ) ha n + 1 parentesi sinistre e destre.

2Le produzioni della grammatica possono essere viste come costruttori. Per ogni simbolo terminale a

abbiamo il costruttore di arietà 0 che rende a, abbiamo poi il costruttore di arietà 2 che presi e1 ed e2 rendela scrittura formale e1 + e2 ed infine il costruttore di arietà 1 che preso e rende la scrittura formale (e).

Page 49: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 49/332

3.1 Grammatiche 49

Introduciamo ora l’ultima classe di grammatiche.Una grammatica si dice regolare se le sue produzioni sono della forma

U → aT oppure U → b oppure U → ε,

con a, b ∈ A e U, T ∈ V . Un linguaggio generato da una grammatica regolare è detto anch’essoregolare.

Le grammatiche di questo tipo sono dette regolari poiché possono essere analizzate daautomi con un numero finito di stati. Molte proprietà interessanti, come ad esempio stabilire seuna grammatica genera un linguaggio non vuoto o se una data stringa appartiene al linguaggiogenerato da una grammatica, sono decidibili nel caso delle grammatiche regolari. Pertantoqueste grammatiche sono spesso usate nei linguaggi di programmazione, in particolare permodellare i token e le parole chiave del linguaggio.

Abbiamo così definito 4 classi di grammatiche: quelle generali (nessuna restrizione sullaforma delle produzioni), quelle dipendenti da contesto, quelle libere e quelle regolari. Le 4classi vengono a volte indicate con una terminologia diff erente: si parla di grammatiche di

“tipo 0” per quelle generali, di “tipo 1” per quelle dipendenti da contesto, di “tipo 2” per quellelibere e di “tipo 3” per quelle regolari. La classe dei linguaggi generati dalle grammatiche di

“tipo i” viene detta anch’essa di “tipo i” ed indicata con Li, per i = 0, 1, 2, 3.La teoria dei linguaggi formali ci dice che le 4 classi di linguaggi sono contenute l’una

nell’altra in questo ordine:

L3 ⊂ L2 ⊂ L1 ⊂ L0.

Si noti che le inclusioni sono “strette”, infatti per ogni i = 0, 1, 2 esiste un linguaggio Li taleche Li ∈ Li e Li 6∈ Li+1. Dunque le 4 classi di linguaggi formano una gerarchia, la cosiddetta

“gerarchia di Chomsky”. Il seguente diagramma riassume le relazioni di inclusione tra le varieclassi.

L0 L1 L2 L3

Ad esempio, il linguaggio

L1 , anbn|n ≥ 1

è libero dal contesto. Infatti, abbiamo già visto che L1 è generato dalla grammatica libera G

1data da

S ::= ab aSb.

Tuttavia L1 non è regolare: infatti L3 coincide con la classe dei linguaggi riconosciuti dagliautomi a stati finiti e un tale automa, se deve riconoscere anbn con n arbitrariamente grande,allora non può non riconoscere anche ambn con m 6= n. Quindi L3 ⊂ L2.

Consideriamo ora il linguaggio

L2 , anbncn|n ≥ 1 .

Si può dimostrare che L2

∈L1, ma tuttavia L2

6∈L2, quindi L2

⊂L1.

Page 50: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 50/332

50 Capitolo 3 – Sintassi e modelli semantici

3.2 Sintassi concreta e sintassi astratta

Un linguaggio di programmazione3

è in prima approssimazione costituito da due parti: unasintassi e una semantica. La sintassi4 ha lo scopo di definire quali sono le frasi (corrette)del linguaggio. La semantica5 ha lo scopo di attribuire un significato esatto alle frasi dellinguaggio.

Il modo migliore per definire la semantica denotazionale di un linguaggio di programma-zione è quello di attribuire un significato a tutti i programmi partendo dalla grammatica cheli genera. Alcune volte però la definizione completa della sintassi del linguaggio in questione,che chiameremo sintassi concreta , è lunga e noiosa e contiene dettagli che rendono difficilela definizione di funzioni di interpretazione semantica semplici e chiare. Esistono cioè alcuniaspetti dei linguaggi di programmazione che poco hanno a che fare con il significato intrinsecodei programmi. Si pensi ad esempio alle precedenze tra i diversi operatori presenti nel lin-

guaggio, oppure al diverso modo di associare o raggruppare sequenze di comandi, cosicché conla sintassi concreta del linguaggio si è costretti a considerare contemporaneamente (e quindia diff erenziarne la generazione) frasi come le seguenti:

(3 + 4) ∗ 5 e 3 + (4 ∗ 5),while p do (c1; c2) e (while p do c1); c2

La sintassi concreta deve tenere conto di questi aspetti e per far questo è appesantita danotazioni estranee al significato dei singoli costrutti.

Quando si è interessati alle caratteristiche semantiche di un linguaggio risulta utile pertan-to ricorrere a varianti sintattiche che sono note come sintassi astratta . Tali varianti permettono

di astrarre da molti dettagli di rappresentazione delle frasi del linguaggio e di concentrarsisolo sulla struttura dei programmi, cioè su come questi possono essere composti a partire dafrasi più elementari. Il procedimento di determinazione della sintassi astratta di un linguaggioconsiste in una semplificazione delle produzioni che porta ad un’altra grammatica, general-mente ambigua, i cui alberi di generazione possono essere messi in corrispondenza con quellidel linguaggio originario. La sintassi astratta può essere ottenuta dalla sintassi concreta, adesempio, identificando alcune frasi, ignorando delle parentesi oppure ridenominando dei sim-boli. In questo modo viene stabilita una corrispondenza tra gli alberi ottenuti come risultatodell’analizzatore sintattico (alberi di derivazione) ed i programmi ottenuti tramite la sintassiastratta (programmi astratti). In pratica, in una sintassi astratta viene considerato solo ciòche è rilevante ai fini della semantica, specificando quindi per ogni costrutto sintattico solo:

1. la categoria sintattica del costrutto,

2. la costruzione sintattica applicata.

Quindi, analizzando più in dettaglio un linguaggio di programmazione, risulta utiledistinguere quattro componenti fondamentali:

3Contrariamente a quanto normalmente si crede, le dizioni “linguaggio” e “linguaggio di programmazione”denotano entità molto distinte.

4(Diz.) Sintassi: studio dei procedimenti attraverso i quali le parole di una frase sono collegate le une allealtre, dal greco “syn” (insieme) e “taxis” (ordine).

5(Diz.) Semantica: Studio del significato delle parole e delle frasi, dal greco “sema” (segno). Si pensi anchealla parola “semaforo” dal greco “sema phoros” (che porta il segnale).

Page 51: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 51/332

3.2 Sintassi concreta e sintassi astratta 51

Sintassiconcreta

definisce−−−−−−→ Frasi del linguaggioconcreto

y Parser

Frase (concreta):2

∗(3 + 4)

Sintassiastratta

definisce−−−−−−→ Alberi di sintassiastratta

y Esecuzione

Albero della sintassi astratta:

*

2 +

3 4

Semantica definisce−−−−−−→ Significato deglialberi Significato (valore):14

Tabella 3.1: Sintassi concreta e sintassi astratta

• Una grammatica Gc, che genera l’insieme L(Gc) delle stringhe (corrette) del linguaggiodi programmazione. L’insieme L(Gc) è costituito dalle stringhe di caratteri che i pro-grammatori possono scrivere e può pertanto essere chiamato linguaggio concreto. Lasintassi definita dalla grammatica Gc è detta sintassi concreta.

• Una grammatica Ga, che dà luogo ad una sintassi, detta sintassi astratta, che definisce

l’insieme T (Ga) degli alberi del linguaggio di programmazione. La sintassi astrattaprescinde da qualunque problema di rappresentazione degli alberi tramite sequenze dicaratteri, e rende la struttura dei termini associati agli alberi assolutamente ovvia.

• Un parser (o analizzatore sintattico), che ad ogni stringa del linguaggio concreto associa(passando attraverso un albero di derivazione della sintassi concreta) un albero dellasintassi astratta. Durante il parsing, varie convenzioni quali precedenze degli operatori,associatività ed uso delle parentesi, vengono tenute in conto per produrre l’albero dellasintassi astratta associato a una frase del linguaggio.

• Una semantica, che ha lo scopo di attribuire un significato esatto ad ogni albero dellasintassi astratta. È importante sottolineare il fatto che la semantica non attribuiscesignificato alle frasi del linguaggio concreto ma agli alberi astratti che queste rappre-sentano. In altre parole, il nucleo del linguaggio di programmazione è costituito dallasintassi per gli alberi astratti e dalla semantica a questi associata.

Il problema di rappresentare gli alberi della sintassi astratta con sequenze lineari di ca-ratteri è gestito dalla sintassi concreta e dal parser ed è del tutto ininfluente ai fini dellasemantica (si veda anche la Tabella 3.1). È per questo che nel resto di queste note, essendonoi interessati alla semantica dei linguaggi, quando introdurremo nuovi formalismi o nuovilinguaggi, definiremo sempre la loro sintassi astratta, mai quella concreta; quest’ultima potràessere derivata, nel caso ce ne sia bisogno, imponendo ulteriore struttura alla sintassi astratta.

Page 52: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 52/332

52 Capitolo 3 – Sintassi e modelli semantici

E ::= E + T | E − T | T (espressioni)

T ::= T ∗ P | T /P | P (termini)P ::= N | (E ) (espressioni primarie)N ::= D N | D (numeri)D : := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (cifre)

(Gc)

Tabella 3.2: Sintassi concreta delle espressioni aritmetiche

Gli approcci più usati per definire la semantica di un linguaggio di programmazione sa-ranno esemplificati nella Sezione 4.5 usando il linguaggio delle espressioni regolari come casodi studio.

3.3 Espressioni aritmetiche

In questa sezione chiariremo meglio i concetti di ‘grammatica’, ‘sintassi concreta’ e ‘sintassiastratta’ usando come esempio il linguaggio delle espressioni aritmetiche.

La sintassi concreta è data dalla grammatica (Gc) in Tabella 3.2. Le produzioni dellagrammatica (Gc) possono essere considerate una descrizione formale della struttura delleespressioni aritmetiche. D’altra parte, le stesse possono essere viste come regole di riscritturache permettono di generare espressioni aritmetiche. In questo senso, esse stabiliscono lepossibili evoluzioni delle stringhe che contengono i simboli E , T , P , N e D. Per esempio,l’ultima produzione stabilisce che se abbiamo una stringa (vale a dire una sequenza finita

di simboli) w che contiene un’occorrenza del simbolo D, possiamo trasformare (riscrivere)w rimpiazzando tale occorrenza di D con uno qualunque dei caratteri 0, 1, . . . , 9. In realtàquesto è un modo compatto di indicare dieci regole diverse.

Si osservi anche che le regole considerate presentano due diversi tipi di simboli: i simboli E ,T , P , N e D sono coinvolti nelle riscritture, mentre gli altri simboli, cioè 0, 1, . . . , 9, +, −, ∗, /,una volta introdotti nella stringa durante un passo della derivazione, non possono mai essereriscritti. Inoltre, la stringa finale non contiene alcuna occorrenza di E , T , P , N oppure D.In tal senso i simboli E , T , P , N e D vengono detti simboli nonterminali oppure variabili ;i restanti sono detti simboli terminali . Questi ultimi compongono dunque le parole del lin-guaggio che le regole date intendono generare. I simboli nonterminali invece rappresentano lediverse categorie sintattiche presenti nelle regole descritte, vale a dire le espressioni, i termini,

le espressioni primarie, i numeri e le cifre. Più precisamente, ogni riscrittura che parta rispet-tivamente dal simbolo E , T , P , N oppure D genera, nel momento in cui tutti i nonterminalisiano stati riscritti, un’espressione, un termine, un’espressione primaria, un numero oppureuna cifra, rispettivamente.

La grammatica (Gc) contiene un certo numero di informazioni, ad esempio sulle precedenzetra gli operatori e sull’uso delle parentesi, che sono certo importanti per far si che ogni frasesia interpretata in modo univoco (abbia cioè un unico albero sintattico) ma che non sonorilevanti per definire la semantica una volta nota la struttura della frase. Se ora astraiamo datali informazioni, possiamo intuitivamente descrivere la struttura di un’espressione aritmeticanel modo seguente:

• 0, 1, . . . , 9 sono cifre;

Page 53: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 53/332

3.3 Espressioni aritmetiche 53

E ::= n | E + E | E − E | E ∗ E | E/E (Ga)

Tabella 3.3: Sintassi astratta delle espressioni aritmetiche (n rappresenta un numero)

• ogni cifra è un numero;

• se N è un numero e D è una cifra, allora N D è un numero;

• ogni numero è un’espressione aritmetica;

• se E è un’espressione aritmetica e N è un numero, allora anche

E + N, E

−N, E

∗N, E/N

sono espressioni aritmetiche.

Questa definizione fornisce immediatamente una nuova grammatica per generare le espressioniaritmetiche sintatticamente corrette:

E ::= N | E + N | E − N | E ∗ N | E/N N ::= N D | DD ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Consideriamo il seguente esempio di generazione, dove i simboli che vengono rimpiazzati

sono sottolineati ad ogni passo mentre quelli che vanno a sostituirli sono sopralineati al passosuccessivo.

E → E + N → E ∗ N + N → E ∗ N + D

→ E ∗ D + D → E ∗ D + 1 → E ∗ 6 + 1 → N ∗ 6 + 1

→ N D ∗ 6 + 1 → N 5 ∗ 6 + 1 → D5 ∗ 6 + 1 → 25 ∗ 6 + 1

Possiamo dire allora che la stringa finale dell’esempio precedente deriva (in più passi) da E escrivere

E ∗→ 25 ∗ 6 + 1.

Facciamo ora un altro passo di astrazione da quella che è la rappresentazione sequenzia-le delle espressioni. Per cogliere invece la natura gerarchica delle espressioni aritmetiche èsufficiente la grammatica mostrata in Tabella 3.3.

La grammatica (Ga) definisce infatti la sintassi astratta delle espressioni aritmetiche. Èimportante sottolineare che questa grammatica viene usata per generare gli alberi del linguag-gio e non le frasi del linguaggio. Se venisse usata per generare stringhe allora tale grammaticarisulterebbe ovviamente ambigua (per esempio 2 ∗ 3 + 4 ammetterebbe due alberi di deriva-zione). Si osservi anche che la definizione di sintassi astratta non fornice informazioni sullastruttura dei numeri: è compito del parser riconoscere un numero ed assegnargli un valoresemantico.

Di fronte alla frase 2∗(3+4) generata dalla grammatica Gc è compito del parser ricostruirel’albero di derivazione

Page 54: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 54/332

54 Capitolo 3 – Sintassi e modelli semantici

E

T

T

P

N

D

2

* P

( E

E

T

P

N

D

3

+ T

P

N

D

4

)

ed associare a tale albero il giusto albero della sintassi astratta, che nello specifico risultaessere

E

E

2

* E

E

E

3

+ E

4

spesso disegnato anche come

*

2 +

3 4

La semantica provvederà poi ad attribuire un significato a quest’ultimo albero. Lo schemadella Tabella 3.1 riassume la situazione.

3.4 Automi

Ricordiamo brevemente la definizione ed il funzionamento degli automi6 a stati finiti.Gli automi a stati finiti sono definiti nel modo seguente.

6(Diz.) Automa: macchina che ha in sè i principi del proprio movimento, dal greco “autos” (da solo)composto con una radice che significa memoria.

Page 55: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 55/332

3.4 Automi 55

spento acceso

rotto

on

off b a

n g

bang

Figura 3.3: Un automa a stati finiti

Definizione 3.7. Un automa a stati finiti M è descritto da una quintupla

M = hQ,A, →, q 0, F i

dove:

• Q è un insieme finito detto insieme degli stati,• A è un insieme finito detto alfabeto di input,

• → ⊆ Q×(A∪ε)×Q è una relazione ternaria detta relazione di transizione; scriveremo

q µ−→ q 0 per indicare che (q,µ,q 0) ∈→,

• q 0 ∈ Q è uno stato speciale detto stato iniziale,

• F ⊆ Q è un insieme di stati detti stati finali o stati di accettazione.

Gli automi a stati finiti hanno una semplice e chiara rappresentazione grafica (comeillustrato in Figura 3.3):

• Uno stato viene rappresentato da un ovale che racchiude il nome dello stato stesso.

• Una transizione q µ−→ q 0 dell’automa viene rappresentata collegando l’ovale che rappre-

senta lo stato q con quello che rappresenta q 0 tramite un arco orientato dal primo statoal secondo ed etichettato con il simbolo µ.

• Lo stato iniziale viene indicato con una freccia entrante che non proviene da nessunaltro stato.

• Ogni stato finale viene indicato con un ovale che ha un bordo doppio.

La semplice forma delle produzioni delle grammatiche regolari consente di metterle incorrispondenza, in maniera naturale, con gli automi a stati finiti. Data una grammatica

regolare G = (A,V,S,P ), il corrispondente automa a stati finiti è

M G = hQ,A,→, S, q f i

dove

• Q = V ∪ q f è l’insieme degli stati (e coincide con l’insieme dei simboli nonterminalidella grammatica unito con un nuovo stato q f ),

• A è l’alfabeto (e coincide con quello della grammatica),

• → ⊆ Q × (A ∪ ε) × Q è la relazione di transizione ed è definita da: A a−→ B se

(A ::= aB) ∈ P e A b−→ q f se (A ::= b) ∈ P (con b ∈ A ∪ ε).

• S è lo stato iniziale (e coincide con il simbolo iniziale della grammatica),

Page 56: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 56/332

56 Capitolo 3 – Sintassi e modelli semantici

• q f è uno stato extra che rappresenta l’unico stato finale.

La grammatica associata all’automa della Figura 3.3 è data da

S ::= on A | bang A ::= o ff S | bang

(dove S rappresenta lo stato “spento” e A lo stato “acceso”).Gli automi possono essere usati anche come strumenti per specificare sequenze leci-

te di azioni; ad esempio l’automa in Figura 3.3, riconosce come corretta la sequenzaon o ff on o ff bang .

In generale, il comportamento dell’automa M su una stringa w ∈ A∗ può essere descrittonel modo seguente: M parte nello stato iniziale e scandisce il simbolo più a sinistra di w. Sulla

base dello stato corrente e del simbolo scandito, l’automa passa in un nuovo stato secondoquanto descritto dalla relazione di transizione. Il passaggio ad un nuovo stato avviene solo sec’è una transizione che lo prevede. Se non vi sono transizioni possibili l’automa si blocca erifiuta la stringa w. Dopo ogni transizione, viene esaminato il prossimo simbolo della stringadi ingresso e viene valutata la possibilità di eseguire una nuova transizione. Questo processova avanti fino a quando la stringa w è stata completamente scandita. A questo punto l’automasi troverà in uno stato q . Se lo stato q è uno degli stati finali dell’automa, cioè se q ∈ F , allorala stringa w viene accettata, altrimenti viene rifiutata.

Un automa si dice nondeterministico se esiste uno stato da cui escono due archi conla stessa etichetta. Formalizziamo l’idea di accettazione di una stringa in modo da gestirecorrettamente anche il nondeterminismo e le transizioni etichettate con ε.

Per far ciò, a partire dalla relazione di transizione → che è fin troppo dettagliata, definiamola seguente relazione più astratta:

•ε

=⇒ = ε−→∗

,

•a

=⇒ = ε=⇒ a−→ ε

=⇒ per a ∈ A,

•s

=⇒ = a1=⇒ · · ·

an=⇒ dove s ∈ A∗ ed s = a1 · · · an con ai ∈ A,

dove la giustapposizione di frecce rappresenta la composizione delle relazioni e ∗ indica lachiusura riflessiva e transitiva di una relazione (si veda la Definizione 2.5). In altre parole se sè una stringa, q s=⇒ q 0 significa che è possibile transire dallo stato q allo stato q 0 attraverso unasequenza di stati intermedi, eseguendo le transizioni indicate da s eventualmente intercalateda sequenze di ε.

Definizione 3.8 (Linguaggio riconosciuto da un automa). Si dice linguaggio riconosciuto da un automa M = hQ,A, →, q 0, F i l’insieme

L(M ) = w ∈ A∗ : esiste q ∈ F tale che q 0w

=⇒ q

È un risultato noto, e semplice da dimostrare, il fatto che l’automa associato ad unagrammatica regolare riconosce il linguaggio generato dalla grammatica stessa.

Page 57: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 57/332

3.5 Sistemi di transizioni etichettate e strutture di Kripke 57

3.5 Sistemi di transizioni etichettate e strutture di Kripke

Introduciamo in questa sezione i sistemi di transizioni etichettate (abbreviato in LTS, Labelled Transition Systems ) che, come vedremo, giocheranno un ruolo fondamentale nel seguito diqueste note per descrivere la semantica operazionale dei linguaggi che via via prenderemo inconsiderazione.7

I sistemi8 di transizioni etichettate possono essere considerati una generalizzazione degliautomi a stati finiti. Un sistema di transizioni infatti può non avere uno stato iniziale, puònon avere degli stati finali e può essere costituito da un numero infinito di stati. Mentre gliautomi sono adatti a descrivere l’evoluzione di un sistema da uno stato iniziale a uno statofinale, i sistemi di transizioni risulteranno utili a descrivere il comportamento e l’interazionedi sistemi concorrenti (i quali possono evolvere nel tempo senza che vi sia un concetto di statofinale).

Definizione 3.9. Un sistema di transizioni etichettate S è una quadrupla

S = hQ,A, →, q 0i

dove:

• Q è un insieme i cui elementi sono detti configurazioni o stati,

• A è un insieme finito di simboli detti azioni,

• → ⊆ Q × A × Q è una relazione ternaria detta relazione di transizione; scriveremoq

a−→ q 0 per indicare che (q,a,q 0) ∈→ e diremo che q può fare l’azione a ed andare in q 0,

• q 0 ∈ Q è uno stato speciale detto stato iniziale.

Lo stato iniziale viene spesso omesso, per cui in tali casi il sistema di transizioni può essereconsiderato una terna.9

Introduciamo adesso alcune convenzioni e notazioni riguardanti i sistemi di transizioni.

Definizione 3.10. Sia S , hQ,A, →i un sistema di transizioni. Un cammino (ocomputazione) ρ a partire da q 0 ∈ Q è una sequenza (finita o infinita) della forma

(q 0, a0, q 1) (q 1, a1, q 2) (q 2, a2, q 3) . . .

tale che (q i, ai, q i+1) ∈→

per ogni i. Per i ≥

0, denoteremo con ρ[i] il suoi + 1-esimo stato e con ρi il cammino da ρ[i] che è su ffi sso di ρ (cioè il cammi-no (q i, a0, q i+1) (q i+1, a1, q i+2) (q i+2, a2, q i+3) . . .). Indicheremo con Paths(q ) l’insieme dei cammini che iniziano dallo stato q .

Per ogni sequenza di azioni s ∈ A∗, definiamo la relazione s−→ nel modo seguente:

7Storicamente i sistemi di transizioni etichettate furono introdotti da Keller (1976) come un modello for-male per descrivere programmi paralleli. In seguito (Plotkin, 1979) sono stati usati per dare una semanticaoperazionale ai linguaggi di programmazione.

8(Diz.) Sistema: Aggregato di parti che dipendono le une dalle altre secondo leggi e regole fisse e chetendono a un medesimo fine, dal greco “syn” (insieme) e “stema” (collocare).

9In letteratura si trovano a volte definizioni leggermente diff erenti. Alcuni autori definiscono gli LTSincludendo anche un insieme di stati finali.

Page 58: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 58/332

58 Capitolo 3 – Sintassi e modelli semantici

q 0

q 1

q 2

q 3 q 4 p l a y

w o r k

w o r k

p l a y

τ

Figura 3.4: Grafo delle transizioni di un LTS

•ε−→ = IdQ, ossia poniamo q

ε−→ q per ogni q ∈ Q;

•s−→ =

a1−→ · · · an−→ , se s = a1 · · · an con ai ∈ A.

Se q s−→ q 0 diremo che q 0 è una s-derivata di q .I sistemi di transizioni il cui insieme di stati e transizioni è finito, possono essere presentati

esplicitamente con un grafo orientato etichettato (come nel caso degli automi), detto grafodelle transizioni . Quando invece l’insieme degli stati è infinito i sistemi di transizioni sonopresentati per mezzo di sistemi di inferenza (si veda la Sezione 2.4).

Esempio 3.11. [Bill-Ben] A titolo d’esempio, vediamo adesso un LTS (con 5 stati, 3 azionie 5 transizioni):

S = hQ,A, →i dove:

Q = q 0, q 1, q 2, q 3, q 4 ,A = play, work, τ ,

→ = (q 0,play,q 1), (q 0,work,q 2), (q 1,work,q 3), (q 2,play,q 3), (q 3, τ , q 4)

Il grafo delle transizioni in Figura 3.4 è una possibile rappresentazione dell’LTS.

Vi è una classe di sistemi di transizioni a cui saremo particolarmente interessati, si trattadei sistemi di transizioni con azione invisibile .

Un sistema di transizioni con azione invisibile è un sistema di transizioni hQ, Actτ , →i ilcui insieme di azioni Actτ contiene una speciale azione denotata con τ e detta azione invisibile(o interna): quindi Actτ è della forma Act

∪τ .

A partire dalla relazione → definiamo ora una nuova relazione di transizione ⇒ che trattal’azione invisibile in maniera speciale.

•ε

=⇒ = τ −→∗

, se q ε=⇒ q 0 si scrive anche q ⇒ q 0,

•µ

=⇒ = ε=⇒ µ−→ ε

=⇒ , se µ ∈ Actτ ,

•s

=⇒ = µ1=⇒ · · ·

µn=⇒ , se s = µ1 · · · µn con µi ∈ Actτ .

In altre parole se s è una stringa, q s=⇒ q 0 significa che è possibile andare da q in q 0 attraverso

una sequenza di stati intermedi, eseguendo le azioni indicate da s, eventualmente intercalateda sequenze di azioni τ . Se q

s=⇒

q 0 diremo che q 0 è un s-discendente di q .

Page 59: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 59/332

3.5 Sistemi di transizioni etichettate e strutture di Kripke 59

Nel seguito useremo α, β , . . . come generici elementi di Act, µ come generico elemento diActτ e s come generica sequenza finita di azioni.

In alcuni casi potremmo essere interessati soltanto alla capacità da parte di uno stato dieff ettuare un’azione od una sequenza di azioni, indipendentemente dallo stato raggiunto, eduseremo le seguenti notazioni:

• q µ−→ , se esiste q 0 tale che q

µ−→ q 0;

• q 6µ−→ , se non esiste q 0 tale che q µ−→ q 0.

Le notazioni q s−→ , q 6s−→ , q

µ=⇒ , q 6µ

=⇒ , q s=⇒ e q 6s

=⇒ hanno significati simili. Uno stato q sidice stabile se q 6τ −→ .

Useremo infine la seguente notazione

• µ = µ se µ 6= τ ,

ε se µ = τ .

Esempio 3.12. [Bill-Ben] Riprendiamo l’Esempio 3.11, dove le azioni visibili sono play ework, e l’azione invisibile è τ . Alcune derivazioni possibili sono le seguenti:

q 0 play−−→ work−−−→ q 3 q 1

work−−−→ τ −→ q 4 q 2 play−−→ τ −→ q 4

Tre possibili discendenze sono:

q 2 play==⇒ q 4 q 1

work===⇒ q 4 q 3 =⇒ q 4

Strutture di Kripke. Le strutture di Kripke sono dei sistemi in cui vengono etichettati glistati invece degli archi. La definizione formale di una struttura di Kripke è la seguente.

Definizione 3.13. Una struttura di Kripke (KS) è una quadrupla hQ, →,AP,I i, dove

• Q è l’insieme delle stati (o configurazioni),

• → ⊆ Q × Q è una relazione binaria (non etichettata) che determina quando è possibile transire da uno stato a un altro,

• AP è l’insieme delle etichette (ad esempio, le etichette sono proposizioni atomiche),

• I : Q → Pow (AP ) è una funzione, detta funzione di interpretazione, che ad ogni statoassegna un insieme di etichette, ossia un sottoinsieme di AP .

Da un punto di vista grafico una KS può essere rappresentata da un grafo avente unnodo per ogni stato del sistema e un arco per ogni elemento della relazione →, cosicchéa hq 1, q 2i ∈→ corrisponderà un arco che parte dal nodo q 1 e arriva in q 2. La funzione I rappresenta un’etichettatura che associa ad ogni nodo le proposizioni atomiche che sono validenello stato corrispondente.

Page 60: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 60/332

60 Capitolo 3 – Sintassi e modelli semantici

Definizione 3.14. Sia K , hQ, →, AP, I i una struttura di Kripke. Un cammino ρ da unostato q 0

∈Q è una sequenza (finita o infinita) di stati della forma

q 0, q 1, q 2, q 3 . . .

tale che q i → q i+1 per ogni i ≥ 0. Per i ≥ 0, denoteremo con ρ[i] il suo i + 1-esimo stato e con ρi il cammino da ρ[i] che è su ffi sso di ρ (cioè il cammino q i q i+1 q i+2 q i+3 . . .). Indicheremocon Paths(q ) l’insieme dei cammini che cominciano dallo stato q .

Nel seguito, le KS saranno principalmente utilizzate nel Capitolo 13 come modelli di inter-pretazione di alcune logiche temporali. In tale contesto, si assume solitamente che qualsiasiKS hQ, →,AP,I i soddisfa la seguente proprietà

∀q

∈Q,

∃q 0

∈Q tale che q

→q 0,

cioè ogni stato ha almeno un successore, quindi i cammini in una tale struttura sono infiniti.

Definizione 3.15. Per ogni KS K , hQ, →, AP, I i e per ogni stato q 0 ∈ Q c’è un alberodelle computazioni infinito con radice q 0 tale che hq, q 0i è un arco dell’albero se e soltanto se q → q 0. Tale albero è ottenuto ‘dispiegando’ la KS a partire da q 0.

Si osservi che gli alberi delle computazioni sono alberi i cui nodi sono etichettati da insiemidi proposizioni atomiche. Un albero è definito nella maniera usuale. Ha un’unica radice eogni nodo q n può essere raggiunto dalla radice tramite un unico cammino. Se →+ indica lachiusura transitiva di →, hq 1, q 2i ∈→+ è verificata se q 1 è un nodo che si trova nell’unicocammino che va dalla radice al nodo q 2.

3.6 Semantica operazionale delle espressioni aritmetiche

In questa sezione, usiamo i sistemi di transizioni per definire una semantica operazionale perle espressioni aritmetiche la cui sintassi astratta è data dalla grammatica (Ga) mostrata inTabella 3.3.

Il significato intuitivo di un’espressione è un numero. Diamo le regole per calcolare questonumero definendo un sistema di transizioni10 i cui stati sono le espressioni generate dallagrammatica in Tabella 3.3. Si noti, tra l’altro, che alcuni degli stati del sistema sono ‘finali’,nel senso che non hanno transizioni uscenti; tali stati corrispondono ai numeri. La relazionedi transizione è definita tramite un sistema di regole di inferenza come la più piccola relazioneche soddisfa gli assiomi e le regole in Tabella 3.4, dove op varia sull’insieme degli operatoriaritmetici; il sistema di inferenza è quindi composto da dodici regole, ottenute istanziando op.Una transizione è quindi possibile (può essere dedotta) se e solo se essa è provabile tramitele regole di inferenza della Tabella 3.4. La regola (op) stabilisce che l’espressione m op n sitrasforma in k allorquando l’applicazione dell’operazione op agli argomenti m ed n producecome risultato k. Questa è l’unica regola che coinvolge eff ettivamente gli operatori aritmetici.Le altre due regole consentono di ridurre ad un numero gli argomenti di un operatore. Inparticolare, (redl) permette di eff ettuare un passo della trasformazione dell’operando sinistro,

10Si noti che i sistemi di transizioni usati in questa sezione non fanno uso di etichette. Intuitivamente, ciò sispiega col fatto che le transizioni corrispondono in ogni caso ad azioni ‘interne’, per le quali non è necessariopubblicare alcuna informazione ‘visibile’ (che è il ruolo tipicamente ricoperto dalle etichette delle transizioni).

Page 61: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 61/332

3.6 Semantica operazionale delle espressioni aritmetiche 61

m op n −→

k (m op n = k) (op)

E 1 −→ E 01E 1 op E 2 −→ E 01 op E 2

(redl)

E 2 −→ E 02E 1 op E 2 −→ E 1 op E 02

(redr)

Tabella 3.4: Semantica di computazione delle espressioni aritmetiche

(redr) permette di trasformare l’operando destro. Il sistema di inferenza non stabilisce alcunordine nell’applicazione delle regole (redl) e (redr). Questo non è comunque rilevante, perché

la valutazione di una qualunque espressione aritmetica fornisce sempre lo stesso risultatoindipendentemente dalla sequenza di applicazione delle regole.

La valutazione di un’espressione aritmetica, ad esempio 4 + 7 ∗ 3/6 − 1 comporta unasequenza di transizioni. È importante notare che le regole della semantica operazionale dellaTabella 3.4 sono date a partire dalla sintassi astratta delle espressioni aritmetiche e perciòper applicarle abbiamo bisogno di vedere l’espressione da valutare non come una sequenza disimboli, ma come un albero di parsing, ad esempio

/

+ −

4 ∗ 6 17 3

che, utilizzando le parentesi, possiamo rappresentare con la stringa (4 + (7 ∗ 3))/(6 − 1).L’espressione fornisce un risultato in quattro passi:

(4 + (7 ∗ 3))/(6 − 1) −→ (4 + 21)/(6 − 1) −→ 25/(6 − 1) −→ 25/5 −→ 5.

La prima transizione viene derivata come segue

7 ∗ 3 −→ 21 (7 ∗ 3 = 21) (op)

4 + (7 ∗ 3) −→ 4 + 21

(redr)

(4 + (7 ∗ 3))/(6 − 1) −→ (4 + 21)/(6 − 1) (redl)

La seconda transizione viene derivata come segue

4 + 21 −→ 25 (4 + 21 = 25) (op)

(4 + 21)/(6 − 1) −→ 25/(6 − 1) (redl)

La terza transizione viene derivata come segue

6 − 1 −→ 5 (6 − 1 = 5) (op)

25/(6−

1) −→

25/5 (redr)

Page 62: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 62/332

62 Capitolo 3 – Sintassi e modelli semantici

m −−→→ m

E 1 −−→→ m1 E 2 −−→→ m2E 1 op E 2 −−→→ k (m1 op m2 = k)

Tabella 3.5: Semantica di valutazione delle espressioni aritmetiche

La quarta transizione è una banale applicazione di un’istanza della prima regola dellasemantica operazionale.

La semantica appena descritta è fin troppo dettagliata. Essa non solo fornisce il risultatodella valutazione di un’espressione, ma descrive anche il procedimento seguito per ottenerlo.Per questo motivo è chiamata semantica di computazione . Talvolta può non essere necessarioconoscere esattamente la sequenza dei passi che ha portato ad associare un valore ad un’e-

spressione. In questi casi viene utilizzato un approccio leggermente diverso, detto semantica di valutazione , attraverso il quale si raggiunge tale valore con una sola transizione. Il nuo-vo sistema di transizioni ha gli stessi stati del precedente, cioè le espressioni generate dallagrammatica in Tabella 3.3, e per relazione di transizione la più piccola relazione che soddisfagli assiomi e le regole in Tabella 3.5. Per esempio, la transizione

(4 + (7 ∗ 3))/(6 − 1) −−→→ 5

viene derivata nel modo seguente:

4 −−→→ 47 −−→→ 7 3 −−→→ 3

7 ∗ 3 −−→→ 21 (7 ∗ 3 = 21)

4 + (7∗

3)−−→→

25 (4 + 21 = 25) 6 −−→→ 6 1 −−→→ 1

6−

1−−→→

5 (6 − 1 = 5)

(4 + (7 ∗ 3))/(6 − 1) −−→→ 5 (25/5 = 5)

Si potrebbe facilmente dimostrare l’equivalenza tra la semantica di computazione e lasemantica di valutazione, cioè che, per ogni espressione aritmetica E , vale

E ∗−→ n se e solo se E −−→→ n.

3.7 Esercizi

3.1 Data la grammatica G con le seguenti produzioni

P ::= aD | ε

D ::= aP

si provi che il linguaggio generato da G è

L(G) =

w | w ∈ a∗ tale che |w| è pari

.

3.2 Data la grammatica dell’esercizio precedente si disegni l’automa associato a tale grammatica.

3.3 Si dimostri che la grammaticaS ::= SaS | SbS | ε

è ambigua ossia che esistono frasi del linguaggio da essa generato che ammettono due alberi diderivazione.

Page 63: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 63/332

3.7 Esercizi 63

3.4 Dimostrare che tutti gli elementi del linguaggio generato dalla grammatica dell’esempio 2.4.4hanno più ‘a’ che ‘+’.

3.5 Data la grammaticaS ::= aT | ε

T ::= aSS

dimostrare che essa genera solo stringhe di lunghezza pari.

3.6 Data la grammaticaS ::= aB

ε

T ::= aSS

dimostrare che essa genera solo stringhe di lunghezza pari.

3.7 Definire una grammatica che generi il seguente linguaggio

L ,

anbn|n ≥ 1 ∪ anb2n|n ≥ 1

3.8 Dimostrare che l’insieme di tutte le stringhe formate da x, y e z che contengono un numerodispari di x, un numero dispari di y ed un numero pari di z è un linguaggio regolare sull’alfabetox,y,z.

3.9 Dimostrare che il linguaggio L , xryszt|s = r + t è libero (Suggerimento: si consideri lagrammatica per il linguaggio anbn|n ≥ 1).

3.10 Scrivere una grammatica dipendente da contesto per il linguaggio L , anbancan|n ≥ 1.

3.11 Dimostrare per induzione strutturale che ogni stringa generata dalla grammatica

S ::= aSbS | bSaS | ε

appartiene al linguaggio

L = w | w ∈ a, b∗ e w contiene tante ‘a’ quante ‘b’.

Dimostrare, per induzione sulla lunghezza delle parole, che la grammatica data generaesattamente il linguaggio L.

3.12 La grammatica

E ::= n | E + E | (E ) ∗ (E )genera le espressioni aritmetiche con gli operatori di somma e moltiplicazione, in cui la mol-tiplicazione ha precedenza sulla somma. Si determini la corrispondente sintassi astratta e sidiscutano le ragioni per cui l’ambiguità di quest’ultima non crea problemi nella valutazionedelle espressioni.

3.13 Data la grammatica dell’esercizio precedente, scrivere gli alberi di derivazione, concreti edastratti, per le espressioni:

1. (4 + 14) ∗ (3);

2. ((7) ∗ (0)) ∗ (6);

3. ((7)

∗(0))

∗(6 + 8).

Page 64: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 64/332

64 Capitolo 3 – Sintassi e modelli semantici

3.14 Fornire l’espressione, derivante dalla sintassi concreta dell’esercizio 5, che ha il seguente alberodi derivazione:

*

* +

1 12 4 5.

3.15 Dimostrare che, per ogni espressione aritmetica E , vale

E ∗−→ n se e solo se E −−→→ n.

3.16 Provare che, per ogni espressione aritmetica E descritta nella Sezione 3.3,

E −→ E 1, E −→ E 2 implica E 1 −−→→ n, E 2 −−→→ n.

Page 65: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 65/332

Capitolo 4

Sintassi e denotazioni

SOMMARIOQuesto capitolo introduce alcune nozioni e definizioni preliminari di semantica denotazionale e le illustra tramite due esempi di descrizione semantica di semplici formalismi. Cominciamo col chiarire la diff erenza fra notazioni sintattiche e denotazioni semantiche. Quindi, come

primo esempio presentiamo la semantica denotazionale di una semplice calcolatrice tascabile e come secondo quella delle espressioni regolari. Vedremo che il principio di induzione strut-turale è uno strumento fondamentale per definire la semantica denotazionale e dimostrare

proprietà dei linguaggi generati tramite grammatiche. Nel caso delle espressioni regolari mo-streremo anche come definire semantiche coerenti usando l’approccio operazionale e quello assiomatico.

4.1 Notazioni sintattiche e denotazioni semantiche

Vogliamo ora chiarire come bisogna procedere per definire la semantica di un programmascritto, ovviamente, in sintassi concreta utilizzando le funzioni di interpretazione semanticache sono invece definite a partire dalla sintassi astratta del linguaggio stesso. Il procedimentoconsiste di tre passi:

1. si usa la sintassi concreta per definire le frasi del linguaggio concreto e quindi l’alberodi parsing del programma;

2. si usa la corrispondenza tra sintassi concreta e sintassi astratta per ottenere l’albero

astratto;3. si usano le funzioni di interpretazione semantica per definire il significato degli alberi

astratti.

Qualcosa di simile in realtà è stato già fatto in Sezione 3.6 per definire la semanticaoperazionale delle espressioni aritmetiche, dove però il punto 3. è rimpiazzato come segue

30. si usa un sistema di transizioni etichettato per definire il significato degli alberi astratti.

Per quanto riguarda il punto 3. è necessario:

1. stabilire la natura degli oggetti matematici che si intendono usare come denotazioni ,

Page 66: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 66/332

66 Capitolo 4 – Sintassi e denotazioni

2. stabilire la natura delle funzioni di interpretazione semantica, ricordando che

DOMINIO SEMANTICODOMINIO SINTATTICO

funzione di

interpretazionee definire le funzioni di interpretazione semantica per induzione sulla sintassi astrattadei termini.

Il primo problema sarà discusso nel Capitolo 6. Il secondo problema si risolve definendofunzioni di interpretazione tra i termini generati dalla sintassi astratta e gli opportuni do-mini semantici. Per fare un esempio concreto, se la sintassi del linguaggio prevede quattrodomini sintattici, e cioè Programmi , Dichiarazioni , Espressioni e Comandi , avremo un mo-dello semantico costituito da quattro domini semantici e quattro funzioni di interpretazionesemantica, ciascuna da un dominio sintattico al corrispondente dominio semantico. Questeultime sono definite per induzione strutturale sulla sintassi dei programmi. Quindi, ad ogniproduzione della grammatica che definisce il linguaggio corrisponderà un caso della defini-zione della funzione di interpretazione semantica, che avrà la stessa struttura ricorsiva dellacorrispondente produzione. Per esempio, i linguaggi di programmazione hanno solitamenteuna produzione che stabilisce che un comando può essere ottenuto mettendo in sequenza duecomandi qualsiasi:

C ::= · · · | C ; C | . . . ;

una clausola della funzione di interpretazione semantica dei comandi avrà allora la forma:

C [[C 1; C 2]] = C [[C 1]] ⊗ C [[C 2]],

in modo che all’operatore sintattico “;” corrisponda l’operatore semantico ⊗. Questo esempiomette in luce due proprietà essenziali dell’approccio denotazionale:

1. in corrispondenza ad ogni operatore sintattico (nel nostro esempio “;”) viene definito unoperatore semantico (nel nostro esempio “⊗”);

2. la semantica di un comando composto è definita ricorsivamente in termini della seman-tica dei comandi che la compongono, così come la sintassi della sequenza di comandi èdefinita ricorsivamente in base alla sintassi dei comandi stessi.

La seconda proprietà descritta sopra va anche sotto il nome di composizionalità con cui si

intende che il significato di un termine composto è costruito in base al significato dei terminiche lo compongono.A titolo esemplificativo, per evidenziare le caratteristiche fondamentali delle funzioni di

interpretazione semantica, definiamo qui di seguito una semantica denotazionale dei numeribinari in termini di numeri decimali. Relativamente a tale esempio, la Tabella 4.1 mostra letre componenti fondamentali di una definizione denotazionale:

1. il dominio sintattico: il linguaggio dei numeri binari;

2. il dominio semantico: i naturali;

3. la funzione di interpretazione semantica, che ad ogni numero binario associa un naturale.

Page 67: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 67/332

4.1 Notazioni sintattiche e denotazioni semantiche 67

Sintassi

Dominio Sintattico: Bin

Grammatica: B ::= 0 | 1 | B 0 | B 1Semantica

Dominio Semantico: N = z ero, u no, d ue ,. . . Operazioni: piu, per : N× N → N

Funzione di InterpretazioneSemantica:

M[[0]] = z eroM[[1]] = u noM[[B 0]] = (M[[B]] per d ue) piu M[[0]]M[[B 1]] = (M[[B]] per d ue) piu M[[1]]

Tabella 4.1: Semantica denotazionale dei numeri binari

Nella funzione di interpretazione semantica descritta in Tabella 4.1 abbiamo utilizzato lestringhe z ero, u no, d ue per rappresentare i numeri, che usualmente vengono indicati con lecifre 0, 1, 2, per meglio rimarcare la diff erenza fra sintassi (101) e semantica (c inque).

Per evidenziare ulteriormente la diff erenza fra notazioni sintattiche e denotazioni semanti-che, aff rontiamo il problema di assegnare un significato a sequenze di cifre decimali. Conside-riamo la grammatica (Ga) per le espressioni aritmetiche mostrata in Tabella 3.3, a pagina 53.Indichiamo con N um l’insieme di tutte le stringhe generate da tale grammatica a partireda N (in pratica, prendiamo N come simbolo iniziale). La funzione di interpretazione, chechiamiamo N , associa ad una stringa di cifre un numero decimale, N : N um → N. In modoperfettamente analogo a quanto visto in Tabella 4.1, ma moltiplicando per d ieci invece cheper d ue, otterremo l’interpretazione di sequenze di cifre decimali. Ad esempio avremo che

N [[152]] = (((u no per d ieci) piu c inque) per d ieci) piu d ue.

Ovviamente, il mantenere esplicita la diff erenza fra la sintassi e la semantica nel caso deinumeri naturali comporterebbe un notevole appesantimento notazionale, che peraltro risul-terebbe inutile. Nel seguito, con abuso di notazione, utilizzeremo gli elementi di N um ancheper rappresentare gli elementi di N. In eff etti, senza dubbio il lettore è portato ad interpre-tare la sequenza 152 come il numero naturale c entocinquantadue. Considerazioni analogheporteranno spesso ad utilizzare lo stesso simbolo per indicare la sintassi e la semantica deglioperatori sui naturali.

Riprendiamo ora l’esame dell’interpretazione dei numeri binari in termini dei naturali,

per capire come procedere in modo composizionale alla determinazione della semantica diun termine costruito tramite una BNF, considerando il modo in cui viene determinato ilsignificato di un numero binario, per esempio 101, tramite la funzione di interpretazioneM[[·]]. La rappresentazione lineare non evidenzia come dividere il numero, di cui si vuol darela semantica, in sottoparti. È allora la sintassi che ci dice esattamente come fare.

Siccome un numero binario è definito come la concatenazione di un numero binario e diuna cifra binaria, abbiamo:

M[[101]] = M[[10]] composto con M[[1]]

e quindiM[[101]] = (M[[10]] per d ue) piu M[[1]]

≡(M[[10]]

∗2) + M[[1]];

Page 68: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 68/332

68 Capitolo 4 – Sintassi e denotazioni

continuando abbiamo

(((M[[1]] ∗ 2) + M[[0]]) ∗ 2) + M[[1]] = ((1 ∗ 2) + 0) ∗ 2) + 1 = 5.

L’esempio riportato sopra segue un approccio top-down per cui l’espressione ottenuta sulladestra dell’= può essere semplificata solo quando, a seguito di successive riscritture, si arrivaa dover interpretare il solo simbolo iniziale del numero binario originario. Alternativamente,è possibile seguire un approccio bottom-up che, nel caso del numero 101, consiste nel deter-minare prima il valore di tutte le sue sottostringhe, cioè 1 e 10, e quindi di utilizzarle perdefinire il significato dell’intera stringa. In questo caso la sequenza 101 sarebbe valutata nelmodo seguente:

M[[1]] = 1M[[10]] = (M[[1]]

∗2) + M[[0]] = 2

M[[101]] = (M[[10]] ∗ 2) + M[[1]] = 5.

Chiaramente la scelta di un approccio o dell’altro dipende dai gusti di chi specifica; biso-gna comunque dire che l’approccio bottom-up ha il vantaggio di garantire che la lunghezzadelle formule intermedie che si originano nel processo di valutazione semantica non crescaproporzionalmente al termine che si sta specificando: in generale questo fatto garantisce unamaggiore leggibilità.

4.2 Una calcolatrice tascabile

Per introdurre il lettore alla metodologia propria dello studio dei linguaggi di programmazione,

consideriamo il linguaggio che deve essere usato per servirsi di una semplice calcolatrice tasca-bile, la cui interfaccia è rappresentata in Figura 4.1. Si noti che il linguaggio delle espressioniaritmetiche introdotto in Sezione 3.3 è parte del linguaggio della calcolatrice tascabile.

L’unica difficoltà nella descrizione del comportamento della calcolatrice è data dalla di-sponibilità di tasti per la memorizzazione di risultati intermedi; d’altra parte questa è lacaratteristica che rende il suo linguaggio simile ad un linguaggio di programmazione reale (elo diff erenzia da quello delle espressioni aritmetiche).

La calcolatrice permette di eff ettuare le quattro operazioni ed è fornita di un visore edi una cella di memoria, di quattro tasti-comandi tramite i quali è possibile modificare ilcontenuto della memoria (MC, MR, M-, M+) e di un altro tasto-comando che permette dirimediare a situazioni di errore e di azzerare il contenuto della cella di memoria (CE/C).

Rispetto al modo standard di interagire con la calcolatrice, che consiste nel premere tastiin una qualsiasi sequenza, noi porremo delle restrizioni e chiederemo che i suoi “programmi”seguano un particolare protocollo.

Sebbene sia fisicamente possibile premere il tasto + subito dopo quello − , premere lostesso tasto operazione un numero qualsiasi di volte oppure premere un qualsiasi tasto primadi aver acceso la calcolatrice, noi lo vieteremo imponendo alcune restrizioni nella definizionedei programmi accettabili dalla calcolatrice. Potremo allora parlare di sequenze di comandiben formati (corretti) ed ignorare tutti i comandi non corretti sintatticamente.

La nostra sintassi richiede che tutti i programmi comincino con l’accensione della macchina(On) e prevede che essi consistano di una sequenza di espressioni aritmetiche separate dalsimbolo uguale (per determinare risultati intermedi), inframmezzate da comandi che servono

Page 69: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 69/332

4.2 Una calcolatrice tascabile 69

4 5 6 * MR

1 2 3 - M-

CE 0 = + M+

MC / 987

OffOn

C

Figura 4.1: Una calcolatrice tascabile

a modificare il contenuto dell’unica cella di memoria. È anche previsto che tutti i programmiterminino con lo spegnimento della macchina stessa (Off ).

La definizione dei programmi corretti si basa su diverse categorie sintattiche cheutilizzeremo per costruire le sequenze ben formate di tasti che si possono premere:

• Program , i programmi (a cui corrisponde la variabile P della grammatica);

• Stat , le sequenze di istruzioni (S );

• Expr , le espressioni (E );

• Numeric , i numeri che possono essere digitati oppure richiamati dalla cella di memoria(M );

• Nat , i numeri digitati (N );

• Digit , le cifre (D);

• Com , i comandi (C ).

Le regole che descrivono i programmi accettati dalla calcolatrice sono le seguenti:

P ::= On S

Tutti i programmi sono formati da una sequenza di istruzioni precedutadalla parola chiave On.

S ::= E = S | Off | C S Una sequenza di istruzioni può essere costituita da:

• un’espressione seguita dal simbolo = e quindi ancora da unasequenza di istruzioni;

• la parola chiave Off ;

• un comando seguito ancora da una sequenza di istruzioni.

Page 70: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 70/332

70 Capitolo 4 – Sintassi e denotazioni

E ::= M | E + M | E − M | E ∗ M | E/M Un’espressione può essere costituita semplicemente da un numero ri-

chiamato dalla memoria oppure composto dalla tastiera, oppure saràcomposta concatenando un’altra espressione, il simbolo di un operato-re aritmetico e un numero (sia questo richiamato dalla memoria oppuredigitato).

M ::= N | MRI numeri richiamati dalla memoria vengono qui distinti da quelli compostipremendo i tasti numerici della calcolatrice.

N ::= D | N D

Queste e le seguenti sono le produzioni viste in precedenza per descrivereil meccanismo di generazione di un numero.

D ::= 0 | 1 | · · · | 9C ::= M+ | M- | MC | CE/C

I comandi disponibili per la gestione della cella di memoria e del visoredella calcolatrice.

Esempio 4.1. I programmi

On 5 + 37 ∗ 2 = M+ Off ,On 5 + 37 ∗ 2 = M+ 44 + MR = Off

sono sintatticamente corretti secondo le regole date sopra, mentre il programmaOn 5 + 4 MR = Off

non è corretto perché non è consentito premere il tasto MR dopo aver composto un numero.

4.3 Il linguaggio della calcolatrice tascabile

Chiamiamo G la grammatica proposta per generare il linguaggio dei programmi accettati dallacalcolatrice tascabile nella Sezione 4.2. L(G) è il linguaggio dei programmi accettati dalla

calcolatrice. La grammatica G è stata introdotta pensando alle diverse categorie sintatticheche possono intervenire nel progetto del linguaggio, ed è una grammatica libera dal contesto.Ovviamente, G non è l’unica grammatica che genera L(G) ed il fatto che G sia libera dal

contesto non implica che L(G) sia un linguaggio “strettamente” libero dal contesto. Infatti,L(G) può essere generato anche a partire da un’altra grammatica G0 che risulta essere regolare,e quindi è un linguaggio regolare (si veda quanto detto in Sezione 3.1). La nuova grammaticaG0 è la seguente:

P ::= On S S ::= Off | d T | MR U | c S T ::= d T | o V | = S U ::= o V | = S

V ::= MR U | d T,

(4.1)

Page 71: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 71/332

4.3 Il linguaggio della calcolatrice tascabile 71

dove d indica una qualunque cifra fra 0 e 9, c indica un comando (manipolazione della memoriae cancellazione del visore o dell’errore), ed o indica una qualunque operazione aritmetica.

Volendo scrivere la grammatica senza considerare queste abbreviazioni dovremmo scrivere ledieci produzioni

0 T | 1 T | · · · | 9 T

al posto di d T , e lo stesso per i comandi e gli operatori.A diff erenza dalla prima, questa grammatica punta a caratterizzare la calcolatrice come

una macchina che via via abilita gruppi di tasti, eventualmente disabilitandone altri, impe-dendo in questo modo la scrittura di programmi non legali. Operativamente, la grammaticaindividua gli stati di un sistema di transizioni etichettate ed il modo in cui si passa da unostato all’altro in funzione del tasto premuto.

Questa visione operativa dell’interazione con la calcolatrice è esemplificata nella Figura 4.2dove ogni stato è rappresentato da una figura della calcolatrice. In ciascuna di tali figure sonoevidenziati in grigio scuro i tasti che lo stato consente di premere, mentre sono disegnati ingrigio chiaro i tasti disabilitati. Le frecce che collegano uno stato con un altro sono etichettatecon un tasto, che eventualmente rappresenta un insieme di tasti: in questo caso è come seavessimo tante frecce quanti sono gli elementi di tale insieme. Questo sta a significare che ilsistema di transizioni può passare dallo stato di partenza a quello di arrivo (individuati dalverso della freccia) qualora il tasto-etichetta sia premuto. Le etichette sulle frecce uscenti dauno stato compongono l’insieme dei tasti attivi nello stato in questione. Per rendere più chiarala corrispondenza fra il sistema di transizioni etichettate così definito e la grammatica regolare(4.1), accanto ad ogni stato è specificato il simbolo nonterminale di quella grammatica che adesso corrisponde.

Questo semplice esempio di linguaggio generato tramite grammatiche di diverso tipo cioff re la possibilità di chiarire che grammatiche diverse possono servire a scopi diversi. In par-ticolare, una grammatica libera dal contesto permette di evidenziare la struttura e le categorieconcettuali fondamentali del linguaggio della calcolatrice tascabile, mentre una grammaticaregolare permette di mimare il comportamento della calcolatrice nell’interazione con l’utente.

Riscriviamo ora, usando le stesse convenzioni stabilite per la grammatica regolare G0, lagrammatica originale G:

P ::= On S S ::= E = S | Off | c S E ::= M | E o M M ::= N | MR

N ::= d | N d

(4.2)

Possiamo dimostrare che le grammatiche G e G0 generano lo stesso linguaggio; ne seguiràovviamente che tale linguaggio è regolare.

Proposizione 4.2. Sia G la grammatica in (4.2) e G0 la grammatica in (4.1). Si ha che

L(G) = L(G0).

Dimostrazione. (Schema) Dimostriamo innanzitutto che entrambe le grammatiche seguenti

E ::= d T | MR U T ::= d T | o V | ε

U ::= o V | ε

V ::= MR U | d T,

E ::= M | E o M M ::= N | MRN ::= d | N d

Page 72: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 72/332

Page 73: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 73/332

4.4 Semantica denotazionale della calcolatrice tascabile 73

generano il linguaggioL = m0 o1 m1 o2 . . . ok mk | k

≥0

dove ciascun oi è uno dei quattro simboli di operazione aritmetica e gli mi sono stringhe dicifre numeriche oppure MR. Queste dimostrazioni possono essere realizzate per induzionesulla struttura delle grammatiche date, e vengono lasciate al lettore.

Si osservi ora che ogni derivazione di una stringa del linguaggio tramite la prima gram-matica termina con una riscrittura di uno dei nonterminali T oppure U in ε, quindi, fissatoun simbolo ausiliario , le due grammatiche

E 0 ::= E E ::= d T | MR U T ::= d T | o V | ε

U ::= o V | ε

V ::= MR U | d T,

E ::= d T | MR U T ::= d T | o V | U ::= o V | V ::= MR U | d T,

generano banalmente lo stesso linguaggio. Ora la tesi segue immediatamente confrontando legrammatiche G e G0 ed usando le proprietà appena dimostrate.

4.4 Semantica denotazionale della calcolatrice tascabile

Ricordiamo innanzitutto la sintassi dei programmi accettati dalla calcolatrice tascabile de-scritta nella Sezione 4.2, evitando di trattare dettagliatamente la generazione delle stringhecorrispondenti ai numeri (in maniera simile a quanto fatto nella grammatica (Ga) per leespressioni aritmetiche mostrata in Tabella 3.3):

P ::= On S S ::= E = S | Off | C S E ::= M | E + M | E − M | E ∗ M | E /M M ::= n | MRC ::= M+ | M- | MC | CE/C

Ricordiamo che le categorie sintattiche presenti nel linguaggio sono

• Program : per i programmi;

• Stat : per le sequenze di istruzioni;

• Expr : per le espressioni;

• Numeric : per i numeri oppure il contenuto della cella di memoria;

• Com : per i comandi.

Per ciascuna di tali categorie avremo delle funzioni di interpretazione semantica il cuivalore dipenderà:

1. dal particolare elemento della categoria sintattica in esame;

2. dal numero che risulterà scritto sul visore;

Page 74: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 74/332

74 Capitolo 4 – Sintassi e denotazioni

3. dal contenuto della cella di memoria.

In generale avremo quindi che le funzioni di interpretazione semantica dipenderanno dauno stato globale che verrà passato loro come argomento. Nel nostro caso l’argomento saràla coppia costituita da ciò che appare sul visore e dal contenuto della cella di memoria. Glielementi delle coppie saranno quindi numeri interi oppure stringhe di “errore”. Queste ultimeentreranno in gioco quando si verificano situazioni anormali, che nel nostro caso sono costituitedalla sola divisione per zero.

Di seguito riportiamo il tipo (la natura dei possibili input e dei possibili output) delle fun-zioni di interpretazione semantica per la calcolatrice tascabile; il simbolo INT denota l’insiemedegli interi. Il tipo di ciascuna funzione dovrebbe già dare un’idea circa il comportamentodella funzione stessa.

P : P rogram−→

(INT + e rror)

S : S tat × (INT + e rror) × INT −→ (INT + e rror)

E : E xpr × (INT+ e rror) × INT −→ (INT+ e rror) × INT

N : N umeric × (INT + e rror) × INT −→ (INT + e rror) × INT

C : C om × (INT + e rror) × INT −→ (INT + e rror) × INT

Questi domini chiariscono che le funzioni P ed S associano un numero intero oppure unerrore ad ogni programma. Comunque, mentre P non tiene conto di altro che del programmastesso, la funzione S , oltre che dalla sequenza di comandi, dipende anche dal valore riportatodal visore e dal contenuto della memoria. È importante notare come possibili valori del visoresiano interi oppure la stringa e rror mentre la memoria può contenere solo interi; niente infatti

verrà mai memorizzato se si verifica una condizione di errore.Al momento potrà non essere immediatamente chiaro il significato di alcuni dei costrutti

usati per descrivere il comportamento della calcolatrice; tutta la notazione sarà chiarita nelleprossime sezioni. Solo allora descriveremo tutti i costrutti del nostro metalinguaggio, cioè dellinguaggio che utilizzeremo per parlare dei vari linguaggi di programmazione che prenderemoin esame. Per ora ci affidiamo all’intuizione ed alla fantasia del lettore, anticipando solamenteche i termini del metalinguaggio sono scritti in corsivo, che l’espressione l et x be v i n f significache all’interno di f tutte le occorrenze della variabile x vengono rimpiazzate dal valore v, chela funzione (di tre argomenti) “· → ·, ·” è la funzione condizionale tale che v → v1, v2 è ugualea v1 se v è vero ed a v2 se v è falso, ed infine che la funzione isint(v) è il predicato (cioè, lafunzione booleana) che restituisce t rue se v è un intero e f alse altrimenti (che nel nostro caso

vuol dire che v è e rror).Le funzioni di interpretazione semantica necessarie per specificare completamente il com-

portamento della calcolatrice tascabile, quando le vengono fornite sequenze ben formate dicomandi, sono riportate di seguito.

P : Program −→ INT + e rror

P [[On S ]] = S [[S ]] < 0, 0 >

La semantica di un programma coincide con quella della sequenza di istruzioni che com-pongono il programma stesso quando queste vengono valutate a partire da una memoria ed

Page 75: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 75/332

4.4 Semantica denotazionale della calcolatrice tascabile 75

un visore inizializzati a zero.

S : Stat × (INT+ e rror) × INT −→ (INT+ e rror)

S [[E = S ]] < v,m > = (S [[S ]] E [[E ]]) < v,m > = S [[S ]](E [[E ]] < v,m >)

La semantica di una istruzione del tipo E = S prevede prima la valutazione dell’espressioneE e successivamente quella della sequenza S utilizzando i valori del visore e della memoriadopo la valutazione di E .

S [[C S ]] < v,m > = (S [[S ]] C [[C ]]) < v,m >

La semantica di una istruzione della forma C S prevede prima la valutazione del comandoC e successivamente quella della sequenza S utilizzando i valori del visore e della memoriadopo la valutazione di C .

S [[Off ]] < v,m > = v

Il risultato finale di un programma è il valore riportato sul visore dopo la valutazione ditutte le istruzioni; tale valore può essere un intero oppure la segnalazione del fatto che si èverificato un errore durante uno dei calcoli precedenti.

E : Expr × (INT + e rror) × INT −→ (INT+ e rror) × INT

E [[M ]] < v,m > = isint(v) → N [[M ]] < v,m >,< v, m >

La digitazione di una combinazione di tasti corrispondente ad un numero oppure del tastodi richiamo dal registro di memoria causa la valutazione della sequenza di tasti premutaquando sul visore non è stata segnalata una situazione di errore. Vale la pena notare cheessendo gli unici valori possibili interi ed e rror il test isint(v) equivale a testare che non sisiano verificati errori durante i calcoli precedenti.

E [[E + M ]] < v,m > = l et < v1, m1 > be E [[E ]] < v,m > i nisint(v1) → (l et < v2, m2 > be N [[M ]] < v1, m1 > i n

< v1 + v2, m2 >),< v1, m1 >

Eff ettuare l’operazione di somma fra una espressione ed un oggetto numerico consiste nelvalutare prima l’espressione e verificare che il risultato della valutazione sia un numero intero,quindi nell’eff ettuare l’operazione vera e propria. Se durante la valutazione dell’espressione siverificano condizioni di errore, il risultato finale sarà comunque un errore.

Page 76: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 76/332

76 Capitolo 4 – Sintassi e denotazioni

E [[E

−M ]] < v,m > = l et < v1, m1 > be E [[E ]] < v,m > i n

isint(v1) → (l et < v2, m2 > be N [[M ]] < v1, m1 > i n< v1 − v2, m2 >),

< v1, m1 >

E [[E ∗ M ]] < v,m > = l et < v1, m1 > be E [[E ]] < v,m > i nisint(v1) → (l et < v2, m2 > be N [[M ]] < v1, m1 > i n

< v1 ∗ v2, m2 >),< v1, m1 >

I casi della diff erenza e del prodotto sono analoghi al precedente.

E [[E/M ]] < v,m > = l et < v1, m1 > be E [[E ]] < v,m > i nisint(v1) → (l et < v2, m2 > be N [[M ]] < v1, m1 > i n

(v2 = 0 →< e rror, m2 >,< v1/v2, m2 >)),< v1, m1 >

Nel caso della divisione, invece, dobbiamo controllare che il secondo operando sia diversoda zero; la divisione per zero genera un errore.

N : N umeric

×(INT+ e rror)

×INT

−→(INT + e rror)

×INT

N [[n]] < v,m > = isint(v) →< n, m >, < v,m >

N [[MR]] < v,m > = isint(v) →< m, m >, < v,m >

La valutazione di un oggetto numerico causa l’aggiornamento del visore ed il mantenimentodella cella di memoria, se tale oggetto è stato composto premendo i tasti numerici dellacalcolatrice; altrimenti, il risultato della valutazione è uno stato in cui sia il visore che la celladi memoria hanno il valore che la cella stessa aveva prima di premere il tasto MR.

C : C om × (INT+ e rror) × INT −→ (INT+ e rror) × INT

C [[MC]] < v,m > = isint(v) →< v, 0 >, < v, m >

C [[M+]] < v,m > = isint(v) →< v, m + v >,< v,m >

C [[M-]] < v,m > = isint(v) →< v, m − v >,< v,m >

C [[CE/C]] < v,m > =< 0, m >

Se sul visore non appare una segnalazione di errore, il comando MC azzera la memoria;il comando M+ (M-) somma (sottrae) il contenuto della memoria e il numero riportato sulvisore. Il comando CE/C azzera il visore cancellando eventualmente la segnalazione di erroresu di esso riportato così ripristinando una situazione di normalità.

Page 77: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 77/332

4.5 Espressioni regolari 77

4.5 Espressioni regolari

Nell’Introduzione a queste note abbiamo descritto brevemente i tre approcci più usati perdefinire la semantica di un linguaggio di programmazione. Tali approcci vanno sotto il nomedi “semantica denotazionale”, “semantica operazionale” e “semantica assiomatica”. Chiudiamoquesto capitolo con un esempio in cui utilizziamo tutti e tre gli approcci definendo dellesemantiche consistenti.

Il linguaggio scelto come esempio è quello delle espressioni regolari. Le espressioni regolarisono usualmente utilizzate per rappresentare linguaggi regolari in forma sintetica oppure perdescrivere le sequenze di azioni che un sistema può eseguire o le sequenze di caratteri che unautoma a stati finiti può riconoscere.

Le espressioni regolari possono essere considerate anche come un piccolo linguaggio diprogrammazione. I costrutti da esse usati (sequenzializzazione, scelta, iterazione, processo

nullo) saranno presenti anche nei formalismi e nei linguaggi che analizzeremo nei prossimicapitoli, per cui usare le espressioni regolari come caso di studio risulterà anche propedeutico.

La sintassi (astratta) delle espressioni regolari è la seguente:

E ::= 0 | 1 | a | E + E | E ; E | E ∗ (Ge)

dove a appartiene ad un alfabeto finito A.1 Per semplicità, l’operatore “;” viene talvoltaindicato con la giustapposizione delle due espressioni regolari che ne costituiscono gli argometi.

Nell’interpretazione più comune, un elemento di A è inteso rappresentare un’azione atomi-ca o evento. L’elemento 1 rappresenta l’evento terminale e l’elemento 0 rappresenta l’eventovuoto. Se E ed F sono espressioni regolari E + F rappresenta l’espressione che può esserein alternativa l’espressione E o l’espressione F , l’espressione E ; F rappresenta l’espressione

ottenuta sequenzializzando le espressioni E ed F ed, infine, l’espressione E ∗ rappresenta la ri-petizione di un numero finito (eventualmente nullo) di volte dell’espressione E , cioè la ripetutasequenzializzazione di E con se stessa.

Osserviamo che le descrizioni precedenti costituiscono solo una semantica intuitiva per leespressioni regolari: è difficile stabilire quale possa essere l’interpretazione di una espressionecomposta, come ad esempio

(a + b)∗ oppure (a∗ + b∗)∗.

Per il momento, l’unica aff ermazione che possiamo fare riguardo a queste due espressioniregolari è che esse sono sintatticamente diff erenti. Vediamo allora i vari modi di dare unasemantica formale ed esatta alle espressioni regolari.

4.5.1 Semantica denotazionale

La semantica denotazionale associa ad ogni espressione regolare il linguaggio (ossia, l’insiemedi stringhe) che essa denota. Per definire la funzione di interpretazione semantica, abbiamobisogno di alcune semplici costruzioni sugli insiemi di stringhe.

Se L1 ed L2 sono insiemi non vuoti di stringhe definiamo concatenazione di L1 e di L2 ela denotiamo con L1 · L2, l’insieme

L1 · L2 = xy : x ∈ L1 e y ∈ L2

1Nella sintassi concreta delle espressioni regolari, l’operatore unario ∗ ha precedenza sugli operatori binari+ e ; , mentre l’operatore ; ha precedenza sull’operatore +. Quando necessario useremo le parentesi.

Page 78: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 78/332

78 Capitolo 4 – Sintassi e denotazioni

L[[0]] = ∅L[[1]] = ε

L[[a]] = a (per a ∈ A)

L[[E + F ]] = L[[E ]] ∪ L[[F ]]

L[[E ; F ]] = L[[E ]] · L[[F ]]

L[[E ∗]] = (L[[E ]])∗

Tabella 4.2: Semantica denotazionale delle espressioni regolari

ossia l’insieme di tutte le stringhe ottenibili concatenando una stringa di L1 con una stringa

di L2. Inoltre, poniamo ∅ · L = L · ∅ = ∅. Se L è un insieme di stringhe poniamo anche

L0 = ε,

Ln+1 = L · Ln,

L∗ =[

n≥0Ln.

Si noti che l’insieme Ln è l’insieme delle stringhe composte dalla concatenazione di n stringhedi L, mentre l’insieme L∗ è l’insieme di tutte le stringhe composte dalla concatenazione di unnumero qualsiasi di stringhe di L (compresa la stringa vuota).

Ciò detto siamo in grado di definire la funzione L di interpretazione semantica delle espres-sioni regolari. L’interpretazione di una espressione E sarà scritta come L[[E ]]. La funzioneL è definita per induzione strutturale sui termini del linguaggio dalle regole mostrate nellaTabella 4.2.2

Date due espressioni regolari E ed F diremo che esse sono semanticamente uguali e scrive-remo E ' F se L[[E ]] = L[[F ]]. Useremo invece la notazione E ≡ F per indicare l’uguaglianzasintattica. Risulta per esempio

a + a ' a

infattiL[[a + a]] = L[[a]]

∪L[[a]] = L[[a]].

Esempio 4.3. Vediamo un altro esempio di uguaglianza semantica. Vogliamo dimostrareche

(a + b)∗ ' (a∗ + b∗)∗.

Dimostriamo prima cheL[[(a + b)∗]] ⊆ L[[(a∗ + b∗)∗]]

2Si osservi che nell’ultima regola l’operatore ∗ gioca due ruoli distinti: nella prima occorrenza si trattadell’operatore sintattico ∗ delle espressioni regolari, nella seconda occorrenza si tratta dell’operatore definitoin precedenza sugli insiemi di stringhe.

Page 79: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 79/332

4.5 Espressioni regolari 79

Abbiamo

L[[(a + b)∗]] = L[[(a + b)]]∗ = L[[a]] ∪ L[[b]]∗⊆

(L[[a]])∗ ∪ (L[[b]])∗∗

=

L[[a∗]] ∪ L[[b∗]]∗

=

L[[a∗ + b∗]]∗

= L[[(a∗ + b∗)∗]]

Per dimostrare l’inclusione opposta, bisogna dimostrare che(L[[a]])∗ ∪ (L[[b]])∗

∗ ⊆ L[[a]] ∪ L[[b]]

∗da cui la tesi segue ragionando come nel caso precedente. Sfruttando il fatto che l’operatore_∗ è idempotente, quindi che

L[[a]] ∪ L[[b]]∗ = L[[a]] ∪ L[[b]]∗∗sarà allora sufficiente dimostrare che

(L[[a]])∗ ∪ (L[[b]])∗∗ ⊆

L[[a]] ∪ L[[b]]∗∗

A tale scopo, sia s ∈ L[[a]]∗∪L[[b]]∗∗. Ciò significa che o s = e quindi s ∈ L[[a]]∪L[[b]]

∗∗per definizione, oppure per un qualche n ≥ 1, si ha s = s1s2 · · · sn e si ∈ L[[a]]∗ oppuresi ∈ L[[b]]∗, per ogni 1 ≤ i ≤ n. Dato che L[[a]]∗ ⊆ (L[[a]] ∪ L[[b]])∗ e L[[b]]∗ ⊆ (L[[a]] ∪ L[[b]])∗, daciò segue che si ∈

L[[a]] ∪ L[[b]]

∗, per ogni 1 ≤ i ≤ n, e quindi s ∈ L[[a]] ∪ L[[b]]∗∗.

Si potrebbe dimostrare che la semantica denotazionale delle espressioni regolari soddisfale seguenti semplici proprietà:

E + (F + G) ' (E + F ) + GE + 0 ' E

E (F G) ' (E F ) GE (F + G) ' E F + E G

0 E ' 0

E ∗ ' 1 + E ∗ E 0∗ ' 1

E + F ' F + E E + E ' E

(E + F ) G ' E G + F G

1 E ' E

E ∗ ' (1 + E )∗

dove E , F , G sono generiche espressioni regolari e l’operatore ; è stato indicato con lagiustapposizione.

4.5.2 Semantica operazionale

Introduciamo adesso una semantica operazionale per le espressioni regolari, vale a dire un “meccanismo di esecuzione”.

Diamo prima un’idea intuitiva del meccanismo. Se a ∈ A è un’espressione atomica, pos-siamo immaginare che l’esecuzione di a corrisponda per esempio a stampare il simbolo a.L’esecuzione dell’espressione composta E + F dovrà consistere di tutte le azioni di E o, in al-ternativa, di tutte le azioni di F . L’esecuzione dell’espressione composta E ; F dovrà consisteredelle azioni di E seguite dalle azioni di F .

Page 80: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 80/332

80 Capitolo 4 – Sintassi e denotazioni

(Tic)1 ε−→ 1

(Atom)a a−→ 1

a∈

A

(Sum1) E

µ−→ E 0

E + F µ−→ E 0

(Sum2) F

µ−→ F 0

E + F µ−→ F 0

(Seq1) E

a−→ E 0

E ; F a−→ E 0; F

(Seq2) E

ε−→ 1

E ; F ε−→ F

(Star1)E ∗ ε−→ 1

(Star2) E

µ−→ E 0

E ∗ µ−→ E 0; E ∗

Tabella 4.3: Semantica operazionale delle espressioni regolari (µ

∈A

∪ε)

Formalmente, la definizione della semantica operazionale si basa sulla relazione E µ−→ F ,

dove µ ∈ A ∪ ε, definita come la più piccola relazione che soddisfa gli assiomi e le regole diinferenza in Tabella 4.3.

Di seguito commentiamo brevemente il comportamento delle espressioni.

1 - L’espressione 1 può essere interpretata come lo stato di arresto. La macchina ha finito dieseguire le azioni ed adesso continua a ciclare eseguendo l’azione vuota.

a - L’espressione a è in grado di eseguire l’azione a per poi arrestarsi.

E + F - L’espressione E + F si può comportare come E o come F per cui se E evolve in E 0con l’azione µ allora E + F può evolvere in E 0 con l’azione µ ed analogamente per F .

E ; F - L’espressione E ; F deve eseguire le azioni di E e poi quelle di F . Per cui se E evolvein E 0 con l’azione a allora E ; F evolve in E 0; F con l’azione a. Se invece E ha finito ilsuo lavoro per cui evolve in 1 con ε allora F può partire per cui E ; F evolve in F .

E ∗ - L’espressione E ∗ può evolvere direttamente in 1 oppure evolvere in E 0; E ∗ se E evolvein E 0.

0 - Per l’espressione 0 non ci sono regole. Questo fa in modo che l’espressione 0 non possaeseguire nessuna azione. L’espressione 0 rappresenta quindi la macchina bloccata.

Definizione 4.4. Sia E un’espressione regolare e sia s ∈ A∗ una stringa. Scriveremo E s=⇒ E 0

se esistono µ1, . . . , µn ∈ A ∪ ε ( n ≥ 0) tali che:

1. la stringa µ1 . . . µn coincide (a meno di occorrenze di ε) con la stringa s,

2. risulta E

µ1−→ E 1µ2−→ E 2

µ3−→ . . . µn−→ E n ≡ E 0.

Definiamo l’insieme delle tracce di E come l’insieme di stringhe

Tracce (E ) = s∈

A∗ : E s=⇒

1,

Page 81: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 81/332

4.5 Espressioni regolari 81

ossia l’insieme delle stringhe s che ammettono una computazione terminante di E .Due espressioni regolari E ed F si dicono equivalenti a tacce, scritto E ∼= F , se Tracce (E ) =

Tracce (F ).

Esempio 4.5. Vediamo, anche in questo caso, che E ≡ (a + b)∗ e F ≡ (a∗ + b∗)∗ risultanoequivalenti, ossia

Tracce((a + b)∗) ∼= Tracce((a∗ + b∗)∗).

Proviamo che se s è una traccia di E (ossia E s=⇒ 1) allora s è una traccia anche di F

(il viceversa è lasciato per esercizio). Procediamo per induzione sulla lunghezza di s. Se|s| = 0 (ossia, s = ε) allora non c’è nulla da dimostrare perché è vero che F

ε−→ 1 (si applical’assioma Star1). Se |s| > 0 allora s = as0 oppure s = bs0. Senza perdita di generalità possiamo

assumere s = as0. Le uniche transizioni che E può eseguire tramite a sono E

a

=⇒ 1; E e E

a

=⇒ E giustificate da

(Atom)a

a−→ 1(Sum1)

a + b a−→ 1

(Star2)(a + b)∗ a−→ 1; (a + b)∗

(T ic)1

ε−→ 1(Seq 2)

1; (a + b)∗ ε−→ (a + b)∗

Inoltre, per ipotesi, E as0==⇒ 1 per cui dev’essere o 1; E

s0=⇒ 1 oppure E

s0=⇒ 1. In ogni caso

segue E s0=⇒ 1. Quindi, per ipotesi induttiva, F

s0=⇒ 1. Basta allora dimostrare che F

a=⇒ F

per ottenere F s=

⇒ 1. Ora, F

a=

⇒ F è giustificata da

(Atom)a

a−→ 1(Star2)

a∗ a−→ 1; a∗(Sum1)

a∗ + b∗ a−→ 1; a∗(Star2)

(a∗ + b∗)∗ a−→ 1; a∗; (a∗ + b∗)∗

(T ic)1

ε−→ 1(Seq 2)

1; a∗; (a∗ + b∗)∗ ε−→ a∗; (a∗ + b∗)∗

(Star1)a∗ ε−→ 1

(Seq 2)a∗; (a∗ + b∗)∗ ε−→ (a∗ + b∗)∗

che dimostrano che F a−→ ε−→ ε−→ F .

Vediamo ora come associare ad ogni espressione regolare una macchina astratta che descri-ve l’esecuzione dell’espressione stessa. Più precisamente, utilizzando la relazione di transizioneintrodotta per le espressioni regolari, associamo ad ogni espressione regolare un automa a statifiniti.

Definizione 4.6. Sia E un’espressione regolare, definiamo l’automa a stati finiti associatoad E come

M E =

QE , A, →E , E, 1

dove

Page 82: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 82/332

82 Capitolo 4 – Sintassi e denotazioni

Figura 4.3: Automi corrispondenti a (a + b)∗ e (a∗ + b∗)∗

• QE = F : ∃s ∈ A∗ tale che E s=⇒ F è l’insieme degli stati dell’automa ed è costituito

dalle espressioni raggiungibili a partire da E ;

• A è l’alfabeto dell’automa (e coincide con quello dell’espressione regolare);

• →E è la relazione di transizione tra stati in QE ed è definita da F µ−→E F 0 se F

µ−→ F 0

con µ ∈ A ∪ ε;• lo stato iniziale è rappresentato dall’espressione E ;

• l’unico stato finale è rappresentato dall’espressione 1.

La Figura 4.3 riporta come esempio gli automi associati alle espressioni regolari (a + b)∗

e (a∗ + b∗)∗. Si osservi che la transizione

(a∗ + b∗)∗ b−→ 1; b∗; (a∗ + b∗)∗

che serve a costruire l’automa di destra nella figura viene derivata nel modo seguente:

(Atom)

b b−→ 1

(Star2)

b∗ b−→ 1; b∗(Sum2)

a∗ + b∗ b−→ 1; b∗(Star2)

(a∗ + b∗)∗ b−→ 1; b∗; (a∗ + b∗)∗

Vogliamo ora dimostrare che l’insieme delle stringhe che un’espressione E può produrredurante la sua esecuzione, secondo la semantica operazionale data, coincide con il linguaggioriconosciuto dall’automa M E associato all’espressione E .

Page 83: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 83/332

4.5 Espressioni regolari 83

Teorema 4.7. Sia E un’espressione regolare ed M E l’automa a stati finiti ad essa associato.Allora

Tracce (E ) = L(M E )

dove L(M E ) è il linguaggio riconosciuto da M E .

Dimostrazione. Si ricordi (vedere Sezione 3.4) che la relazione a−→E dell’automa dà luogo a

una relazione a=⇒E e che L(M E ) = s ∈ A∗ : E

s=⇒E 1.

(⊆) Se w ∈ Tracce(E ), allora E w=⇒ 1. Proviamo per induzione sulla lunghezza di w che

w ∈ L(M E ). Se |w| = 0, cioè E ε=⇒ 1, allora per definizione E

ε=⇒E 1, e quindi ε ∈ L(M E ).

Sia allora w = aw0, abbiamo

E a=⇒ E 1

w0

=⇒ 1.

Per ipotesi induttiva w0

∈ L(M E 1) ossia E 1

w0

=

⇒E 1. La tesi segue allora osservando che,

sempre per definizione,E

a=⇒ E 1 implica E

a=⇒E E 1.

(⊇) Procediamo di nuovo per induzione sulla lunghezza di w ∈ L(M E ) e proviamo che w ∈Tracce(E ). Il caso base è banale. Se w = aw0 per un certo w 0, abbiamo per ipotesi

E a=⇒E E 0 w0

=⇒E 1.

Quindi E a=⇒ E 0 inoltre, per ipotesi induttiva, w0 ∈ Tracce(E 0), per cui E 0 w0

=⇒ 1. Ne segueE

w=⇒ 1.

Possiamo vedere la semantica operazionale come la specifica del comportamento desideratoper ogni implementazione del linguaggio delle espressioni regolari e l’associazione con gliautomi come una eff ettiva implementazione del linguaggio.

Vogliamo ora determinare le relazioni esistenti tra la semantica operazionale e la seman-tica denotazionale data in precedenza per le espressioni regolari. In particolare vogliamodimostrare che esse sono in accordo. Più precisamente, dimostreremo che il linguaggio chela semantica denotazionale associa ad una espressione regolare coincide con l’insieme delletracce della stessa espressione, e quindi, per il teorema precedente, con il linguaggio accettatodall’automa ad essa associato.

Teorema 4.8. Sia E un’espressione regolare. Allora

w ∈ Tracce (E ) ⇐⇒ w ∈ L[[E ]].

Dimostrazione. (=⇒) Procediamo per induzione sulla struttura di E .

E ≡ 0 Banale, perché Tracce(0) = ∅ = L[[0]].

E ≡ 1 Banale, perché Tracce(1) = ε = L[[1]].

E ≡ a Banale, perché Tracce(a) = a = L[[a]].

E ≡ E 1 + E 2 Se w ∈ Tracce(E 1 + E 2), allora esistono µ ∈ A ∪ ε e w 0 ∈ A∗ con w = µw0 e

E 1 + E 2µ

−→F

w0

=⇒

1,

Page 84: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 84/332

84 Capitolo 4 – Sintassi e denotazioni

dove la prima transizione è ottenuta applicando una delle due regole relative all’operatoredi somma. Quindi abbiamo che

E 1µ−→ F

w0

=⇒ 1 oppure E 2µ−→ F

w0

=⇒ 1.

Per ipotesi induttiva allora

w ∈ L[[E 1]] oppure w ∈ L[[E 2]]

da cui w ∈ L[[E 1]] ∪ L[[E 2]] = L[[E 1 + E 2]].

E ≡ E 1; E 2 Se w ∈ Tracce(E 1; E 2), cioè E 1; E 2w

=⇒ 1, allora si potrebbe dimostrare cheesistono due stringhe x e y tali che w = xy e

E 1x

=⇒ 1 e E 2y

=⇒ 1.

Quindi, per ipotesi induttiva abbiamo che

x ∈ L[[E 1]] e y ∈ L[[E 2]],

da cui w ∈ L[[E 1]] · L[[E 2]] = L[[E 1; E 2]].

E ≡ E ∗1 Indichiamo con S (E ∗1 , w) il numero di volte che la regola Star2 viene applicata nellasequenza di transizioni E ∗1

w=⇒ 1 e dimostriamo per induzione (locale) su n = S (E ∗1 , w)

chew ∈ Ln[[E 1]]. (Ln[[E 1]] sta per (L[[E 1]])n)

Se S (E ∗1 , w) = 0, cioè Star2 non viene mai usata, allora vuol dire che è stata usata Star1,quindi w = ε. Infatti la semantica operazionale dell’operatore ∗ è modellata dalle dueregole Star1 e Star2. La tesi segue dal fatto che, per definizione, si ha ε = ε

∈L0[[E 1]].

Se invece S (E ∗1 , w) = n + 1, allora si ha che esistono due stringhe x, y tali che w = xy e

E ∗1x

=⇒ E ∗1y

=⇒ E ∗1ε−→ 1,

con S (E ∗1 , x) = n, per cui per ipotesi induttiva (locale) x ∈ Ln[[E 1]]. Dato che S (E ∗1 , y) =

1, abbiamo che la regola Star2 deve essere applicata esattamente una volta in E ∗1y

=⇒ E ∗1per cui devono esistere µ ∈ A ∪ ε ed y 0 ∈ A∗ tali che y = µy 0, E 1

µ−→ E 0 e

E ∗1µ−→ E 0; E ∗1

y0

=⇒ E ∗1 .

Dato che E 0; E ∗1y0

=⇒ E ∗1 non usa la regola Star2 abbiamo E 0 y0

=⇒ 1, da cui

E 1µy0

==⇒

1

e quindi, per l’ipotesi induttiva strutturale, y ∈ L[[E 1]] che insieme a x ∈ Ln[[E 1]] dà latesi.

(⇐=) Procediamo per induzione sulla struttura di E . Per semplicità, trattiamo in dettagliosolo il caso E = E ∗1 . Se w ∈ L[[E ∗1 ]], allora esiste n tale che w ∈ Ln[[E 1]]. Quindi esistonox1, . . . , xn ∈ L[[E 1]] tali che w = x1 · · · xn. Per ipotesi induttiva xi ∈ Tracce(E 1), ossiaE 1

xi=⇒ 1 da cui, applicando Star2 e (più volte) Seq 1, si ricava E ∗1x1=⇒ 1; E ∗1 . Dato che

1; E ∗1ε−→ E ∗1 , per la Seq2, e E ∗1

ε−→ 1, per la Star1, abbiamo

E ∗1x1=⇒ 1; E ∗1

x2=⇒ 1; E ∗1 · · · xn=⇒ 1; E ∗1

ε−→ 1

per cui E ∗1w

=

⇒1, cioè per definizione w

∈Tracce(E ∗1).

Page 85: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 85/332

4.5 Espressioni regolari 85

4.5.3 Semantica assiomatica

Vediamo infine una semantica assiomatica per le espressioni regolari. Diamo cioè un insiemedi assiomi e di regole di inferenza che definiscono una relazione di binaria sull’insieme delleespressioni regolari. Denoteremo con l’uguaglianza E = F il fatto che le espressioni regolariE e F sono uguagliate da tale sistema di inferenza (ossia il fatto che esiste una derivazione diE = F ).

Prima di introdurre il sistema di inferenza abbiamo bisogno della seguente definizione.

Definizione 4.9. Una espressioni regolare E si dice possedere la proprietà di produrre la stringa vuota se una delle seguenti tre condizioni è verificata:

• E ≡ E ∗1 per un certo E 1,

• E è una somma di espressioni regolari ed una di queste possiede la proprietà di produrre la stringa vuota,

• E è una sequenzializzazione di espressioni regolari ciascuna delle quali possiede la proprietà di produrre la stringa vuota.

La Tabella 4.4 riporta gli assiomi e le regole del sistema di inferenza (gli assiomi sono statidivisi in gruppi e agli assiomi ed ai gruppi stessi sono stati dati dei nomi; per semplificare lenotazioni, per denotare l’operatore di sequenzializzazione è stata usata la giustapposizione).

Facciamo alcune osservazioni sul sistema di inferenza presentato. Innanzitutto si puòosservare che gli assiomi e le regole risultano “sensati” ossia coerenti con la nostra intuizionesul significato delle espressioni regolari. Non è difficile vedere (e lo abbiamo già osservato

nella Sezione 4.5.3) che gli assiomi sono coerenti anche con la semantica denotazionale. Peresempio, l’assioma 0E = 0 è in accordo con il fatto che

L[[0E ]] = L[[0]] · L[[E ]] = ∅ · L[[E ]] = ∅ = L[[0]].

Tuttavia rispetto alle semantiche viste fin’ora, mostrare che due espressioni regolari sonouguali risulta più difficile. Si osservi per esempio che anche il fatto che per ogni espressioneregolare E risulta E = E , cioè che = è una relazione riflessiva , richiede una dimostrazioneche è basata sulla sola applicazione della regola di sostituzione:

E + E = E E + E = E (regola1)

E = E E = E + E

Dimostriamo ora che E = F implica F = E , cioè che = è simmetrica . Lo facciamo applicandoancora la regola di sostituzione:

E = F E = F (regola1)

F = F F = E

Infine, dimostriamo che E = F e F = G implicano E = G, cioè che = è transitiva . Anche inquesto caso, la dimostrazione segue dalla applicazione della regola di sostituzione:

E = F E = F (regola1)

F = E F = G(regola1)

E = G

Page 86: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 86/332

86 Capitolo 4 – Sintassi e denotazioni

Assiomi:

E + (F + G) = (E + F ) + GE + F = F + E E + 0 = E

(assoc +)(comm +)(neutro +)

(monoide+)

E (F G) = (E F ) G1 E = E

(assoc ;)(neutro ;)

(monoide ;)

E (F + G) = E F + E G(E + F ) G = E G + F G0 E = 0

(distribS)(distribD)(assorb 0)

(modulo +, ;)

E + E = E

(idempotenza +)

E ∗ = 1 + E ∗ E

E ∗ = (1 + E )∗0∗ = 1

(unfolding)

(assorb *)(00) (regole *)

Regola 1 (Sostituzione):E = F G = H

G0 = H G0 = G

dove G 0 è ottenuta da G rimpiazzandouna occorrenza di E con F

Regola 2 (Soluzione di equazioni):E = E F + G

E = G F ∗se F non possiede la proprietàdi produrre la stringa vuota

Tabella 4.4: Semantica assiomatica delle espressioni regolari

Da tutto ciò segue che = è una relazione equivalenza .Come altro esempio, mostriamo ora che E 0 = 0 (durante l’inferenza, faremo più volte

implicitamente uso del fatto che = è simmetrica)

(absorb0)00∗ = 0

(absorb0)0 = 00 E 0 = E 0

(regola1)E 00 = E 0

(neutro+)E 0 + 0 = E 0

(regola1)E 00 + 0 = E 0

(regola2)E 0 = 00∗

(regola1)E 0 = 0

Come si vede, le dimostrazioni anche di semplici uguaglianze diventano laboriose. Ci si puòallora chiedere quale sia il potere dimostrativo di questo sistema di inferenza e quale sia lasua relazione con la semantica denotazionale. Si può dimostrare che

E = F è derivabile dal sistema di inferenza

se e solo seL[[E ]] = L[[F ]].

Se diciamo che una uguaglianza E = F è valida quando L[[E ]] = L[[F ]], allora possiamo chie-derci se il sistema di inferenza dimostra solo uguaglianze valide (correttezza ) e se le dimostra

Page 87: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 87/332

4.5 Espressioni regolari 87

tutte (completezza ), cioè se è vero che se una uguaglianza è valida allora essa è dimostrabi-le dal sistema di inferenza. La dimostrazione della correttezza è immediata ed è già stata

indirettamente osservata alla fine della Sezione 4.5.1. La dimostrazione della completezza èinvece delicata e in queste note ci limitiamo a dimostrare la completezza per l’insieme delleespressioni regolari che non usano l’operatore ∗.

Cominciamo con l’introdurre il concetto di forma normale per espressioni regolari senza ∗.

Definizione 4.10. Una espressione regolare senza ∗ si dice in forma normale se è o 1 oppure della forma X

i∈I

si

dove I è un insieme (finito) di indici, si ∈ A+ e si 6= s j per i 6= j .

Se I =∅

allora s’intende che Pi∈I

si = 0.

Proposizione 4.11. Se E è un’espressione regolare senza ∗, allora esiste un’espressione re-golare E 0 in forma normale tale che E = E 0 è derivabile con il sistema di inferenza della Tabella 4.4 (senza l’uso delle regole-∗ e della regola 2).

Dimostrazione. Procediamo per induzione strutturale su E .- Se E ≡ 0, 1, a non c’è nulla da dimostrare.- Se E ≡ E 1 + E 2 allora per induzione, e grazie alla regola di sostituzione, abbiamo E =P

i∈I si + P

j∈J t j e quindi, a meno di raccogliere tutti gli addendi in un’unica somma permezzo dell’associatività e di eliminare gli addendi ripetuti per mezzo dell’idempotenza, E èin forma normale.- Se E

≡ E

1E 2

allora per induzione, e grazie alla regola di sostituzione, abbiamo E =Pi∈I si

P j∈J t j e quindi, per la proprietà distributiva, E = Pi∈I

P j∈J si t j ossia E =P

k∈K uk dove K = I × J ed uk = si t j per k = (i, j). Per cui, a meno di eliminare gliaddendi ripetuti per mezzo dell’idempotenza, E è in forma normale.

Siamo ora in grado di dimostrare la completezza del sistema di inferenza per le espressioniregolari che non usano l’operatore ∗.

Teorema 4.12. Se E ed F sono espressioni regolari senza ∗ ed

L[[E ]] = L[[F ]]

allora

E = F è derivabile dal sistema di inferenza della Tabella 4.4 (senza l’uso delle regole-∗ e della regola 2).

Dimostrazione. Per la proposizione precedente esistono due forme normali E 0 ed F 0 tali chele uguaglianze E = E 0 ed F = F 0 siano derivabili. Si noti che se E 0 ≡ 1 allora, data l’ipotesiL[[E ]] = L[[F ]], segue che F 0 ≡ 1 (e viceversa). Supponiamo quindi che E 0 ≡ Pi∈I si edF 0 ≡ P

j∈J t j . Basta quindi dimostrare che E 0 = F 0, dopodicheé la tesi segue applicando laregola di sostituzione. Dalla correttezza degli assiomi segue L[[E ]] = L[[E 0]] e L[[F ]] = L[[F 0]]e quindi, data l’ipotesi L[[E ]] = L[[F ]], segue che L[[E 0]] = L[[F 0]]. Usando la definizione di L(Tabella 4.2) abbiamo

L[[E 0]] = L[[Pi∈I

si ]] = Si∈I

L[[si]] = Si∈I

si = si : i∈

I

Page 88: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 88/332

88 Capitolo 4 – Sintassi e denotazioni

ed analogamenteL[[F 0]] = t j : j

∈J .

Per cui, eventualmente applicando l’assioma di commutatività della somma, abbiamo chePi∈I si =

P j∈J t j , ossia E 0 = F 0.

4.6 Esercizi

4.1 Fornire la semantica denotazionale dei numeri in base 5, usando come dominio semantico inaturali.

4.2 Considerare una variante della calcolatrice tascabile in cui il tasto M- sottrae il contenuto dellamemoria a quello del visore.

4.3 Considerare una calcolatrice tascabile che ha una memoria con tre registri (a,b,c) a cui si accede

premendo i tasti MC, M+, M-, MR e poi il tasto On 1, 2, 3 volte, rispettivamente.

4.4 Modificare la sintassi e la semantica della calcolatrice tascabile in modo da distinguere i tastiCE (cancellazione dopo errore) e C (cancellazione senza errore).

4.5 Descrivere in modo informale i linguaggi specificati dalle seguenti espressioni regolari:a) (a; a)∗; (b; b)∗,a) (a∗; b∗; c∗)∗,b) (a; a; a + a; a; a; a)∗.

4.6 Si provi che L[[(a + b)∗]] = L[[(a∗ + b∗)∗]].

4.7 Costruire gli automi associati alle espressioni regolari a; (b + c) e a; b + a; c.

4.8 Si provi che Tracce((a + b)∗) = Tracce((a∗ + b∗)∗).

4.9 Siano E ed F espressioni regolari e sia s una stringa, si provi che se E ; F s=⇒ 1, allora esistono

delle stringhe x e y tali che s = xy e E x=⇒ 1, F

y=⇒ 1.

4.10 Si dimostrino le seguenti uguaglianze usando il sistema di inferenza della semantica assiomatica:

a) E = F =⇒ F = E d) E ∗ + 1 = E ∗

b) E 1 = E e) E ∗ + E = E ∗

c) E = F =⇒ E ∗ = F ∗ F ) 0∗∗ = 0∗

Page 89: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 89/332

Parte II

Sistemi Sequenziali

Page 90: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 90/332

Page 91: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 91/332

Capitolo 5

λ-calculus

SOMMARIO

Questo capitolo presenta il λ-calculus, un sistema formale che ha un ruolo importante nello studio dei fondamenti dei linguaggi di programmazione. Il λ-calculus fornisce infatti sia una notazione semplice per la rappresentazione di funzioni nonché di altri importanti concetti di

programmazione, sia un sistema di calcolo basato su un insieme di regole di riduzione che consente di studiare le proprietà semantiche di funzioni e programmi.

Le funzioni giocano un ruolo importante nella definizione della semantica dei linguaggi diprogrammazione, poiché il significato di un programma sequenziale può essere considerato unafunzione dai valori in input a quelli in output. Inoltre, le funzioni hanno un ruolo essenzialein matematica, e infatti gran parte della teoria delle funzioni, comprese le questioni cheriguardano la computabilità, furono sviluppate come parte della logica matematica primaancora della nascita dei calcolatori. Tant’è vero che negli anni ’30 del secolo scorso, il logicoamericano Alonzo Church ideò il λ-calculus [Chu41, Bar84, Bar90] come sistema formale perdefinire in modo non ambiguo funzioni e manipolarle in maniera puramente sintattica.

Originariamente, quindi, il λ-calculus fu sviluppato come un ramo della logica matemati-ca per definire formalmente la nozione di funzione calcolabile, in alternativa alla teoria degliinsiemi. Infatti, un modo semplice per definire le funzioni è quello di vederle come insiemi dicoppie ordinate. Una funzione f : A → B è stata definita (si veda la Definizione 2.12) comeun sottoinsieme del prodotto cartesiano A × B: così (a, b) ∈ f se e solo se la f assume valore b sull’argomento a. Tale definizione tuttavia non considera in alcun modo l’aspetto compu-tazionale delle funzioni, vale a dire il processo che dall’argomento conduce al valore. Inoltre,essa non consente di descrivere in modo chiaro e semplice i meccanismi che permettono di co-struire nuove funzioni a partire da funzioni già definite. Un tipico esempio che illustra questedifficoltà è dato dai funzionali , vale a dire funzioni che hanno funzioni fra i loro argomenti oche producono funzioni come risultato. Al contrario, il λ-calculus, come altri formalismi qualile funzioni ricorsive o le macchine di Turing, descrive come, mediante regole di riscrittura,determinare meccanicamente i valori associati ad ogni argomento e come comporre funzioni,risolvendo così i problemi summenzionati in modo naturale ed elegante. Inoltre, l’estremasemplicità del sistema di calcolo lo rende interessante come modello per lo studio di proprietà.

Nella teoria della computabilità il λ-calculus ha permesso di formalizzare una risposta(negativa) al problema della decisione di Hilbert. Il potere espressivo del formalismo è infattiequivalente a quello delle macchine di Turing, come appunto la tesi di Church-Turing sostiene:il λ-calculus (non tipato) può esprimere e calcolare tutte le funzioni eff ettivamente calcolabili.

Page 92: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 92/332

92 Capitolo 5 – λ-calculus

Il λ-calculus tuttavia enfatizza l’uso delle regole di riscrittura più che l’operato delle macchineche implementano le regole. Il metodo di riscrittura è il calcolo.

Il λ-calculus ha anche avuto un ruolo importante nella teoria dei linguaggi di program-mazione e ha fornito contributi importanti anche alla definizione formale della semantica deilinguaggi di programmazione:

• tutti i linguaggi di programmazione funzionali (quali Lisp, ML, Scheme, Haskell) sono so-stanzialmente derivati direttamente dal λ-calculus che a sua volta può essere considerato‘il più semplice linguaggio di programmazione’;

• sebbene sia capace di rappresentare tutte le funzioni calcolabili, la semplicità dellasua sintassi e della sua semantica forniscono uno strumento eccellente per studiare ilsignificato dei concetti dei linguaggi di programmazione;

• la semantica denotazionale, uno degli approcci più utilizzati per specificare formalmentela semantica dei linguaggi, ha avuto origine dalla ricerca nel campo del λ-calculus e falargamente uso della notazione fornita dal λ-calculus per esprimere funzioni di ordinesuperiore.

5.1 La λ-convenzioni semplificative

Una funzione può essere descritta da un’espressione E che contiene simboli di funzioni giàdefinite (o di cui assumiamo implicitamente di conoscere già il significato) e variabili. Scrivia-mo E (x , y , . . . ) per indicare che l’espressione E contiene le variabili x, y , . . . . In particolare,

se E (x) è un’espressione che contiene la sola variabile x ed a è un valore in un opportunodominio D, indichiamo con E (a) il valore che la funzione descritta dall’espressione E assumequando il parametro formale x viene rimpiazzato con il valore attuale a. E (a) è un elementodi un altro dominio di valori D 0. Vista come insieme di coppie, la funzione descritta da E è

(a, E (a)) | a ∈ D.

Non tutte le espressioni possono essere considerate funzioni; esse infatti non sempre ga-rantiscono la univocità del loro valore, quando le loro variabili vengono istanziate. Dicendoad esempio “calcoliamo la funzione x − y per gli argomenti 7 e 20”, può non essere chiarose x = 7 e y = 20 o viceversa. Inoltre considerando “x − y” come una funzione di una solavariabile, non sappiamo se essa è una funzione f di x oppure una g di y .

Per evitare ambiguità ed imprecisioni è necessario essere più specifici. Ad esempio, perdefinire la funzione successore per i numeri naturali in modo preciso, scriviamo:

f, dove f (x) = x + 1 per tutti gli interi non negativi x.

Questa definizione individua inequivocabilmente l’insieme

(x, x + 1) | x ∈ N .

Inoltre, considerando funzioni di due variabili, possiamo distinguere la funzione h, dove

h(x, y) = x−

y

Page 93: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 93/332

5.1 La λ-convenzioni semplificative 93

dalla k , dovek(y, x) = x

−y,

cosicché h(5, 3) = 5 − 3 mentre k(5, 3) = 3 − 5.Considerando ancora l’espressione E (x, y) = x − y, possiamo quindi distinguere

g1(x) = x − y e g2(y) = x − y,

in modo tale che ad esempio

g1(0) = 0 − y, g1(5) = 5 − y, g2(3) = x − 3.

Eff ettivamente, questa soluzione permette di evitare ambiguità e di caratterizzare univo-camente quelle espressioni che rappresentano funzioni; essa, però, oltre a richiedere descrizioni

lunghe, ha lo svantaggio di richiedere che venga dato un nome ad ogni funzione definita. Inol-tre, in alcune situazioni può non essere chiaro come procedere nel definire una funzione: siconsideri ad esempio il caso in cui la funzione si ottenga come risultato dell’applicazione diun’altra funzione ad un valore, oppure addirittura ad un’ulteriore funzione.

Per evitare questi problemi e per avere una notazione più compatta, Alonzo Church haintrodotto un’operazione che è nota come λ-astrazione. Essa permette di specificare unafunzione ed i suoi argomenti nel modo seguente:

Sia E un’espressione la cui variabile può assumere valori in un dominio D. Lafunzione

f : D → D0

definita daf x = E, ∀x ∈ D

viene scrittaλx : D.E.

Quando il dominio D è evidente dal contesto si scrive semplicemente λx.E .

La costruzione che prevede la giustapposizione del prefisso λx. ad una espressione E vienechiamata λ-astrazione o semplicemente astrazione. Essa può essere vista come un “costrut-tore” di funzioni; al contrario, l’applicazione di funzione è un “distruttore” di funzioni. Lastringa λx. stabilisce un legame per tutte le occorrenze della variabile x in E per le quali nonvi è un legame più interno. Intuitivamente, x è il parametro formale della funzione.

Per associare ad una λ-espressione un “nome”, questo viene scritto a sinistra del simbolo “≡”, mentre l’espressione viene scritta alla sua destra. Ad esempio, per associare il nomesucc alla funzione λx.x + 1, scriveremo: succ ≡ λx.x + 1. In eff etti con h ≡ T intendiamoche h rappresenta integralmente T . Questo, oltre ad essere un modo per attribuire un nomealla espressione T , stabilisce anche che ogni volta che si voglia considerare un’espressionecontenente il simbolo h, questo è una sorta di segnaposto per T .

La λ-astrazione, come descritta sopra, permette di “legare” una sola variabile, e quindidi definire solo funzioni unarie. Le funzioni di più variabili vengono descritte come defini-zioni successive di funzioni unarie. Spesso, per semplicità, rappresenteremo funzioni di piùargomenti omettendo i “λ” ripetuti; ad esempio, λxyz.E sarà un’abbreviazione di λx.λy.λz.E .

Page 94: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 94/332

94 Capitolo 5 – λ-calculus

Se consideriamo le espressioni sopra menzionate, abbiamo allora

g1 ≡ λx.x − y g2 ≡ λy.x − yh ≡ λx.λy.x − y k ≡ λy.λx.x − y

e conseguentementeg1(0) ≡ (λx.x − y)(0) = 0 − y,g2(3) ≡ (λy.x − y)(3) = x − 3,h(5)(3) ≡ (λx.λy.x − y)(5)(3) = 5 − 3.

Altri esempi di λ-astrazione sono

λx.x + 1 λx.λy.x + 1λx.x ∗ x λx.(x = 7) → x − 1, x + 1.

Si osservi che, mentre il termine λx.x + 1 rappresenta la funzione successore, il termineλx.λy.x + 1 rappresenta una funzione che applicata a due argomenti è uguale alla funzionesuccessore sul primo dei due. La notazione “ p → e1, e2” indica la funzione condizionale , cheassume il valore di e1 se il predicato p è vero, di e2 se p è falso.

In tutti gli esempi appena visti, abbiamo evitato di scrivere il tipo dei parametri for-mali della funzione che stiamo definendo; quando potranno sorgere ambiguità scriveremoesplicitamente i domini coinvolti nella definizione della funzione.

Nella λ-notazione, un’espressione può essere applicata ad un argomento di tipo opportuno;l’operazione di applicazione viene rappresentata come semplice giustapposizione; le parentesiattorno all’argomento non sono più necessarie e, quando ritenute inutili, saranno omesse. Peresempio

(λx.x + 1) 2 = 2 + 1 = 3

e, se plus ≡ (λxy.x + y), alloraplus 2 3 = 5.

Per valutare l’espressione (λx.E (x))d bisogna sostituire d a quelle occorrenze di x in E chenon sono legate da “λ” più interni; tali x vengono dette libere . Gli esempi seguenti illustranoquesta gestione del meccanismo di sostituzione del parametro attuale a quello formale:

(λx.(λx.x))2 = λx.x 6= λx.2(λy.(λx.y))3 = λx.3.

Tuttavia questo processo di sostituzione non è del tutto banale, perché bisogna assicurarsiche esso non produca conflitti tra i nomi delle variabili. In un’espressione λx.E , il nome x dellavariabile legata non è rilevante per il significato della funzione; esso serve solo ad identificarele occorrenze del parametro formale nel corpo E della funzione. Possiamo dunque consideraresintatticamente uguali, in quanto intercambiabili, quelle espressioni che diff eriscono solo peril nome delle variabili legate. Abbiamo ad esempio che λfy.yf rappresenta la stessa funzionedi λfz.zf , al punto che potremo considerare questi due termini sintatticamente equivalen-ti. Se il nome di una variabile legata causa conflitti durante la sostituzione del parametroformale con l’argomento della funzione, possiamo ridenominarla per poter eff ettuare una so-stituzione corretta. Ad esempio, la valutazione di (λfy.fy)(λx.x − y) non è λy.(λx.x − y)y,ma λz.(λx.x − y)z. Senza la ridenominazione della y legata in z, la y libera della funzioneλx.x

−y diventerebbe legata, cambiando il significato della valutazione.

Page 95: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 95/332

5.2 Il principio di estensionalità 95

Una delle ragioni principali dell’uso della λ-notazione è che essa permette di descriverenaturalmente funzioni di ordine superiore , vale a dire funzioni che possono ricevere come

argomento, e produrre come risultato, altre funzioni.Un esempio di funzione di ordine superiore è il seguente:

plusc ≡ λx.(λy.x + y).

Abbiamo, ad esempio,

1. plusc 2 = (λx.(λy.x + y)) 2 = λy.2 + y

2. plusc 2 3 = (λx.(λy.x + y)) 2 3 = (λy.2 + y) 3 = 2 + 3 = 5.

La funzione plusc applicata al valore 2 ha come risultato una funzione che associa naturali

a naturali, sommando 2 al suo argomento. La funzione plusc può essere dunque applicataanche ad un solo argomento. Il questo caso il suo valore sarà una funzione, che a sua voltapotrà accettare un altro argomento e produrre come risultato un intero.

Considerare le funzioni come se fossero tutte unarie e trattare funzioni di più argomenticome sequenze di funzioni unarie è detto currificazione 1. La currificazione è fondamentale peravere un formalismo che permetta di rappresentare in modo naturale i meccanismi con cui lefunzioni vengono combinate fra loro per ottenerne di nuove.

La λ-notazione risulterà utile per definire funzioni e per riferirsi ad esse senza dover ne-cessariamente dare loro un nome. Nel seguito di queste note, la notazione, arricchita con altricostrutti derivati ad essa riconducibili, costituirà il metalinguaggio (si veda Sezione 6.5) perdescrivere le funzioni di interpretazione semantica di diversi linguaggi di programmazione.

5.2 Il principio di estensionalità

Un classico esempio di funzione di ordine superiore sono gli “iteratori”. Consideriamo adesempio la funzione t wice, che, data una funzione ed un naturale, applica la funzione primaa questo argomento e poi al risultato dell’applicazione:

t wice ≡ λfx.f (f x)

Ad esempio,t wice s ucc

≡ (λfx.f (f x))(λx.x + 1)

= λx.(λx.x + 1)((λx.x + 1)x)= λx.(λx.x + 1)(x + 1)= λx.(x + 1) + 1.

Osserviamo adesso che l’applicazione di t wice a s ucc ha fornito una nuova funzione λx.(x+1)+1 che sommerà 1 due volte consecutive al proprio argomento. Non possiamo dire tuttaviache questa è la funzione che prende un valore intero e gli somma 2, perché non vi è nellanostra notazione alcun modo di esprimere la proprietà associativa della somma e trasformare

λx.(x + 1) + 1

1L’operazione di currificazione prende il nome dal logico americano Haskell Brooks Curry.

Page 96: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 96/332

96 Capitolo 5 – λ-calculus

inλx.x + (1 + 1)

e quindi inλx.x + 2.

Tuttavia, possiamo aff ermare che le due λ-espressioni

λx.(x + 1) + 1 e λx.x + 2

sono equivalenti, perché esse forniscono evidentemente lo stesso risultato per ogni argomento.In altre parole, gli insiemi di coppie

(a, (λx.(x + 1) + 1) a) | a ∈ N e (a, (λx.x + 2) a) | a ∈ N

coincidono, anche se la funzione che essi individuano viene rappresentata in due modidiff erenti.

Il principio che permette di considerare due λ-espressioni equivalenti se descrivono lo stessocomportamento input-output viene detto principio di estensionalità . Esso viene espressoformalmente come segue:

Siano e1 : D → D0 e e2 : D → D0 due λ-espressioni unarie, che rappresentanodue funzioni che associano elementi di D ad elementi di D0. Allora diciamo chee1 ed e2 sono estensionalmente equivalenti su D se e solo se individuano la stessafunzione:

∀d

∈D.e1 d = e2 d.

Scriveremo in questo caso e1 = e2, ovviamente distinto da e1 ≡ e2 che indical’uguaglianza sintattica delle due espressioni.

5.3 Operatori di n-upla

La λ-notazione è uno strumento conveniente per definire funzioni composte. In questa sezionedescriviamo alcuni operatori che saranno utili allo scopo.

I primi operatori che consideriamo sono gli operatori di n-upla . Questi possono essereutilizzati quando si desiderano formare funzioni di più argomenti raggruppando questi ultimiin un’unica struttura.

Il costruttore di una n-upla organizza una sequenza ordinata di n espressioni in un’espres-sione unica, in modo analogo a quanto avviene in programmazione tramite la struttura direcord . Ad esempio, date le espressioni T 1, . . . , T n, il costruttore di n-upla fornisce la singolaespressione

hT 1, . . . , T ni.

Ad ogni costruttore di n-ple sono associati n distruttori , detti proiettori , che consentono diestrarre le singole componenti dall’n-upla.

I costruttori ed i proiettori possono essere definiti tramite la λ-notazione nel modoseguente:

Costruttori di n-ple: Dn

≡λx1 . . . xnx.xx1 . . . xn;

Page 97: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 97/332

5.3 Operatori di n-upla 97

Proiettori di n-ple: πin ≡ λx.x(λt1 . . . tn.ti).

Date n espressioni T 1, . . . , T n, l’n-upla di queste è dunque definita come

DnT 1 . . . T n = λx.xT 1 . . . T n.

Si verifica facilmente che

πin(λx.xT 1 . . . T n) = (λx.xT 1 . . . T n)(λt1 . . . tn.ti)

= (λt1 . . . tn.ti)T 1 . . . T n= T i.

Ne segue che l’espressione λx.xT 1 . . . T n rappresenta eff ettivamente nella λ-notazione l’n-upla

hT 1, . . . , T n

i. Nel seguito, per comodità di notazione, useremo direttamente

hT 1, . . . , T n

iper rappresentare un’n-upla e π in per indicare il selettore del suo i-esimo elemento (i ≤ n).

Come abbiamo già visto, la λ-notazione considera tutti gli operatori come se fossero unari.In alcuni casi tuttavia può essere più naturale fornire tutti gli argomenti ad una funzione n-ariasimultaneamente. In altre parole, una funzione n-aria può essere trasformata in una funzioneunaria il cui argomento sia una n-upla. Per fare questo, si raggruppano gli argomenti dellafunzione in una n-upla e si usano i proiettori per recuperare volta per volta l’argomentoopportuno. A partire dalla λ-espressione

f ≡ λx1 . . . xn.E (x1, . . . , xn),

nella quale E (x1, . . . , xn) indica un’espressione in cui compaiono le variabili x1, . . . , xn, è

possibile costruire l’espressione

f 0 ≡ λx.E (π1n x, . . . , πn

n x),

rimpiazzando in E ciascuna xi con π in x. Per ogni n-upla hT 1, . . . , T ni, si ha allora che

f 0 hT 1, . . . , T ni = E (π1n hT 1, . . . , T ni, . . . , πn

n hT 1, . . . , T ni)= E (T 1, . . . , T n) = f T 1 . . . T n.

Tramite le n-ple ed i proiettori è possibile dunque ottenere le versioni non currificate dellefunzioni. Ad esempio, l’espressione

somma ≡ λx.(π12 x) + (π2

2 x).

è tale chesomma h3, 5i ≡ (λx.(π1

2 x) + (π22 x))h3, 5i = 3 + 5 = 8.

Notazione 5.1. Per semplificare la notazione scriveremo le funzioni non currificate semplicemente usando

λ(x1, . . . , xn).E (x1, . . . , xn)

invece di

λx.E (π1n x, . . . , πn

n x).

Page 98: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 98/332

98 Capitolo 5 – λ-calculus

Esistono due famiglie di operatori, indicizzate sui naturali, CurToUncurn eUncurToCurn, che consentono di trasformare la versione currificata di una funzione n-aria

nella corrispondente non currificata, e viceversa. Essi sono definiti come segue:

CurToUncurn ≡ λx.(λ(x1, . . . , xn).x x1 . . . xn),UncurToCurn ≡ λxy1 . . . yn.xhy1, . . . , yni.

Con questa scelta si ha allora:

CurToUncur2 (λxy.x + y) ≡ (λx.(λ(x1, x2).x x1x2))(λxy.x + y)= λ(x1, x2).(λxy.x + y) x1x2

= λ(x1, x2).x1 + x2

e

UncurToCur2 (λ(x, y).x + y) ≡ (λxy1y2.xhy1, y2i)(λ(x, y).x + y)= λy1y2.(λ(x, y).x + y)hy1, y2i= λy1y2.y1 + y2.

5.4 Operatori di composizione

Come abbiamo visto nel Capitolo 2, la funzione composta g f di due funzioni f e g è lafunzione che richiede di applicare successivamente prima la f e poi la g al risultato della primaapplicazione. Ovviamente perché questo abbia senso le due funzioni devono essere tali che ildominio della g coincida con il codominio della f . Possiamo definire due λ-espressioni

comp ≡ λxyz.x(yz) e comp0 ≡ λxyz.y(xz)

che, qualora applicate a due funzioni, forniscano la loro composizione, utilizzando gli argomen-ti (cioè le funzioni da comporre) nell’ordine in cui sono presentati oppure nell’ordine invertito.In tal modo avremo ad esempio

comp s ucc double ≡ (λxyz.x(yz))(λx.x + 1)(λy.2y)= λz.(λx.x + 1)((λy.2y) z )= λz.((λy.2y) z ) + 1 = λz.2z + 1,

comp0 s ucc double ≡ (λxyz.y(xz))(λx.x + 1)(λy.2y)= λz.(λy.2y)((λx.x + 1) z )

= λz.2((λx.x + 1) z ) = λz.2(z + 1).

Gli operatori di composizione possono essere scritti in forma infissa : utilizzeremo i simboli e • in modo tale che

comp f g ≡ f g e comp0 f g ≡ f • g.

Quindi, per ogni x,(f g) x = f (g x) e (f • g) x = g(f x).

Inoltre, gli operatori di composizione sono entrambi associativi , per cui scriveremo

f 1

f 2

· · ·

f n al posto di f 1

(f 2

(· · ·

(f n−1

f n) · · · ))

Page 99: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 99/332

5.5 Il sistema di calcolo 99

ed analogamente per l’operatore •.L’operatore • permette di esprimere in modo chiaro e semplice l’applicazione sequenziale

di funzioni. Infatti, la notazione

(f 1 • f 2 • · · · • f n) x

rappresenta l’applicazione di f 1 ad x, quindi di f 2 al risultato della prima applicazione, e cosìvia fino all’applicazione di f n.

Esempio 5.2. Sianof ≡ λ(x, y).hx + y, yi,g ≡ λ(x, y).h2x, 3yi,h ≡ λ(x, y).hx − y, xi.

Allora

(f • g • h) h3, 4i = h(g(f h3, 4i))= h(g h7, 4i)= h h14, 12i = h2, 14i.

5.5 Il sistema di calcolo

La λ-notazione è stata introdotta come formalismo per la rappresentazione di funzioni. Inrealtà essa non è solo una notazione ma pone le premesse per un vero e proprio sistema dicalcolo. Il meccanismo fondamentale usato per ottenere nuove λ-espressioni a partire da altregià definite è costituito dal passaggio di un argomento ad una funzione e dalla sua sostituzioneal posto di uno dei parametri formali nella funzione stessa. Nelle sezioni precedenti abbiamoutilizzato alcune nozioni ad un livello puramente intuitivo, quali il passaggio di parametri,l’applicazione di funzione, nonché la sua valutazione per certi argomenti. Queste nozionipossono essere formalizzate definendo un vero e proprio sistema di calcolo, detto λ-calculus ,basato su specifiche regole di riscrittura.

Il λ-calculus può essere definito in diversi modi, che si diff erenziano in base alla presenzadi tipi, di operatori aggiuntivi e delle regole di calcolo usate. In questo capitolo introdurremoil sistema puro, che è dal punto di vista sintattico il più semplice.

5.5.1 Sintassi del λ-calculus

Definizione 5.3. Dato un insieme numerabile Var di simboli distinti detti variabili, i cui ele-

menti sono denotati da x, y , z , . . ., l’insieme Λ dei termini del λ-calculus è definito attraversola seguente grammatica:

M ::= x | (λx.M ) | (M N )

Ad esempio, le espressioni

(λx.x), (λx.(λy.(x(xy)))), (λx.(xx))

sono termini del λ-calculus.Dati due termini M, N ∈ Λ, diciamo che il termine (λx.M ) è ottenuto da M per astrazione

della variabile x, mentre il termine (M N ) è ottenuto per applicazione di M ad N . L’operazionedi applicazione si indica dunque come semplice giustapposizione di un termine ad un altro.

Nel seguito, per semplificare la notazione, adotteremo alcune convenzioni semplificative.

Page 100: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 100/332

100 Capitolo 5 – λ-calculus

Notazione 5.4. In primo luogo, ometteremo le parentesi più esterne di un termine scrivendoad esempio λx.(xx) anzicché (λx.(xx)). Inoltre, assumeremo che l’applicazione associa a

sinistra e che l’astrazione associa a destra. Cosicché, ad esempio, possiamo scrivere

M NP, x(λu.u)(vz), x((λu.u)v)z

per indicare rispettivamente

(M N )P, (x(λu.u))(vz), (x((λu.u)v))z

e λx.xx, λx.λy.xy

per indicare rispettivamente λx.(xx), λx.(λy.(xy)).

Inoltre, quando più variabili sono astratte in successione, assumeremo di poterle scrivere tutte dopo un unico λ; ad esempio, i termini

λxyz.xyz, x(λuvz.uzv), x(λuv.u(λz.zv))

saranno considerati abbreviazioni, rispettivamente, di

λx.(λy.(λz.xyz)), x(λu.(λv.(λz.uzv))), x(λu.(λv.u(λz.zv))).

La sintassi mostra che tutti i termini del λ-calculus sono unari . Prendiamo ad esempio iltermine T ≡ λxy.yx. Esso rappresenta un operatore che, una volta applicato a due argomenti,a e b, applica b ad a. Tuttavia i due argomenti non devono necessariamente essere passati

ambedue a T . Infatti l’applicazione T a fornisce un nuovo operatore, che potremmo chiamareT a, che rappresenta quella funzione che, preso ora un solo argomento, lo applica ad a. Questofenomeno risulta più chiaro se si ricorda che il termine T è sintatticamente equivalente aλx.(λy.yx).

Osservazione 5.5. Nella sintassi non compaiono simboli di funzione di base (come gli ope-ratori aritmetici) né costanti (come i naturali). In tal senso, essa potrebbe sembrare menoespressiva della sintassi delle λ-espressioni sottintesa dalle sezioni precedenti. In e ff etti, è pos-sibile dimostrare che sia i naturali che l’insieme di tutte le funzioni calcolabili sono codificabili nella semplice sintassi presentata in questa sezione.

Ad esempio, il naturale n può essere rappresentato dal termine

n ≡ λxy.x(x(. . . (x | z n volte

y) . . .)),

mentre i valori booleani t rue e f alse possono essere rappresentati dalle funzioni ( selettori)

t rue ≡ λxy.x f alse ≡ λxy.y.

A questo punto il condizionale p → q, r è rappresentato semplicemente dall’applicazione pqr,dove p è un valore booleano.

Lo scopo di questa sezione è tuttavia quello di studiare la struttura dei termini e di de-scrivere ed analizzare proprietà del meccanismo di calcolo proprio di essi. Per far questo è su ffi ciente il sistema ‘puro’ e ad esso ci limiteremo.

Page 101: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 101/332

5.5 Il sistema di calcolo 101

5.5.2 Semantica del λ-calculus

Il significato di un λ-termine è il λ-termine risultante dalla sua ‘valutazione’, cioè il λ-termineottenuto dopo aver eff ettuato tutte le applicazioni di funzioni contenute nel termine origi-nario. Quindi, valutare un λ-termine vuol dire ‘ridurlo’ finché non sono possibili ulteriorisemplificazioni.

La regola di riduzione principale coinvolge la sostituzione di occorrenze libere di variabilicon termini in maniera simile a quanto accade per la sostituzione dei parametri formali con iparametri attuali in un’invocazione di funzione all’interno di un programma. Consideriamo iltermine

λab.a (5.1)

Seguendo l’interpretazione informale dei termini data precedentemente, esso rappresenta unafunzione che restituisce il primo dei suoi due argomenti, indipendentemente dal valore del

secondo. Osserviamo quindi che, sebbene sintatticamente distinto da esso, il termine λuv.uha la stessa interpretazione di λab.a. I due termini considerati sono legati fra loro da unasemplice relazione: l’uno è ottenibile dall’altro attraverso un’operazione di ridenominazionedelle variabili ‘legate’ dal λ, che nell’esempio in questione mette in corrispondenza a con u eb con v .

Formalizziamo ora il concetto di occorrenza legata e libera di una variabile. A tale scopo,introduciamo una notazione che permette un’analisi della struttura dei λ-termini e, quindi,di ragionare su di essi.

Definizione 5.6. La relazione P occorre in Q (anche, P è un sottotermine di Q) è definita per induzione strutturale come segue:

1. P occorre in P ;

2. se P occorre in M oppure in N , allora P occorre in M N ;

3. se P occorre in M , allora P occorre in λx.M .

Ad esempio in xy(λxy.x(xy)) ci sono due occorrenze di (xy) (quelle sottolineate), e treoccorrenze di x. Inoltre, il termine x(yz) occorre in u(x(yz)) ma non in ux(yz), che per leconvenzioni usate è uguale a (ux)(yz).

Definizione 5.7. Per una particolare occorrenza di λx.M in un termine P , il corpo del λx

considerato è M .

Ad esempio, seP ≡ (λy.yx(λx.y(λy.z)x))vw,

allora il corpo del primo λy da sinistra è

yx(λx.y(λy.z)x),

quello del λx èy(λy.z)x,

mentre quello del secondo λy è la sola variabile z .Le variabili in un termine possono essere classificate secondo la loro occorrenza nel corpo

di un λ.

Page 102: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 102/332

102 Capitolo 5 – λ-calculus

Definizione 5.8. Sia M un termine del λ-calculus.

1. Una occorrenza della variabile x in M è legata se e solo se essa si trova nel corpo di un λx in M , altrimenti è libera.

2. Se una variabile ha almeno una occorrenza libera in M viene detta variabile libera di M ; l’insieme delle variabili libere di un termine M viene denotato con F V (M ).

3. Un termine senza variabili libere viene detto chiuso (si dice anche che è un combinatore).

Si noti che una variabile x può essere sia libera che legata in un certo λ-termine M , peresempio se M ≡ x(λx.x), ma una particolare occorrenza di x in M non può essere allo stessotempo libera e legata.

L’insieme F V (M ) può essere definito per induzione sulla sintassi dei λ-termini come segue:

• F V (x) = x;

• F V (λx.N ) = F V (N ) \ x;

• F V (N P ) = F V (N ) ∪ F V (P );

• F V ( (N ) ) = F V (N ).

Nel seguito scriveremo M ≡ N per indicare che M e N sono lo stesso termine o possonoessere ottenuti l’uno dall’altro attraverso un’operazione di ridenominazione delle variabili le-gate dal λ, come ad esempio λy.(xy) e λz.(xz). È chiaro che la relazione ≡ è una equivalenza

sui λ-termini che raggruppa in una stessa classe di equivalenza termini che diff

eriscono sol-tanto per il nome delle loro variabili legate e che possono essere resi sintatticamente identiciridenominando queste ultime. Nel seguito non faremo alcuna distinzione tra termini tra loroequivalenti.

Inoltre adotteremo la seguente convenzione sulle variabili : se i λ-termini M 1, . . . , M nsono utilizzati in un certo contesto (per esempio, una definizione, un termine più ‘grande’),allora in tali termini tutte le variabili legate sono (diverse tra loro e) diverse dalle variabililibere.

Queste due assunzioni ci permetteranno di semplificare la definizione dell’operazione disostituzione, che è il cuore del meccanismo di valutazione del λ-calculus in quanto permettonodi evitare che si verifichino collisioni tra le variabili, come è illustrato nell’esempio seguente.

Esempio 5.9. [Collisione tra variabili] La regola principale del sistema di valutazione èchiamata β -riduzione e coinvolge l’operazione di applicazione di funzione. Un termine dellaforma

(λx.M )N (5.2)

rappresenta l’applicazione di una funzione ad un argomento. Intuitivamente, il valore di que-sta applicazione viene calcolato passando l’argomento N alla funzione λx.M . In quest’ultima,l’astrazione rispetto alla variabile x indica il parametro formale coinvolto. Durante la valu-tazione dell’espressione (5.2), l’argomento viene sostituito al posto di ogni occorrenza liberadella variabile x in M , cioè al posto di tutte le occorrenze del parametro formale nel corpodella funzione.

Page 103: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 103/332

5.5 Il sistema di calcolo 103

Consideriamo ad esempio le seguenti applicazioni e le sostituzioni relative:

(λab.a)(xv)z (λb.xv)z xv. (5.3)

È necessario evitare che il passaggio dell’argomento alla funzione comporti l’introduzio-ne di legami per le variabili libere dell’argomento stesso. In particolare, le variabili liberenell’argomento N devono essere diff erenti da tutte le variabili legate dai λ in M .

Eseguendo le stesse operazioni che in (5.3) senza preoccuparsi che le variabili dell’argomen-to restino libere dopo la sostituzione, otteniamo infatti, partendo dal termine (λuv.u)(xv)z,che è α-equivalente a quello in (5.3),

(λuv.u)(xv)z (λv.xv)z xz 6= xv.

Ne segue che due termini che hanno apparentemente la stessa interpretazione vengono ad avere

due valori diversi: questo è dovuto al fatto che la variabile v , libera prima della sostituzione,viene a trovarsi nel corpo di un λv: questo fenomeno si chiama collisione di variabili e deveessere evitato durante la valutazione, ridenominando la variabile legata come di seguito

(λuv.u)(xv)z ≡ (λub.u)(xv)z (λb.xv)z xv.

Possiamo finalmente definire formalmente l’operazione di sostituzione.

Definizione 5.10 (Sostituzione). Il risultato della sostituzione di N al posto delle occorrenze libere di x in M , scritto M [N/x], è definito per induzione sulla sintassi dei termini tramite le seguenti clausole:

x[N/x] = N y[N/x] = y se x 6= y

(M 1M 2)[N/x] = (M 1[N/x])(M 2[N/x])(λx.M )[N/x] = λx.M (λy.M )[N/x] = λy.(M [N/x]) se x 6= y

L’operazione di sostituzione fornisce il meccanismo per implementare l’applicazione difunzione e ci permette quindi di definire formalmente la β -riduzione.

Introduciamo prima alcune proprietà delle relazioni binarie tra λ-termini.

Definizione 5.11.

1. Una relazione binaria R sui λ-termini è detta compatibile (con le operazioni) se

M R N

M Z R N Z

M R N

ZM R ZN

M R N

λx.M R λx.N

2. Una relazione di riduzione sui λ-termini è una relazione compatibile, riflessiva e transitiva.

3. Una relazione di congruenza sui λ-termini è una relazione di equivalenza compatibile.

Definizione 5.12. Siano le relazioni binarie −→β, =⇒β e =β sui λ-termini definite dalle regole seguenti:

Page 104: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 104/332

104 Capitolo 5 – λ-calculus

1.

(λx.M )N −→β M [N/x] M −→β N M Z −→β N Z

M −→β N ZM −→β ZN

M −→β N λx.M −→β λx.N

2.

M =⇒β M M −→β N

M =⇒β N

M =⇒β N N =⇒β L

M =⇒β L

3.M =⇒β N

M =β N

M =β N

N =β M

M =β N N =β L

M =β L

Tali relazioni sono denominate come segue:

• M −→β N : M si β -riduce a N in un passo;

• M =⇒β N : M si β -riduce a N ;

• M =β N : M è β -convertibile a N .

Si noti che per definizione abbiamo che −→β è una relazione compatibile, =⇒β è unarelazione di riduzione e =β è una relazione di congruenza.

La relazione di β -riduzione in un passo −→β descrive l’eff etto dell’applicazione di funzio-ne. Si noti che, grazie alle regole di compatibilità, la β -riduzione può avvenire in qualsiasicontesto. La relazione di β -riduzione =

⇒β descrive l’eff etto dell’applicazione di una sequenza,

eventualmente nulla, di β -riduzioni, mentre la relazione di β -conversione =β è sostanzialmentela sua chiusura simmetrica.

Osservazione 5.13 (α-conversione). Per semplicità, nella nostra presentazione del λ-calculus abbiamo scelto di identificare termini che di ff eriscono solo per il nome delle variabili le-gate. Una alternativa consiste nell’introdurre esplicitamente nel calcolo l’operazione di ridenominazione delle variabili legate, detta α-conversione.

Se x e y sono variabili e M è un λ-termine in cui y non occorre, allora diciamoche λx.M è α-convertibile in λy.M 0 e scriviamo

λx.M −→α λy.M [y/x]

In origine, questa era la prima regola di riscrittura del calcolo, da cui il suo nome e quellodella regola introdotta nella Definizione 5.12. L’ α-conversione è comunque necessaria per implementare gli algoritmi di valutazione dei termini del λ-calculus.

Osservazione 5.14 (η-conversione). Oltre ad α-conversione e β -riduzione, c’è un’altra regola di riscrittura usata in letteratura, detta η-conversione.

Se x è una variabile e M è un λ-termine in cui x non occorre, allora λx.Mx siη-converte a M e scriviamo

λx.Mx

−→η M

Page 105: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 105/332

5.5 Il sistema di calcolo 105

Intuitivamente, questa regola consente di dichiarare identici due termini sulla base del princi-pio che se essi si comportano allo stesso modo (una volta applicati ad un parametro) devono

quindi essere considerati identici. Quando diciamo che λx.(M x) e M si comportano allostesso modo, intendiamo dire che per ogni N : (λx.(M x))N = (M x)[N/x] = M N . In pratica la regola di η-conversione giustifica una visione estensionale delle funzioni: cioè due funzioni sono uguali se producono gli stessi valori quando vengono passati loro gli stessi argomenti.

La regola di η-conversione non è strettamente necessaria per valutare λ-termini; noi la menzioniamo per completezza.

Un termine della forma (λx.M )N è chiamato β -redesso, terminologia derivata da β -reduction expression che significa espressione che può essere β -ridotta. Il termine M [N/x]

risultante dalla β -riduzione è chiamato contratto. Lo scopo della valutazione di un λ-termineè quindi quello di ridurlo finché non contiene più β -redessi. Il termine così ottenuto viene

detto ‘forma normale’ e rappresenta la valutazione del λ-termine originario.Definizione 5.15 (Forma normale). Diciamo che P è una β -forma normale se P non contiene alcun β -redesso. Un termine M si riduce a β -forma normale (o ha β -forma normale) se esiste un termine N in β -forma normale tale che M =⇒β N .

Nel λ-calculus una funzione calcolabile è (rappresentata da) una qualche λ-espressione ingrado di riscriversi fino a raggiungere una β -forma normale. Esistono però anche termini chegenerano una successione infinita di riscritture senza mai raggiungere una β -forma normale,che perciò rappresentano funzioni non calcolabili. Un tipico esempio è dato dall’applicazionedel ‘duplicatore’ λx.xx a se stesso

(λx.xx)(λx.xx).

Infatti, durante il processo di riduzione, il termine non fa altro che riprodurre se stesso:

(λx.xx)(λx.xx) =⇒β (λx.xx)(λx.xx) =⇒β (λx.xx)(λx.xx) =⇒β . . .

La caratteristica di poter definire funzioni calcolabili e non calcolabili insieme alla ricorsio-ne, rende il λ-calculus del tutto equivalente alle macchine di Turing ma con un approcciocompletamente a-temporale.

Vale la pena notare che un termine potrebbe contenere più di un redesso e potrebbe quindiridursi in diversi modi; ad esempio, i redessi presenti in

(λx.x)((λu.uv)t)

sono stati sottolineati. Abbiamo allora(λx.x)((λu.uv)t) =⇒β (λu.uv)t

ma anche(λx.x)((λu.uv)t) =⇒β (λx.x)(tv).

Il criterio con cui viene scelto il redesso successivo da ridurre viene detto strategia di riduzione . Ci sono varie strategie, come ad esempio quella detta normal order , che scegliesempre il redesso più a sinistra tra quelli più esterni, o quella detta applicative order cheinvece sceglie il redesso più a sinistra tra quelli più interni.

Benché ci siano varie strategie di riduzione, vale tuttavia la seguente proprietà diconfluenza o Church-Rosser :

Page 106: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 106/332

106 Capitolo 5 – λ-calculus

Se P =⇒β Q e P =⇒β R, allora esiste un termine S tale che Q =⇒β S e R =⇒β S .

Da questa proprietà segue immediatamente che se un termine ha una β -forma normaleallora questa è unica (a meno di α-conversione, ovviamente). Intuitivamente, la riduzionepuò essere pensata come un processo di calcolo e la proprietà di confluenza assicura l’unicitàdel risultato per tutte le computazioni che terminano. Inoltre la β -forma normale, se esiste,può essere raggiunta usando la strategia normal order , o qualsiasi altra, perché la β -formanormale è indipendente dal criterio di riduzione utilizzato (anche questa proprietà è dovuta aChurch-Rosser). Quindi una riduzione in normal order può avere uno dei seguenti due esiti:

1. raggiunge una β -forma normale unica (a meno di ridenominazioni di variabili legate);

2. non termina mai.

Sfortunatamente non c’è un procedimento algoritmico per determinare per un λ-terminearbitrario quale di queste due situazioni si verificherà.

5.6 Esercizi

5.1 Quali dei seguenti termini

– (x(xx)x), (x((x)x)x), x(xx)x, y(yy)y, y(yyy), x(xxx);

– (xy)(xy),xyxy,xy(xy), xz(xz);

– λy.(xy)(xy), λy.xyxy, λy.xy(xy), λz.xz(xz), λt.xz(xz);

– λzx.xz(xz), λxz.xz(xz), λx.(λz.xz(xz)).

possono essere considerati sintatticamente equivalenti, sfruttando le convenzioni stabiliteprecedentemente?

5.2 Determinare la forma normale dei termini

(λz.z)(λz.z), (λzy.yz)(zy), (λyz.y(yz))(+3)2.

5.3 I due termini ((λyz.z(yz))(λa.a) e (λyz.yzz)(λab.ba) possono essere considerati uguali?Perché?

5.4 Si ponga

S ≡ λxyz.xz(yz) K ≡ λxy.x I ≡ λx.xB ≡ λxyz.x(yz) C ≡ λxyz.xzy W ≡ λxy.xyy.

Definire S in termini di B, C, W, definire I in termini di S, K, definire C in termini di S, B, K.

5.5 Dimostrare che SK = KI.

5.6 Trovare un λ-termine Y tale che, per ogni variabile x, Y x = x(Y x).

5.7 Trovare la forma normale dei due termini (λy.yyy)(KI(SS)) e SSSSSSS.

5.8 Scrivere un termine che contiene almeno due redessi, ha una forma normale ma può anche darluogo ad una sequenza di riduzioni infinita.

5.9 Usando il termine Y dell’esercizio precedente, dimostrare che, per ogni termine M , esiste untermine X tale che X = F X .

Page 107: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 107/332

5.6 Esercizi 107

5.10 Esibire un termine ∆ tale che, per ogni coppia di variabili distinte x, y,

∆S = x,∆K = y.

5.11 Sia (vedi Sezione 5.5):n ≡ λxy.x(x(. . . (x | z

n volte

y) . . .)).

Esibire:

– un termine s tale che, per ogni n, s n = n + 1,

– un termine A tale che A m n = m + n,

– un termine P tale che P m n = m ∗ n.

5.12 Un grafo orientato i cui nodi sono etichettati con λ-termini si dice grafo di riduzione se

– non esistono in esso due nodi etichettati dallo stesso termine;

– se un nodo è etichettato con M e M β−→ N , allora esiste un nodo etichettato con N .

Mostrare i grafi di riduzione dei termini

K(λx.Ixx)(λx.Ixx)), II(III), KI(WI(WI)).

5.13 Si trovi un termine il cui grafo di riduzione ha la struttura seguente:

/ /

O O

o o

Page 108: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 108/332

Page 109: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 109/332

Capitolo 6

Domini per la semanticadenotazionale

SOMMARIO

Questo capitolo introduce le basi matematiche per la semantica denotazionale dei linguaggidi programmazione. Introdurremo i concetti di insieme parzialmente ordinato completo,funzione continua, minimo punto fisso e soluzione di un sistema di equazioni mutuamente ricorsive. Presenteremo quindi i concetti di base della teoria dei domini ed alcuni operatoriche permettono di costruire domini a partire da domini più semplici. Infine, definiremo unmetalinguaggio per esprimere le funzioni utilizzate per descrivere la semantica denotazio-nale di una vasta classe di linguaggi di programmazione e mostreremo che i costrutti del metalinguaggio preservano la continuità.

Per studiare la semantica dei linguaggi di programmazione è importante definire una teoriamatematica che permetta di parlare di significati . A tale scopo, la semantica denotazionale usala teoria dei domini e le funzioni sui domini. Dana Scott sviluppò la teoria dei domini [Sco76]per fornire un modello per il λ-calculus così da gettare delle basi consistenti per la semanticadenotazionale. Senza un tale fondamento, non avremmo motivo di credere che le definizionidenotazionali hanno realmente un significato matematico. Allo stesso tempo, la teoria deidomini fornisce una valida interpretazione per funzioni e tipi definiti ricorsivamente.

La nozione centrale della teoria dei domini è quella di dominio semantico, un insieme dielementi, raggruppati perché condividono importanti proprietà, strutturato da una relazionedi ordinamento parziale, v, basata sulla quantità di informazione associata ai singoli elementi.Ogni dominio fornisce un insieme di operazioni che ‘ben si comportano’ rispetto alla strutturae che permettono di assemblare e disassemblare gli elementi del dominio stesso.

I domini permettono quindi di parlare di quantità di informazione contenuta in un ele-mento e, soprattutto, di elementi infiniti in termini delle loro approssimazioni finite. Infatti, idomini garantiscono che tutte le sequenze, anche infinite, di elementi sempre più definiti han-no un limite di cui gli elementi della sequenza sono approssimazioni via via migliori. Questaproprietà, che permette di rappresentare informazione infinita come limite di sequenze di ele-menti con informazione finita, è essenziale per costruire una teoria delle funzioni, perché unafunzione ha un carattere intrinsecamente infinito, dovendo essere in generale definita per unaquantità infinita di argomenti. Analogo discorso vale per i programmi scritti in un linguaggio.Quindi, il concetto di approssimazione connesso alla relazione di ordinamento parziale rivesteun ruolo fondamentale.

Page 110: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 110/332

110 Capitolo 6 – Domini per la semantica denotazionale

I domini sono anche dotati di un elemento minimo, ⊥, che rappresenta assenza di informa-zione. In pratica esso è un elemento totalmente indefinito, che è la peggiore approssimazione

di un qualsiasi elemento. La presenza di un elemento minimo nei domini permette di poterconsiderare totali tutte le funzioni usate nella nostra indagine sulla semantica denotazionale.Infatti, piuttosto che dire che una funzione f non è definita su un elemento d del suo dominio,scriveremo f (d) =⊥, dove ⊥ è l’elemento minimo del codominio di f . L’elemento minimo èinoltre fondamentale per la semantica dei linguaggi di programmazione. Infatti, qualsiasi lin-guaggio che fornisce la possibilità di usare iterazione indefinita e funzioni ricorsive consente discrivere programmi che non terminano. Perciò, per definire la semantica serve un meccanismoper rappresentare la non terminazione e l’elemento minimo può essere visto come il risultatodi una computazione che non termina.

Definiremo vari operatori che permettono di costruire nuovi domini a partire da dominipiù semplici e mostreremo che le funzioni associate a tali costruzioni sono continue. Infatti,

quando si ha a che fare con insiemi strutturati, piuttosto che con insiemi senza alcuna strut-tura associata, di solito è utile considerare funzioni che preservano la struttura, invece chefunzioni arbitrarie. Ciò porta alla richiesta di monotonia , nel caso di insiemi parzialmenteordinati (o poset), ed a quella di continuità , nel caso di insiemi parzialmente ordinati completi(o cpo o domini). Le funzioni in questione costituiscono una sorta di λ-calculus esteso, unmetalinguaggio che nei capitoli successivi sarà usato come formalismo matematico per defi-nire la semantica denotazionale dei vari linguaggi considerati. Il fatto che il metalinguaggiopermetta di descrivere solo funzioni continue, ci consentirà di assumere la continuità dellefunzioni che via via introdurremo, evitando di intercalare la loro presentazione con le relativeprove di continuità.

6.1 Esempi d’uso dei domini nella semantica denotazionale

Definizioni ricorsive vengono utilizzate sia nei linguaggi di programmazione, che solitamentepermettono per esempio la definizione di funzioni o strutture dati (es. liste, alberi) ricorsive,che nelle specifiche dei linguaggi stessi (le grammatiche che generano i termini di un linguaggiosono solitamente ricorsive). Costrutti familiari nella pratica della programmazione vengonoaltrettanto spesso “spiegati” intuitivamente tramite equazioni ricorsive. Si pensi ad esempioal costrutto while ed all’equazione

while e do c = if e then begin c; while e do c end,

con la quale si indica che l’esecuzione di un ciclo while consiste nella valutazione dell’e-spressione booleana e seguita, nel caso in cui essa sia vera, dall’esecuzione della sequenza dicomandi c e da una nuova esecuzione del ciclo while.

Normalmente l’utente di un linguaggio di programmazione non si cura dei fondamenti logicidelle definizioni ricorsive, è tuttavia necessario garantire la validità delle definizioni ricorsi-ve. L’attribuzione di un significato ad un’equazione ricorsiva non è però sempre immediato.Consideriamo ad esempio la seguente equazione ricorsiva:

f ≡ λx.(x = 0) → 1, f (x + 1). (6.1)

In eff etti, si potrebbe obiettare che questa non è una vera e propria definizione di funzione,in quanto f è definito in termini di se stesso. La (6.1) deve essere vista piuttosto come una

Page 111: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 111/332

6.1 Esempi d’uso dei domini nella semantica denotazionale 111

specifica di funzione, vale a dire la descrizione di vincoli che la funzione f deve soddisfare. Talespecifica indica che una qualsiasi funzione che la rispetti deve dare risultato 1 quando riceve

0 come argomento. Tuttavia il suo comportamento sugli altri argomenti non è univocamentedeterminato. Infatti l’unico altro vincolo che viene richiesto è quello di dare sempre lo stessorisultato per tutti gli argomenti maggiori di 0. Da un punto di vista computazionale ilsignificato intuitivo della specifica è d’altra parte ovvio:

per calcolare la f su un argomento x, si controlli innanzitutto se x = 0, nel qualcaso f (x) = 1; altrimenti si richiami la f sull’argomento x + 1.

Seguendo questo procedimento di calcolo, ed indicando con ⊥ la non definizione (l’assenzadi informazione), è chiaro che la specifica (6.1) individua la funzione

g

≡λx.(x = 0)

→1,

⊥,

cioè la funzione che dà risultato 1 per argomento 0 e che non è definita per gli altri argomentiperché il procedimento di calcolo procede all’infinito per essi.

In generale, diciamo che una funzione soddisfa una specifica se e solo se essa è una suasoluzione. In eff etti, una specifica come la (6.1) può essere vista come un’equazione nell’inco-gnita f . Una soluzione è allora una qualunque funzione che, sostituita al posto di f , rendal’equazione un’identità.

Ci si può facilmente rendere conto che la funzione g è una soluzione dell’equazione (6.1).Sostituendo la definizione di g nella parte destra dell’equazione (6.1) otteniamo:

λx.(x = 0) → 1, (λx.(x = 0) → 1, ⊥)

| z g

(x + 1)

= λx.(x = 0) → 1, (x + 1 = 0) → 1, ⊥= λx.(x = 0) → 1, ⊥ (dato che non esiste un naturale x tale che x + 1 = 0)≡ g.

D’altra parte è importante notare come la g non sia l’unica soluzione possibile; infatti, perogni k ∈ N, ogni funzione della forma

gk ≡ λx.(x = 0) → 1, k

soddisfa la specifica, vale a dire è soluzione dell’equazione.Tra tutte le possibili soluzioni, la g ha comunque un ruolo particolare; essa corrisponde ai

risultati che si ottengono interpretando la specifica in modo meccanico, così che, per valutarela f per un generico x > 0, si “espande” il corpo della f per scoprire che è necessario valutarlaper x + 1, quindi per x + 2, e così via.

Si noti che la funzione g è meno definita di ciascuna delle gk. Infatti, sull’unico argomentosu cui g è definita, le gk sono anch’esse definite ed assumono lo stesso valore:

∀k. g(0) = gk(0).

La discussione precedente evidenzia la necessità di individuare un metodo per risolvereequazioni ricorsive, nonché per poter scegliere fra eventuali soluzioni multiple. Allo scopo dicaratterizzare le soluzioni di un’equazione ricorsiva, diamo innanzitutto una definizione cheuseremo spesso nel seguito.

Page 112: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 112/332

112 Capitolo 6 – Domini per la semantica denotazionale

Data una funzione f : D → D, diciamo punto fisso di f un qualsiasi elementod

∈D tale che f d = d.

Per spiegare meglio l’importanza di questo concetto, consideriamo un’equazione, peresempio sugli interi

x = 2x + 1.

Possiamo vedere la sua soluzione come il punto fisso della funzione dagli interi agli interi

f ≡ λx.2x + 1,

cioè −1. In modo analogo, una soluzione dell’equazione (6.1) può essere vista come un puntofisso della funzione

τ ≡ λf.(λx.(x = 0) → 1, f (x + 1))

che è una funzione che prende come argomento una funzione e restituisce come risultatoun’altra funzione, vale a direτ : (N → N) → (N → N).

Un altro esempio di funzionale è il seguente

τ fact ≡ λf.λx.(x = 0) → 1, x ∗ f (x − 1)

che corrisponde evidentemente alla definizione della funzione fattoriale. Infatti, se poniamo

fact = λx.(x = 0) → 1, x ∗ fact(x − 1)

allora evidentemente τ fact(fact) = f act.

Ogni soluzione di una specifica ricorsiva di funzione è dunque un punto fisso del funzionaleassociato alla specifica stessa. Tale funzionale è ottenuto astraendo il membro destro dellaspecifica rispetto all’incognita dell’equazione.

Per poter scegliere tra diverse soluzioni di una specifica ricorsiva, risulta utile introdurreun ordinamento fra funzioni che formalizzi l’intuizione che una funzione è un’approssimazionedi un’altra.

Siano f, g : D → D0. Diciamo che f approssima (o è meno definita di ) g, escriviamo f v g se

∀x. se f (x) è definita, allora f (x) = g(x).

L’esempio iniziale mostra che fra tutti i punti fissi del funzionale associato alla specifica(6.1) ne esiste uno che è meno definito di tutti gli altri e che corrisponde all’intuizione “ope-razionale” della specifica stessa. Questa particolare soluzione viene chiamata minimo punto

fisso.Vediamo ora come i concetti di approssimazione finita di una funzione e quello di minimo

punto fisso contribuiscano a fornire un modo “eff ettivo” per determinare una soluzione di unaspecifica ricorsiva.

Si consideri innanzitutto la funzione Ω ≡ λx. ⊥, che è ovunque non definita e che quindicostituisce la peggior approssimazione di ogni funzione. Si applichi quindi il funzionale τ

associato alla specifica (6.1):

τ Ω = λx.(x = 0)→

1,Ω(x + 1) = g.

Page 113: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 113/332

6.2 Insiemi parzialmente ordinati completi 113

La soluzione g è stata ottenuta applicando il funzionale τ ad una sua approssimazione!Si consideri ora il funzionale τ fact e si calcoli F act1

≡τ fact Ω:

Fact1 ≡ τ fact Ω = λx.(x = 0) → 1, x ∗Ω(x − 1) = λx.(x = 0) → 1, ⊥ . (6.2)

Fact1 non è ovviamente un punto fisso di τ fact, però è una funzione più definita di Ω,ed assume sull’argomento su cui è definita lo stesso valore che su di esso assume la funzionefattoriale. Fact1 è un’approssimazione della funzione fattoriale migliore di Ω. Inoltre, F act1ha, sull’unico argomento per cui è definita, un comportamento “operazionalmente” corrispon-dente alla specifica della funzione fattoriale, perché è stata ottenuta interpretando la specificacome un programma e sostituendo, al posto del richiamo ricorsivo della funzione, una suaapprossimazione. Il lettore potrà ora verificare che, considerando la sequenza

Fact2 ≡ τ fact Fact1, Fact3 ≡ τ fact Fact2, . . .

si ottengono approssimazioni della funzione fattoriale via via migliori, e che il limite di questasequenza di funzioni è la funzione fattoriale stessa. In altre parole, il minimo punto fisso dellaspecifica della funzione fattoriale può essere ottenuto per approssimazioni successive. Inoltre,ciascuna di queste approssimazioni può essere rappresentata in modo finito e, ovviamente,non ricorsivo.

6.2 Insiemi parzialmente ordinati completi

Cominciamo col definire le proprietà strutturali degli insiemi che costituiscono i domini. A

questo proposito, si ricordi che una relazione binaria R su un insieme A è una relazione diordine se è riflessiva, antisimmetrica e transitiva (Definizione 2.7).

Definizione 6.1.

1. Un insieme parzialmente ordinato (poset) è una coppia (D, v), dove D è un insieme ev è una relazione di ordine parziale su D .

2. Un poset D è totalmente ordinato se per ogni coppia d, d0 ∈ D abbiamo che d v d0 od0 v d.

3. Un insieme totalmente ordinato finito o numerabile viene chiamato catena .

Abbiamo già detto, nell’introduzione di questo capitolo, che intuitivamente la relazionedi ordine parziale v è basata sulla quantità di informazione associata ai singoli elementidell’insieme D. Qui facciamo notare che in un insieme totalmente ordinato la quantità di in-formazione di due elementi qualsiasi è sempre confrontabile. In una catena, poi, ogni elementodeve contenere informazione che è consistente con quella contenuta dal suo predecessore; puòessere uguale al suo predecessore o può contenere informazione aggiuntiva.

Esempio 6.2.

1. Gli interi con la relazione di minore o uguale sono una catena.

Page 114: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 114/332

114 Capitolo 6 – Domini per la semantica denotazionale

2. L’insieme dei sottoinsiemi di un insieme con la relazione di contenuto o uguale è unposet.

Sia (D, v) un poset. Dati d, d0 ∈ D, diciamo che d precede immediatamente d0 se d v d0

e non c’è alcun d00 ∈ D tale che d v d00 v d0. Si noti che la relazione di ordinamento v delposet coincide con la chiusura riflessiva e transitiva della relazione “precede immediatamente”.Un grafo (o diagramma) della relazione “precede immediatamente” è chiamato diagramma di Hasse del poset. Tali grafi sono spesso usati per rappresentare poset in maniera grafica. I nodidel grafo rappresentano elementi di D, mentre gli archi rappresentano la relazione “precedeimmediatamente”, con la convenzione che questi ultimi siano orientati verso l’alto.

Ad esempio, i sottoinsiemi dell’insieme a,b,c con l’ordinamento di inclusione sonorappresentati dal grafo seguente

a,b,c

a, b a, c b, c

a b c

I naturali con il tradizionale ordinamento di minore o uguale possono essere rappresentaticome segue:

• n

• 2

• 1

• 0

Si noti che se (D, v) è un poset, allora per ogni A ⊆ D si ha che (A, vA), dove vA è la

restrizione di v su A, è un poset.Le definizioni riportate di seguito servono come preparazione alla nozione di appros-simazione di informazione e fissano le proprietà di alcuni elementi di un ordinamentoparziale.

Definizione 6.3. Sia (D, v) un poset ed S un sottoinsieme di D; un elemento a ∈ D è chiamato:

1. un maggiorante di S se d v a, ∀d ∈ S ;

2. un minorante di S se a v d, ∀d ∈ S ;

3. il massimo di S se a è un maggiorante di S ed a∈

S ;

Page 115: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 115/332

6.2 Insiemi parzialmente ordinati completi 115

4. il minimo di S se a è un minorante di S ed a ∈ S .

Si noti che, dall’antisimmetria della relazione v, segue immediatamente che il massimo(minimo) di un poset, se esiste, è unico.

Definizione 6.4. Sia (D, v) un poset ed S un sottoinsieme di D; un elemento di D è chiamato:

1. l’ estremo superiore (o least upper bound, o limite, o join) di S se è il minimo dei suoi maggioranti. Nel seguito sarà denotato da sup S (o anche da

FS ).

2. l’ estremo inferiore (o greatest lower bound, o meet) di S se è il massimo dei suoi minoranti. Nel seguito sarà denotato da inf S (o anche da

dS ).

Per denotare l’estremo superiore (inferiore) utilizzeremo soltanto sup (inf ) omettendo “inD” tutte le volte che il dominio in questione risulti evidente dal contesto. Alcune volte, perfar capire in quale dominio viene determinato l’estremo superiore verrà utilizzato un apice odun indice che suggerisca il dominio (ad esempio scriveremo sup0 S invece di sup S in D 0).

Naturalmente, l’unicità del massimo (minimo) di un poset, implica quella dell’estremoinferiore (superiore).

Esempio 6.5.

1. L’insieme dei naturali ha minimo, ma non ha maggioranti; talvolta il maggiorante vieneaggiunto e viene denotato da ω .

2. L’insieme dei sottoinsiemi di un insieme ordinato per inclusione ha per minimo l’insiemevuoto e per massimo l’insieme originario.

3. Consideriamo il seguente poset D :

g

f

d e

b c

a

e siano S = a,b,c, S 0 = a,b,c,d,e. S ha quattro maggioranti in D: d,e,f, e g , manon ha alcun estremo superiore. D’altra parte S ha un estremo inferiore che è anche ilminimo (a). S 0 ha due maggioranti di cui f è il minimo ed è quindi l’estremo superioredi S 0, ma anche S 0 non ha massimo. L’insieme D ha invece sia massimo (g) che minimo(a).

Associate alle definizioni precedenti abbiamo le seguenti proposizioni, di faciledimostrazione:

Page 116: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 116/332

116 Capitolo 6 – Domini per la semantica denotazionale

Proposizione 6.6.Dato un insieme parzialmente ordinato, abbiamo che:

1. Se un sottoinsieme ha massimo, questo è anche l’estremo superiore.

2. Ogni catena finita ha un massimo.

3. Ogni sottoinsieme di una catena è una catena.

Proposizione 6.7.Sia (D, v) un cpo, xi | i ∈ I una catena su D e d ∈ D un elemento qualsiasi. Se xi v d,per ogni i ∈ I , allora supxi | i ∈ I v d.

Dimostrazione. Per definizione di estremo superiore, se d è un maggiorante della catena, ilminimo degli maggioranti supxi | i ∈ I dev’essere non più grande di d.

Proposizione 6.8.Sia (D, v) un cpo e xi | i ∈ I e yi | i ∈ I due catene su D. Se xi v yi, per ogni i ∈ I ,allora supxi | i ∈ I v supyi | i ∈ I .

Dimostrazione. Dall’ipotesi, e per definizione di estremo superiore, segue che per ogni i ∈ I ,xi v yi v supyi | i ∈ I . Perciò, per la Proposizione 6.7 (prendendo d = supyi | i ∈ I ), siha supxi | i ∈ I v supyi | i ∈ I .

I domini utilizzati per definire la semantica di linguaggi di programmazione sono insiemiparzialmente ordinati (poset ), che hanno sempre un elemento minimo e sono tali che l’estremosuperiore delle loro catene esista sempre. Essi sono chiamati ordinamenti parziali completi,abbreviati in cpo, dall’inglese complete partially ordered set .

Definizione 6.9. Un poset (D, v) è completo ( cpo set, cpo o dominio) se e solo se

1. D ha il minimo, indicato con

⊥;

2. ogni catena in (D, v) ha estremo superiore in D.

I poset descritti negli esempi precedenti sono tutti cpo tranne i naturali, che hanno minimoma non hanno estremo superiore della catena costituita da tutto l’insieme, e gli interi, chenon hanno né massimo né minimo.

In un cpo dunque l’estremo superiore di una catena riassume l’informazione che è stataaccumulata in maniera consistente lungo la catena stessa. Poiché una catena può avere unnumero infinito di elementi distinti, l’estremo superiore agisce come elemento limite per lasequenza infinita. D’altro canto, una catena può avere elementi duplicati, poiché v includeanche l’uguaglianza, e può anche assumere un valore costante da un certo punto in poi. Nelqual caso, l’estremo superiore è proprio quel valore.

Page 117: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 117/332

6.3 Funzioni continue e minimo punto fisso 117

6.3 Funzioni continue e minimo punto fisso

Una funzione f : D → D0 può essere vista computazionalmente come un agente che trasformaun elemento d di (D, v) in un elemento d0 di (D0, v0). La teoria della computazione siinteressa a come questa trasformazione può essere attuata, anche quando d è infinito, tramiteprocedimenti eff ettivi.

L’insieme D → D0 delle funzioni totali da D a D 0 contiene molte funzioni con un compor-tamento ‘anormale’ che preclude la possibilità di calcolarle o anche solo approssimarle tramiteun computer. Per esempio, consideriamo la funzione H : (N → N) → (N → N) definita da

H ≡ λg.λx.(g(x) =⊥) → 0, 1.

Chiaramente, se accettiamo questa funzione nella teoria dei domini, che fornisce le basi fonda-

zionali per la semantica denotazionale, allora ammettiamo una funzione che risolve il “proble-ma della fermata” (cioè, se una funzione g arbitraria termina regolarmente quando applicataad un argomento x arbitrario), che sappiamo essere non decidibile. Per escludere questa, edaltre funzioni dal comportamento anormale, imponiamo alcune restrizioni sulle funzioni inmodo da assicurare che esse abbiano un comportamento accettabile.

Si può pensare ad un argomento d di una funzione come ad una molecola di informazioneed assumere che f trasformi d trasformando prima gli atomi di d e poi ricomponendoli perottenere d0, una molecola di D 0. Questo suggerisce che se d1 e d2 sono due elementi di D taliche d2 contiene gli stessi atomi di d1 ed eventualmente qualcosa di più, cioè d1 v d2, allora èragionevole aspettarsi che f d1 v0 f d2. Una funzione che preserva la quantità di informazioneviene detta monotona .

Quando un oggetto infinito e viene usato come argomento di una funzione, può non esserepossibile immagazzinarne la rappresentazione in un computer con memoria finita e quindi,data una funzione f , il risultato di f e può non essere determinabile nel modo convenzionale.Comunque, se e è l’estremo superiore di una catena ei | i ∈ I dove ciascun ei ha grandezzafinita, allora ciascun ei può essere memorizzato separatamente ed f applicata ai vari ei insuccessione. In questo caso il valore di f e può essere determinato come l’estremo superioredella catena f ei | i ∈ I . Una funzione che off re questo tipo di possibilità è detta continua .

Le funzioni che vengono usate per definire la semantica denotazionale dei linguaggi diprogrammazione sono monotone e continue. Di seguito riportiamo le definizioni formali diqueste due importanti nozioni, utilizzando la seguente notazione: se f è una funzione chemappa elementi di un cpo D in elementi di un cpo D 0 ed S è un sottoinsieme di D, allora con

f S indichiamo l’insieme f x | x ∈ S .Definizione 6.10. Siano (D, v) e (D0, v0) due cpo.

1. Una funzione f : D → D0 si dice monotona se e solo se

∀x, y ∈ D, x v y implica f x v0 f y;

2. Una funzione f : D → D0 si dice continua se e solo se per ogni catena K di D

(a) esiste sup0(f K );

(b) f (sup K ) = sup0(f K ).

Page 118: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 118/332

118 Capitolo 6 – Domini per la semantica denotazionale

In pratica, una funzione tra due cpo è monotona quando “preserva” la relazione d’ordineed è continua quando “preserva” e “rispetta” gli estremi superiori delle catene del dominio.

Si noti che la nozione di funzione continua introduce in matematica discreta il concetto di “limite”, solitamente utilizzato in matematica del continuo.

Il teorema che segue chiarisce la relazione tra funzioni monotone e funzioni continue.

Teorema 6.11. Siano (D, v) e (D0, v0) due cpo. Se f : D → D0 è una funzione continua allora f è anche monotona.

Dimostrazione. Se consideriamo x, y ∈ D con x v y e la corrispondente catena x, y, ab-biamo che supx, y = y. Siccome f è continua, abbiamo anche che f (supx, y) = f y =supf x, f y e quindi che f x v0 f y per definizione di estremo superiore.

In generale il viceversa di questo teorema non è vero; esistono funzioni che sono monotonema non continue. Come esempio consideriamo il cpo Nω, costituito dai naturali con il tradi-zionale ordinamento di minore o uguale (0 ≤ 1 ≤ 2 ≤ . . . ), ed esteso con un nuovo elemento

“ω” tale che ω ≤ ω e, per ogni naturale n, n ≤ ω. È facile dimostrare che Nω = (N ∪ ω, ≤)è un cpo. Consideriamo ora la funzione f : Nω → Nω definita come segue:

f ≡ λx.(x = ω) → ω, 1.

È facile verificare che f è monotona. Essa non è però continua: infatti se consideriamola catena i | i ∈ N ottenuta prendendo tutti i naturali senza ω abbiamo che f (supi | i ∈N) = f ω = ω 6= supf i | i ∈ N = 1.

Monotonia e continuità si implicano a vicenda soltanto quando gli argomenti della funzioneappartengono a cpo che contengono solo catene finite.

Teorema 6.12. Sia f : D → D0 una funzione monotona e D contenga solo catene finite.Allora f è continua.

Dimostrazione. Sia x0, . . . , xn, n ∈ N, una catena su D. Siccome la catena è finita, abbiamoche supx0, . . . , xn = xn e quindi che f (supx1, . . . , xn) = f xn. D’altra parte, siccome f

è monotona abbiamo anche che f x1, . . . , f xn è una catena di D0 il cui estremo superioreè f xn. Questo basta per concludere che sup0(f x1, . . . , xn) = f (supx1, . . . , xn) e quindiche f è continua.

Dalla definizione di funzione continua su un cpo segue banalmente la continuità dellafunzione identità.

Lemma 6.13. Se D è un cpo, la funzione identità su D è continua.

Nel seguito, faremo uso di questa proprietà di base della composizione di funzioni continue.

Lemma 6.14. Se D1, D2 e D3 sono cpo e f : D1 → D2 e g : D2 → D3 sono due funzioni continue, allora

g f : D1 → D3

è continua.

Page 119: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 119/332

6.3 Funzioni continue e minimo punto fisso 119

Dimostrazione.

g

f (supxi | i∈

I ) = g (f (supxi | i∈

I )) per definizione= g (supf xi | i ∈ I ) per la continuità di f = supg(f xi) | i ∈ I per la continuità di g= supg f (xi) | i ∈ I per definizione.

Una volta definite le nozioni di ordinamento e di continuità si possono dimostrare alcuneproprietà fondamentali delle funzioni continue che ci permettono di assegnare un significa-to alle definizioni ricorsive di funzioni. Un concetto importante è quello di punto fisso diuna funzione, che ora possiamo definire formalmente perché disponiamo di una relazione diordinamento fra le funzioni e fra i loro argomenti.

Definizione 6.15. Dato un cpo D, una funzione f : D → D ed un elemento d ∈ D1. d è un punto fisso di f se f d = d;

2. d è il minimo punto fisso di f se è il minimo dei punti fissi di f ;

3. d è il massimo punto fisso di f se è il massimo dei punti fissi di f .

Esempio 6.16. Consideriamo il dominio “piatto” (si veda Sezione 6.4.1) dei naturali,denotato con NAT, che può essere rappresentato graficamente nel modo seguente:

0 1 2 n

⊥ed alcuni esempi di funzioni da NAT in NAT.

1. La funzione f ≡ λx.(x =⊥) →⊥, x è monotona e quindi continua (NAT ha solo catenefinite). Tutti gli elementi di NAT sono suoi punti fissi e il minimo punto fisso è ⊥.

2. Invece la funzione g ≡ λx.(x =⊥) → 1, ⊥ non è monotona. Infatti per ogni numeronaturale n abbiamo che ⊥≤ n ma g ⊥= 1 6≤ ⊥= g n e quindi la funzione g non ha puntifissi.

3. Un altro esempio di funzione non monotona è h ≡ λx.(x =⊥) → 1, x. La funzione h ha

infiniti punti fissi (tutti i naturali diversi da ⊥) ma non ha minimo punto fisso.

In Sezione 6.1 abbiamo visto come i concetti di approssimazione finita di una funzione equello di minimo punto fisso contribuiscano a fornire un modo “eff ettivo” per determinare unasoluzione di una specifica ricorsiva. Il prossimo teorema, dovuto al matematico americanoStephen Cole Kleene, mostra che, nel caso di funzioni continue, il minimo punto fisso èottenibile come estremo superiore di una catena ed è quindi approssimabile in maniera finitacon gli stessi elementi della catena.

Nel seguito, se f : D → D è una funzione, useremo la seguente notazione

f 0x = xf i+1x = f (f ix)

Page 120: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 120/332

120 Capitolo 6 – Domini per la semantica denotazionale

Teorema 6.17 (Teorema di Kleene per il minimo punto fisso). Sia (D, v) un cpo. Ogni funzione continua f : D

→ D ha il minimo punto fisso (indicato con fix f ) che è uguale a

supf i ⊥| i ∈ N.

Dimostrazione. La prova si svolge in tre passi. Prima (passo 1) proviamo che f i ⊥| i ∈ N èuna catena e che supf i ⊥| i ∈ N è il suo estremo superiore, quindi (passo 2) che supf i ⊥|i ∈ N è un punto fisso di f , infine (passo 3) che esso è il minimo tra tutti i punti fissi di f .

1. Per induzione su N dimostriamo prima che f i ⊥| i ∈ N è una catena, cioè che ∀i :f i ⊥v f i+1 ⊥.Base dell’induzione. f 0 ⊥=⊥v f ⊥= f 1 ⊥, perché ⊥v d, ∀d ∈ D.Passo induttivo. f i ⊥= f (f i−1 ⊥) v f (f i ⊥) = f i+1 ⊥, per la monotonia di f e l’ipotesiinduttiva (f i−1 ⊥v f i ⊥).Ora, siccome D è un cpo, questa catena ha estremo superiore supf i

⊥ (per abbreviare,

anche nel seguito, scriviamo f i ⊥ anzicché f i ⊥| i ∈ N).

2. Dimostriamo ora che supf i ⊥| i ∈ N è un punto fisso di f :

f (supf i ⊥) = supf (f i ⊥) per la continuità di f = supf i+1 ⊥ per la definizione di f i

= sup(f i+1 ⊥ ∪ ⊥) il sup non varia aggiungendo ⊥= sup(f i+1 ⊥ ∪ f 0 ⊥) perché ⊥= f 0 ⊥= supf i ⊥

3. Dimostriamo ora che ogni punto fisso della funzione f è un maggiorante della catena

f i ⊥ e quindi che ogni punto fisso è maggiore o uguale dell’estremo superiore dellacatena. La dimostrazione procede per induzione su N. Sia x un punto fisso, cioè taleche f x = x.Base dell’induzione. f 0 ⊥ = ⊥v x, perché ⊥v x, ∀x ∈ D.Passo induttivo. Supponiamo che f i ⊥v x; dobbiamo dimostrare che f i+1 ⊥ v x.Abbiamo

f i+1 ⊥ = f (f i ⊥) per definizionev f x per ipotesi induttiva e per la monotonia di f = x perché x è un punto fisso di f .

Questo basta per concludere che per ogni i

∈ N abbiamo f i

⊥v x. Poiché l’estre-

mo superiore di una catena è per definizione il minimo dei maggioranti, abbiamo chesupf i ⊥ v x, e quindi che supf i ⊥ è il minimo punto fisso di f .

Come immediata applicazione del teorema del punto fisso abbiamo il seguente corollario.

Corollario 6.18. Siano (D, v) e (D0, v0) due cpo. Ogni funzionale continuo F : (D →D0) → (D → D0) ha minimo punto fisso fix F , che può essere assunto come il significato della definizione (ricorsiva) corrispondente a F .

Osservazione 6.19 (Cpo e funzioni continue). So ff ermiamoci ora brevemente sull’idea in-tuitiva alla base dei cpo e delle funzioni continue. Gli ordinamenti parziali completi corri-spondono ai tipi di dati, dati che possono essere utilizzati come input o come output di una

Page 121: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 121/332

6.3 Funzioni continue e minimo punto fisso 121

computazione. Gli elementi di un cpo sono visti come punti di informazione e x v y puòessere interpretato come “ x approssima y”, oppure “ x contiene una quantità di informazione

minore o uguale a quella di y”, di conseguenza ⊥ è l’elemento con minima informazione. Le funzioni stesse possono essere pensate come dati utilizzati oppure prodotti da una computa-zione. In particolare, le funzioni calcolabili sono rappresentate come funzioni continue tra tali cpo. Ciò deriva dall’idea intuitiva che la presenza di una untià di informazione nell’output di una funzione calcolabile debba dipendere soltanto dalla presenza di un numero finito di untià di informazioni nell’input. In caso contrario una computazione della funzione dovrebbe elaborare un numero infinito di untià di informazione prima di produrre l’untià di output in questione.

Alcuni cpo sono anche dei reticoli completi, cioè sono tali che ogni sottoinsieme di elementiabbia sia estremo superiore che estremo inferiore (un reticolo è un insieme che soddisfa laproprietà che qualsiasi coppia di elementi ha estremo superiore ed estremo inferiore). In tali

strutture si può dimostrare che ogni funzione monotona ha sempre minimo e massimo puntofisso. Ciò è quanto aff erma il teorema fondamentale della teoria del punto fisso, noto anchecome teorema di Tarski, dal nome del matematico che lo ha formulato. Un’altra dimostrazioneindipendente del teorema era stata trovata da Knäster.

Definizione 6.20. Dato un cpo D, una funzione f : D → D ed un elemento d ∈ D

1. d è un pre-punto fisso di f se f d v d;

2. d è un post-punto fisso di f se d v f d.

Quindi un punto fisso è sia un pre-punto fisso che un post-punto fisso.

Teorema 6.21 (Teorema di Knäster-Tarski per i punti fissi). Sia (R, v) un reticolo completoe sia f : R → R una funzione monotona. Allora f ammette sia massimo punto fisso zmax che minimo punto fisso zmin, i quali sono definiti nel modo seguente:

zmax = sup x ∈ R | x v f (x)zmin = inf x ∈ R | f (x) v x

Dimostrazione. Dimostriamo che zmax è il massimo punto fisso di f (la dimostrazione perzmin può essere fatta in maniera analoga). Affinché ció valga devono essere valide le dueseguenti aff ermazioni:

1. zmax = f (zmax), cioè zmax è un punto fisso, e

2. r v zmax, per ogni r ∈ R punto fisso di f .

Nella dimostrazione proveremo separatamente le due aff ermazioni. Ci serviremo inoltredell’insieme A definito nel modo seguente:

A = x ∈ R | x v f (x)

1. Mostriamo dapprima chezmax v f (zmax) e

f (zmax) v zmax.

Page 122: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 122/332

122 Capitolo 6 – Domini per la semantica denotazionale

Dimostriamo la prima delle due relazioni. Per definizione

zmax = sup A.

Allora, per ogni x ∈ A, è verificata x v zmax. Dalla monotonia di f , la relazionex v zmax implica f (x) v f (zmax). Segue che, per ogni x ∈ A, x v f (x) v f (zmax),perciò f (zmax) è un maggiorante per l’insieme A. Per definizione zmax è il minimomaggiorante di A, quindi zmax v f (zmax).

Per dimostrare la seconda relazione, si osservi che, da zmax v f (zmax) e dalla monotoniadi f , si ha che f (zmax) v f (f (zmax)). Ma allora f (zmax) ∈ A e quindi f (zmax) v zmax,dato che zmax è l’estremo superiore di A.

Componendo le due relazioni delle quali è appena stata dimostrata la validità si ottiene

zmax v f (zmax) v zmax

Per l’antisimmetria di v deve valere zmax = f (zmax), quindi zmax è un punto fisso di f .

2. Vediamo ora che zmax è il massimo punto fisso di f . Sia r un qualsiasi punto fisso dif . Allora in particolare avremo che r v f (r). Questo implica che r ∈ A e quindi cher v sup A = zmax. Perció tutti i punti fissi di f appartengono ad A e quindi zmax,che é l’estremo superiore di A, è il massimo punto fisso di f .

Il teorema di Knäster-Tarski è importante perché si applica a qualsiasi funzione monotona

su un reticolo completo. Nel seguito, tuttavia, l’attenzione sarà concentrata soprattutto suiminimi punti fissi di funzioni continue costruiti, con la tecnica utilizzata nel teorema di Kleene,come estremi superiori (cioè minimi maggioranti) di catene.

6.4 Costruzioni di domini

Come i linguaggi di programmazione forniscono primitive per costruire nuovi dati a partireda dati preesistenti, così la teoria dei domini fornisce alcuni operatori che permettono dicostruire nuovi domini a partire da domini esistenti. Questa ricchezza è importante in quantogarantisce che i cpo possano essere utilizzati come domini per dare significato ai vari tipi dicostrutti dei linguaggi di programmazione. Di seguito illustriamo alcuni di questi operatoriinsieme a particolari funzioni continue associate alle costruzioni.

6.4.1 Domini elementari

Il modo più semplice di definire un cpo a partire da un insieme qualsiasi è quello di definireil dominio piatto o elementare basato su di esso. Dato un insieme D, l’operazione di lifting up(D) consente di ottenere il cpo D = (D ∪ ⊥ , v) tramite l’aggiunta di un nuovo elemento⊥ (⊥6∈ D) a D e la definizione dell’ordinamento parziale, detto discreto, v come segue:

1. ⊥v x per ogni x ∈ D;

2. xv

x per ogni x∈

D∪

.

Page 123: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 123/332

6.4 Costruzioni di domini 123

È banale verificare che ogni D definito come sopra soddisfa le condizioni richieste ai domini.Il più semplice esempio di dominio piatto è quello dei booleani estesi con

⊥:

BOOL = (t rue, f alse, ⊥)

in cui i due valori di verità t rue e f alse sono incomparabili ed entrambi più definiti di ⊥.

t rue f alse

⊥Un altro esempio di dominio piatto che sarà frequentemente usato in queste note è NAT,

il dominio piatto dei naturali (introdotto nell’Esempio 6.16).

6.4.2 Prodotti finiti

Il prodotto tra domini, indicato dall’operatore ×, costruisce un dominio di n-uple a partireda n domini. Per semplicità in questa sezione presenteremo i dettagli per il prodotto binario,l’estensione al prodotto di n domini è ovvia.

Definizione 6.22. Siano D0 = (D0, v0) e D1 = (D1, v1) due domini. Chiamiamo dominioprodotto, denotato con D0 × D1, la coppia (D0 × D1, v) dove

1. D0 × D1 è il prodotto cartesiano di D0 e D1, cioè hx, yi | x ∈ D0, y ∈ D1;

2. la relazione v è definita “per componenti”, cioè hx, yi v hx0, y0i se e solo se x v0 x0 e y v1 y 0.

Dimostriamo ora che il prodotto di cpo è esso stesso un cpo.

Teorema 6.23. D0 × D1 è un cpo.

Dimostrazione. Si dimostra facilmente che la relazione v è riflessiva, antisimmetrica e tran-sitiva sfruttando le analoghe proprietà di v0 e v1. Quindi D0 ×D1 è un poset. Il suo minimoè la coppia h⊥0, ⊥1i (è ovvio infatti che h⊥0, ⊥1i v hd0, d1i, ∀d0 ∈ D0, ∀d1 ∈ D1). Resta dadimostrare che ogni catena in D0 ×D1 ha estremo superiore. Sia hxi, yii | i ∈ N una catena.Per definizione di

vabbiamo che xi | i

∈N e yi | i

∈N sono catene rispettivamente in D0

e D1 e quindi hanno sup perché questi insiemi sono cpo. Siccome abbiamo:

∀ j ∈ N : x j v0 sup xi | i ∈ N e y j v1 sup yi | i ∈ N

allora abbiamo anche che

∀ j ∈ N : hx j , y ji v hsup xi | i ∈ N , sup yi | i ∈ Ni

e quindi hsup xi | i ∈ N , sup yi | i ∈ Ni è un maggiorante della catena hx j , y ji | j ∈ N.Dimostriamo ora che è il più piccolo dei maggioranti. Sia hm, ni un altro maggiorante. Questovuol dire che

∀i∈N :

hxi, yi

i v hm, n

i

Page 124: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 124/332

124 Capitolo 6 – Domini per la semantica denotazionale

e quindi, per come v è stato definito,

∀i ∈ N : xi v0 m e yi v1 n.

Questo basta per concludere che m ed n sono maggioranti di xi | i ∈ N e yi | i ∈ N, ri-spettivamente. Dalla definizione di estremo superiore segue che sup xi | i ∈ N v0 m esup yi | i ∈ N v1 n. Pertanto, dalla definizione di v, abbiamo

hsup xi | i ∈ N , sup yi | i ∈ Ni v hm, ni

e quindi la coppia hsup xi | i ∈ N , sup yi | i ∈ Ni è l’estremo superiore della catena

hxi, yii | i ∈ N .

In particolare, generalizzando il teorema precedente al prodotto di n domini, abbiamo chel’estremo superiore di una catena di n-uple corrisponde alla n-upla degli estremi superioridelle singole componenti.

Le funzioni associate al cpo prodotto rivestono una notevole importanza. Al costruttore di n-uple h·, . . . , ·i | z

n

sono anche associati n distruttori , detti anche selettori o proiettori , che

permettono di selezionare singole componenti di una n-upla in D0×D1 × · · · ×Dn−1. Nel cason = 2 abbiamo due selettori , cioè due funzioni funzioni

Π0 : (D0

×D1)

→D0

Π1 : (D0 × D1) → D1

definite come segue:Πi(x0, x1) = xi i = 0, 1.

Lemma 6.24. I selettori Π0 e Π1 sono continui.

Dimostrazione. (Schema) La prova è semplice e si basa sul fatto che l’estremo superiore di unacatena di n-uple corrisponde alla n-upla degli estremi superiori delle singole componenti.

L’operazione che dati gli elementi di singoli cpo crea la n-upla corrispondente può essereestesa alle funzioni. Siano f 0 : D → D0 e f 1 : D → D1 due funzioni continue. Si definisce la

funzione hf 0, f 1i : D → D0 × D1

nel seguente modo:hf 0, f 1i(d) = hf 0(d), f 1(d)i

La funzione hf 0, f 1i chiaramente soddisfa la proprietà che

Πi hf 0, f 1i = f i per i = 0, 1

e, in eff etti, hf 0, f 1i è l’unica funzione in D → D0 × D1 che gode di tale proprietà. Si puòfacilmente dimostrare che la funzione hf 0, f 1i è monotona. Inoltre è anche continua, comeaff erma il seguente Lemma.

Page 125: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 125/332

6.4 Costruzioni di domini 125

Lemma 6.25. La funzione hf 0, f 1i è continua.

Dimostrazione. Sia xi | i ∈ N una catena in D. Allora abbiamo

hf 0, f 1i(sup xi | i ∈ N)= hf 0(sup xi | i ∈ N), f 1(sup xi | i ∈ N)i definizione di hf 0, f 1i= hsup f 0(xi) | i ∈ N , sup f 1(xi) | i ∈ Ni continuità delle f i= sup hf 0(xi), f 1(xi)i | i ∈ N definizione di sup di un prodotto,

Teorema 6.23= sup hf 0, f 1i(xi) | i ∈ N definizione di hf 0, f 1i.

La costruzione di prodotto sui cpo può essere estesa alle funzioni. Siano f 0 : D0

→ D2 e

f 1 : D1 → D3 due funzioni continue. Si definisce la funzione

f 0 × f 1 : D0 × D1 → D2 × D3

nel modo seguente:f 0 × f 1he0, e1i = hf 0(e0), f 1(e1)i

Lemma 6.26. La funzione f 0 × f 1 è continua.

Dimostrazione. Si noti che f 0 × f 1 = hf 0 Π0, f 1 Π1i. Ogni componente f i Πi è continuapoiché è la composizione di funzioni continue (Lemma 6.14), e, per il Lemma 6.25, è continuaanche la coppia

hf 0

Π0, f 1

Π1

i, così la tesi è dimostrata.

Vediamo un paio di importanti proprietà dei prodotti, spesso usate in pratica.

Lemma 6.27. Siano D, D0 e D1 cpo e sia h : D → D0×D1 una funzione. Allora h è continua se e solo se le funzioni Π0 h : D → D0 e Π1 h : D → D1 sono continue.

Dimostrazione. ⇒) Segue direttamente dal fatto che la composizione di funzioni continue èuna funzione continua (Lemma 6.14).⇐) Siano Π0 h e Π1 h continue. Allora, per qualsiasi x ∈ D abbiamo

h(x) = hΠ0(h(x)),Π1(h(x))i = hΠ0 h(x),Π1 h(x)i = hΠ0 h,Π1 hi(x)

Dunque, poiché Π0 h e Π1 h sono continue, per il Lemma 6.25, anche h = hΠ0 h,Π1 hiè continua.

Per dimostrare la proprietà successiva, faremo uso del seguente risultato riguardantel’estremo superiore di una “matrice” di elementi di un cpo.

Proposizione 6.28. Siano ai,j elementi di un cpo D, con i ∈ I e j ∈ I , aventi la proprietà che ai,j v ai0,j0 se i ≤ i0 e j ≤ j0. Allora l’insieme ai,j | i ∈ I, j ∈ I ha estremo superiore e

supai,j | i ∈ I, j ∈ I = supsupai,j | i ∈ I | j ∈ I = supsupai,j | j ∈ I | i ∈ I = supai,i | i

∈I

Page 126: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 126/332

126 Capitolo 6 – Domini per la semantica denotazionale

Dimostrazione. La prova è semplice e si basa sul fatto che gli insiemi A = ai,j | i ∈ I, j ∈ I ,B = supai,j | i

∈ I | j

∈ I , C = supai,j | j

∈ I | i

∈ I e D = ai,i | i

∈ I hanno

gli stessi maggioranti, e quindi lo stesso minimo dei maggioranti, cioè estremo superiore. Peresempio, è facile vedere che A e D hanno gli stessi maggioranti perché qualsiasi elemento ai,j

è minore o uguale di un elemento della forma ai,i, e viceversa. Certamente l’estremo superioredella catena D esiste e quindi l’estremo superiore di A esiste e i due valori coincidono. Inoltre,sfruttando la commutatività di quantificatori omogenei, in questo caso del quantificatoreuniversale, abbiamo

x è un maggiorante per B ⇔ ∀ j. supai,j | i ∈ I v x⇔ ∀ j∀i. ai,j v x⇔ x è un maggiorante per A⇔ ∀i. supai,j | j ∈ I v x

⇔ x è un maggiorante per C .

Lemma 6.29. Una funzione f : D1 × D2 → D è continua se e solo se f è continua nei due argomenti separatamente, cioè se, per qualsiasi d1 ∈ D1, la funzione f 2 : D2 → D definita da f 2(d) = f (d1, d) è continua, così come pure è continua la funzione f 1 : D1 → D definita da f 1(d) = f (d, d2), per qualsiasi d2 ∈ D2.

Dimostrazione. ⇒ Questa parte è semplice. Basta fissare uno dei due argomenti e dimo-strare che se soltanto uno degli argomenti contribuisce al crescere della catena, alloral’ipotesi di continuità della funzione è sufficiente per derivare la tesi. In pratica, bisognadimostrare che se ai | ai

∈D1, i

∈I è una catena e b

∈D2 allora

f (supai | i ∈ I , b) = supf (ai, b) | i ∈ I .

da cui la tesi segue per simmetria. In eff etti, abbiamo

supf (ai, b) | i ∈ I = f (sup(ai, b) | i ∈ I ) per la continuità di f = f (supai | i ∈ I , b) per definizione di prodotto

⇐ Bisogna dimostrare che se A = (ai, bi) | ai ∈ D1, bi ∈ D2, i ∈ I è una catena allora

f (sup(ai, bi) | i ∈ I ) = supf (ai, bi) | i ∈ I .

Dall’ipotesi che A è una catena segue che anche gli insiemi (ai, b j ) | b j ∈ D2, j ∈ I ,per ogni ai

∈ D1 con i

∈ I , sono catene. In particolare, l’ipotesi di continuità, seppure

sui singoli argomenti, implica la monotonia di f e quindi sono catene anche gli insiemif (ai, b j ) | b j ∈ D2, j ∈ I , per ogni ai ∈ D1 e i ∈ I . Inoltre, sempre dall’ipotesi dicontinuità, segue che tali insiemi hanno estremo superiore. Quindi abbiamo

f (sup(ai, bi) | i ∈ I ) = f (supai | i ∈ I , supb j | j ∈ I )per la definizione di sup di un prodotto,

= supf (ai, supb j | j ∈ I ) | i ∈ I per la continuità di f nel primo argomento

= supsupf (ai, b j ) | j ∈ I | i ∈ I per la continuità di f nel secondo argomento

= supf (ai, bi) | i ∈ I

per la Proposizione 6.28.

Page 127: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 127/332

6.4 Costruzioni di domini 127

Quest’ultimo risultato è molto utile perché in numerose occasioni la continuità di unafunzione definita su di un prodotto viene verificata dimostrando che è continua separatamenterispetto a ciascun argomento.

6.4.3 Somma disgiunta

È spesso utile creare unioni di domini, per esempio per aggiungere valori di errore ai valori “normali” delle computazioni. Un modo per unire due o più domini ed ottenere un nuovodominio è quello di fare l’unione disgiunta dei loro elementi. Questa costruzione, indicatadall’operatore +, è simile all’operazione di unione disgiunta tra insiemi; essa è strutturata inmodo tale che è possibile esaminare un elemento del risultato e decidere a quale degli insiemi dipartenza esso appartiene. Dati due domini D0 e D1, l’operazione di somma disgiunta costruisceun dominio i cui elementi sono copie degli elementi dei domini di origine contrassegnate conil nome di tale dominio (o con qualcosa che permetta di identificarlo univocamente), più unnuovo elemento minimo. Anche in questo caso definiremo soltanto la somma disgiunta di duedomini, in quanto la sua estensione al caso generale di n domini è ovvia.

Definizione 6.30. Siano D0 = (D0, v0) e D1 = (D1, v1) due domini. Chiamiamo sommadisgiunta, denotata da D0 + D1, la coppia (D0 + D1, v) con

1. D0 + D1 = inD0(x) | x ∈ D0 ∪ inD1(y) | y ∈ D1 ∪ ⊥,

2. v è definita come segue:

(a) ⊥v d, per ogni d ∈ D0 + D1,(b) inDi(d) v inDi(d0) ⇔ d vi d0, per ogni d, d0 ∈ Di (i = 0, 1),

dove le funzioni di immersione inD0 : D0 −→ D0 + D1 e inD1 : D1 −→ D0 +D1 sono iniettive e tali che inD0(d) e inD1(d0) siano sempre inconfrontabili per qualsiasi d e d0.

Analogamente a quanto dimostrato per il prodotto, si può facilmente dimostrare che lasomma disgiunta di cpo è essa stessa un cpo.

Teorema 6.31. D0 + D1 è un cpo.

Associati al costruttore somma ci sono operatori che permettono di riottenere elementi dei

domini originari a partire da elementi del dominio composto o di testare il dominio di originedi un certo elemento del dominio composto.Nel caso n = 2, abbiamo i due selettori

outD0 : D0 + D1 → D0

outD1 : D0 + D1 → D1

definiti come segue:

outDi(x) =

⊥i se x =⊥ o x = inDi+21(y)y se x = inDi(y)

dove i = 0, 1 e +2 denota la somma modulo 2.

Page 128: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 128/332

128 Capitolo 6 – Domini per la semantica denotazionale

Abbiamo anche i due predicati di test

isD0 : D0 + D1 → BOOLisD1 : D0 + D1 → BOOL

definiti come segue:

isDi(x) =

t rue se x = inDi(y)

f alse se x = inDi+21(y)⊥BOOL se x =⊥D0+D1

dove i = 0, 1.Possiamo dimostrare la continuità delle operazioni associate alla somma disgiunta, come

enunciato dal seguente risultato.

Lemma 6.32. Le immersioni inDi, i selettori outDi e i predicati isDi sono continui.La costruzione di somma disgiunta di cpo può essere estesa alle funzioni. Siano f 0 : D0 → D

e f 1 : D1 → D due funzioni continue sui cpo D0, D1 e D. Si definisce la funzione combinazione

[f 0, f 1] : D0 + D1 → D

nel modo seguente:

[f 0, f 1](inDi(di)) = f i(di) ∀di ∈ Di e i = 0, 1[f 0, f 1](⊥) = ⊥D

Si potrebbe dimostrare che la funzione così definita è continua.

Lemma 6.33. La funzione [f 0, f 1] è continua.

Inoltre, vale che [f 0, f 1]inDi = f i per i = 0, 1 e tale proprietà sulle funzioni in D0+D1 → D

caratterizza la funzione [f 0, f 1] in modo univoco.

6.4.4 Spazio delle funzioni

Il prossimo costruttore di domini risulta essenziale per le definizioni semantiche dei linguaggidi programmazione. Il costruttore di spazi di funzione , indicato con →, crea il dominio (D0 →D1, v) a partire dai domini D0 e D1. Gli elementi di questo dominio sono tutte le funzionicontinue da D0 a D1 e l’ordinamento

v richiede che una funzione più definita di un’altra

fornisca, per uguale argomento, un risultato uguale o più definito. Tale ordinamento, quandoi domini D0 e D1 sono piatti, coincide con quello presentato informalmente in Sezione 6.1.Per esprimere gli elementi del dominio (D0 → D1, v) useremo la λ-notazione (introdotta nelCapitolo 5); in pratica, la λ-astrazione funge da costruttore e l’applicazione di funzione dadistruttore.

Definizione 6.34. Siano D0 = (D0, v0) e D1 = (D1, v1) due domini. Chiamiamo spaziodelle funzioni continue da D0 a D1, denotato da [D0 → D1], la coppia (D0 → D1, v) dove

1. D0 → D1 è l’insieme delle funzioni continue da D0 a D1,

2.

v è così definito: f

vg

⇔ ∀x.fx

v1 gx.

Page 129: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 129/332

6.4 Costruzioni di domini 129

Di seguito dimostriamo che lo spazio delle funzioni continue tra due cpo è ancora un cpo.

Teorema 6.35. [D0 →

D1] è un cpo.

Dimostrazione. È facile verificare che v è riflessiva, antisimmetrica e transitiva: ciò derivadalle corrispondenti proprietà di v0 e v1. Quindi (D0 → D1, v) è un poset. Inoltre esiste ilminimo, che è la funzione continua:

Ω = λx. ⊥1 .

Resta da dimostrare che ogni catena di funzioni in [D0 → D1] ha sup in [D0 → D1]. Data unagenerica catena di funzioni continue f i | i ∈ I , sia g la funzione così definita:

g = λx.supf i x | i ∈ I .

Per dimostrare la tesi, sarà allora sufficiente dimostrare che la funzione g così definita ap-

partiene a [D0 → D1], cioè che g è continua (punto 1) e che g = supf i | i ∈ I (punto2).

1. È facile convincersi che g è monotona. Infatti, siano x1, x2 ∈ D0 tali che x1 v x2.Allora, abbiamo f i x1 v f i x2 per ogni i ∈ I , dato che f i è monotona. Quindi, per ladefinizione di g , abbiamo ∀i ∈ I , gx1 = supf i x1 | i ∈ I v supf i x2 | i ∈ I = gx2.Dimostriamo ora che g è anche continua, cioè che, data una catena x j | j ∈ J dielementi di D0, abbiamo:

g supx j | j ∈ J = supg x j | j ∈ J .

Il fatto che g sia monotona garantisce l’esistenza di supg x j | j ∈ J ; infatti g x j |

j ∈ J è una catena in D

1 e quindi ha estremo superiore dato che per ipotesi D

1 è uncpo. Abbiamo:

g supx j | j ∈ J = supf i supx j | j ∈ J | i ∈ I definizione di g= supsupf i x j | j ∈ J | i ∈ I continuità delle f i= supsupf i x j | i ∈ I | j ∈ J Proposizione 6.28= supg x j | j ∈ J definizione di g .

2. Per la definizione di sup e per quella di g abbiamo:

∀i ∈ I, ∀x ∈ D0 : f i x v1 supf i x | i ∈ I = g x.

Questo, per come è stato definito l’ordinamento tra funzioni, implica

∀i ∈ I : f i v g

e quindi g è un maggiorante della catena f i | i ∈ I . Dimostriamo che esso è anche ilminimo tra i maggioranti. Sia h un altro maggiorante per f i | i ∈ I . Per la definizionedi v abbiamo che

∀i ∈ I, x ∈ D0, f i x v1 h x.

Questo basta per concludere che h x è un maggiorante della catena f i x | i ∈ I . Poichég x è per definizione il sup di tale catena, dalle definizioni di sup e di v abbiamo

∀x ∈ D0. g x v1 h x, dunque g v h

e questo basta per concludere che g è il sup di f i | i∈

I .

Page 130: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 130/332

130 Capitolo 6 – Domini per la semantica denotazionale

In particolare, dal teorema precedente segue che l’estremo superiore di una catena difunzioni continue è definito in maniera “puntuale”, cioè corrisponde alla funzione che su ognielemento del dominio restituisce l’estremo superiore della catena di elementi formata dai valorirestituiti dalle singole funzioni della catena quando invocate su quell’elemento.

Ci sono due operazioni chiave associate alla costruzione dello spazio delle funzioni,l’applicazione e la currificazione (introdotta alla fine della Sezione 5.1). La prima corrispondealla funzione a pply : [D1 → D2] × D1 → D2 definita da

a pply ≡ λ(f, x).f (x) .

La seconda (·)c :: [(D1

×D2)

→ D3]

→ [D1

→ D2

→ D3], data una funzione continua f :

(D1 × D2) → D3, corrisponde alla versione currificata di f , cioè f c : D1 → D2 → D3, definitada

(·)c ≡ λf.λx.λy.f (x, y) .

Sotto ipotesi opportune, entrambe le funzioni risultano essere continue, come sostenuto daidue lemmi seguenti.

Lemma 6.36. La funzione a pply è continua se il suo primo argomento è una funzione continua.

Dimostrazione. Sfruttando il Lemma 6.29 sarà sufficiente dimostrare che a pply è continua nel

primo e secondo argomento separatamente.

1. Dimostriamo prima che a pply(f, supxi | i ∈ I ) = supa pply(f, xi) | i ∈ I .

a pply(f, supxi | i ∈ I ) = f (supxi | i ∈ I ) per definizione di a pply,= supf xi | i ∈ I per la continuità di f ,= supa pply(f, xi) | i ∈ I per definizione di a pply.

2. Dimostriamo ora che a pply(supf i | i ∈ I , x) = supa pply(f i, x) | i ∈ I .

a pply(supf i | i ∈ I , x) = (supf i | i ∈ I )x per definizione di a pply,

= supf ix | i ∈ I perché l’estremo superiore di una catena difunzioni continue è definito in modo puntuale,

= supa pply(f i, x) | i ∈ I per definizione di a pply.

Lemma 6.37. Se f : [(D1 × D2) → D3] è una funzione continua allora anche f c è continua.

Dimostrazione. Si osservi innanzitutto che, ∀x ∈ D1, f c(x) = λy.f (x, y) è continua. Infatti,dato che f è continua, dal Lemma 6.29 segue che è continua separatamente rispetto a ciascunargomento, per cui f c(x) è continua. Dimostriamo ora che f c è continua, cioè che per una

Page 131: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 131/332

6.4 Costruzioni di domini 131

generica catena xi | xi ∈ Di, i ∈ I abbiamo f c(supxi | xi ∈ Di, i ∈ I ) = sup(f cxi | xi ∈Di, i

∈I ). Sia d

∈D2 generico. Abbiamo

(f c(supxi | i ∈ I ))d = f (supxi | i ∈ I , d) per definizione di f c,= supf (xi, d) | i ∈ I perché f è continua,= sup(f c(xi))d | i ∈ I per definizione di f c,= sup(f cxi | i ∈ I )d perché l’estremo superiore di una catena di

funzioni continue è definito in modo puntuale.

Si potrebbe anche dimostrare che, data f : [D1 ×D2 → D3], f c è l’unica funzione continuain [D1 → D2 → D3] tale che

apply(f

c

(d1), d2) = f (d1, d2) ∀d1 ∈D1, d2 ∈

D2 .

Un operatore utile nel seguito è (·)∗ :: [D1 → D2] → [D1 → D2], il quale data una funzionecontinua f : [D1 → D2] ne restituisce la sua versione “stretta”; questa coincide con la funzioneoriginale a parte che è indefinita quando tale è l’argomento. Sia f : [D1 → D2] una funzionecontinua tra due cpo. La funzione f ∗ : [D1 → D2] è definita nel modo seguente

f ∗(d) =

f (d) se d 6=⊥D1⊥D2

se d =⊥D1

Lemma 6.38. L’operatore (·)∗ è continuo.

Dimostrazione. Sia d un elemento qualsiasi di D1 e sia f i | i

∈ I una generica catena di

funzioni continue in [D1 → D2]. Nel caso in cui d =⊥D1 , dalla definizione dell’operatore (·)∗, siottiene immediatamente che (supf i | i ∈ I )∗(d) =⊥D2

= (supf ∗i | i ∈ I )(d). Altrimenti,cioè se d 6=⊥D1

, abbiamo

(supf i | i ∈ I )∗(d) = (supf i | i ∈ I )(d) per definizione di f ∗,= supf i(d) | i ∈ I perché l’estremo superiore di una catena di

funzioni continue è definito in modo puntuale.= supf ∗i (d) | i ∈ I per definizione di f ∗,= (supf ∗i | i ∈ I )(d) perché l’estremo superiore di una catena di

funzioni continue è definito in modo puntuale.

Chiudiamo questa sezione introducendo la funzione condizionale

· → ·, · : BOOL× D× D → D

dove D è un qualche cpo (si ricordi che BOOL = t rue, f alse, ⊥ è il cpo piatto dei valori diverità). Presi b ∈ BOOL e d, d0 ∈ D, poniamo

b → d, d0 =

d se b = t rued0 se b = f alse⊥D se b =⊥BOOL

Il risultato successivo ne dimostra la continuità.

Page 132: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 132/332

132 Capitolo 6 – Domini per la semantica denotazionale

Lemma 6.39. La funzione condizionale · → ·, · : BOOL× D× D → D è continua.

Dimostrazione. Sia hb1, d1, d01i v hb2, d2, d02i v hb3, d3, d03i v . . . una catena in BOOL× D× D.Abbiamo tre casi da considerare.

1. bi =⊥ per tutti gli i ≥ 1: Poiché l’estremo superiore di una catena di n-uple corrispondealla n-upla degli estremi superiori delle singole componenti (si veda il Teorema 6.23),abbiamo sup h⊥, di, d0ii = hsup ⊥, sup di, sup d0ii = h⊥, sup di, sup d0ii. Inoltre,poiché

· → ·, ·(⊥, sup di, sup d0i) =⊥→ sup di, sup d0i =⊥D=sup ⊥D = sup ⊥→ di, d0i = sup · → ·, ·(⊥, di, d0i)

abbiamo che la condizione di continuità per la funzione ·

→·, · è verificata.

2. bi = t rue per tutti gli i ≥ k per un qualche k: ragionando come nel caso precedente, ab-biamo sup hbi, di, d0ii = hsup bi, sup di, sup d0ii = ht rue, sup di, sup d0ii. La condizionedi continuità per la funzione · → ·, · risulta verificata poiché abbiamo:

· → ·, ·(t rue, sup di, sup d0i) = t rue → sup di, sup d0i = sup di =sup di|i ≥ k = sup bi → di, d0i = sup · → ·, ·(bi, di, d0i)

3. bi = f alse per tutti gli i ≥ k per un qualche k : la prova di questo caso è simile a quelladel caso precedente.

6.5 Un metalinguaggio per la definizione di funzioni di

interpretazione

Nel Capitolo 4 abbiamo visto che la semantica denotazionale di un linguaggio di programma-zione consiste nell’associare elementi di opportuni domini semantici a termini della sintassiastratta del linguaggio. Nell’introduzione a questo capitolo abbiamo visto che, per le difficoltàmatematiche che intervengono quando si vogliono catturare proprietà e descrivere costruttidei linguaggi di programmazione, è necessario utilizzare come domini speciali tipi di insiemicon struttura conosciuti come ordinamenti parziali completi ed è necessario richiedere che lefunzioni su tali oggetti matematici siano continue.

In questa sezione introdurremo un linguaggio per descrivere elementi dei domini semantici,cioè elementi dei cpo che utilizzeremo per denotare i costrutti dei linguaggi di programmazioneche studieremo nei capitoli successivi. Siccome il linguaggio che proporremo verrà utilizzatoper descrivere altri linguaggi, esso verrà chiamato metalinguaggio. Assumeremo che il signifi-cato dei suoi costrutti sia noto; se così non fosse dovremmo utilizzare un meta-metalinguaggiopiù semplice per descrivere il metalinguaggio stesso ed assumere o che la semantica del meta-metalinguaggio sia nota oppure andare avanti fino ad un linguaggio (ad esempio quello deinumeri naturali) che riterremo sufficientemente semplice per poter essere utilizzato come basedelle nostre descrizioni semantiche.

Page 133: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 133/332

6.5 Un metalinguaggio per la definizione di funzioni di interpretazione 133

6.5.1 Una classe di domini

Prima di procedere alla presentazione del metalinguaggio ricapitoliamo come, a partire dainsiemi di valori, che prendiamo come valori di base e noti, sia possibile definire una classe dicpo sufficientemente ricca per i nostri scopi.

Gli insiemi di base che utilizzeremo per le denotazioni dei vari linguaggi che saranno presiin esame in queste note saranno:

Naturali, 0, 1, 2, . . ., che chiameremo N;

Booleani, t rue, f alse, che chiameremo B;

Locazioni, l ,loc,... che chiameremo LOC;

Identificatori, i n, out, r es, plike,..., un insieme di stringhe di lettere e numeri che

chiameremo I;

Insiemi finiti, e rror , u nbound , u nused , e rror, u nbound, u nused , . . ., insiemi co-struiti elencando esplicitamente i loro elementi.

I domini che utilizzeremo saranno costruiti a partire da uno qualsiasi di questi insiemi di ba-se, oppure componendo altri domini precedentemente definiti, tramite opportuni costruttori.Questi costruttori di dominio sono stati, per la maggior parte, già presentati nella Sezione 6.4;li ripresentiamo qui per sommi capi per ricordare la struttura delle nostre denotazioni e perintrodurre alcune semplici generalizzazioni.

Lifting: up(D). I domini primitivi possono essere formati a partire da uno qualsiasi degliinsiemi base tramite l’operazione di lifting. Se D è un insieme di valori base allora up(D)restituisce il dominio (piatto) D = (D ∪ ⊥ , v) che contiene l’elemento minimo ⊥ ed è taleche tutti gli elementi sono più definiti di ⊥ e sono tra di loro inconfrontabili. Per esempio,nelle sezioni precedenti, abbiamo visto come i domini NAT e BOOL dei naturali e dei booleanivengono costruiti tramite lifting a partire da N e B.

Prodotto di domini: ×(D1, . . . ,Dn). Dati n domini D1, . . . ,Dn, l’operazione di prodotto×(D1, . . . ,Dn) costruisce un dominio di n-uple di elementi degli n domini. Spesso invece dellanotazione prefissa, scriveremo (D1 × · · · × Dn). Questa operazione è la generalizzazione delprodotto binario visto in dettaglio nella Sezione 6.4.2. Le operazioni associate al prodotto di

domini sono il costruttore di n-uple h·, . . . , ·i | z n

ed i proiettoriΠ

i(·) (con 1 ≤ i ≤ n). Nel seguito,dato il dominio D, indicheremo con Dn il dominio prodotto D× . . . × D | z

n

.

Somma disgiunta di domini: +(D1, . . . ,Dn). Dati n domini D1, . . . ,Dn, l’operazione disomma disgiunta +(D1, . . . ,Dn) costruisce un dominio i cui elementi sono etichettati dal nome(o da qualcosa che permetta di identificare univocamente il nome) dei loro domini di origine.Anche per questo operatore useremo spesso la notazione infissa: D1 + · · · + Dn. Questaoperazione è la generalizzazione della somma binaria vista in dettaglio nella Sezione 6.4.3.Le operazioni associate alla somma disgiunta di domini sono i costruttori inDi(·), i selettorioutDi(·) ed i predicati isDi(·) (con 1

≤i≤

n).

Page 134: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 134/332

134 Capitolo 6 – Domini per la semantica denotazionale

Generalizzando, si può definire una somma disgiunta infinita. Se D1, D2, D3, . . .sonodomini allora D1 +D2 +D3 + . . . contiene elementi della forma inDi(d) con d

∈Di (per i > 0),

più un nuovo elemento minimo.Tra l’altro, questa costruzione permette la definizione del dominio “delle sequenze”, deno-

tato con D∗, comprendente tutte le sequenze finite (liste) formate da elementi di un dominioD

D∗ = nil + D + D

2 + D3 + . . .

Se d ∈ D∗, allora esso è o la sequenza vuota (rappresentata da nil), oppure una sequenza dielementi di D di lunghezza finita n, per qualche n ≥ 1, oppure ⊥. Al dominio sequenza D∗

sono associate specifiche operazioni: il costruttore · :: ·, i selettori hd(·) e tl(·) ed il predicatonull(·). Se s ∈ D

∗ e d ∈ D, informalmente le operazioni sono così definite:

d :: s è la sequenza il cui primo elemento è d e il resto è la sequenza s;

hd(s) è il primo elemento della sequenza s;

tl(s) è la sequenza ottenuta da s togliendo il primo elemento;

null(s) è un predicato che è vero se s è la sequenza vuota.

Vogliamo ora definire formalmente le operazioni associate a D∗. Si tenga innanzituttopresente che se uno dei loro argomenti è un elemento minimo (di D o di D∗, a seconda del tipodell’operazione) il risultato dell’operazione è l’elemento minimo del codominio. Consideriamoora i casi restanti, cioè s ∈ D

∗ e d ∈ D con s 6=⊥D∗ e d 6=⊥D. Quindi s = inDn(d1, d2, . . . , dn),per qualche n ≥ 1 e di ∈ D per ogni 1 ≤ i ≤ n, oppure s = inD0(nil). Allora abbiamo:

· :: · : D× D∗ → D∗ cond :: inD0(nil) = inD1(d)d :: inDn(d1, d2, . . . , dn) = inDn+1(d,Π1(outDn(inDn(d1, d2, . . . , dn))), . . . ,

Πn(outDn(inDn(d1, d2, . . . , dn))))

hd(·) : D∗ → D conhd(inD0(nil)) =⊥hd(inDn(d1, d2, . . . , dn)) = Π1(outDn(inDn(d1, d2, . . . , dn)))

tl(·) : D∗ → D∗ con

tl(inD0(nil)) =⊥tl(inD1(d)) = inD0(nil)tl(inDn(d1, d2, . . . , dn)) = inDn−1(Π2(outDn(inDn(d1, d2, . . . , dn))), . . . ,

Πn(outDn(inDn(d1, d2, . . . , dn)))) se n > 1

null(·) : D∗ → BOOL connull(s) = isD0(s)

Dalla loro definizione formale deriva direttamente che le operazioni associate al dominiosequenza D∗ sono continue poiché definite in termini della composizione di funzioni continue(si vedano i risultati delle Sezioni 6.3 e 6.4). Quindi vale il seguente risultato.

Lemma 6.40. Il costruttore · :: · ∈ (D× D∗) → D

∗, i selettori hd(·) ∈ D∗ → D e tl(·) ∈ D

∗ →D∗ ed il predicato null

∈D∗

→BOOL sono continui.

Page 135: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 135/332

6.5 Un metalinguaggio per la definizione di funzioni di interpretazione 135

Spazio delle funzioni continue: [D0 → D1]. Il costruttore di spazi di funzioni rappresental’insieme di tutte le funzioni continue da un dominio D0 ad un dominio D1; esso crea il dominio

[D0 → D1] a partire dai domini D0 e D1. Per non appesantire la notazione, assumeremo chel’operatore ‘→’ associ a destra e rappresenteremo:

D0 → (D1 → (D2 → · · · → Dn) . . .) con D0 → D1 → D2 → · · · → Dn.

La λ-astrazione è il modo più comune per costruire elementi di [D0 → D1], così come l’appli-cazione di una funzione elemento di [D0 → D1] ad un elemento di D0 permette di riottenereun elemento di D1.

6.5.2 Il metalinguaggio

Nella descrizione della semantica denotazionale di un linguaggio di programmazione è neces-sario avere a disposizione strumenti che permettano di ottenere nuove funzioni a partire dafunzioni esistenti. Per quanto visto finora (si veda in particolare i risultati in Sezione 6.3), èimportante che le funzioni utilizzate siano continue. Risulta essenziale quindi che le operazioniper la manipolazione di funzioni preservino la continuità. Il principale scopo di questa sezio-ne è quello di rassicurare il lettore che le funzioni di interpretazione semantica che sarannoutilizzate nel seguito per descrivere i costrutti dei linguaggi di programmazione sono tuttedefinite su cpo e sono tutte continue.

Il metalinguaggio proposto è basato sulla λ-notazione introdotta nel Capitolo 5 e la suasemantica operazionale è quindi basata sulla β -riduzione. Ricordiamo che invece di scrivereλx.λy.f spesso scriveremo semplicemente λxy.f . È importante non confondere questa nota-

zione con λ(x, y).f . Infatti, λxy.f è un funzionale di un solo argomento, mentre λ(x, y).f èuna funzione di due argomenti raggruppati in una coppia. Approfittiamo di questa occasioneanche per ricordare che la λ-astrazione associa a destra, cioè lega il più possibile alla suadestra: pertanto λx.x + y va letto come λx.(x + y) e non come (λx.x) + y.

Tuttavia, per denotare funzioni utilizzeremo non soltanto λ-espressioni, ma anche unasintassi più mnemonica. Questa può comunque essere sempre vista come un’abbreviazionedi una qualche λ-espressione, come sarà chiaro alla fine della sezione. Si vorrebbe imporre ilminor numero possibile di vincoli sulla λ-notazione e tuttavia essere sicuri che, così facendo,si definiscono funzioni continue.

Le principali componenti delle funzioni di interpretazione che utilizzeremo nei capitolisuccessivi saranno:

• le variabili,

• le costanti, tra cui l’operatore di minimo punto fisso,

• le n-uple,

• l’applicazione di funzione,

• la λ-astrazione,

• i costrutti derivati Condizionale, Let e Case.

Page 136: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 136/332

136 Capitolo 6 – Domini per la semantica denotazionale

Queste, ed alcune altre costruzioni esprimibili utilizzando solo quelle elencate sopra, costitui-scono le espressioni del metalinguaggio. Tipicamente, tali espressioni rappresentano elementi

di un qualche cpo D1 e dipendono da variabili ciascuna delle quali assume valori in qualchealtro cpo. È quindi necessario stabilire la continuità di queste espressioni. Un’espressione eè detta continua nella variabile x ∈ D0 se e solo se la funzione λx.e (con tipo D0 → D1) ècontinua. Si dice che e è continua nelle sue variabili se e solo se e è continua in ciascunadelle sue variabili. In particolare, se la variabile x non occorre in e, allora la funzione λx.e ècostante e quindi continua.

I risultati di questa sezione, insieme a quelli della sezione precedente, ci permettono didimostrare che i costrutti fondamentali del metalinguaggio usato per descrivere le funzioni diinterpretazione semantica preservano la continuità e quindi garantiscono che le espressioni delmetalinguaggio sono continue nelle loro variabili.

Variabili. Un’espressione e, che assume valori in un cpo D1, costituita da una singola va-riabile x è continua nelle sue variabili perché, presa y ∈ D0, la funzione λy.e risulta infattiessere o l’identità λx.x (quando y = x) oppure la funzione costante λy.x.

Costanti. Oltre ai valori base (interi, booleani, ⊥, . . . ), abbiamo già introdotto altrielementi “particolari” dei cpo, quali

• le proiezioni Πi ∈ (D0 × . . . × Dn) → Di, le operazioni su funzioni hf 0, . . . , f ni : D →D0 × . . . × Dn e f 0 × . . . × f n : D0 × . . . × Dn → D

00 × . . . × D

0n associate al prodotto di

cpo;

• le immersioni inDi ∈ Di → (D0 + . . . + Dn), i selettori outDi ∈ (D0 + . . . + Dn) → Di,i predicati isDi ∈ (D0 + . . . + Dn) → BOOL e l’operazione di combinazione di funzioni[f 0, . . . , f n] ∈ D0 + . . . + Dn → D, tutti associati alla somma disgiunta;

• il costruttore · :: · ∈ (D× D∗) → D

∗, i selettori hd(·) ∈ D∗ → D e tl(·) ∈ D∗ → D∗ ed il

predicato null ∈ D∗ → BOOL, tutti associati al dominio delle sequenze;

• gli operatori a pply ∈ (D1 → D2) × D1 → D2, (·)c ∈ [(D1 × D2) → D3] → [D1 → D2 → D3]e (·)∗ :: [D1 → D2] → [D1 → D2] associate allo spazio delle funzioni;

• il condizionale · → ·, · : BOOL× D× D → D.

Queste espressioni costanti (non dipendenti da variabili), di cui abbiamo provato la continuitànelle Sezioni 6.3, 6.4 e 6.5.1, costituiscono pertanto elementi prestabiliti di un cpo di funzionicontinue perciò sono continue nelle loro variabili.

Introduciamo ora un importante operatore che riguarda le funzioni continue da un cpo ase stesso. Ad ogni cpo D è infatti associato un operatore di punto fisso fix : [D → D] → D chemappa una qualsiasi funzione continua f : [D → D] nel suo minimo punto fisso, ed è definitoda

fix ≡ λf.sup

f i ⊥| i ∈ I

.

Il Lemma 6.41, la cui dimostrazione è rimandata a dopo aver trattato l’applicazione di funzionee la λ-astrazione, ci dice che l’operatore fix è continuo.

Page 137: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 137/332

6.5 Un metalinguaggio per la definizione di funzioni di interpretazione 137

n-uple. Date le espressioni e1 ∈ D1, . . . , en ∈ Dn, nei cpo D1, . . . , Dn, si può definire lan-pla

he1, . . . , en

i nel cpo prodotto (D1

×. . .

×Dn). La continuità di un’espressione ottenuta

in questo modo è una conseguenza del fatto che la continuità di una n-pla e quella delle suecomponenti si implicano vicendevolmente.

Infatti, per definizione, una n-upla he1, . . . , eni è continua nella variabile x se e solo se lafunzione λx.he1, . . . , eni è continua, cioè, per il Lemma 6.27, se e solo se Πi (λx.he1, . . . , eni)è continua per 1 ≤ i ≤ n, cioè se e solo se λx.ei è continua per 1 ≤ i ≤ n, cioè se e solo se ei

è continua su x per 1 ≤ i ≤ n.Quindi se le componenti sono continue nelle loro variabili, lo sono anche le n-ple.

Applicazione di funzione. Consideriamo innanzitutto un’applicazione c(e), dove c è unafunzione continua del tipo discusso precedentemente in “Costanti”. Per definizione, c(e) ècontinua in una variabile x se e solo se λx.c(e) è continua. Mostriamo ora che se e è continua

in x allora λx.c(e) è continua. Infatti, se supponiamo che e è continua in x, per definizioneciò vuol dire che λx.e è continua e, per il Lemma 6.14, anche c (λx.e) è continua. Poiché c ècostante, cioè non ha variabili libere, abbiamo c (λx.e) = λx.c(e), quindi λx.c(e) è continua.

Le applicazioni generali della forma e1(e2) sono continue nelle loro variabili se tali sono e1ed e2. Questo segue osservando che

e1(e2) = a pply(e1, e2),

cioè e1(e2) si ottiene applicando la costante a pply alla n-upla he1, e2i.

λ-astrazione. Sia e un’espressione continua nelle sue variabili. Allora scegliendo una va-

riabile particolare x che assuma valori in un cpo D si può costruire la funzione λx.e, cherisulta quindi essere continua per costruzione. Per dimostrare che anche λx.e è continua nellesue variabili, è necessario dimostrare la continuità di λy.λx.e, per una generica variabile y.Certamente ciò è vero se x = y, essendo il risultato una funzione che fornisce costantementeλx.e (che è continua per costruzione). Altrimenti, essendo e continua sia in x che in y peripotesi, allora per il Lemma 6.29 λ(y, x).e è continua. Se ora applichiamo l’operatore di curri-ficazione (·)c otteniamo proprio λy.λx.e che è quindi continua perché tale operatore preservala continuità (come aff erma anche il Lemma 6.37). Quindi un’astrazione è continua nelle suevariabili a condizione che lo sia il suo corpo.

Come caso particolare, si ottiene che la composizione di espressioni preserva la proprietàdi continuità nelle variabili perché e1

e2 = λx.e1(e2(x)). Si noti che anche λ-astrazioni più

generali, quali ad esempio λ(x, y).e ∈ (D1 × D2) → D3, sono continue perché ad esempio èpossibile esprimerle nella forma λz.e[Π1(z)/x,Π2(z)/y] con z ∈ D1 × D2.

Lemma 6.41. L’operatore fix è continuo.

Dimostrazione. Per dimostrare la tesi mostriamo dapprima che, per ogni i, la funzione fixi ≡λf.f i ⊥ è continua. La prova procede per induzione su i. fix0 ≡ λf.f 0 ⊥ è il funzionalecostante λf. ⊥ che sappiamo essere continuo. Assumiamo che fixi sia una funzione continuae proviamo che anche fixi+1 è una funzione continua. Poiché fixi+1 ≡ λf.f (f i ⊥) puòessere vista come λf.a pply(f, (f i ⊥)), cioè può essere espressa in termini di applicazione difunzione e λ-astrazione a partire da funzioni continue, fixi+1 è continua. Per induzione su inon è difficile dimostrare che fixi | i

∈ I è una catena nello spazio delle funzioni continue

Page 138: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 138/332

138 Capitolo 6 – Domini per la semantica denotazionale

[D → D ]. A questo punto, per il Teorema 6.35, segue che supfixi | i ∈ I esiste ed è unafunzione continua. Infine, poiché l’estremo superiore di una catena di funzioni è definito in

modo puntuale, abbiamo che supfixi | i ∈ I = λf.supf i ⊥| i ∈ I che è appunto fix.

Costrutti derivati. Riassumendo, un’espressione costruita a partire da elementi prestabi-liti e funzioni continue tramite i metodi descritti nei paragrafi precedenti è continua nelle suevariabili. Vediamo ora come esprimere alcuni costrutti utili in termini di quelli già esaminatiin modo da ottenere una sintassi più mnemonica.

Condizionale. Useremo p → e1, e2

dove p ∈ BOOL e e1, e2 ∈ D, al posto di a pply((· → ·, ·), ( p, e1, e2)). Il costrutto in

questione restituisce ⊥D se p =⊥BOOL, e1 se p = t rue ed e2 se p = f alse. Se p,e1 e e2 sono continue nelle loro variabili, allora anche p → e1, e2 è continuo nelle suevariabili perché esprimibile usando unicamente le costruzioni descritte in precedenza, inparticolare a pply e · → ·, ·, di cui abbiamo già mostrato la continuità (Lemmi 6.36 e6.39).

Osservazione 6.42. In alternativa, il costrutto condizionale può essere espresso in termini di altri costrutti, senza bisogno di introdurre la funzione · → ·, · (si veda anche il Lemma 6.39). In particolare, l’idea è di esprimere le costanti booleane tramite i proiettori del dominio prodotto D× D: cioè

t rue≡Π0 : (D

×D)

→D f alse

≡Π1 : (D

×D)

→D

definite da:

t rue ≡ λ(x, y).x f alse ≡ λ(x, y).y

Difatti queste definizioni corrispondono a quelle introdotte nell’Osservazione 5.5 riguar-do (le modalità per esprimere) le costanti nel λ-calculus. A questo punto, indicandogenericamente con p una qualsiasi delle funzioni t rue, f alse o Ω2 ≡ λ(x, y). ⊥, e con e1ed e2 espressioni a valori in D, abbiamo che il condizionale è esprimibile con l’espressio-ne a pply( p, (e1, e2)). Quindi, se e1 e e2 sono continue nelle loro variabili, allora anche anche il condizionale lo è, perché esprimibile usando unicamente le costruzioni descrit-te in precedenza, in particolare a pply e Πi, di cui abbiamo già mostrato la continuità

(Lemmi 6.36 e 6.24).

Let. Useremolet x be e1 in e2

al posto di (λx.e2)∗e1. In pratica, il costrutto let vuole evidenziare che soltanto see1 ∈ D1 è un valore diverso da ⊥D1

allora la funzione λx.e2 utilizza tale valore perdeterminare il risultato tramite l’espressione e2, altrimenti il risultato è ⊥D2

. Dalla suadefinizione segue immediatamente che il costrutto let è continuo nelle sue variabili see1 ∈ D1 e e2 ∈ D2 lo sono, perché in tal caso è continua l’espressione (λx.e2)∗e1, laquale infatti si può ottenere da e1 e e2 usando unicamente le costruzioni descritte inprecedenza.

Page 139: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 139/332

6.6 Esempi di funzioni sul dominio dei naturali 139

T ::= D | hT 1, . . . , T ni | Πi(T )

| inD(T ) | outD(T ) | isD(T )

| T 1 :: T 2 | hd(T ) | tl(T ) | null(T )

| x | λx.T | T 1T 2

| fix (T ) | T → T 1, T 2 | let x be T 1 in T 2

| cases T of inD(T 1) : T 01; . . . ; inD(T n) : T 0n endcases

Tabella 6.1: Sintassi del metalinguaggio

Cases. La combinazione mostrata in Sezione 6.4.3 permette di definire un costrutto generale,detto cases , che produce risultati diff erenti a seconda del componente della somma acui appartiene l’argomento. Sia D un cpo. Sia D1 + . . . +Dn una somma disgiunta di ncpo e sia e un’espressione a valori nella somma disgiunta, continua nelle sue variabili.Useremo

cases e of inD1(x1) : e1 ;. . .inDn(xn) : en

endcases

al posto della seguente combinazione [λx1.e1, . . . , λxn.en](e). In pratica, il costruttocases seleziona ei nel caso in cui e = inDi(di) per qualche di ∈ Di e restituire ⊥D se

e =⊥. Se supponiamo che, per 1 ≤ i ≤ n, λxi.ei : Di → D sono funzioni continue nelleloro variabili, allora il costrutto cases è continuo nelle sue variabili perché rappresentaun’espressione costruita in termini di espressioni e costrutti che preservano la continuità.

In definitiva, i termini del metalinguaggio sono quelli descritti dalla grammatica inTabella 6.1.

Considerazioni conclusive. Sebbene presentato in modo informale, il linguaggio riassuntoin questa sezione può essere formalizzato definendo precisamente quali siano i tipi e le opera-zioni costanti, ottenendo così un particolare λ-calcolo tipato i cui termini, nell’interpretazionestandard, denotano elementi di cpo. In pratica le regole di costruzione del linguaggio assicu-

rano che funzioni non continue non possono insinuarsi in esso. Un approccio di questo tipoha consentito a Dana Scott di sviluppare LCF (logica delle funzioni calcolabili) che consistein un λ-calcolo tipato simile a quello brevemente introdotto qui, con predicati ed una regoladi prova (induzione di punto fisso) per ragionare sui minimi punti fissi.

6.6 Esempi di funzioni sul dominio dei naturali

In questa sezione applichiamo la teoria vista in precedenza al dominio piatto dei naturali NATe alle funzioni continue che coinvolgono i naturali.

Cominciamo col dare una struttura di dominio alle funzioni dai naturali ai naturali. Con-sideriamo il dominio NAT ed il dominio prodotto NAT

×· · ·

×NAT = NAT

n. Il dominio

Page 140: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 140/332

140 Capitolo 6 – Domini per la semantica denotazionale

FUNn = (f : NATn → NAT | f continua , v) delle funzioni continue di n argomenti è definitocome segue:

∀f, g ∈ FUNn. f v g se e solo se, ∀hx1, . . . , xni ∈ NATn : f (x1, . . . , xn) v g(x1, . . . , xn) .

Per quanto visto in precedenza, questo insieme è un cpo. Vale la pena notare che in questocaso i domini su cui sono definite le funzioni in esame sono tutti domini con solo catene finite.Più precisamente, è vero che NATn ha catene lunghe al più n + 1. Infatti, una n-upla a è menodefinita o uguale di un’altra n-upla b se e solo se o le due n-uple sono uguali o a contienealmeno un elemento uguale a ⊥ mentre gli altri elementi di a e b sono uguali.

Inoltre, il fatto che NAT sia un dominio piatto ha come conseguenza che, se f v g, allora

∀hx1, . . . , xni ∈ NATn : f (x1, . . . , xn) 6=⊥ ⇒ f (x1, . . . , xn) = g(x1, . . . , xn),

cioè che g è una estensione di f .Consideriamo di nuovo la funzione fattoriale

f = λx.(x = 0) → 1, x ∗ f (x − 1)

e le sue approssimazioni iniziali ottenute a partire dal funzionale

τ = λf.λx.(x = 0) → 1, x ∗ f (x − 1).

Essendo il funzionale τ continuo, per il Teorema 6.17, esso ha minimo punto fisso, che è datoda

supτ i

Ωdove Ω ≡ λx. ⊥ è il minimo di FUN1.

τ 0Ω = Ω = λx. ⊥τ 1Ω = (λf.λx.(x = 0) → 1, x ∗ f (x − 1))(Ω)

= λx.(x = 0) → 1, x ∗ Ω(x − 1)= λx.(x = 0) → 1, x ∗ ⊥= λx.(x = 0) → 1, ⊥ (perché come vedremo più avanti x ∗ ⊥=⊥)

τ 2Ω = (λf.λx.(x = 0) → 1, x ∗ f (x − 1))(λx.(x = 0) → 1, ⊥)= λx.(x = 0) → 1, x ∗ ((λx.(x = 0) → 1, ⊥)(x − 1))= λx.(x = 0)

→1, x

∗((x

−1 = 0)

→1, x

−1

∗ ⊥)

= λx.(x = 0) → 1, (x − 1 = 0) → x, ⊥= λx.(x = 0) → 1, ((x = 1) → x, ⊥).

In generale si può dimostrare che per ogni i ∈ N

τ iΩ = λx.(x < i) → x!, ⊥

e quindi l’estremo superiore della catena è la funzione fattoriale λx.x!.L’esempio appena visto ci permette di capire come la continuità permetta di ragionare su

oggetti infiniti non considerandoli globalmente (cosa peraltro impossibile), ma considerando leloro approssimazioni finite. Infatti per conoscere, ad esempio, il risultato della funzione che èla semantica del funzionale succitato sull’argomento 5 non è necessario sapere che tale funzione

Page 141: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 141/332

6.6 Esempi di funzioni sul dominio dei naturali 141

è la funzione fattoriale, basta considerare la sesta funzione nella catena che la approssima evalutarla con argomento 5.

Se un funzionale non è continuo, il comportamento dell’estremo superiore della catenapuò non avere nulla a che vedere col comportamento degli elementi della catena. Di seguitoriportiamo due esempi di funzionali non continui. Ricordiamo che su domini piatti continuitàe monotonia si equivalgono (vedi 6.11).

Esempio 6.43. Il funzionale

τ 1 = λf.λx.(f x =⊥) → 0, ⊥non è monotono. Infatti, se consideriamo le funzioni

Ω = λx. ⊥ e Z = λx.0;

abbiamo che Ω v Z secondo il normale ordinamento di funzioni, ma

τ 1Z v τ 1Ω e τ 1Z 6= τ 1Ω

essendo τ 1Ω = Z e τ 1Z = Ω.

Esempio 6.44. Consideriamo la funzione I d ≡ λx.x ed il funzionale

τ 2 = λf.λx.(f = I d) → x, ⊥ .

Il risultato di τ 2 per qualsiasi argomento diverso dalla funzione identità vale sempre Ω, mentre

τ 2(λx.x) = λx.x. Sia f v g. Se nessuna delle due funzioni è la funzione identità, abbiamoche τ 2f = τ 2g = Ω. Nel caso g ≡ λx.x allora possiamo avere due sottocasi: τ 2f = Ω oppureτ 2f = λx.x; in entrambi i casi abbiamo sempre che τ 2f v τ 2g. Per esaurire i casi e concludereche τ 2 è monotono ci basta ora notare che se f è l’identità allora f = g, perché non esistonofunzioni monotone più definite dell’identità, che è una funzione totale.

Mostriamo ora che il funzionale τ 2 non è continuo. Si consideri la catena di funzionicontinue

λx.(x < i) → x, ⊥| i ∈ N

il cui estremo superiore è la funzione identità. Abbiamo

τ 2(supλx.(x < i) → x, ⊥| i ≥ 0) = τ 2(λx.x) = λx.x

mentresup τ 2(λx.(x < i) → x, ⊥) | i ∈ N = Ω = Ω.

Si noti che la non continuità di τ 2 è dovuta sostanzialmente al fatto che in esso viene eff ettuatoun test di uguaglianza fra funzioni, che ovviamente non può essere determinato confrontandoun numero finito di approssimanti.

Per concludere questa sezione, analizziamo un problema posto dal fatto che, per garantirela continuità, i domini delle funzioni sono stati ottenuti estendendo l’insieme dei numerinaturali con ⊥. La presenza di ⊥ pone la necessità di associare un significato all’applicazione difunzione ad argomenti indefiniti. Questo permetterà d’altra parte di trattare la composizionedi funzioni f

g anche quando g non sia definita su qualche argomento.

Page 142: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 142/332

142 Capitolo 6 – Domini per la semantica denotazionale

Definizione 6.45. Data una funzione f : Nn → NAT diciamo che la funzione f ext è la sua estensione naturale su NATn se e solo se è definita come segue:

f ext(x1, . . . , xn) = f (x1, . . . , xn) se xi 6=⊥, ∀i ∈ 1 . . . n;

⊥ altrimenti.

Si dimostra facilmente che ogni funzione ottenuta in questo modo è monotona, e dunquecontinua, dato che NATn ha solo catene finite (lunghe al più n + 1, come abbiamo già visto).Infatti, una n-upla a è meno definita o uguale di un’altra n-upla b se e solo se o le due n-uplesono uguali o a contiene almeno un elemento uguale a ⊥ mentre gli altri elementi di a e bsono uguali. Se in quest’ultimo caso la funzione ha valore ⊥, tale valore sarà senz’altro perdefinizione meno definito del (o uguale al) valore della funzione su b e quindi la funzione f èmonotona.

Le funzioni che nel caso di argomenti indefiniti valgono ⊥

sono anche note come funzio-ni strette ed infatti l’estensione naturale è detta anche estensione stretta . Questo tipo diestensione non è comunque l’unica estensione monotona possibile. Ad esempio, una funzionecostante K = λx.k può essere estesa anche ponendo K ⊥= k.

Se consideriamo le funzioni con un solo argomento, una estensione monotona diversa dallastretta è possibile solo se la funzione è costante. Altrimenti avremmo ⊥v d ma f ⊥6v f d,poiché f ⊥, f d 6=⊥ e in NAT abbiamo che d1 6v d2 se d1, d2 6=⊥. Il discorso è diff erente perfunzioni con più argomenti. Consideriamo ad esempio la moltiplicazione. Essa ha quattroestensioni monotone:

mul1(x, y) =

x ∗ y se x 6=⊥ e y 6=⊥

⊥ altrimenti

mul2(x, y) =

x ∗ y se x 6=⊥ e y 6=⊥0 se x = 0⊥ altrimenti

mul3(x, y) =

x ∗ y se x 6=⊥ e y 6=⊥0 se y = 0⊥ altrimenti

mul4(x, y) =

x ∗ y se x 6=⊥ e y 6=⊥0 se x = 0 o y = 0⊥ altrimenti

Si può vedere che mul1, che è l’estensione stretta, è la meno definita tra le quattro fun-zioni, mentre mul4 è la più definita; abbiamo inoltre che mul2 non è confrontabile con mul3.Le quattro funzioni definite sopra corrispondono a modi diversi di valutare l’espressione dimoltiplicazione: mul1 corrisponde ad una valutazione che prima di dare un risultato calcolaentrambi gli argomenti, mul2 corrisponde ad una valutazione da sinistra a destra, mul3 dadestra a sinistra, mentre in mul4 i due argomenti sono valutati parallelamente; le ultime trefunzioni forniscono zero come risultato non appena uno dei loro argomenti viene valutato azero.

Una funzione di cui non utilizzeremo l’estensione stretta è il condizionale, il quale, nelcaso in cui il dominio dei sui tre argomenti sia quello dei naturali N, potrebbe essere scrittocome

i fthenelse = λxyz.x→

y, z

Page 143: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 143/332

6.7 Sistemi di equazioni mutuamente ricorsive 143

indicando in questo modo la funzione che vale y se x = 0 e z altrimenti. Se questa funzionefosse estesa a NAT in modo stretto il significato di qualsiasi definizione intrinsecamente ricor-

siva sarebbe indefinito. Per esempio, se consideriamo la prima approssimazione F act1 definitanell’equazione (6.2), avremmo

Fact1 ≡ τ fact Ω = λx.x → 1, ⊥= λx.i fthenelse(x, 1, ⊥) = λx. ⊥= Ω ≡ Fact0

da cui non sarebbe difficile dimostrare che F acti ≡ Ω per ogni i ∈ N !La funzione condizionale viene di solito estesa in modo tale che risulti stretta soltanto

rispetto al suo primo argomento:

i fthenelse(x,y ,z) =

y se x = 0z se x 6= 0 e x 6=⊥

⊥ altrimenti

Con questa estensione, che permette di avere un’espressione indefinita o erronea inuno dei ‘rami’ del condizionale purché quel ramo non sia scelto, abbiamo, ad esempio,i fthenelse(0, 5, ⊥) = 5.

6.7 Sistemi di equazioni mutuamente ricorsive

La teoria del punto fisso per le definizioni ricorsive di funzione può essere estesa senza difficoltàa sistemi di equazioni mutuamente ricorsive.

Consideriamo un insieme di n equazioni:

f 1 = λx1 . . . xm1

.e1...

f n = λx1 . . . xmn.en

Ognuna di esse individua un funzionale di mi argomenti

τ i : (FUNm1 × · · · × FUNmn

) → FUNmi

definito daτ i = λ(f 1, . . . , f n)x1 . . . xmi

.ei

e l’intero sistema individua un unico funzionaleτ : (FUNm1

× · · · × FUNmn) → (FUNm1

× · · · × FUNmn)

così definito:τ = λ(g1, . . . , gn).hτ 1(g1, . . . , gn), . . . , τ n(g1, . . . , gn)i

Una n-upla di funzioni hg1, . . . , gni è un punto fisso per τ se e solo se

τ (g1, . . . , gn) = hg1, . . . , gni,

cioè

∀i : τ i(g1, . . . , gn) = gi.

Page 144: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 144/332

144 Capitolo 6 – Domini per la semantica denotazionale

Se τ è continuo (e i risultati presentati in Sezione 6.4 ci dicono quando questo puòsuccedere), il suo minimo punto fisso è

supnhτ

j1(Ωm1

, . . . ,Ωmn), . . . , τ jn(Ωm1

, . . . ,Ωmn)i | j ∈ N

odove, per ogni i = 1, . . . , n, Ωmi

è il minimo di FUNmi, cioè la funzione da mi-ple di naturali

a naturali che fornisce come risultato sempre ⊥, e per ogni j ∈ N, τ ji è definito iterativamente

come segue

τ 0i (Ωm1, . . . ,Ωmn

) = Ωmi

τ j+1i (Ωm1

, . . . ,Ωmn) = τ i(τ

j1 (Ωm1

, . . . ,Ωmn), . . . , τ

jn(Ωm1

, . . . ,Ωmn)).

L’estremo superiore di questa catena è una n-upla di funzioni. Per estrarre le singolefunzioni è sufficiente utilizzare i selettori già definiti per i domini ottenuti come prodotti dialtri domini.

Consideriamo ad esempio il funzionale

τ : (FUN1 × FUN2) → (FUN1 × FUN2)

associato al sistema di equazioni f 1 = λx.(x = 0) → 1, f 2(x, f 1(x − 1))f 2 = λ(x, y).(x = 0) → 0, y + f 2(x − 1, y)

cioè

τ 1 = λ(f 1, f 2)λx.(x = 0)

→1, f 2(x, f 1(x

−1))

τ 2 = λ(f 1, f 2)λ(x, y).(x = 0) → 0, y + f 2(x − 1, y)

e calcoliamo le prime approssimazioni della catena (abbreviando τ ji (Ω1,Ω2) in τ

ji ).

τ 01 = λx. ⊥τ 02 = λ(x, y). ⊥

τ 11 = τ 1(τ 01 , τ 02 ) = λx.(x = 0) → 1, ⊥τ 12 = τ 2hτ 01 , τ 02 i = λ(x, y).(x = 0) → 0, ⊥

τ 21 = τ 1hτ 11 , τ 12 i = λx.(x = 0) → 1, ⊥τ 2

2 = τ 2

hτ 1

1, τ 1

2 i= λ(x, y).(x = 0)

→0, (x = 1)

→y,

⊥.

τ 31 = τ 1hτ 21 , τ 22 i = λx.(x = 0) → 1, (x = 1) → 1, ⊥τ 32 = τ 2hτ 21 , τ 22 i = λ(x, y).(x = 0) → 0, (x = 1) → y, (x = 2) → y + y, ⊥ .

In generale si può dimostrare che, per ogni i ∈ N

τ i1 = λx.(x < i − 1) → x!, ⊥τ i2 = λ(x, y).(x < i) → x ∗ y, ⊥

per cui l’estremo superiore della catena è la coppia di funzioni

hλx.x!, λ(x, y).x

∗y

i.

Page 145: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 145/332

6.8 Esercizi 145

6.8 Esercizi

6.1 Si dimostri che se un cpo ha un numero finito di elementi, allora ogni funzione monotona su diesso è anche continua.

6.2 Un ordinamento parziale su un insieme finito è sempre completo? E quello su un insiemeinfinito?

6.3 Si considerino due cpo (D1, v1) e (D2, v2) tali che D1 ⊆ D e D2 ⊆ D, per qualche D .

1. La struttura (D1∪D2, v), dove x v y se e solo se x v1 y ∨x v2 y è sempre un ordinamentoparziale?

2. La struttura (D1 ∩ D2, v), dove x v y se e solo se x v1 y ∧ x v2 y

(a) è sempre un ordinamento parziale?

(b) è sempre un ordinamento parziale completo?

6.4 Si consideri l’insieme T di tutti i termini costruiti con un simbolo f di funzione binaria e condue simboli di costante c e ⊥. Si consideri la relazione v (⊆ T × T ) definita informalmente dat v t0 se il termine t0 è ottenuto da t sostituendo alcune occorrenze di ⊥ con generici termini inT .

1. Si definisca formalmente la relazione v.

2. Si provi che (T , v) è un ordinamento parziale con elemento minimo.

3. Si dimostri che (T , v) non è completo.

6.5 Si studino gli insiemi V ∗ e V ∗ ∪ V ∞ delle stringhe finite e delle stringhe finite ed infinitesull’alfabeto V = a,b,c, con l’ordinamento α v αβ , dove αβ indica la concatenazione dellestringhe α e β e inoltre αβ = α se α è infinita.

1. La struttura (V ∗ ∪ V ∞, v) è un ordinamento parziale?

2. Esiste l’elemento minimo?

3. È completo?

6.6 Si considerino le stesse domande dell’esercizio precedente per la struttura (V ∗, v).

6.7 Risolvere le equazioni fra linguaggi:

– X = a · X ,

– X = a ∪ (b · X ),

dopo aver scelto gli opportuni domini e verificato che · e ∪ sono operazioni continue.

6.8 Si dimostri che, per ogni f , g, funzioni continue tra gli opportuni cpo, vale

fix (f g) = f ( fix (g f )).

6.9 Dimostrare se, per ogni cpo, esiste sempre il minimo dei maggioranti di ogni suo sottoinsieme.

6.10 Sia D un cpo. Una funzione r : D → D si dice idempotente se r(r(x)) = r(x), per ogni x ∈ D.Dimostrare che l’insieme di tutte le funzioni continue idempotenti da D in D è un cpo.

Page 146: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 146/332

Page 147: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 147/332

Capitolo 7

Un semplice linguaggio funzionale

SOMMARIOIn questo capitolo definiamo la semantica denotazionale di un semplice linguaggio funzio-nale. La semantica ottenuta viene paragonata ad una semantica operazionale, basata suregole di riscrittura semplici ed intuitive. La prova che semantica operazionale e semantica denotazionale coincidono fornisce un’ulteriore giustificazione dell’approccio alla semantica basato su di una teoria che garantisce l’esistenza di punti fissi e, in molti casi, di un minimo

punto fisso per le funzioni definite ricorsivamente.

In questo capitolo analizziamo sintassi e semantica di un semplice linguaggio funzionale,che chiameremo SLF. Il linguaggio è detto funzionale in quanto i costrutti principali che locaratterizzano sono la definizione e l’applicazione di funzioni (per questo motivo tali linguaggi

sono anche detti applicativi ). Esso ha un costrutto letrec D in T , che permette di definireinsiemi di funzioni, anche mutuamente ricorsive, a partire da funzioni base, numeri naturali,e variabili. Il calcolo avviene solo attraverso applicazioni di funzioni. L’associazione variabile-valore non è modellata attraverso una nozione esplicita di stato, ma semplicemente tramite lasostituzione dei parametri formali con quelli attuali. Il linguaggio è sufficientemente espressivoper permettere di definire tutte le funzioni calcolabili.

Per definire la semantica di SLF utilizzeremo due tecniche diverse, una basata sull’approc-cio operazionale ed un’altra su quello denotazionale, quindi studieremo le relazioni tra questidue approcci. Inoltre, delle due semantiche forniremo versioni che permettono di descrivere ilpassaggio degli argomenti alle funzioni con meccanismi per nome e per valore .

7.1 Sintassi di un semplice linguaggio funzionale

La sintassi di SLF è basata sui seguenti insiemi di simboli terminali:

Valori di base: N = 0, 1, 2, . . . ; la lettera n (n1, n2, . . . ) sarà utilizzata per denotare elementidi N;

Variabili su valori di base: Var = x1, x2, . . . , xm, . . . ;

Simboli di funzioni base: B = b1, . . . ,bk;

Variabili di funzione: FVar = f1, . . . ,fr.

Page 148: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 148/332

148 Capitolo 7 – Un semplice linguaggio funzionale

P ::= letrec D in T

T ::= xi | n | b j (T 1, . . . , T m) | fr(T 1, . . . , T ρ(r)) | if T then T 1 else T 2D ::= f1(x1, . . . , xρ(1)) ⇐ T 1, . . . ,fn(x1, . . . , xρ(n)) ⇐ T n

dove ρ( j) è uguale all’arità di f j , 1 ≤ j ≤ n.

Tabella 7.1: Sintassi di SLF

Esempi tipici di funzioni di base sono +, ∗, s ucc, pred. Per semplicità, tra i valori di basesono assenti i booleani; codificheremo t rue con 0, f alse con tutti gli altri naturali. Cambiandogli insiemi delle funzioni e dei valori di base è possibile ottenere linguaggi leggermente diversi.

Per descrivere l’insieme delle funzioni di base si presenta un problema analogo a quello

incontrato studiando la semantica dei numeri naturali. È necessario distinguere oggetti appar-tenenti ad un dominio sintattico dalle loro denotazioni, anche quando la loro corrispondenza èdiretta. In questo capitolo utilizzeremo le stesse lettere per rappresentare i nomi delle funzionidi base e le funzioni di base stesse, evidenziando la diff erenza fra sintassi e semantica tramitecaratteri tipografici leggermente diversi. Il nome della funzione di base b sarà scritto b.

I termini del linguaggio sono definiti tramite la grammatica descritta in Tabella 7.1. In-dichiamo con P rog, T erm, D ecl i linguaggi generati da tale grammatica con simboli inizialirispettivamente P, T , D.

Nelle varie clausole si utilizzano per comodità degli indici per denotare elementi della stessacategoria sintattica: ad esempio, nel caso della categoria sintattica Term , i vari T i denotanoun qualsiasi termine di SLF. Un programma P ∈ P rog scritto nel linguaggio SLF consiste di

un termine T ∈ T erm e di un insieme di dichiarazioni D ∈ D ecl; queste ultime determinanoil contesto in cui T dovrà essere valutato. Nella definizione di programma il termine T deveessere un termine chiuso, cioè un termine in cui non compaiono variabili di dati.

Le dichiarazioni sono semplicemente una n-upla di associazioni di termini a nomi difunzioni e possono essere mutuamente ricorsive.

Gli esempi che seguono sono programmi, scritti nel linguaggio SLF, che calcolano il fatto-riale di 2. Mentre nel primo esempio moltiplicazione e sottrazione sono considerate funzionibase (ed espresse in notazione infissa), nel secondo esempio la moltiplicazione viene definitain base alla somma e alla sottrazione.

Esempio 7.1.

1. letrec f(x) ⇐ if x then 1 else x ∗ f(x − 1)in f(2)

2. letrec f1(x) ⇐ if x then 1 else f2(x, f1(x − 1))f2(x1, x2) ⇐ if x1 then 0 else x2 + f2(x1 − 1, x2)

in f1(2)

7.2 Semantica operazionale

L’approccio operazionale alla semantica dei linguaggi di programmazione è stato il primoad essere proposto per descrivere precisamente il significato dei vari costrutti dei linguaggi

Page 149: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 149/332

7.2 Semantica operazionale 149

b j (n1, . . . , nm) = n

b j (n1, . . . , nm) −−→D n

(Bas1)

T i −−→D

T 0ib j (. . . , T i, . . . ) −−→

D b j (. . . , T 0i , . . . )

(Bas2)

if 0 then T 1 else T 2 −−→D

T 1 (Cond1)

if n + 1 then T 1 else T 2 −−→D

T 2 (Cond2)

T −−→D

T 0

if T then T 1 else T 2 −−→D

if T 0 then T 1 else T 2(Cond3)

D contiene fr

(x1

, . . . , xρ(r)

)⇐

T

fr(T 1, . . . , T ρ(r)) −−→D

T [T 1/x1, . . . , T ρ(r)/xρ(r)] (Fun)

Tabella 7.2: Semantica operazionale per nome di SLF

stessi. Essenzialmente, esso permette di descrivere il significato dei costrutti di un linguaggiospecificando una opportuna macchina astratta e descrivendo l’eff etto dell’esecuzione di ognicostrutto su questa macchina. Inizialmente questo approccio non è stato accettato da moltiperché spesso le macchine astratte erano troppo concrete e troppo simili alle macchine “vere”e le specifiche richiedevano troppi dettagli implementativi.

Più di recente c’è stato un rinnovato interesse per l’approccio operazionale. Vari ricerca-tori, utilizzando concetti, come quello di composizionalità e sintassi astratta, propri dell’ap-proccio denotazionale, hanno proposto una nuova tecnica operazionale che è sufficientementeastratta e formale. La semantica di un linguaggio è descritta in termini di un sistema di tran-sizioni che indica quali sono i possibili stati in cui un programma può transire quando si trovain uno stato noto. Questo metodo combina la vecchia idea di usare i sistemi di transizionietichettate per specificare il comportamento dei programmi con il rinnovato interesse per lamodularità: le transizioni associate ad una istruzione dipendono dalle transizioni associate aisuoi componenti più elementari.

Nel caso del linguaggio SLF la relazione di transizione è definita tramite un insieme diassiomi e regole d’inferenza applicando le quali è possibile dedurre tutte e sole le transizionipossibili di un programma scritto nel linguaggio stesso. Gli assiomi e le regole di inferenzaper SLF sono riportati in Tabella 7.2. La tabella contiene almeno un assioma o una regola diinferenza per ogni costrutto del linguaggio. Il principio di induzione strutturale garantisce cheil sistema proposto permette di assegnare un significato ad un qualunque programma SLF.

Dato un insieme di dichiarazioni D, la relazione −−→D

è la più piccola relazione fra ele-menti chiusi (senza variabili libere) di Prog , basata su D, derivabile dalle regole di inferenzariportate in Tabella 7.2. Le regole di riscrittura descrivono tutte e sole le transizioni a cuii vari programmi di SLF possono dar luogo e gli stati raggiungibili dopo ogni transizione.Essendo SLF un linguaggio applicativo, ogni stato sarà rappresentato soltanto da un termine.È importante notare che tutte le derivazioni sono relative ad un insieme di dichiarazioni De per questo riportiamo D accanto alla freccia. Commentiamo ora brevemente le regole di

Page 150: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 150/332

150 Capitolo 7 – Un semplice linguaggio funzionale

inferenza.

(Bas1) se, valutando la funzione base b j con m naturali come argomenti, si ottiene comerisultato un naturale n, allora il termine ottenuto applicando il simbolo di funzioneb j (che corrisponde a b j) ai simboli che rappresentano gli argomenti stessi, può essereriscritto nella rappresentazione di n.

(Bas2) quando il termine attuale è un simbolo di funzione base applicato a termini che nonsono ancora riscritti come rappresentazioni di naturali, è necessario trasformare tutti gliargomenti in rappresentazioni di naturali, per poter essere nella condizione di applicarela regola (Bas1).

(Cond1) e (Cond2) questi due assiomi definiscono le possibili trasformazioni di un terminecondizionale in cui il predicato è già il rappresentante di un naturale. Le riscritture sono

dovute alla scelta di considerare 0 come il valore booleano true e tutti gli altri numericome il valore false .

(Cond3) nel caso in cui il termine di controllo non rappresenti un naturale, è necessariotrasformarlo, per poter essere nella condizione di applicare la regola (Cond1) oppure la(Cond2).

(Fun) descrive il comportamento di una chiamata di funzione quando a questa vengono passatialtri termini come argomenti: si deve sostituire al nome della funzione il suo corpocome specificato nelle dichiarazioni in D e sostituire i parametri attuali ai parametriformali. È importante notare che, siccome nella regola non si fa alcun riferimento allavalutazione dei parametri prima di legarli all’interno del corpo della funzione, questa

semantica realizza la cosiddetta chiamata per nome o call-by-name . In seguito vedremoi cambiamenti necessari per modellare un diverso meccanismo di passaggio di parametrinoto come call-by-value .

A partire dalle regole di riscrittura per −−→D

è possibile definire una nuova relazione ∗−−−→

D

che è semplicemente la chiusura riflessiva e transitiva di −−→D

e che è necessaria per definireil valore prodotto dalla valutazione operazionale di un programma. Si noti che −−→

D è una

relazione e non una funzione, nel senso che un programma può evolvere in modi diff erenti.Ad esempio abbiamo che

+(s ucc(0), s ucc(0)) −−→D

+(1, s ucc(0))

ma anche+(s ucc(0), s ucc(0)) −−→

D +(s ucc(0), 1)

Si può tuttavia dimostrare che la semantica operazionale originata dalle regole di riscritturain Tabella 7.2 è confluente . Infatti, abbiamo che, dato un generico termine chiuso T , esiste alpiù un naturale n tale che T

∗−−−→D

n.Intuitivamente non è difficile capire la ragione della univocità della nostra semantica.

Infatti, il sistema di transizioni considerato permette di scegliere di riscrivere indiff erentementedue termini solo nel caso in cui il termine in esame preveda la valutazione dell’applicazionedi una funzione base ai suoi argomenti, e cioè quando

T = b j (T 1, . . . , T m).

Page 151: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 151/332

7.2 Semantica operazionale 151

In questo caso, esiste la possibilità di scegliere quale dei termini T i riscrivere. Tuttavia,per determinare il valore finale di T (e cioè il naturale n tale che T

−−−→D

n) dobbiamo

necessariamente applicare la regola (Bas1), e questo è possibile solo se abbiamo riscritto inun naturale tutti gli argomenti della funzione base (T j

∗−−−→D

n j , ∀ j tale che 1 ≤ j ≤ m).Dovendo pertanto ridurre tutti gli argomenti, l’ordine di riduzione non risulta rilevante.

Possiamo ora definire formalmente la valutazione dei programmi di SLF:

Definizione 7.2. Il significato operazionale di un programma chiuso letrec D in T è il naturale n tale che T

∗−−−→D

n, se esiste; altrimenti, il significato del programma è indefinito.

Proposizione 7.3.

Dato un programma chiuso letrec D in T , esiste al più un naturale n tale che T −−→∗D

n.

Dimostrazione. Per induzione sulla struttura di T .

Come abbiamo visto in precedenza, gli assiomi e le regole di inferenza della Tabella 7.2portano ad una semantica operazionale in cui la chiamata di funzione utilizza come mecca-nismo di passaggio dei parametri attuali la cosiddetta chiamata per nome (call-by-name).Infatti, la valutazione dell’applicazione di una qualsiasi funzione dichiarata in D non richiedealcuna valutazione dei suoi argomenti al momento della chiamata.

È possibile, con semplici modifiche alle regole precedenti, definire una semantica basatasulla chiamata per valore (call-by-value), che richiede di valutare gli argomenti prima di so-stituirli all’interno del corpo di una funzione. L’unica modifica da apportare alle regole della

semantica è sostituire la (Fun) con le due regole (Fun0) e (Fun00) in Tabella 7.3, lasciandotutte le altre immutate.

La regola (Fun0) è simile alla regola (Fun) vista in precedenza, nel senso che permettedi sostituire il corpo della funzione al suo nome e di istanziare i parametri formali; essapuò comunque essere applicata soltanto quando tutti gli argomenti sono stati trasformati inrappresentazioni di interi. La regola (Fun00) rende possibile la trasformazione degli argomentiin rappresentazioni di interi.

Si può facilmente verificare che le regole che descrivono la chiamata per nome e quelle chedescrivono la chiamata per valore possono dare origine a sequenze di transizioni diverse. Se,ad esempio, consideriamo il seguente programma SLF

P = letrec f(x) ⇐ 0 in f(f(1))

e con (n ome)−−−−−−−→

D , •

(n ome)−−−−−−−→D

indichiamo la transizione ottenuta applicando la regola (n ome)di una delle due semantiche operazionali viste sopra, abbiamo che con la call-by-name in unsolo passo è possibile determinare che il valore di P è la rappresentazione del naturale 0;

f(f(1)) (Fun)−−−−−−→

D 0.

D’altra parte, per determinare il valore di P tramite la call-by-value, abbiamo bisogno di duepassi:

f(f(1)) • (Fun00)

−−−−−−→D

f(0) • (Fun0)

−−−−−−→D

0.

Page 152: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 152/332

152 Capitolo 7 – Un semplice linguaggio funzionale

b j (n1, . . . , nm) = n

b j (n1, . . . , nm) •−−→D n

(Bas1)

T i •−−→D

T 0ib j (. . . , T i, . . . ) •−−→

D b j (. . . , T 0i , . . . )

(Bas2)

if 0 then T 1 else T 2 •−−→D

T 1 (Cond1)

if n + 1 then T 1 else T 2 •−−→D

T 2 (Cond2)

T •−−→D

T 0

if T then T 1 else T 2 •−−→D

if T 0 then T 1 else T 2(Cond3)

D contiene fr

(x1

, . . . , xρ(r)

)⇐

T

fr(n1, . . . , nρ(r)) •−−→D

T [n1/x1, . . . , nρ(r)/xρ(r)] (Fun0)

T i •−−→D

T 0ifr(T 1, . . . , T i, . . . , T ρ(r)) •−−→

D fr(T 1, . . . , T 0i , . . . , T ρ(r))

(Fun00)

Tabella 7.3: Semantica operazionale per valore di SLF

Si osservi che f(f(1)) • (Fun00)−−−−−−→

D f(0) perché f(1) •

(Fun0)−−−−−−→D

0.I due insiemi di regole possono dare addirittura origine a valutazioni diverse. Se ad esempio

consideriamo il programma

letrec f(x1, x2) ⇐ if x1 then 0 else f(x1 − 1,f(x1, x2)) in f(1, 2)

abbiamo che, mentre il suo valore operazionale basato sulla call-by-name è 0, quello basatosulla call-by-value non dà alcun risultato, nel senso che le regole richiedono sempre nuoveriscritture. Infatti, nel caso della call-by-value è necessario valutare tutti gli argomenti dellafunzione f prima di cercare di determinarne il valore e questo fa sì che dopo ogni riscritturasia sempre necessario valutare il termine f(x1, x2):

f(1, 2) • (Fun0)−−−−−−→

D if 1 then 0 else f(1 − 1,f(1, 2))

• (Cond2)

−−−−−−−→D f(1 − 1, f(1, 2)) • (·)

−−−−→D · · · .

Un programma che dà luogo a sequenze infinite di riscritture viene detto divergente .In eff etti, non è difficile dimostrare, ragionando per induzione sulla lunghezza delle

derivazioni, il lemma seguente.

Lemma 7.4. Se T • ∗−−−→

D n, allora T

∗−−−→D

n.

7.3 Semantica denotazionale

Come abbiamo già visto, l’approccio denotazionale descrive in termini “matematici” il signifi-cato di ogni costrutto del linguaggio, in generale associando ad esso una funzione che permette

Page 153: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 153/332

7.3 Semantica denotazionale 153

di determinare la relazione di input-output calcolata da ogni programma. La semantica vienedefinita in maniera composizionale per induzione sulla sintassi astratta del linguaggio. Nel

caso di SLF però, non essendo presenti nel linguaggio costrutti di input, ad ogni programmaverrà associato un naturale; si osservi tuttavia che, nel fornire l’interpretazione dei terminidel linguaggio, dovremo comunque associare ad essi delle funzioni.

Per definire la semantica denotazionale di SLF utilizzeremo tre funzioni di interpretazionesemantica, una per ogni categoria sintattica (T per i termini, D per le dichiarazioni e P peri programmi), che associano ad ogni termine del linguaggio il suo significato.

Dato un programma SLF, faremo le seguenti assunzioni, senza perdere in generalità:

– il numero delle definizioni di funzioni (mutuamente ricorsive) presenti in una qualunquedichiarazione D sarà indicato con n;

– il numero degli argomenti di ciascuna funzione è costante e sarà indicato con m (cioèsupponiamo per semplicità ρ(1) = · · · = ρ(n) = m).

Ricordiamo che con NAT viene indicato il dominio piatto dei naturali e con FUNm quellodelle funzioni continue con m argomenti naturali. Indichiamo con (FUNm)n il dominio delle n-uple di funzioni appartenenti a FUNm. Per indicare n-uple e m-uple utilizzeremo la notazione

“vettoriale”, ( ~ · ). Quindi

– ~ F sta per hf 1, . . . , f ni;

– λ ~ F sta per λ(f 1, . . . , f n);

– ~ X sta per hx1, . . . , xmi;

– λ ~ X sta per λ(x1, . . . , xm).

I tipi delle funzioni semantiche sono:

T : T erm → (FUNm)n → NATm → NAT

D : D ecl → (FUNm)n

P : P rog → NAT

La denotazione di un termine è un funzionale che prende come argomento una n-upla difunzioni e restituisce una funzione da m-uple di naturali a naturali; la denotazione di unadichiarazione restituisce una n-upla di funzioni ed infine quella di un programma restituisceun naturale.

Le clausole che definiscono la semantica sono riportate in Tabella 7.4 e brevementecommentate qui sotto.

(Var) stabilisce che la denotazione di una variabile di dato xi è il funzionale costante chedata una qualsiasi n-upla di funzioni restituisce una funzione che modella la i-esimaproiezione di una m-pla.

(Nat) stabilisce che la denotazione di un naturale è il funzionale costante che data unaqualsiasi n-upla di funzioni restituisce la funzione costante λ ~ X.n.

Page 154: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 154/332

154 Capitolo 7 – Un semplice linguaggio funzionale

T [[xi]] = λ ~ F .λ ~ X. Πi ~ X (Var)

T [[n]] = λ ~ F .λ ~ X. n (Nat)

T [[b j (T 1, . . . , T m)]] = λ ~ F .λ ~ X. b j (T [[T 1]] ~ F ~ X , . . . , T [[T m]] ~ F ~ X ) (Bas)

T [[if T then T 1 else T 2]] = λ ~ F .λ ~ X.T [[T ]] ~ F ~ X → T [[T 1]] ~ F ~ X, T [[T 2]] ~ F ~ X (Cond)

T [[fr(T 1, . . . , T m)]] = λ ~ F .λ ~ X.Πr( ~ F )(T [[T 1]] ~ F ~ X , . . . , T [[T m]] ~ F ~ X ) (Fun)

D[[f1(x1, . . . , xm) ⇐ T 1, . . . ,fn(x1, . . . , xm) ⇐ T n]] = (Dec)

fix (λ ~ F .hT [[T 1]] ~ F , . . . , T [[T n]] ~ F i)

P [[letrec D in T ]] = T [[T ]] D[[D]]

h0, . . . , 0

i (Prg)

Tabella 7.4: Semantica denotazionale di SLF

(Bas) definisce la denotazione del termine b j (T 1, . . . , T m) a partire dalla denotazione dei suoisottotermini, vale a dire T 1, . . . , T m. La denotazione è il funzionale che, data una n-upladi funzioni ~ F , restituisce la funzione che, data a sua volta una m-pla di naturali ~ X come argomento, applica la funzione base b j ai naturali ottenuti valutando i vari T i coni legami determinati da ~ F e ~ X .

(Cond) ha un significato analogo alla precedente. Difatti anche il condizionale è una funzione

di base; essa viene considerata separatamente solo per la sua particolare struttura.(Fun) associa al termine fr(T 1, . . . , T m) il funzionale che proietta l’r-esimo argomento di una

n-pla e lo applica alla valutazione degli argomenti di fr.

(Dec) Il significato di una dichiarazione D è una n-upla di funzioni ottenuta come minimopunto fisso di un funzionale (FUNm)n → (FUNm)n; D può infatti contenere definizionimutuamente ricorsive. Questo funzionale, data una n-upla di funzioni ~ F , restituisce lan-upla di funzioni ottenuta valutando ricorsivamente i termini associati ai simboli difunzione nella dichiarazione D, con argomento ~ F (si veda la Sezione 6.7).

(Prg) il significato di un programma letrec D in T è ottenuto valutando il significato deltermine chiuso T con la n-upla di funzioni ottenuta dalla valutazione della dichiarazioneD e con la m-upla di argomenti h0, . . . , 0i. La scelta di usare quest’ultima m-upla èirrilevante; essendo T chiuso rispetto alle variabili di dato, la sua interpretazione saràuna funzione che non dipende dalla m-pla di dati.

Affinché la clausola per la valutazione delle dichiarazioni abbia senso, si deve dimostrareche, per ogni n-upla di termini hT 1, . . . , T ni, il minimo punto fisso di

λ ~ F .hT [[T 1]] ~ F , . . . , T [[T n]] ~ F iesiste sempre. Per provare questo, è necessario mostrare che, per ogni T , T [[T ]] è continuo.La continuità di λ ~ F .hT [[T 1]] ~ F , . . . , T [[T n]] ~ F i, e quindi l’esistenza del suo minimo punto fis-so, segue dalla continuità dell’astrazione, dell’applicazione e dell’operazione di formazione di

Page 155: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 155/332

7.3 Semantica denotazionale 155

n-ple. Per provare la continuità di T è sufficiente seguire il percorso tracciato nella Sezio-ne 6.5. Osserviamo che nelle clausole relative a T in Tabella 7.4 compaiono solo variabili,

naturali oppure operazioni che abbiamo già dimostrato preservare la continuità. Siccome an-che la composizione di funzioni preserva la continuità, abbiamo che la proprietà desiderata ègarantita.

Teorema 7.5 (Continuità). Per ogni termine T del linguaggio SLF , il funzionale T [[T ]] è continuo.

Dimostrazione. Per induzione sulla struttura di T. Per la base dell’induzione è sufficientenotare che

T [[xi]] = λ ~ F .λ ~ X.xi

e

T [[n]] = λ ~ F .λ ~ X.nsono banalmente funzionali continui; ad esempio, data una catena di n-uple di funzioni

~ F i | i ∈ I ,

si ha cheT [[n]]( sup ~ F i | i ∈ I ) = λ ~ X.n

e∀i T [[n]] ~ F i = λ ~ X.n.

Per il passo induttivo consideriamo innanzitutto il caso delle funzioni base e, supponendo che

T [[T 1]], . . . , T [[T m]]

siano continui, dimostriamo cheT [[b j (T 1, . . . , T m)]]

è continuo. Sia ~ F i | i ∈ I una catena di n-uple di funzioni. Per ogni m-upla ~ d di naturaliabbiamo

sup (T [[b j (T 1, . . . , T m)]] ~ F i~ d

= sup b j (T [[T 1]] ~ F i ~ d , . . . , T [[T m]] ~ F i ~ d) perché l’estremo superiore di una catena difunzioni continue è definito in modo puntuale,

= b j ( sup 0T [[T 1]]~

F i~

d, . . . , sup T [[T m]]~

F i~

d) per la continuità di b j= b j ( sup T [[T 1]] ~ F i ~ d , . . . , sup T [[T m]] ~ F i ~ d) perché l’estremo superiore di una catena di

funzioni continue è definito in modo puntuale,= b j (T [[T 1]] sup ~ F i ~ d , . . . , T [[T m]] sup ~ F i ~ d) per ipotesi induttiva= T [[b j (T 1, . . . , T m)]] sup ~ F i~ d

Poiché questo vale per ogni ~ d, data l’equivalenza estensionale delle funzioni, abbiamo che

sup T [[b j (. . . )]] ~ F i = T [[b j (. . . )]] sup ~ F i.

La dimostrazione che i funzionali T [[if T then T 1 else T 2]] e T [[fr(T 1, . . . , T m)]] sono continuisegue uno schema analogo.

Page 156: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 156/332

156 Capitolo 7 – Un semplice linguaggio funzionale

7.4 Relazioni tra semantica operazionale e denotazionale

Gli approcci operazionali e denotazionali alla semantica dei linguaggi di programmazionegiocano un ruolo complementare. Una semantica operazionale serve da guida per l’imple-mentazione del linguaggio in quanto essa permette di tenere conto anche delle caratteristichedelle macchine su cui questo sarà implementato. D’altra parte l’approccio denotazionale per-mette di definire un linguaggio in modo indipendente dalla macchina, di evitare ridondanzee costrutti ad hoc. Inoltre, l’esistenza di una semantica “matematica” di un linguaggio diprogrammazione permette di provare proprietà dei suoi programmi.

Se si dispone di due diverse metodologie di specifica della semantica di un linguaggio,diventa importante provare che, per ogni programma, esse danno luogo alla stessa valutazione.Di seguito caratterizzeremo precisamente il concetto di equivalenza fra diverse semantiche diun linguaggio.

Definizione 7.6. Data una semantica operazionale O p ed una semantica denotazionale D enper un linguaggio di programmazione L, abbiamo:

1. D en è consistente rispetto ad O p se D en[ p] = v implica O p[ p] = v per tutti i programmi p che è possibile scrivere nel linguaggio L;

2. D en è completa rispetto a O p se O p[ p] = v implica D en[ p] = v per tutti i programmi pche è possibile scrivere nel linguaggio L;

3. D en è equivalente ad O p se è consistente e completa rispetto ad essa.

Per provare le relazioni fra le semantiche introdotte per SLF, abbiamo bisogno di alcunirisultati preliminari.

Osserviamo innanzitutto che, per la definizione di punto fisso, abbiamo:

Osservazione 7.7. Per ogni dichiarazione D che contiene fr(x1, . . . , xm) ⇐ T r, abbiamo che

Πr(D[[D]]) = T [[T r]] (D[[D]]).

Valgono inoltre i due lemmi che seguono:

Lemma 7.8. (Lemma di sostituzione) Per ogni termine T e per ogni dichiarazione D si ha

T [[T [T 1/x1, . . . , T m/xm]]] (D[[D]]) ~ X =

T [[T ]] (D[[D]])hT [[T 1]] (D[[D]]) ~ X , . . . , T [[T m]] (D[[D]]) ~ X i.

Dimostrazione. Per induzione sulla struttura di T .

Lemma 7.9. Per ogni dichiarazione D = f1(x1, . . . , xm) ⇐ T 1, . . . ,fn(x1, . . . , xm) ⇐ T nsi ha

P [[letrec D in T r[T 1/x1, . . . , T m/xm]]] = P [[letrec D in fr(T 1, . . . , T m)]].

Page 157: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 157/332

7.4 Relazioni tra semantica operazionale e denotazionale 157

Dimostrazione. Utilizziamo ~ 0 per rappresentare la m-pla h0, . . . , 0i.

P [[letrec D in T r[T 1/x1, . . . , T m/xm]]]= T [[T r[T 1/x1, . . . , T m/xm]]](D[[D]])~ 0 per la regola (Dec),= T [[T r]] (D[[D]])hT [[T 1]] (D[[D]])~ 0, . . . , T [[T m]] (D[[D]])~ 0i per il Lemma 7.8,= Πr(D[[D]])hT [[T 1]] (D[[D]])~ 0, . . . , T [[T m]] (D[[D]])~ 0i per l’Osservazione 7.7,= T [[fr(T 1, . . . , T m)]] (D[[D]])~ 0 per la regola (Fun),= P [[letrec D in fr(T 1, . . . , T m)]] per la regola (Prg).

Possiamo ora dimostrare il seguente risultato di completezza:

Teorema 7.10 (Completezza rispetto alla semantica operazionale con call-by-name). P è

completa rispetto a ∗−−−→

D, cioè per tutti i programmi del linguaggio SLF abbiamo

T ∗−−−→

D n implica P [[letrec D in T ]] = n.

Dimostrazione. La tesi viene provata per induzione sulla lunghezza k della derivazione

T ∗−−−→

D n (che indichiamo T

k−−−→D

n).Base dell’induzione . Se T va in zero passi in n allora l’unica possibilità è che sia T ≡ n.Esaminando la denotazione che abbiamo associato alle costanti, otteniamo che questa coincidecon n:

P [[letrec D in n]] = T [[n]] (D[[D]])h0, . . . , 0i= (λ ~ F ~ X.n)(D[[D]])h0, . . . , 0i= n.

Passo induttivo. Supponiamo che, se T k−−−→

D n, allora, per tutti i k ≤ i,

P [[letrec D in T ]] = n.

Dobbiamo provare che T i+1−−−−→

D n implica P [[letrec D in T ]] = n. Consideriamo i casi in

cui T i+1−−−−→

D n è possibile.

T ≡ b j (T 1, . . . , T m) : Se b j (T 1, . . . , T m) i+1−−−−→D

n, allora T h k−−−→D

nh con k ≤ i e 1 ≤ h ≤m, e quindi abbiamo

P [[letrec D in b j (T 1, . . . , T m)]]= T [[b j (T 1, . . . , T m)]] (D[[D]])h0, . . . , 0i per def. di P ,= (λ ~ F ~ X.b j (T [[T 1]] ~ F ~ X , . . . , T [[T m]] ~ F ~ X ))(D[[D]])h0, . . . , 0i per def. di T ,= b j (P [[letrec D in T 1]], . . . , P [[letrec D in T m]]) per def. di P ,= b j (n1, . . . , nm) per l’ipotesi induttiva,= n per la definizione delle funzioni base.

T ≡

if T then T 1 else T 2 : La prova è simile a quella per il caso precedente.

Page 158: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 158/332

158 Capitolo 7 – Un semplice linguaggio funzionale

T ≡ fr(T 1, . . . , T m) : Abbiamo che

fr(T 1, . . . , T m) −−→D T r[T 1/x1, . . . , T m/xm] i−−−→D n.

Per ipotesi induttiva, questo implica

P [[letrec D in T r[T 1/x1, . . . , T m/xm]]] = n,

pertanto per provare la tesi resta da provare che

P [[letrec D in T r[T 1/X 1, . . . , T m/xm]]] = P [[letrec D in fr(T 1, . . . , T m)]],

ma questo è esattamente quanto aff ermato dal Lemma 7.9.

Come abbiamo dimostrato che P è completa rispetto alla semantica operazionale con call-by-name, così possiamo dimostrare che lo è anche rispetto alla semantica operazionale concall-by-value. In eff etti, questo risultato è una immediata conseguenza di alcuni risultati giàdimostrati.

Teorema 7.11 (Completezza rispetto alla semantica operazionale con call-by-value). P è

completa rispetto a • ∗−−−→

D, cioè per tutti i programmi del linguaggio SLF abbiamo

T • ∗−−−→

D n implica P [[letrec D in T ]] = n.

Dimostrazione. Questo risultato è una diretta conseguenza del Lemma 7.4 e del Teorema 7.10.

Per la semantica operazionale basata sulla chiamata per nome, dimostriamo anche ilseguente teorema, che risulterà non valido per la semantica basata su call-by-value.

Teorema 7.12 (Consistenza rispetto alla semantica operazionale con call-by-name). P è

consistente rispetto a ∗−−−→

D, cioè per tutti i programmi del linguaggio SLF abbiamo

P [[letrec D in T ]] = n implica T ∗−−−→

D n.

Dimostrazione. Dalla definizione di P e dalla continuità di T (Teorema 7.5), segue che

P [[letrec D in T ]] = T [[T ]] D[[D]]h0, . . . , 0i = T [[T ]] f ix ~ F (r)h0, . . . , 0i = f ix T [[T ]] ~ F (r)h0, . . . , 0i

dove, per ogni r ≥ 0, ~ F (r) indica l’r-mo approssimante del minimo punto fisso del funzionaleassociato alle dichiarazioni D. Quindi, P [[letrec D in T ]] = n implica che, per qualche natu-rale r, si ha T [[T ]] ~ F (r)h0, . . . , 0i = n. Sarà allora sufficiente dimostrare che, per ogni naturaler,

T [[T ]] ~ F (r)h0, . . . , 0i = n implica T ∗−−−→

D n. (7.1)

Si noti che essendo T chiuso, la scelta della m-pla di argomenti (in questo caso h0, . . . , 0i) èdel tutto irrilevante, cioè non influenza il valore assunto dalla funzione T [[T ]] ~ F (r).

Page 159: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 159/332

7.4 Relazioni tra semantica operazionale e denotazionale 159

Dimostriamo ora un risultato più generale, da cui la tesi seguirà come corollario. Sia T untermine non necessariamente chiuso; assumiamo solo che le sue variabili libere appartengano

all’insieme y1, . . . , ym. Presi m termini chiusi V 1, . . . , V m qualsiasi, dimostriamo che:

T [[T ]] ~ F (r)(res(V 1), . . . , r e s(V m)) = n implica T [V 1/y1, . . . , V m/ym] ∗−−−→

D n, (7.2)

dove, per ogni termine chiuso V , poniamo

res(V ) =

( n se V

∗−−−→D

n

⊥ altrimenti.

In pratica, res(V ) indica il risultato della valutazione operazionale del termine chiuso V .Si noti che la proprietà (7.2) può essere equivalentemente espressa come:

T [[T ]] ~ F (r)(res(V 1), . . . , r e s(V m)) v res(T [V 1/y1, . . . , V m/ym]). (7.3)

Infatti, se vale la proprietà (7.2) allora abbiamo o che T [[T ]] ~ F (r)(res(V 1), . . . , r e s(V m)) =⊥,quindi la proprietà (7.3) è banalmente vera, oppure che T [[T ]] ~ F (r)(res(V 1), . . . , r e s(V m)) =n; in quest’ultimo caso, dalla definizione di res(·), segue res(T [V 1/y1, . . . , V m/ym]) = nper cui si ha nuovamente che la proprietà (7.3) vale. Al contrario, cioè se vale la pro-prietà (7.3), e se T [[T ]] ~ F (r)(res(V 1), . . . , r e s(V m)) = n, allora, dalla definizione di v,segue che res(T [V 1/y1, . . . , V m/ym]) = n; quindi, dalla definizione di res(·), abbiamoT [V 1/y1, . . . , V m/ym]

∗−−−→D

n, che vuol dire che la proprietà (7.2) vale.Procediamo ora a dimostrare la proprietà (7.1) ragionando per induzione su r. Se

r = 0, quindi ~ F (0) =

hΩm, . . . ,Ωm

i (dove Ωm

≡ λ(x1, . . . xm).

⊥), la tesi segue per in-

duzione sulla struttura di T . Consideriamo solo i casi più interessanti. Poniamo ~ V =hres(V 1), . . . , r e s(V m)i. Osserviamo che, se T ≡ fh(T 1, . . . , T m), allora:

T [[fh(T 1, . . . , T m)]]hΩm, . . . ,Ωmi~ V =

ΠhhΩm, . . . ,Ωmi(T [[T 1]] hΩm, . . . ,Ωmi~ V , . . . , T [[T m]] hΩm, . . . ,Ωmi~ V ) =

Ωm(T [[T 1]] hΩm, . . . ,Ωmi~ V , . . . , T [[T m]] hΩm, . . . ,Ωmi~ V ) =⊥e quindi la tesi segue banalmente. Invece, se T è una variabile, necessariamente una delle y j ,con 1 ≤ j ≤ m, si ha

T [[y j ]]hΩm, . . . ,Ωmi~ V = Π j~ V = res(V j ).

Ora, se T [[y j

]]hΩ

m, . . . ,Ω

mi~ V = n, cioè res(V

j) = n, allora, dalla definizione di res(V

j), segue

che V j∗−−−→

D n. La tesi deriva allora dal fatto che y j [V 1/y1, . . . , V m/ym] ≡ V j . Gli altri casi

della base dell’induzione sono altrettanto semplici e lasciati al lettore.Consideriamo ora il caso r > 0. Procediamo ancora per induzione sulla struttura di T .

L’unico caso interessante è quando T ≡ fh(T 1, . . . , T m), poiché gli altri casi procedono inmodo simile al caso r = 0. In tal caso, abbiamo

T [[fh(T 1, . . . , T m)]] ~ F (r)~ V = Πh( ~ F (r))hT [[T 1]] ~ F (r)~ V , . . . , T [[T m]] ~ F (r)~ V i= T [[T h]] ~ F (r−1)hT [[T 1]] ~ F (r)~ V , . . . , T [[T m]] ~ F (r)~ V i,

dove la prima uguaglianza è ottenuta applicando la regola (Fun) della semanticadenotazionale, mentre la seconda segue dalla definizione di approssimante (vista in 6.7).

Page 160: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 160/332

160 Capitolo 7 – Un semplice linguaggio funzionale

Le variabili di T i, per 1 < i < m, appartengono certamente all’insieme y1, . . . , ymcosicché, per ipotesi induttiva interna (induzione strutturale), abbiamo che, per ogni 1

≤i

≤m,T [[T i]] ~ F (r)~ V = ni implica T i[V 1/y1, . . . , V m/ym]

∗−−−→D

ni.

cioè, equivalentemente, che

T [[T i]] ~ F (r)~ V v res(T i[V 1/y1, . . . , V m/ym]).

Allora, per la monotonia di T (si ricordi che la continuità di T , argomentata alla fine dellasezione precedente e dimostrata dal Teorema 7.5, ne implica la monotonia) si ha

T [[T h]] ~ F (r−1)hT [[T 1]] ~ F (r)~ V , . . . , T [[T m]] ~ F (r)~ V i vT [[T h]] ~ F (r−1)

hres(T 1[V 1/y1, . . . , V m/ym]), . . . , r e s(T m[V 1/y1, . . . , V m/ym])

iPer ipotesi induttiva esterna (induzione matematica) abbiamo che

T [[T h]] ~ F (r−1)hres(T 1[V 1/y1, . . . , V m/ym]), . . . , r e s(T m[V 1/y1, . . . , V m/ym])i = n

implica T h[T 1[V 1/y1, . . . , V m/ym]/y1, . . . , T m[V 1/y1, . . . , V m/ym]/ym] ∗−−−→

D n.

cioè, equivalentemente, che

T [[T h]] ~ F (r−1)hres(T 1[V 1/y1, . . . , V m/ym]), . . . , r e s(T m[V 1/y1, . . . , V m/ym])iv res(T h[T 1[V 1/y1, . . . , V m/ym]/y1, . . . , T m[V 1/y1, . . . , V m/ym]/ym]).

Poiché dalla semantica operazionale abbiamo che

fh(T 1[V 1/y1, . . . , V m/ym], . . . , T m[V 1/y1, . . . , V m/ym]) −−→D

T h[T 1[V 1/y1, . . . , V m/ym]/y1, . . . , T m[V 1/y1, . . . , V m/ym]/ym]

ne segue, per definizione di res(·), che

res(fh(T 1[V 1/y1, . . . , V m/ym], . . . , T m[V 1/y1, . . . , V m/ym]))

= res(T h[T 1[V 1/y1, . . . , V m/ym]/y1, . . . , T m[V 1/y1, . . . , V m/ym]/ym]).

PerciòT [[fh(T 1, . . . , T m)]] ~ F (r)~ V v res(fh(T 1, . . . , T m)[V 1/y1, . . . , V m/ym])

Quindi, l’ipotesi induttiva è provata nel caso T ≡ fh(T 1, . . . , T m).Per induzione matematica possiamo allora concludere che per ogni naturale r e per ogni

termine chiuso T vale che

T [[T ]] ~ F (r)h0, . . . , 0i = n implica T ∗−−−→

D n.

che è quanto volevamo dimostrare.

È facile vedere che P non è consistente rispetto alla semantica operazionale con call-by-value.

Page 161: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 161/332

7.5 Esercizi 161

Esempio 7.13. Sia P il programma

letrec f1(x) ⇐ if x then 1 else f1(x)f2(x) ⇐ 1

in f2(f1(1))

Ora, non è difficile dimostrare che

D[[f1(x) ⇐ if x then 1 else f1(x), f2(x) ⇐ 1]] =

fix (λ(g1, g2).hT [[if x then 1 else f1(x)]] hg1, g2i, T [[1]] hg1, g2ii) =hλx.x → 1,⊥, λx.1i,

e quindi cheP [[P ]] =

T [[f2(f1(1))]] hλx.x → 1,⊥, λx.1i 0 =(λx.1)(T [[f1(1)]]hλx.x → 1,⊥, λx.1i 0) =

= 1

Invece, la semantica operazionale basata su call-by-value dà luogo alla computazionedivergente:

f2(f1(1)) (Fun00)−−−−−−→

D f2(f1(1))

(Fun00)−−−−−−→D

. . .

perché si ha

f1(1) (Cond2)−−−−−−−→

D f1(1)

Per concludere, osserviamo che è certamente possibile definire una semantica denotazionale

per il linguaggio SLF che sia equivalente (consistente e completa rispetto) alla semanticaoperazionale definita dalle regole per la chiamata per valore. Per far ciò è sufficiente modificareleggermente la semantica denotazionale descritta in Tabella 7.4. L’applicazione di funzioneva modificata, per richiedere che anche tutte le funzioni non di base siano strette, cioè chesiano indefinite se alcuni dei loro argomenti non sono definiti.

7.5 Esercizi

1. Scrivere i programmi SLF per calcolare

• la funzione M CD(x, y), che determina il massimo comun divisore fra x ed y ;

• la funzione di Fibonacci F IB(x).

2. Definire in SLF la funzione predecessore senza usare l’operazione di sottrazione.

3. Introdurre in SLF un tipo di dato lista di naturali e scrivere una funzione che, data unalista, ne calcola la lunghezza.

4. Modificare la semantica operazionale di SLF in modo tale che gli argomenti delle funzionibase siano valutati

• da sinistra verso destra;

• in parallelo.

Page 162: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 162/332

162 Capitolo 7 – Un semplice linguaggio funzionale

5. Definire i predicati di uguaglianza, di minore e di minore o uguale in SLF.

6. Fornire semantica operazionale e denotazionale del programma

letrec f(x) ⇐ f(x) in f(5).

7. Fornire un programma SLF la cui valutazione usando il passaggio di parametri per valoreè più “rapida” di quella che si ottiene usando il passaggio di parametri per nome, nelsenso che il valore si ottiene con una minore quantità di transizioni.

8. Definire una semantica denotazionale per SLF che sia equivalente alla semanticaoperazionale con la chiamata per valore.

9. Proporre restrizioni sintattiche per il linguaggio SLF in modo tale che nell linguaggio

risultante le chiamate per nome e per valore coincidano.

10. Discutere, dal punto di vista operazionale, la validità della seguente equivalenza:

f(if T then T 1 else T 2) = if T then f(T 1) else f(T 2).

11. Usare la semantica denotazionale per provare che

letrec f(x) ⇐ x in T = letrec f(x) ⇐ x in f(T ).

12. È possibile specificare la sintassi di SLF senza usare i puntini (. . .)? Motivare la risposta.

Page 163: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 163/332

Capitolo 8

Un semplice linguaggio imperativo

SOMMARIOQuesto capitolo presenta alcuni concetti comuni a vari linguaggi di programmazione e le tecniche utilizzate per la loro descrizione formale. Considereremo TINY , un semplice lin-guaggio di programmazione imperativo, di cui presenteremo una semantica operazionale ed una semantica denotazionale e ne dimostreremo l’equivalenza.

8.1 Il linguaggio TINY

TINY, già introdotto in [Gor79], è un frammento, privo di dichiarazioni, del linguaggio Pascal.Esso rientra all’interno di quella categoria di linguaggi noti come imperativi , cioè basati suicomandi (quali assegnamento e sequenzializzazione); in contrasto con i cosiddetti linguaggi

funzionali (o applicativi ), che sono invece essenzialmente basati sull’applicazione di funzione.Un programma TINY consiste di una sequenza di comandi, che possono contenere al loro

interno delle espressioni da valutare. Il linguaggio è quindi basato su due principali categoriesintattiche: Com , la categoria dei comandi, ed Exp, la categoria delle espressioni. Entrambequeste categorie sono basate sulla categoria sintattica degli identificatori, che assumeremo giànota ed il cui corrispettivo semantico non sarà analizzato in dettaglio. Essi si assumerannocostituiti da una qualsiasi stringa di numeri o lettere.

Le clausole che specificano la sintassi astratta del linguaggio TINY sono riportate inTabella 8.1; le parole chiave del linguaggio sono scritte in grassetto.

e ::= true | false | not e | n | e1 nop e2 | e1 bop e2 | read | xc ::= noaction | x := e | c1; c2 | if e then c1 else c2 | while e do c | output e

Tabella 8.1: Sintassi di TINY

Il significato intuitivo dei vari costrutti è quello suggerito dalla pratica della program-mazione. Per quanto riguarda le espressioni , le stringhe true e false rappresentano i valoribooleani vero e falso, così come n rappresenta un qualunque numero naturale. La stringa notrappresenta l’operazione di negazione sui booleani, mentre nop e bop stanno ad indicareoperatori binari rispettivamente sui naturali e sui booleani, come le operazioni aritmeticheo il predicato di uguaglianza. La stringa read rappresenta invece l’operazione di lettura da

Page 164: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 164/332

164 Capitolo 8 – Un semplice linguaggio imperativo

un file di input. Per quanto riguarda i comandi , i costrutti sintattici rappresentano, nell’or-dine, il comando nullo, l’assegnamento, la sequenzializzazione, il condizionale, l’iterazione e

l’operazione di scrittura su un file di output. Infine, un programma TINY è una sequenza dicomandi.

8.2 Semantica operazionale di TINY

Per definire la semantica operazionale delle espressioni di TINY, consideriamo innanzitutto ilsistema di transizioni

(Σ,ΣF , −−→→)

in cui l’insieme delle configurazioni Σ è definito come segue:

Σ = he, σi | e ∈ Exp, σ : Id −→ Val ∪ σ : Id −→ Val,

dove e è un’espressione e σ, lo stato, è una funzione che associa valori ad identificatori.L’insieme delle configurazioni finali ΣF è

ΣF = σ : Id −→ Val.

Dato uno stato σ, un valore v ∈ Val ed un identificatore id ∈ Id, la notazione σ[v/id]indica lo stato così definito: σ[v/id](id0) = σ(id0) se id0 6= id, σ [v/id](id0) = v altrimenti (cioèse id0 = id).

La definizione della relazione di transizione −−→→ è riportata in Tabella 8.2.

Assumeremo l’esistenza di tre identificatori “riservati”, che chiameremo rispettivamenteres, a cui sarà associato un valore di base, ovvero un intero o un booleano;

in, a cui sarà associata una sequenza di valori di base, gli input del programma;

out, a cui sarà associata una sequenza di valori di base, gli output del programma.

Il risultato v della valutazione di un’espressione sarà memorizzato tramite l’associazione di v

all’identificatore res. La lettura di un valore dalla sequenza di input, tramite l’espressioneread, modificherà questa sequenza estraendone la testa (e memorizzandola in res) ed asso-ciando ad in la coda della sequenza iniziale. Per realizzare queste operazioni vengono usate

le due funzioni h d e t l.Si osservi che quella descritta nella Tabella 8.2 è una semantica di valutazione; questovuol dire che la relazione di transizione permette di ottenere in un solo passo il valore diun’espressione.

(True), (False), (Nat): La valutazione dell’espressione true nello stato σ comporta l’aggior-namento di σ in modo tale che, nel nuovo stato, all’identificatore res venga associato ilvalore t rue. La valutazione dell’espressione false o dell’espressione n avviene in modoanalogo.

(Ide): La valutazione di un identificatore x in uno stato σ viene realizzata associando a resil valore che in σ viene associato ad x.

Page 165: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 165/332

8.2 Semantica operazionale di TINY 165

htrue, σi −−→→ σ[t rue/res] (True)

hfalse, σi −−→→ σ[ f alse/res] (False)

hn, σi −−→→ σ[n/res] (Nat)

hx, σi −−→→ σ[σ(x)/res] (Ide)

he, σi −−→→ σ0 σ0(res) = v

hnot e, σi −−→→ σ0[¬v/res] (Not)

he1, σi −−→→ σ0he2, σ0i −−→→ σ00σ0(res) = v1σ00(res) = v2

he1 bop e2, σi −−→→ σ00[v1 bop v2/res]

(Bop)

he1, σi −−→→ σ0he2, σ0i −−→→ σ00

σ0(res) = v1σ00(res) = v2

he1 nop e2, σi −−→→ σ00[v1 n op v2/res]

(Nop)

hread, σi −−→→ σ[h d(σ(in))/res, t l(σ(in))/in] (Read)

Tabella 8.2: Semantica operazionale delle espressioni di TINY

(Not): Data un’espressione e, la valutazione dell’espressione not e in uno stato σ viene ot-tenuta considerando lo stato σ0 risultato della valutazione di e e negando il valore cheσ0 associa a res. Non ci occupiamo, in questa descrizione, dell’eventualità che il valoredell’espressione e non sia un booleano; ignoriamo quindi situazioni di errore.

(Bop): Per valutare un’espressione della forma e1 bop e2 in uno stato σ, si considera lo stato σ0

ottenuto dalla valutazione di e1 in σ; successivamente si considera lo stato σ00 ottenutodalla valutazione di e2 in σ 0. Il risultato finale è uno stato ottenuto da σ 00 associando a

res il valore v1 bop v2 che si ha applicando l’operatore booleano ai valori ottenuti dallavalutazione di e1 ed e2.

(Nop): La valutazione di un’espressione della forma e1 n op e2 procede in modo perfettamenteanalogo al caso precedente.

(Read): La valutazione dell’espressione read in uno stato σ comporta l’associazione a resdella testa della sequenza di input, ed il conseguente aggiornamento di quest’ultima.

Per definire la semantica operazionale dei comandi di TINY, consideriamo il sistema ditransizioni

(K, K F ,−→

)

Page 166: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 166/332

166 Capitolo 8 – Un semplice linguaggio imperativo

he, σi −−→→ σ0 σ0(res

) = vhx := e, σi−→hnoaction, σ0[v/x]i (Ass)

hnoaction; c2, σi−→hc2, σi (Seq1)

hc1, σi−→hc01, σ0ihc1; c2, σi−→hc01; c2, σ0i (Seq2)

he, σi −−→→ σ0 σ0(res) = t rue

hif e then c1 else c2, σi−→hc1, σ0i (Cond1)

he, σi −−→→ σ0 σ0(res) = f alsehif e then c1 else c2, σi−→hc2, σ0i (Cond2)

he, σi −−→→ σ0 σ0(res) = t rue

hwhile e do c, σi−→hc; while e do c, σ0i (While1)

he, σi −−→→ σ0 σ0(res) = f alse

hwhile e do c, σi−→hnoaction, σ0i (While2)

he, σi −−→→ σ0 σ0(res) = v

houtput e, σ

i−→hnoaction, σ0[v :: (σ(out))/out]

i (Out)

Tabella 8.3: Semantica operazionale dei comandi di TINY

in cui l’insieme delle configurazioni K è definito come segue:

K = hc, σi | c ∈ Com , σ : Id −→ Val,

dove c è un comando e σ uno stato. L’insieme delle configurazioni finali K F è

K F = hnoaction,σi |

σ : Id

−→Val

.La semantica operazionale dei comandi di TINY è descritta dalla relazione di transizione

−→, definita in Tabella 8.3 (dove ricordiamo che l’operatore :: indica l’aggiunta di un elementoin testa ad una lista).L’esecuzione di un comando procede nel modo seguente:

(Ass): La valutazione di un’assegnazione x := e nello stato σ causa l’associazione del valoredell’espressione e all’identificatore x.

(Seq): Nella valutazione di una sequenza di comandi c1; c2, si procede valutando c1 tramite laregola (Seq)2, finché c1 non si rriduce a noaction. A questo punto l’esecuzione proseguevalutando c2 nello stato ottenuto dall’esecuzione di c1.

Page 167: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 167/332

8.3 Semantica denotazionale di TINY 167

(Cond): Per eseguire il condizionale if e then c1 else c2, si valuta prima l’espressione e,quindi, a seconda che questa sia vera o falsa, si esegue il comando c1 oppure il comando

c2, a partire dallo stato ottenuto dalla valutazione di e.

(While): Per eseguire il ciclo while e do c, si valuta prima l’espressione e, quindi, a secondache questa sia vera o falsa, si esegue, a partire dallo stato ottenuto dalla valutazione die, il comando c seguito da una nuova chiamata di ciclo oppure il comando noaction.

(Out): La valutazione del comando output e in uno stato σ comporta la valutazione di eseguita dall’aggiornamento della sequenza di output.

Osserviamo che la Tabella 8.3 non contiene alcuna regola per la riscrittura di noaction.Questo basta per concludere che noaction viene interpretato come il comando nullo. Unesempio dell’esecuzione di un semplice programma TINY, ottenuta utilizzando il sistema di

transizioni appena descritto, è riportato in Tabella 8.4.Analizziamo ora alcune proprietà della semantica operazionale di TINY. Per fare questo,

abbiamo bisogno di introdurre alcuni concetti.

Definizione 8.1. Una computazione di un comando c a partire da uno stato σ è una sequenza

hc, σi ≡ hc0, σ0i−→hc1, σ1i −→ · · · −→ hcn, σni −→ · · ·

che è infinita, oppure tale che l’ultima configurazione è della forma hnoaction, σ0i.

Informalmente, diremo che uno stato σ è appropriato per un comando c se tutte le variabilidi c sono ‘definite’ in σ. Il fatto che una variabile x sia ‘definita’ in uno stato σ indica o cheσ associa esplicitamente un valore a x o che la sequenza dei valori di input associati a in

è sufficientemente lunga da permettere di leggere, tramite espressioni read, i valori di basenecessari per poi inizializzare x.

Vale il seguente teorema, che può essere dimostrato per induzione utilizzando la semanticaoperazionale ed eff ettuando un’analisi della struttura di tutti i possibili programmi TINY.

Teorema 8.2. Siano c un programma TINY e σ uno stato appropriato per c.

1. Progresso: esiste sempre una computazione da hc, σi.

2. Determinismo: se c 6≡ noaction, allora esiste una sola configurazione hc0, σ0i tale che hc, σi−→hc0, σ0i.

8.3 Semantica denotazionale di TINY

Di seguito studieremo le funzioni di interpretazione semantica per Exp, che chiameremo E ,e per Com , che chiameremo C . Queste funzioni associano ai relativi costrutti sintattici glielementi di opportuni domini semantici. Per far questo, dopo aver definito tramite la sintassiastratta i possibili programmi, è necessario specificare i domini semantici D1 e D2 tali che:

E : Exp −→ D1

C : Com −→ D2.

A questo scopo bisogna individuare l’insieme dei possibili valori delle espressioni, dei possi-bili input e dei possibili output del programma. È anche necessario individuare delle strutture

Page 168: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 168/332

168 Capitolo 8 – Un semplice linguaggio imperativo

* x := 2 ∗ read; y := read;

while x < y dooutput (y − x); x := x + 1

, in

7→[2, 5]

out 7→ [ ] +↓* y := read;

while x < y dooutput (y − x); x := x + 1

,

res 7→ 4in 7→ [5]out 7→ [ ]x 7→ 4

+

↓* while x < y do

output (y − x); x := x + 1 ,

res 7→ 5in 7→ [ ] x 7→ 4out 7→ [ ] y 7→ 5

+

↓* output (y − x); x := x + 1;while x < y do

output (y − x); x := x + 1,

res 7→ t ruein 7→ [ ] x 7→ 4out 7→ [ ] y 7→ 5

+

↓* x := x + 1;while x < y do

output (y − x); x := x + 1,

res 7→ 1in 7→ [ ] x 7→ 4out 7→ [1] y 7→ 5

+

* while x < y do

output (y

−x); x := x + 1

,

res 7→ 5in 7→ [ ] x 7→ 5

out 7→ [1] y 7→ 5

+↓*

noaction ,

res 7→ f alsein 7→ [ ] x 7→ 5out 7→ [1] y 7→ 5

+

Tabella 8.4: Un esempio di computazione in TINY

dati che permettano di descrivere passo passo il comportamento dei vari programmi scrittiin TINY e che siano comunque sufficientemente astratte da evitare la descrizione di inutilidettagli implementativi. Tali strutture dati, analogamente a quanto già visto nel caso dellacalcolatrice tascabile, dipenderanno dall’input, dall’output e dalla memoria. La memoria nonsarà, come nel caso della calcolatrice tascabile, semplicemente un intero, ma una funzioneche associa valori booleani o naturali ad identificatori. Questa scelta ci permetterà di deter-minare i valori delle variabili usate all’interno dei programmi e di modificare l’associazionevariabili-valori per tener conto di eventuali comandi di assegnamento.

La struttura dati, che utilizzeremo per descrivere il comportamento dei vari programmi,non è esplicitamente menzionata all’interno della sintassi del linguaggio, ma gioca un ruolofondamentale per la descrizione della semantica; come per la semantica operazionale, questastruttura viene chiamata stato. Tutte le possibili frasi del linguaggio verranno descritte intermini delle modifiche che esse inducono sullo stato. Oltre a definire l’associazione variabili-

Page 169: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 169/332

8.3 Semantica denotazionale di TINY 169

valori, esso servirà a modellare la comunicazione tra parti separate di uno stesso programma:i valori calcolati da una frase sono depositati nello stato ed altre frasi useranno il nuovo stato

aggiornato. Essenzialmente lo stato rappresenta un argomento implicito durante l’esecuzionedi tutti i programmi e non è altro che un modello della memoria del calcolatore.

In generale l’eff etto dell’esecuzione di un comando di un linguaggio imperativo è quel-lo di cambiare il contenuto delle celle di memoria, dell’input o dell’output. La descrizionedenotazionale rende esplicito questo fatto modellando lo stato come una tripla che contieneinformazioni su input, output e memoria e la semantica dei vari comandi come funzioni chetrasformano uno stato in un altro, in generale diverso dal precedente.

I domini semantici che utilizzeremo per descrivere le funzioni di interpretazione dellinguaggio TINY sono riportati di seguito.

VAL = NAT + BOOL

MEM = ID −→ (VAL + unbound)

STATO = VAL∗ × VAL

∗ ×MEM.

VAL indica l’insieme dei possibili valori che le diverse espressioni possono assumere.MEM è invece una funzione che viene utilizzata per rappresentare la corrispondenza tra

identificatori e valori dei domini semantici. Ad un identificatore al quale non corrispondealcun valore viene associata la stringa unbound .

STATO è una tripla che rappresenta lo stato di un particolare programma ed è il parametroche deve essere passato alla funzione di interpretazione semantica per valutare i vari terminidel linguaggio. Lo stato di un programma contiene informazioni sulle sequenze di valori che

saranno date come input e prodotte come output e sull’associazione identificatori-valori delprogramma stesso. Difatti la coppia VAL∗×VAL∗ sta proprio ad indicare le possibili sequenze

di valori di input e di output dei programmi.Noi assumeremo che l’input venga fornito dall’utente prima dell’esecuzione di un pro-

gramma e che l’output del programma venga descritto aggiungendo ad una sequenza inizial-mente vuota i valori che si vogliono comunicare all’esterno. Il risultato finale di un qualsiasiprogramma sarà l’intera lista degli output, leggibile solo dopo la terminazione del programma.

I domini semantici appena visti ci permettono di specificare i domini semantici di E e diC , cioè D1 e D2; è importante notare che entrambi questi ultimi, e anche le loro componentipiù elementari (STATO, VAL, error) sono degli ordinamenti parziali completi, o cpo.

L’eff etto di valutare un’espressione a partire da uno stato qualsiasi è quello di produrre

un risultato ed allo stesso tempo un nuovo stato, oppure di generare un errore. Questo vieneespresso dalla seguente funzionalità di E :

E : Exp −→ STATO −→ ((VAL× STATO) + error).

La funzione di valutazione di un’espressione prende l’espressione stessa come argomento efornisce come risultato una funzione che, dato uno stato, produce errore oppure una coppiaformata da un valore e da un altro stato. Quest’ultimo risulta dalle modifiche apportateallo stato originario durante la valutazione dell’espressione. Il valore error viene restituitose, durante la valutazione dell’espressione, insorgono situazioni di errore, quali ad esempio ladivisione per zero oppure l’uso di identificatori a cui non corrisponde alcun valore all’internodella memoria.

Page 170: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 170/332

170 Capitolo 8 – Un semplice linguaggio imperativo

Osservazione 8.3. Poiché le espressioni producono valori, si potrebbe pensare di prendere co-me denotazione delle espressioni gli elementi del dominio VAL, e quindi di porre semplicemente

E : Exp −→ VAL.Questo potrebbe andar bene per i valori (costanti) di base, ma non permetterebbe di model-

lare la semantica di espressioni che causano errori, quali ad esempio 1 + true. Per trattare adeguatamente tali situazioni dovremmo definire E : Exp −→ (VAL+ error).

Ciò però non sarebbe ancora su ffi ciente per esprimere la dipendenza dei valori di alcune espressioni dallo stato, come per esempio nel caso di x+1, il cui valore dipende dal valore legatoad x nella memoria, o di 1 +read, il cui valore dipende dall’input. Per trattare adeguatamente anche tali situazioni dovremmo definire E : Exp −→ STATO −→ (VAL + error).

Infine, dobbiamo tener conto anche del fatto che la valutazione di un’espressione potrebbe modificare lo stato, come capita per esempio per l’espressione read, la cui valutazione compor-ta la rimozione del primo valore dalla sequenza dei valori in input. Per trattare adeguatamente anche tali situazioni dobbiamo definire E : Exp −→ STATO −→ ((VAL× STATO) + error).

L’eff etto di eseguire un comando a partire da uno stato qualsiasi è quello di produrre unnuovo stato o di generare un errore; questo viene espresso nella seguente funzionalità di C :

C : Com −→ STATO −→ (STATO + error).

La funzione di valutazione di un comando prende il comando stesso come argomento e forniscecome risultato una funzione che, dato uno stato, produce errore oppure un nuovo stato.

Nelle due sezioni successive riportiamo tutte le clausole di interpretazione semantica per

TINY. Il valore delle funzioni di interpretazione E e C sarà definito in termini del metalin-guaggio visto in precedenza in Sezione 6.5; avremo un’equazione per ciascuna delle opzionidelle categorie sintattiche Exp e Com . Ogni equazione sarà seguita da brevi commenti sul suosignificato.

È importante notare che le clausole di interpretazione semantica che riportiamo sonosufficienti per definire completamente la semantica di TINY e cioè di tutti i programmi e ditutte le espressioni che si possono costruire a partire dalla grammatica del linguaggio. Daremouna clausola per ogni costrutto di TINY e definiremo E e C sui termini composti in funzione deirisultati della loro applicazione ai sottotermini. Il principio di induzione strutturale garantisceche questo è sufficiente per specificare la semantica di qualsiasi programma TINY. Comevedremo, le definizioni di E e di C sono mutuamente ricorsive nel senso che si richiamano a

vicenda. Esse vanno viste come un unico sistema ricorsivo la cui soluzione è garantita dalfatto che tutte le funzioni sono continue (vedi Capitolo 6) e quindi dall’esistenza del minimopunto fisso.

8.4 Semantica delle espressioni

In questa sezione riportiamo le equazioni semantiche relative alla categoria sintattica Exp.Sostanzialmente esse associano ad ogni espressione una funzione che preso uno stato pro-duce un valore (il valore dell’espressione) ed uno stato eventualmente modificato durante lavalutazione dell’espressione.

Page 171: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 171/332

8.4 Semantica delle espressioni 171

E [[true]] = λσ. < t rue, σ >

E [[false]] = λσ. < f alse, σ >

La denotazione dell’espressione true (risp. false) è una funzione che riceve come inputuno stato σ e costruisce la coppia < t rue, σ > (risp. < f alse, σ >) dove t rue ( f alse) è il valoredi verità costante che fa parte del dominio semantico dei booleani assunto noto; lo stato σ èesattamente lo stesso stato ricevuto in ingresso dal momento che la valutazione di una costantenon comporta alcuna modifica alla memoria. Vale la pena notare che la denotazione sceltaper true e false non è completamente appropriata. Per tener conto esattamente del tipo dellefunzioni di interpretazione semantica avremmo dovuto scrivere

E [[true]] = λσ.in0(< t rue, σ >)

E [[false]] = λσ.in0(< f alse, σ >).

Comunque, nel resto delle note ometteremo questi dettagli per non appesantireulteriormente la notazione.

E [[not e]] = λσ. cases (E [[e]]σ) of < v, σ0 >: isbool(v) →< ¬(v), σ0 >, e rror;

e rror : e rrorendcases

La denotazione dell’espressione not e è una funzione che ricevuto uno stato lo usa pervalutare l’espressione e, quindi produce come risultato intermedio una coppia <valore, nuovostato>. Successivamente la funzione controlla che la prima componente del risultato sia unvalore di verità e costruisce la coppia formata dal negato del valore risultato e dal nuovo stato(¬ rappresenta il simbolo di negazione del metalinguaggio). Nel caso in cui la valutazionedell’espressione e dia luogo ad errore oppure il valore risultato non sia un booleano, il risultatodella funzione è error . A voler essere più precisi si potrebbe distinguere anche fra i due tipidi errore, ma, per semplicità, preferiamo ignorare anche questo tipo di problematica.

E [[n]] = λσ. < n, σ >

La denotazione dell’espressione n è una funzione che quando riceve come input uno stato

costruisce la coppia < n, σ > dove ora n è un elemento del dominio degli interi e σ è lo statoricevuto in ingresso.

E [[read]] = λ(in, out, mem). cases in of nil : error;v :: in0 :< v,< in0, out, mem >>

endcases

La funzione associata a read riceve in input uno stato, che viene visto in questo casocome una tripla ottenuta dal prodotto di elementi di tre domini1. Questo modo esplicito di

1Ricordiamo che, in base alla notazione descritta nel Capitolo 5, λ(in,out,mem).E (in,out,mem) sta perλσ.E (Π2

1σ,Π22σ,Π23σ).

Page 172: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 172/332

172 Capitolo 8 – Un semplice linguaggio imperativo

vedere lo stato ci permette di selezionare la sue componenti ed assegnare loro un nome; graziea questa possibilità, la funzione associata a read può verificare se la componente dello stato

corrispondente all’input è una lista (diciamo l) non vuota ed in caso aff ermativo produrrecome risultato il primo elemento di l insieme ad un nuovo stato del tutto simile al precedentea parte la lista di input che viene modificata rimuovendo da essa il primo elemento. Se la listadi input risulta vuota la funzione corrispondente a read vale error .

E [[e1 nop e2]] = λσ. cases (E [[e1]] σ) of < v1, σ1 >: i snat(v1) →

cases (E [[e2]] σ1) of < v2, σ2 >: i snat(v2) →

< v1 nop v2, σ2 >,error;

error : errorendcases ,error;

error : errorendcases

La funzione associata ad e1 nop e2 valuta la prima espressione ottenendo come risultatoun valore ed un nuovo stato; quest’ultimo viene usato per valutare la seconda espressione. Ilrisultato finale della valutazione di e1 nop e2 è quindi la coppia formata dal risultato dell’o-perazione fra i valori ottenuti dalla valutazione delle due espressioni e dallo stato risultantedalla valutazione della seconda espressione. Tutto questo si verifica se le valutazioni non dan-

no luogo ad errori e se i valori ottenuti come risultato sono elementi del dominio dei naturali;in caso contrario il risultato della valutazione di e1 nop e2 è λσ.error. A volte sarà neces-sario inserire nella clausola precedente ulteriori controlli sulla correttezza di una particolareoperazione. Nel caso della divisione ad esempio scriveremo, al posto di < v1 nop v2, σ2 >:

iszero(v2) → error, < v1 nop v2, σ2 > .

E [[e1 bop e2]] = λσ. cases (E [[e1]] σ) of < v1, σ1 >: i sbool(v1) →

cases (E [[e2]] σ1) of < v

2, σ

2 >: i sbool(v

2)→< v1 bop v2, σ2 >,

error;error : error

endcases ,error;

error : errorendcases

La funzione associata ad e1 bop e2 è simile a quella associata ad e1 nop e2. Il risultatofinale è quindi una coppia < v1 bop v2, σ2 > dove σ2 è lo stato ottenuto dopo la valutazionedi e2.

Page 173: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 173/332

8.5 Semantica dei comandi 173

E [[x]] = λ(i n, out, m em). m em(x) = u nbound → e rror,< m em(x), < i n, out, m em >>

La semantica di un identificatore è una funzione dello stato che restituisce il vecchio statoed il valore associato ad x all’interno di esso, se x non è unbound; in caso contrario restituiscesemplicemente error .

8.5 Semantica dei comandi

La funzione di interpretazione dei comandi è una funzione che dato uno stato lo trasformain un nuovo stato che è il risultato delle modifiche apportate allo stato originario durantel’esecuzione del comando. Se si verificano situazioni di errore allora invece che uno stato ilrisultato della valutazione è la stringa error .

C [[noaction]] = λσ. σ

Il significato del comando noaction è la funzione identità sullo stato, cioè la funzione chenon modifica il suo argomento.

C [[x := e]] = λσ. cases (E [[e]] σ) of < v, < in, out, mem >>:< in, out, mem[v/x] >;error : error

endcases

La semantica di un comando di assegnamento prevede la valutazione dell’espressione coin-volta nel comando, la verifica che questa valutazione non dia luogo ad errori e quindi lacreazione di un nuovo legame all’interno della memoria (tramite [v/x]) tra l’identificatore asinistra dell’assegnamento ed il risultato della valutazione. Chiaramente, se x in precedenzaera legato ad un altro valore, il vecchio legame viene perso.

C [[c1; c2]] = λσ. cases (C [[c1]] σ) of σ0 : C [[c2]] σ0;e rror : e rror

endcases

La semantica dell’operatore di sequenzializzazione prevede la valutazione del primo coman-do usando lo stato che viene passato come argomento alla funzione di valutazione. Il secondocomando viene quindi interpretato utilizzando lo stato risultante della prima valutazione.Questo succede solo quando non si verificano situazioni di errore.

C [[if e then c1 else c2]] = λσ. cases (E [[e]] σ) of < v, σ0 >: i sbool(v) →

v → C [[c1]] σ0, C [[c2]] σ0,e rror;

e rror : e rrorendcases

Page 174: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 174/332

174 Capitolo 8 – Un semplice linguaggio imperativo

La semantica del condizionale è basata sul condizionale del metalinguaggio. Essa prevededi valutare prima la condizione e, poi il comando c1 o il comando c2 a seconda che il valore

dell’espressione e sia vero o falso. Quando la valutazione di e non è un valore booleano, ilrisultato della valutazione del condizionale è error.

C [[output e]] = λσ. cases (E [[e]] σ) of < v, < in, out, mem >>:< in, v :: out, mem >;e rror : e rror

endcases

La funzione associata ad output e riceve in input uno stato che essa usa per valutarel’espressione e; il risultato della valutazione, se diverso da error , viene inserito in testa allalista degli output del programma di cui il comando fa parte. Come risultato complessivo la

funzione produce un nuovo stato che contiene la stessa lista di input, la nuova lista di outpute la memoria risultante dalla valutazione di e.La funzione di interpretazione semantica del comando while è la più complicata tra quelle

prese in considerazione finora. Il suo significato intuitivo ed i motivi dell’introduzione dell’o-peratore di punto fisso possono essere spiegati utilizzando la semantica di tre dei comandi giàdescritti. Infatti, abbiamo che

while e do c

ha lo stesso significato di

if e then ( c; while e do c ) else noaction.

Pertanto, se si ignorano alcune verifiche di assenza di errore, che in questo caso avrebbero ilsolo risultato di appesantire la notazione, si ha che la funzione di interpretazione semanticadel while può essere descritta in termini della semantica dell’operatore condizionale come:

C [[while e do c]] =λσ. cases (E [[e]] σ) of < v, σ0 >: v → C [[c; while e do c]] σ0,

C [[noaction]] σ0

endcases .

Quindi, espandendo la funzione sopra definita utilizzando la semantica dell’operatore disequenzializzazione, depurata dai controlli di errore,

C [[c; while e do c]] = λσ. C [[while e do c]] (C [[c]] σ),

e la semantica di noaction, abbiamo:

C [[while e do c]] =λσ. cases (E [[e]] σ) of < v, σ0 >: v → C [[while e do c]](C [[c]] σ0),

σ0

endcases .

Se ora ridenominiamo C [[while e do c]] con Θw, otteniamo la specifica ricorsiva

Θw = λσ. cases (E [[e]] σ) of < v, σ0 >: v →

Θw(C [[c]] σ0), σ0 endcases .

Page 175: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 175/332

8.6 Equivalenza fra le semantiche 175

da cui, astraendo rispetto a Θw, ricaviamo il funzionale:

λΘw.λσ. cases (E [[e]] σ) of < v, σ0 >: v → Θw(C [[c]] σ0), σ0 endcases .

Possiamo quindi concludere che la funzione di interpretazione del while è il punto fisso delfunzionale suddetto (ove si siano considerate le tre possibili sorgenti di errore: E [[e]] σ, isbool(v)e C [[c]] σ0).

C [[while e do c]] = fix (λΘw. λσ. cases (E [[e]] σ) of < v, σ0 >: i sbool(v) →

v →cases C [[c]] σ0 of

σ00 : Θw σ00;

e rror : e rrorendcases ,σ0,

e rror;e rror : e rror

endcases )

8.6 Equivalenza fra le semantiche

Mostriamo ora l’equivalenza tra semantica operazionale e semantica denotazionale proposteper TINY. Per non appesantire le dimostrazioni, adotteremo alcune semplificazioni. Innanzi-tutto, non considereremo la verifica delle situazioni di errore, che è stata invece ampiamentetrattata nella semantica denotazionale. Infatti, eventuali errori, siano questi causati dallapresenza di espressioni mal tipate o dalla richiesta di eseguire operazioni non definite, nonhanno un corrispettivo operazionale. In altre parole, nessuna transizione è possibile partendoda un errore. Nel confrontare le semantiche proposte siamo invece interessati solo al caso incui un programma produca un risultato.

Prima di enunciare i teoremi che permetteranno di stabilire le relazioni fra le semanticheproposte, osserviamo che le strutture dati utilizzate nel caso operazionale sono leggermentediverse da quelle usate nella semantica denotazionale. In particolare, lo stato nella semanticaoperazionale è una funzione che associa valori, eventualmente sequenze di valori, ad identifi-catori. Lo stato nella semantica denotazionale è invece una tripla, formata da due sequenzedi valori e da una funzione che associa valori ad identificatori. Nel seguito di questo capitolosupporremo di poter uniformare queste diverse strutture. Assumeremo allora che lo statoutilizzato nella semantica denotazionale contenga anche le associazioni per gli identificatoririservati in e out, ma non per l’altro identificatore riservato res. Quindi, se σ è < i,o,m >,lo useremo anche per indicare la funzione m[i/in, o/out]. Dato un σ che non contiene alcunaassociazione per res, la notazione σ ∪ res 7→ v indicherà σ [v/res]. Scriveremo inoltre σ

res

per indicare uno stato che è identico a σ a parte per il fatto che può contenere l’associazionedi un valore per la variabile riservata res. Spesso, quando il contesto non renda necessa-rio distinguerli, confonderemo lo stato σ con σ

res. È da notare che nel linguaggio TINY, ilcomportamento di un programma è determinato dalla sequenza di output ottenibile a partireda una sequenza di input. Quindi il vero oggetto del nostro interesse sta nelle evoluzioni di

Page 176: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 176/332

176 Capitolo 8 – Un semplice linguaggio imperativo

queste due sequenze di valori. La variabile riservata res sarà utile nell’analisi della semanticadelle espressioni, ma avrà scarsa rilevanza nello studio della semantica dei comandi.

Innanzitutto, consideriamo l’equivalenza tra le semantiche delle espressioni.

Lemma 8.4. La semantica operazionale e la semantica denotazionale definite per le espressioni del linguaggio TINY sono equivalenti:

E [[e]] σ =< v, σ0 > ⇔ he, σresi −−→→ σ0 ∪ res 7→ v.

Dimostrazione. Per induzione sulla struttura di e.

true : Si ha E [[true]] σ =< true, σ > e inoltre htrue, σresi −−→→ σ

res[t rue/res]. La tesi segue

allora per il fatto che σres[t rue/res] = σ ∪ res 7→ t rue.

false : Simile al caso precedente.n : Simile ai casi true e false.

x : Si ha E [[x]] σ =< σ(x), σ > e inoltre hx, σresi −−→→ σres[σres(x)/res]. La tesi segue alloraper il fatto che σ

res[σ

res(x)/res] = σ ∪ res 7→ σ

res(x).

read : Si ha E [[read]] σ =< h d(σ(in)), σ[t l(σ(in))/in] > e inoltre

hread, σresi −−→→ σ

res[h d(σres(in))/res, t l(σ

res(in))/in].

La tesi segue allora per il fatto che σres

[h d(σres

(in))/res, t l(σres

(in))/in] =σ[t l(σres(in))/in]

∪res

7→h d(σres(in)).

not e : Si ha

E [[not e]] σ =< ¬v, σ0 >⇔ E [[e]] σ =< v, σ0 > per la definizione di E [[]]⇔ he, σ

resi −−→→ σ0 ∪ res 7→ v per ipotesi induttiva

⇔ hnot e, σresi −−→→ σ0 ∪ res 7→ ¬v. per la regola operazionale (Not)

e1 nop e2 : Per ipotesi induttiva abbiamo che

E [[e1]] σ =< v1, σ0 > ⇔ he1, σresi −−→→ σ0 ∪ res 7→ v1,

E [[e2]] σ0 =< v2, σ

00 >

⇔ he2, σ

0resi −−→→

σ00 ∪

res7→

v2.

Per la definizione di E [[]] e per la regola operazionale (Nop), segue che

E [[e1 nop e2]]σ =< v1 nop v2, σ00 >⇔ he1 nop e2, σ

resi −−→→ σ00 ∪ res 7→ v1 nop v2.

e1 bop e2 : Simile al caso precedente.

Utilizziamo ora il risultato precedente per stabilire l’equivalenza fra le semantiche deicomandi.

Page 177: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 177/332

8.6 Equivalenza fra le semantiche 177

Teorema 8.5. La semantica operazionale e la semantica denotazionale definite per i comandi del linguaggio TINY sono equivalenti:

C [[c]] σ = σ 0 ⇔ hc, σresi ∗−−−→ hnoaction, σ0res

i.

Dimostrazione. Consideriamo innanzitutto l’implicazione ⇒ (cioè la consistenza della se-mantica denotazionale rispetto alla semantica operazionale). La dimostrazione procede perinduzione sulla struttura di c. Il caso più interessante è quando si considera il comando while.In questo caso, abbiamo

C [[while e do c]] = fix F

dove F è il funzionale descritto nella sezione precedente, cioè

F = λΘw . λσ. let < v, σ0 > be E [[e]] σ in v → Θw(C [[c]] σ0), σ0.

le cui approssimazioni sono definite come segue:

F 0Ω = Ω = λσ. ⊥F n+1Ω = λσ. let < v, σ0 > be E [[e]] σ in v → (F nΩ)(C [[c]] σ0), σ0

Considerando che fix F è una funzione da stati in stati, conviene in questo contesto rappre-sentarla come un insieme di coppie di stati. Analogamente, tutte le sue approssimazioni finitepossono essere descritte come insiemi di coppie di stati. Infatti, applicando la funzione F n+1Ωand uno stato σ, si ottiene

(F n+1Ω)σ = σ0 E [[e]] σ =< f alse, σ0 >σ0 E [[e]] σ =< t rue, σ00 > e (F nΩ)(C [[c]] σ00) = σ 0

Per cui abbiamo

F 0Ω = ∅F n+1Ω = (σ, σ0) | E [[e]] σ =< f alse, σ0 > ∪

(σ, σ0) | E [[e]] σ =< t rue, σ00 > e (C [[c]] σ00, σ0) ∈ F nΩ.

Quindi, ad esempio, abbiamo

F 1Ω = (σ, σ0) | E [[e]] σ =< f alse, σ0 >F 2Ω = (σ, σ0) | E [[e]] σ =< f alse, σ0 > ∪

(σ, σ0) | E [[e]] σ =< t rue, σ00 > e (C [[c]] σ00, σ0) ∈ F 1Ω

= (σ, σ0) | E [[e]] σ =< f alse, σ0 > ∪(σ, σ0) | E [[e]] σ =< t rue, σ00 > e E [[e]] (C [[c]] σ00) =< f alse, σ0 >

F 3Ω = (σ, σ0) | E [[e]] σ =< f alse, σ0 > ∪(σ, σ0) | E [[e]] σ =< t rue, σ00 > e (C [[c]] σ00, σ0) ∈ F 2Ω

= (σ, σ0) | E [[e]] σ =< f alse, σ0 > ∪(σ, σ0) | E [[e]] σ =< t rue, σ00 > e E [[e]] (C [[c]] σ00) =< f alse, σ0 > ∪(σ, σ0) | E [[e]] σ =< t rue, σ00 > e E [[e]] (C [[c]] σ00) =< t rue, σ000 >

e E [[e]] (C [[c]] σ000) =< f alse, σ0 >

Dimostriamo ora, per induzione matematica (interna), che per ogni n, abbiamo

∀(σ, σ0)

∈F nΩ

⇒ hwhile e do c, σ

res

i ∗

−−−→ hnoaction, σ0

resi.

Page 178: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 178/332

178 Capitolo 8 – Un semplice linguaggio imperativo

Da ciò, poiché F è continuo e C [[while e do c]] = fix F , segue che

∀ (σ, σ0) ∈ C [[while e do c]] ⇒ hwhile e do c, σresi ∗−−−→ hnoaction, σ0resi.

Così, nel caso del comando while, la tesi risulta dimostrata.

Base dell’induzione. Se n = 0, allora F 0Ω = ∅ e quindi l’aff ermazione è banalmente vera.

Passo induttivo. Siano σ e σ0 tali che (σ, σ0) ∈ F n+1Ω. Data la definizione di F n+1Ω ci sonodue possibilità. Se E [[e]] σ =< f alse, σ0 >, allora la tesi segue dal Lemma 8.4 e dalla regola(While2) della semantica operazionale dei comandi. Altrimenti, sia E [[e]] σ =< t rue, σ00 >.Per il Lemma 8.4, segue che he, σ

resi −−→→ σ 00 ∪ res 7→ true. Allora, applicando la regolaoperazionale (While1), otteniamo

hwhile e do c, σ

res

i−→hc; while e do c, σ00

res

idove σ00

res indica lo stato σ00 ∪ res 7→ true. Se ora poniamo σ000 = C [[c]] σ00, per induzione

strutturale (esterna), abbiamo che

hc, σ00res

i ∗−−−→ hnoaction, σ000res

i.

Quindi, usando le regole (Seq1) e (Seq2), ricaviamo che

hc; while e do c, σ00res

i ∗−−−→ hwhile e do c, σ000res

i.

Ora, dalla definizione di F n+1Ω, da E [[e]] σ =< t rue, σ00 > e σ 000 = C [[c]] σ00, segue che (σ000, σ0) ∈F nΩ e quindi, per induzione matematica (interna), segue che

hwhile e do c, σ000res

i ∗−−−→ hnoaction, σ0res

i,

per cui possiamo concludere che

hwhile e do c, σresi ∗−−−→ hnoaction, σ0

resi.

Dimostriamo ora l’implicazione ⇐ (cioè la completezza della semantica denotazionale ri-spetto alla semantica operazionale). La dimostrazione procede, come nel caso precedente,per induzione sulla struttura dei comandi, considerando i diversi modi in cui possono essereapplicate le regole della semantica operazionale. Per semplicità, considereremo solo il ca-

so più interessante, relativo al comando while e do c. Consideriamo allora la transizione,eventualmente in più passi,

hwhile e do c, σresi ∗−−−→ hnoaction, σ0res

i.

In questo caso, la dimostrazione procede per induzione sul numero n di volte che nellatransizione viene applicata la regola (While1).

Se n = 0, allora la transizione in esame è ottenuta in un solo passo attraverso la re-gola (While2), quindi he, σ

resi−−→→σ0res

con σ0res

(res) = false. Dal Lemma 8.4 si haE [[e]] σ =< f alse, σ0 >. Quindi, la tesi, cioè C [[while e do c]] σ = σ0, segue immediatamentedalla definizione di C [[while e do c]].

Altrimenti, cioè n > 0, esistono σ 00 e σ 000 tali che

Page 179: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 179/332

8.7 Esercizi 179

1. he, σresi −−→→ σ00res

e σ00res

(res) = t rue, quindi, per la regola operazionale (While1),ricaviamo che

hwhile e do c, σ

res

i−→hc; while e do c, σ00

res

i,

2. hc, σ00res

i ∗−−−→ hnoaction, σ000res

i, e

3. hwhile e do c, σ000res

i ∗−−−→ hnoaction, σ0res

i, dove la regola (While1) è utilizzata n − 1volte.

Quindi abbiamoE [[e]] σ =< t rue, σ00 >,

per il Lemma 8.4, eC [[c ]]σ00 = σ 000,

per ipotesi induttiva esterna (induzione strutturale), e

C [[while e do c]] σ000 = σ 0,

per ipotesi induttiva interna (numero di applicazioni della regola (While1)). La tesi, cioèC [[while e do c]] σ = σ0, allora segue dalla definizione di C [[while e do c]], dato che si haE [[e]] σ =< t rue, σ00 > e C [[while e do c]] (C [[c ]]σ00) = σ 0.

Come detto all’inizio di questa dimostrazione, gli unici casi interessante nell’induzionestrutturale su cui si basano la due prove sono quelli appena completati. Inoltre il caso delcomando while richiede due prove sostanzialmente diff erenti per le due implicazioni, mentrei casi degli altri comandi possono essere aff rontati seguendo uno stesso schema. Vediamoinfatti come si dimostra uno degli altri casi, relativo al comando di assegnamento, lasciandoil resto della dimostrazione per esercizio al lettore. Abbiamo

C [[x := e]] = (σ, σ0) | E [[e]]σ =< v, σ00 > e σ0 = σ 00[v/x].

Quindi, per il Lemma 8.4, he, σi −−→→ σ 00 ∪ res 7→ v. La tesi segue immediatamente dallaregola operazionale (Ass).

Viceversa, se hx := e, σi −→ hnoaction, σ0[v/x]i, allora, dalla regola operazionale (Ass),abbiamo he, σi −−→→ σ0, con σ0(res) = v. Applicando il Lemma 8.4 e la definizione diC [[x := e]] si ottiene la tesi.

8.7 Esercizi

8.1 Si dimostri che i comandi

while e do c e (while e do c); while e do c

hanno la stessa semantica operazionale e la stessa semantica denotazionale.

8.2 Si dimostri che

C [[while x = 1 do noaction]] =C [[if x = 1 then (while true do noaction) else noaction]].

8.3 Dimostrare cheC [[while x

6= 0 do x := 0]] = C [[x := 0]].

Page 180: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 180/332

180 Capitolo 8 – Un semplice linguaggio imperativo

8.4 Si fornisca la semantica operazionale e denotazionale del costrutto

cases e of n1 :c1n2 :c2

otherwise:c3,

dove n1 6= n2. Questo comando prevede l’esecuzione di c1, c2 o c3 a seconda che la valutazionedi e fornisca n1, n2 oppure un altro intero.

8.5 Si consideri il comandoc1 then when e do c2,

con la seguente semantica informale: nello stato ottenuto eseguendo c1 viene valutata la condi-zione e; se questa risulta vera, il comando c2 viene valutato nello stato precedente l’esecuzionedi c1, altrimenti l’intero comando non ha eff etto sullo stato. Fornire la semantica operazionale

e denotazionale del comando sopra descritto.8.6 Si calcoli formalmente, usando la semantica denotazionale di TINY, l’insieme degli stati a partire

dai quali eseguendo il comando seguente si ha divergenza:

while x > 0 do

if x < 3 then x := x − 1 else noaction.

8.7 La semantica C [[c1; c2]], con C [[c2]] =⊥ può non essere ⊥?

8.8 Fornire una semantica non standard di TINY, che ad ogni programma associa l’insieme degliidentificatori utilizzati.

8.9 Fornire una semantica non standard di TINY, che associa ad ogni programma il valore corretto,

se tutti gli identificatori, prima di comparire a sinistra di un assegnamento, compaiono a destra,ed il valore sbagliato altrimenti.

8.10 La semantica operazionale presentata per il linguaggio TINY è una semantica di valutazioneoppure di computazione? Specificare l’altra alternativa.

8.11 Si aggiunga al linguaggio TINY un comando stop con la semantica informale di far terminare ilprogramma. Se ne dia la semantica e si dimostri che c1; stop e c1; stop; c2 sono semanticamenteequivalenti.

Page 181: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 181/332

Capitolo 9

Linguaggi con contesti

SOMMARIOQuesto capitolo introduce un altro linguaggio di programmazione, SMALL, che è una sem-

plice estensione del linguaggio TINY considerato nel capitolo precedente. Rispetto a TINY , il linguaggio SMALL prevede la dichiarazione esplicita di variabili e costanti usate all’interno diun programma e la strutturazione in blocchi dei programmi stessi; inoltre SMALL permette la dichiarazione e l’uso di funzioni e procedure. Pertanto, SMALL si avvicina notevolmente al linguaggio Pascal.

9.1 Il linguaggio SMALL

SMALL, anch’esso ripreso da [Gor79], ha quattro categorie sintattiche. Una categoria Dec per

le dichiarazioni, una categoria, Prog per i programmi e le categorie Exp e Com , come il TINY,per le espressioni ed i comandi. Qui e nel resto della sezione utilizzeremo

prog per indicare elementi di Prog ,d, d1, d2, . . . per indicare elementi di Dec ,e, e1, e2, . . . per indicare elementi di Exp, ed infinec, c1, c2, . . . per indicare elementi di Com .

prog ::= program cd ::= const x = e | var x = e | proc p(x); c | fun f (x); e | d1; d2

e ::= b | n | not e | e1 nop e2 | e1 bop e2| if e then e1 else e2 | x | e(e1) | read

c ::= e := e1 | c1; c2 | if e then c1 else c2 | while e do c | output e |begin d; c end | e(e1)

Tabella 9.1: Sintassi di SMALL

Nella sintassi riportata in Tabella 9.1 non abbiamo descritto gli elementi del dominio deibooleani e dei naturali e le relative operazioni; li abbiamo indicati con b e con n e con nope bop rispettivamente. La nuova sintassi richiede di dichiarare variabili e costanti prima diusarle ed off re la possibilità di strutturare i programmi in blocchi (begin d; c end).

Page 182: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 182/332

182 Capitolo 9 – Linguaggi con contesti

Il linguaggio inoltre prevede la definizione e l’uso di funzioni e procedure. Per semplicitàsia procedure che funzioni avranno sempre uno ed un solo parametro. Il meccanismo di pas-

saggio dei parametri previsto è la cosiddetta call-by-undereferenced value , un compromesso trail passaggio di parametri per valore e quello per nome: se viene passato come parametro unindirizzo, questo non viene dereferenziato, cioè non viene utilizzato per determinare il valoreche si trova nella relativa cella di memoria al momento della chiamata. Procedure e funzionipossono essere dichiarate all’interno di blocchi ed il meccanismo utilizzato per assegnare unvalore alle loro variabili globali è quello noto come scoping statico: le sequenze di istruzioniche costituiscono il corpo delle procedure e delle funzioni usano i valori che le loro variabiliglobali hanno al momento della dichiarazione e non quelli attivi al momento delle chiamate(scoping dinamico). La valutazione di un’espressione può produrre come risultato anche unafunzione od una procedura; per questo, la sintassi prevede anche espressioni e comandi del ti-po: e(e1), e := e1, invece di prevedere semplicemente qualcosa del tipo f (e1), p(e1) ed x := e1.

Sono previste inoltre dichiarazioni di costanti, variabili, procedure e funzioni; è possibile eff et-tuare sequenze di dichiarazioni con begin d1; d2; c end. In quest’ultimo caso le dichiarazionieff ettuate con d2 hanno precedenza su quelle eff ettuate con d1 ed entrambi, insieme ai legamiattivi prima dell’esecuzione del blocco, determinano il contesto (scope ) in cui il comando c

deve essere valutato.

9.2 Ambienti e locazioni

L’introduzione dei blocchi porta con sè la nozione di contesto all’interno del quale valutare leespressioni ed i comandi e quindi il problema di decidere quale significato assegnare alle lorovariabili. Si può infatti verificare il caso in cui un unico identificatore abbia due significatidiversi che dipendono dal contesto in cui esso viene usato. Ciò accade ad esempio quando inun programma ci sono due blocchi che usano lo stesso identificatore; è ovvio che in questocaso, in un qualsiasi punto di un programma, si pone il problema di determinare l’associazioneattiva.

Esempio 9.1. Consideriamo il programma

programbegin

var x = 100;var y = 0;

y := x;begin

var x = 1;y := x

end;y := x

end

In esso appaiono due diverse dichiarazioni per x e di conseguenza due diversi valori per y.Infatti, nel blocco più esterno, x vale 100, mentre nel blocco più interno x è una variabileinizializzata ad 1. Conseguentemente nel blocco più esterno y vale 100 sia prima che dopo lavalutazione del blocco più interno; dentro quest’ultimo y vale 1.

Page 183: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 183/332

9.2 Ambienti e locazioni 183

Oltre al problema di utilizzare lo stesso nome per indicare valori diversi, evidenziato dalframmento di programma SMALL riportato nell’Esempio 9.1, può anche succedere che venga-

no utilizzati due identificatori per far riferimento allo stesso valore; ciò si verifica ad esempioquando i corpi di due diverse procedure usano una stessa variabile globale. In tal caso il pro-blema che si pone è quello di mantenere la consistenza tra i valori associati ai due identificatori:in un qualsiasi istante la valutazione di entrambi deve dar luogo allo stesso valore.

È importante notare come sia sempre possibile determinare, in ogni punto di un program-ma, il contesto attivo e quindi l’esatta associazione tra variabili e valori. Nel nostro caso,avendo scelto per SMALL uno scoping statico, l’associazione potrà essere determinata anchesenza eseguire i programmi. Altri linguaggi, che qui non prenderemo in considerazione, sonobasati sullo scoping dinamico: in questi casi la determinazione esatta dei contesti attivi èpossibile solo durante l’esecuzione.

La descrizione della semantica di un qualsiasi linguaggio a blocchi richiede una gestione

appropriata dei contesti. Con l’approccio denotazionale questi vengono modellati tramitefunzioni chiamate ambienti . Gli ambienti stabiliscono una corrispondenza tra identificatorie locazioni della memoria, le quali contengono invece dei valori. L’associazione completaidentificatore-valore viene quindi ottenuta applicando in sequenza due funzioni: l’ambiente ela memoria. Quest’ultima è una funzione simile alla funzione mem vista per TINY e che inquesto caso mappa locazioni (invece che identificatori) in valori. Abbiamo quindi la doppiacorrispondenza rappresentata in Figura 9.1.

x ρ / / l σ / / v

identificatore

O O

locazione

O O

valore

O O

ambiente

O O

memoria

O O

Figura 9.1: Associazione identificatore-valore in SMALL

Le locazioni possono essere viste come indirizzi astratti ma anche, forse meglio, comeoggetti che hanno una vita che generalmente ha inizio al momento della dichiarazione di unidentificatore e ha fine quando si esce dal blocco in cui la dichiarazione è avvenuta. Allelocazioni viene fatto riferimento tramite gli identificatori e ad esse viene associato un valore(che può cambiare nel tempo) tramite la memoria. Quindi, se sono stati dati due nomi diversiad una stessa locazione (vedi Figura 9.2), situazione nota col nome di aliasing , non ci sonodifficoltà a mantenere la consistenza tra i valori associati ai due nomi: ogni aggiornamento diuna variabile è implementata tramite una modifica dell’associazione della sua locazione con ilsuo valore e, quindi, comporterà un automatico aggiornamento anche della seconda variabile.

Nel caso del TINY non abbiamo avuto bisogno di introdurre l’ambiente perché ogni pro-gramma dava luogo ad un solo contesto globale. L’unico ambiente corrispondente a questocontesto era inglobato nello stato per ottenere un’associazione diretta tra identificatori e valorirappresentata in Figura 9.3.

Nel seguito vedremo come, in generale, gli ambienti possono essere modificati solo dalle di-chiarazioni mentre le memorie possono essere modificate sia dai comandi che dalle dichiarazio-ni. Le dichiarazioni possono modificare l’ambiente, introducendo nuovi legami identificatore-

Page 184: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 184/332

184 Capitolo 9 – Linguaggi con contesti

x

l / / v

y

C C

Figura 9.2: Nomi diversi per una stessa locazione

x σ / / v

identificatore

O O

valore

O O

memoria

O O

Figura 9.3: Associazione identificatore-valore in TINY

locazione, e possono modificare la memoria associando un valore ad una locazione. I comandipossono soltanto modificare il contenuto delle locazioni, ma non il legame tra identificatori elocazioni.

All’interno di un blocco un identificatore denota sempre la stessa locazione, quello che puòcambiare (a causa di un’operazione di assegnamento) è solo il contenuto di questa locazione.In generale, un identificatore è visibile in tutto il blocco in cui è stato dichiarato, a menoche esso non venga ridichiarato in un blocco più interno. In questo caso la locazione ad essoassociata originariamente scompare momentaneamente per ricomparire quando si esce dalblocco più interno.

Nel caso dell’Esempio 9.1 i due identificatori x denotano due diff erenti locazioni mentrel’identificatore y, non essendo stato dichiarato nel blocco più interno, denota la stessa locazionesia in questo che nel blocco che lo contiene. SInoltre, abbiamo che il valore finale di y è 100in quanto l’ultimo x visibile è quello associato alla locazione che contiene 100.

9.3 Domini semantici per SMALL

Di seguito studieremo le funzioni di interpretazione semantica per Prog , Dec , Exp e Com ,che chiameremo rispettivamente P , D, E e C . Queste funzioni associano elementi dei dominisemantici ai relativi costrutti sintattici. Per definirle è essenziale quindi specificare i dominisemantici che abbiamo intenzione di utilizzare. Come nel caso di TINY, questi domini sarannodei cpo. Tutti saranno costruiti a partire da domini elementari quali NAT, BOOL, LOC (ildominio piatto delle locazioni), ID (il dominio piatto degli identificatori) e dai “singoletti”error , unused e unbound . I domini più “complicati” saranno costruiti utilizzando operatori tradomini quali +, ×, −→.

Per descrivere i domini delle varie funzioni che vengono associate ai frammenti diprogrammi SMALL, risulta conveniente individuare diff erenti classi di valori. Avremo pertanto:

Page 185: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 185/332

9.3 Domini semantici per SMALL 185

BVAL il dominio che contiene i valori che possono essere dati in input ai programmi e ottenuticome output (valori di base ); un esempio sono i naturali ed i booleani.

NVAL il dominio dei valori che possono essere denotati da identificatori (valori nominabili ),come per esempio le locazioni.

EVAL il dominio dei valori che le espressioni possono assumere (valori esprimibili ); un esempiosono le funzioni od i valori di base.

MVAL il dominio dei valori che possono essere associati alle locazioni nella memoria (valorimemorizzabili ), come ad esempio i valori di base o le sequenze di input o di output.

Non può essere deciso una volta per tutte, a prescindere dal linguaggio che si intendedescrivere, quali debbano essere gli elementi dei domini di interpretazione. Ad esempio, può

essere o meno necessario avere le procedure tra i valori esprimibili, avere i reali tra i valori dibase, avere le locazioni tra i valori memorizzabili, e così via.

Nel caso di SMALL i domini precedentemente menzionati sono quelli specificati dalleseguenti equazioni:

BVAL = NAT + BOOL

NVAL = BVAL + LOC+ FUN+ PROC

EVAL = NVAL

MVAL = BVAL + BVAL∗

Dalle formule riportate sopra possiamo vedere che i valori di base necessari per descrivere lasemantica di SMALL sono i naturali ed i booleani, mentre i valori nominabili sono quelli di basepiù le locazioni, le funzioni e le procedure. Ancora, per SMALL abbiamo che i valori esprimibilicoincidono con quelli nominabili; anche questo fatto può non essere vero per tutti i linguaggi:ad esempio, in alcuni linguaggi le procedure sono valori nominabili ma non esprimibili. Ivalori memorizzabili necessari per SMALL sono i valori di base oppure loro sequenze; questeultime verranno essenzialmente utilizzate per rappresentare possibili input ed output.

Insieme ai domini semantici visti sopra, per descrivere la semantica di SMALL utilizzeremoun ambiente ed una memori il cui scopo è stato già discusso in precedenza. Ambiente ememoria sono funzioni che associano valori nominabili e valori memorizzabili ad identificatorie locazioni, rispettivamente. Più formalmente abbiamo:

AMB = ID −→ (NVAL + u nbound)

MEM = LOC −→ (MVAL+ u nused)

Come suggerito dai loro tipi, le equazioni sopra riportate prevedono anche la possibilitàche l’ambiente definisca u nbound un identificatore e che la memoria definisca u nused unalocazione.

Un ambiente fornisce il risultato u nbound quando il suo argomento non è stato dichiaratoprima del suo uso. Gli elementi di AMB saranno nel seguito indicati con ρ, ρ0, ρ00, etc. esaranno funzioni inizialmente uguali a λx.u nbound, che verranno successivamente aggiornatein base alle dichiarazioni presenti all’interno dei programmi.

Per descrivere la modifica di un ambiente ρ utilizzeremo due diverse notazioni:

Page 186: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 186/332

186 Capitolo 9 – Linguaggi con contesti

1. ρ[loc/id] che sta per λx. (x = id) → loc, ρ(x);

2. ρ[ρ0] che sta per λx. (ρ0(x) = u nbound) → ρ(x), ρ0(x).La prima notazione verrà utilizzata per descrivere l’aggiornamento dell’ambiente rela-

tivamente ad un solo identificatore, mentre la seconda indicherà che tutte le associazionidell’ambiente ρ0 in cui il valore è diverso da u nbound vengono utilizzate per aggiornare ρ.

Come detto in precedenza, anche per la memoria abbiamo la possibilità di segnalare si-tuazioni anomale che si verificano durante la valutazione di un frammento di programma.La memoria è infatti rappresentata da una funzione che può produrre il valore associato allalocazione che gli viene passata come argomento, oppure la stringa u nused quando alla loca-zione argomento non è stato ancora associato alcun valore. Gli elementi di MEM, che sarannoindicati con σ, σ0, σ00, etc., saranno funzioni inizialmente uguali a λx.u nused, che verrannopoi aggiornate dalla valutazione delle dichiarazioni o degli assegnamenti presenti all’interno

dei programmi.In modo simile alle funzioni ambiente, è possibile aggiornare i valori associati ad una

locazione. Nel seguito useremo la seguente notazione:

σ[val/loc] che sta per λx. (x = loc) → val, σ(x).

Prima di concludere questa discussione, è necessario stabilire quali sono gli elementi deldominio base LOC; infatti la memoria è definita in termini di questi. Una possibile soluzioneè quella di assumere LOC uguale al dominio dei naturali NAT; per modellare le locazioni servesoltanto un insieme sufficientemente grande ed un meccanismo per verificare se ci sono o menovalori associati ai suoi elementi. Tutte le volte che avremo bisogno di far riferimento ad unalocazione per la prima volta all’interno di una memoria, utilizzeremo la funzione:

n ew : MEM −→ LOC

che, quando applicata ad una memoria σ, restituisce il minimo intero n a cui non si è maifatto riferimento precedentemente, e cioè un n tale che σ(n) = u nused e σ(m) 6= u nused, perogni m < n.

Va detto che questa soluzione non tiene conto né dei problemi indotti dalle limitazionidella memoria, né del comportamento del programma in caso di overflow. In caso contrariobisognerebbe assumere che la memoria sia una funzione che mappa gli interi fino a k (oppor-tunamente scelto) in u nused e gli interi maggiori di k in e rror. Se facessimo questa scelta lafunzione n ew dovrebbe essere del tipo

n ew : MEM −→ (LOC+ e rror)e restituire il minimo intero m a cui non si è mai fatto riferimento precedentemente, cioè unm tale che σ(m) = u nused, se m è minore od uguale a k, ed e rror altrimenti.

In tutto questo capitolo, per evitare ulteriori controlli ed appesantimenti notazionali, as-sumeremo memoria illimitata. Inoltre, assumeremo come date due locazioni che chiameremol in e l out; ad esse saranno associate le stringhe di valori di input e di output dei programmi.

Una volta definiti ambiente e memoria, siamo in grado di definire i domini delle funzio-ni e delle procedure che ci permettono di completare la definizione dell’insieme dei valorinominabili NVAL:

FUN = NVAL −→ MEM −→ ((EVAL×MEM) + e rror)PROC

= NVAL

−→MEM

−→ (MEM

+ e rror)

Page 187: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 187/332

9.4 Semantica di SMALL 187

Queste equazioni prevedono che le funzioni programmabili in SMALL prendano come ar-gomento un valore nominabile (il parametro attuale) e diano come risultato una funzione che

prende come argomento la memoria e produce un valore esprimibile (il risultato della funzio-ne) ed una nuova memoria; questo ovviamente se non si verificano situazioni di errore. Unaprocedura SMALL si comporta in modo analogo alle funzioni, ma ha come risultato sempli-cemente una nuova memoria; il risultato della procedura potrà essere fornito al programmachiamante tramite assegnamenti a variabili globali e quindi tramite il nuovo stato.

Osservazione 9.2. Poiché non è immediatamente evidente, vale la pena notare che le defini-zioni di questi domini semantici sono ricorsive. Per esempio, abbiamo che PROC è un valore nominabile (cioè appartenente a NVAL), ma anche che NVAL viene usato nella definizione del dominio PROC. Questa caratteristica dei domini semantici aumenta notevolmente il potere espressivo dei linguaggi di programmazione. Grazie ad essa, siamo ad esempio in grado di

scrivere il seguente programma SMALL che calcola la funzione fattoriale senza utilizzare alcun costrutto per la ricorsione, o per l’iterazione.

programbegin

fun f (< g,x >);if x = 0 then 1 else g(< g, x − 1 >) ∗ x;

output f (< f, read >)end

Infine, i domini semantici introdotti permettono di definire i domini delle funzioni diinterpretazione semantica per le espressioni, le dichiarazioni, i comandi ed i programmi.

E : Exp −→ AMB −→ MEM −→ ((EVAL×MEM) + e rror)C : Com −→ AMB −→ MEM −→ (MEM+ e rror)D : Dec −→ AMB −→ MEM −→ ((AMB×MEM) + e rror)P : Prog −→ BVAL

∗ −→ (BVAL∗ + e rror)

9.4 Semantica di SMALL

Prima di descrivere le funzioni semantiche di SMALL introdurremo delle funzioni ausiliarieche permetteranno di semplificare la notazione e di abbreviare significativamente la lunghezzadelle equazioni semantiche.

Uno dei fattori principali, tra quelli che contribuiscono alla lunghezza delle equazioni perTINY, è il fatto che quasi in ogni espressione si deve considerare la propagazione delle situazionidi errore; spesso infatti le alternative del cases sono solo due, una delle quali gestisce soltantoeventuali errori. Di seguito presentiamo un nuovo operatore di composizione di funzioni chepermette di tener conto in modo omogeneo del problema degli errori. Questo nuovo operatore,chiamato ? e già definito in [Gor79], permette di comporre due funzioni facendo “galleggiare”gli errori che si verificano al momento dell’applicazione della prima funzione, evitando divalutare la seconda funzione. La valutazione di quest’ultima viene fatta solo se la primavalutazione non dà luogo ad errori. L’operatore ?, inoltre, permette di trattare in modoopportuno anche quei casi di composizione in cui il risultato dell’applicazione della primafunzione è una coppia mentre la seconda funzione si aspetta gli argomenti uno dopo l’altro.

Page 188: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 188/332

188 Capitolo 9 – Linguaggi con contesti

Definizione 9.3. L’operatore ? è definito nel modo seguente:

1. Se f : D1 −→ (D2 + e rror) e g : D2 −→ (D3 + e rror), allora

f ? g : D1 −→ (D3 + e rror)

è definita come segue:

f ? g = λx. (f x = e rror) → e rror, g(f x).

2. Se f : D1 −→ ((D2 × D3) + e rror) e g : D2 −→ D3 −→ (D4 + e rror) allora

f ? g : D1 −→ (D4 + e rror)

è definita come segue:f ? g = λx. cases f x of

< d2, d3 >: (g d2) d3;error : error

endcases

Se f e g sono due funzioni di dominio appropriato, allora f ? g è la funzione che prevedel’applicazione di f ed un comportamento futuro che dipende dal risultato di questa applica-zione. In particolare, se essa dà luogo ad errori il risultato di f ? g, è la costante e rror; seinvece l’applicazione di f produce un qualsiasi altro valore v, questo viene passato a g ed ilrisultato finale di f ? g è quello che si ottiene applicando g al valore v .

Per avere un’idea dell’impatto di queste scelte notazionali, consideriamo la funzione diinterpretazione semantica dell’operatore di sequenzializzazione di TINY, che prima era:

C [[c1; c2]] = λσ. cases C [[c1]] σ of σ0 : C [[c2]] σ0;error : error

endcases

e che ora diventa:C [[c1; c2]] = C [[c1]] ? C [[c2]].

Quest’ultima funzione richiede di valutare prima c1, quindi di passare lo stato risultante adun’altra funzione che lo utilizza per valutare c2.

Si noti che ? è associativo, cioè f ? (g ? h) = (f ? g) ? h, quindi espressioni del tipo f ? g ? hnon sono ambigue e che espressioni quali f ? g ? λx.h ? k significano f ? g ? (λx.(h ? k)) (poichél’operatore ‘→’ associa a destra, come evidenziato in Sezione 6.5.1).

Un’altra funzione che risulta utile nella descrizione della semantica di SMALL è una fun-zione simile a i sD già discussa nella Sezione 6.5; l’unica diff erenza è che la nuova funzione,invece di produrre il valore booleano che dipende dal dominio di appartenenza dell’oggetto ache le viene passato come argomento, dà come risultato e rror quando i sD(a) = f alse e l’argo-mento stesso quando i sD(a) = t rue. La nuova funzione, che chiameremo c heckD, permettedi trattare in termini di composizioni di funzioni sia la verifica del tipo degli argomenti chel’eff ettiva applicazione di una funzione ai suoi argomenti. La funzione c heckD sarà definita

Page 189: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 189/332

9.4 Semantica di SMALL 189

per un generico dominio D, ma non c’è alcuna difficoltà ad istanziarla sui domini di nostrointeresse; la sua definizione è la seguente:

c heckD : D −→ MEM −→ ((D×MEM) + e rror)

c heckD = λv σ. i sD(v) →< v, σ >, e rror.

Essenzialmente c heckD si comporta come un filtro tra una funzione e l’altra, che lasciapassare soltanto quei risultati dell’applicazione della prima funzione che risultano essere ditipo D. Utilizzando sia ? che c heckD abbiamo che la semantica dell’operatore not di TINY,che prima era

E [[not e]] = λσ. cases E [[e]]σ of

< v, σ0 >: isbool(v) →< ¬v, σ0 >, e rror;error : error endcases

diventa semplicemente:

E [[not e]] = E [[e]] ? checkBOOL ? λv σ. < ¬v, σ >

In alcuni casi per descrivere le funzioni di interpretazione semantica troveremo più con-veniente mostrare il loro comportamento quando sono applicate ad alcuni dei loro parametri;questo è giustificato dal principio di estensionalità, che permette di identificare due funzioniquando i loro valori sono gli stessi per tutti i possibili argomenti (si veda a tale proposito la

Sezione 5.2). Nel seguito pertanto, invece di scrivere

C [[c1; c2]] = λρ. (λσ. C [[c1]] ρ σ) ? λσ 0. C [[c2]] ρ σ0

scriveremoC [[c1; c2]] ρ = λσ. C [[c1]] ρ σ ? λσ0. C [[c2]] ρ σ0

applicando l’argomento ρ, inoltre, utilizzando il principio di estensionalità a sinistradell’operatore ?, abbiamo

C [[c1; c2]] ρ = C [[c1]] ρ ? λσ0. C [[c2]] ρ σ0

ed infine, utilizzando il principio di estensionalità anche a destra dell’operatore ?, possiamoscrivere

C [[c1; c2]] ρ = C [[c1]] ρ ? C [[c2]] ρ.

Di seguito riportiamo tutte le clausole semantiche di SMALL, scritte utilizzando sia glioperatori del metalinguaggio presentati nella Sezione 6.5 che i nuovi operatori c heckD e ?. Perutilizzare al meglio questi operatori cambieremo leggermente anche lo stile di descrizione dellefunzioni di interpretazione semantica ed utilizzeremo più pesantemente la composizione difunzioni. Inoltre le funzioni verranno spesso specificate utilizzando direttamente λ-espressioniinvece degli operatori derivati let e cases . Come per le clausole semantiche del linguaggioTINY, faremo seguire ogni definizione da un breve commento.

Page 190: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 190/332

190 Capitolo 9 – Linguaggi con contesti

9.5 Semantica dei programmi

P [[program c]]in = cases (C [[c]]ρ0(λx.u nused)[in/lin][nil/lout]) of σ : σ(lout);e rror : e rror

endcases

Un programma SMALL è una funzione della sequenza di input (in ); il suo valore dipendedalla semantica del corpo del programma, valutato in un ambiente vuoto ρ0 (indica l’ambienteλx.u nbound) ed utilizzando una memoria in cui le uniche locazioni inizialmente definite sonola locazione l in inizializzata con la sequenza di input e la locazione l out inizializzata con lasequenza vuota. Il risultato del programma è il contenuto della locazione l out all’interno dellamemoria che è risultata dalla valutazione del programma stesso.

9.6 Semantica delle dichiarazioni

Nel seguito, l’ambiente vuoto ρ0 sarà utilizzato come base per costruire il “piccolo ambiente”che viene fornito come risultato della valutazione di una o più dichiarazioni. Nel piccoloambiente tutte le locazioni, a parte quelle appena dichiarate, sono legate ad u nbound.

D[[const x = e]] ρ = R[[e]] ρ ? λv σ. < ρ0[v/x], σ >

La valutazione di una dichiarazione di costante prevede la determinazione del valore da

associare all’identificatore x e quindi la creazione di un piccolo ambiente in cui l’unica asso-ciazione è quella tra il valore dell’espressione ed x stesso. La garanzia che x non sarà maimodificato all’interno del programma è data dal fatto che ad x viene associato direttamente unvalore memorizzabile e non una locazione, e dal fatto che, come sarà evidente dalla descrizionedella semantica dei comandi, il comando di assegnamento permette di modificare soltanto lelocazioni. R è una nuova funzione di valutazione, che verrà definita in seguito, simile ad E ,che produce e rror quando il risultato di E [[e]] è una funzione od una procedura, e produce unvalore di base quando il risultato di E [[e]] è già un valore di base oppure è una locazione.

D[[var x = e]] ρ = R[[e]] ρ ? λv σ. < ρ0[n ew σ/x], σ[v/n ew σ] >

Come per la clausola precedente, la valutazione di una dichiarazione di variabile prevede,innanzitutto, la determinazione del valore da associare all’identificatore che si intende dichia-rare. In questo caso comunque il piccolo ambiente non associa ad x il valore dell’espressione adestra del simbolo =, ma gli associa una nuova locazione n ew σ . Il risultato della valutazionedi e viene poi associato ad n ew σ all’interno della memoria σ che, insieme al piccolo ambienteche contiene solo l’associazione tra x ed n ew σ , rappresenta il risultato della valutazione delladichiarazione.

D[[proc p(x); c]] ρ = λσ. < ρ0[(λd. C [[c]] ρ[d/x])/p], σ >

D[[fun f (x); e]] ρ = λσ. < ρ0[(λd.E [[e]] ρ[d/x])/f ], σ >

Page 191: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 191/332

9.7 Semantica delle espressioni 191

Le valutazioni delle dichiarazioni di funzione e di procedura danno come risultato la me-moria ricevuta come argomento ed un piccolo ambiente in cui l’unica associazione è quella tra

il nome della funzione, o della procedura, e la semantica del loro corpo. Quest’ultima è unafunzione che, ricevuti come argomento il parametro attuale ed una memoria, valuta i costruttiche costituiscono il corpo utilizzando la memoria passatale come argomento e l’ambiente incui ha avuto luogo la dichiarazione, aggiornato però dall’associazione tra il parametro formaleed il parametro attuale.

D[[d1; d2]] ρ = D[[d1]] ρ ? λρ1. D[[d2]] ρ[ρ1] ? λρ2 σ. < ρ1[ρ2], σ >

La valutazione di una sequenza d1; d2 di due dichiarazioni ha come risultato il piccoloambiente risultante dalla valutazione di d1 modificato dal piccolo ambiente risultante dallavalutazione di d2. Per la valutazione di d1 vengono utilizzati l’ambiente e la memoria passaticome argomento alla funzione di valutazione. Per la valutazione di d2 vengono utilizzatila memoria risultante dalla valutazione di d1, e l’ambiente ottenuto aggiornando l’ambienteoriginario con il piccolo ambiente risultante questa stessa valutazione.

9.7 Semantica delle espressioni

Prima di descrivere la funzione di interpretazione semantica per le espressioni è necessariochiarire un problema che viene introdotto dal fatto che la loro valutazione può dar luogo adun qualsiasi valore esprimibile e non semplicemente a valori memorizzabili. Infatti, nel caso

di SMALL abbiamo visto che sono esprimibili tutti quei valori a cui è possibile associare unnome; quindi, possiamo avere come risultato della valutazione di un’espressione non solo unvalore memorizzabile ma anche una locazione, una funzione o una procedura. In alcuni casi(quali ad esempio l’operazione di somma ed il comando di assegnamento) è necessario avereun valore memorizzabile come risultato della valutazione di un’espressione. In questi casi, seil risultato è un valore allora non resta che passarlo alla funzione di valutazione successiva.Se invece il risultato è una locazione, allora bisogna fornire alla funzione successiva non lalocazione, ma il valore ad essa associato all’interno della memoria. Infine, se come risultatodella valutazione viene ottenuta una procedura od una funzione, allora alla funzione successivanon viene passato alcun valore, ma viene solo segnalata una situazione di errore.

Per tenere conto di questo tipo di problemi è necessario introdurre un’operazione, co-munemente chiamata di dereferenziazione , che permette di determinare il valore associato aciascuna locazione all’interno della memoria. Per evitare di dover far riferimento in conti-nuazione all’operazione di dereferenziazione e quindi di scrivere tutte le volte qualcosa comed eref (E [[e]]), definiamo una nuova funzione di valutazione R che è simile ad E , ma produ-ce e rror quando il risultato di E [[e]] è una funzione od una procedura, e produce un valoredi base quando il risultato di E [[e]] è già un valore di base o una locazione. Ricordiamoche isbval(·),isloc(·),isfun(·), isproc(·) sono le ovvie istanziazioni del costrutto isD(·) delmetalinguaggio.

R : Exp −→ AMB −→ MEM −→ (BVAL×MEM) + e rror

Page 192: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 192/332

192 Capitolo 9 – Linguaggi con contesti

R[[e]] ρ = E [[e]] ρ ? λv σ. cases v of isbval(v) :< v, σ >;

isloc(v) : σ(v) = u nused → e rror, < σ(v), σ >;isfun(v) : e rror;isproc(v) : e rror

endcases

Ora possiamo considerare le funzioni di interpretazione semantica per le espressioni:

E [[true]] ρ = λσ. < t rue, σ >

E [[false]] ρ = λσ. < f alse, σ >

E [[n]] ρ = λσ. < n, σ >

La semantica delle costanti di base di SMALL è una funzione costante che lascia inalteratiambiente e memoria e dà come risultato la vecchia memoria ed il valore semantico associatoai simboli di costante.

E [[not e]] ρ = R[[e]] ρ ? checkBOOL ? λb σ. < ¬b, σ >

E [[e1 nop e2]] ρ = R[[e1]] ρ ? checkNAT ? λn1. R[[e2]] ρ ? checkNAT ? λn2 σ. < n1 nop n2, σ >

E [[e1 bop e2]] ρ = R[[e1]] ρ ? checkBOOL? λb1. R[[e2]] ρ ? checkBOOL ? λb2 σ. < b1 bop b2, σ >

Le valutazioni delle varie operazioni tra espressioni sono funzioni che, dopo aver ricevutocome argomenti un ambiente ed una memoria, valutano il primo operando, quindi verificanoche il risultato della valutazione è del tipo appropriato rispetto all’operazione che si deveeseguire. Successivamente, se il tipo del primo operando è appropriato e se l’operazioneha un altro argomento, valutano anche questo utilizzando il vecchio ambiente e la memoriarisultante dalla prima valutazione. Infine, se anche il risultato della seconda valutazione èdel tipo appropriato, applicano l’operazione, corrispondente all’operatore sintattico, ai valoriottenuti dalla valutazione degli operandi. Per valutare gli operandi viene utilizzata la funzione

R e non la E , in quanto le operazioni not, nop e bop sono definite soltanto su valori dibase.

E [[if e then e1 else e2]] ρ = R[[e]] ρ ? checkBOOL? λb. b → E [[e1]] ρ, E [[e2]] ρ

L’interpretazione del condizionale valuta la condizione e, verifica che il valore risultantesia un booleano, quindi a seconda che esso sia il booleano t rue o f alse, valuta il secondo oil terzo argomento utilizzando il vecchio ambiente e la memoria risultante dalla valutazionedell’espressione e.

Page 193: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 193/332

9.8 Semantica dei comandi 193

E [[read]] ρ = λσ. cases σ(lin ) of v :: in :< v, σ[in/lin] >;

nil : error endcases

Se la lista associata alla locazione l in non è vuota, l’espressione read produce come risul-tato il suo primo elemento insieme ad una nuova memoria che diff erisce da quella originariasolo per la locazione l in. A questa verrà associata una nuova sequenza ottenuta rimuovendol’elemento di testa dalla vecchia.

E [[x]] ρ = λσ. ρ(x) = u nbound → e rror, < ρ(x), σ >

La valutazione di un identificatore ha come risultato il valore nominabile (cioè un va-lore di base intero o booleano, una locazione, una procedura o una funzione) associatoall’identificatore all’interno dell’ambiente ed insieme ad esso la vecchia memoria.

E [[e(e0)]] ρ = E [[e]] ρ ? checkFUN ? λf. E [[e0]] ρ ? λv σ. f v σ

La valutazione di un’applicazione di funzione ha come risultato, se non si verificano situa-zioni di errore, l’applicazione del risultato della valutazione della prima espressione al risultatodella valutazione della seconda espressione. I punti importantiche caratterizzano il tipo di pas-saggio di parametri ed il tipo di scoping modellati con la chiamata di funzione qui descritta

sono due:1. Per valutare l’argomento viene utilizzata la funzione E e non la funzione R, quindi si

può passare come parametro un qualunque valore esprimibile; e cioè non solo valori dibase ma anche locazioni, procedure od altre funzioni.

2. L’ambiente ρ in cui viene eff ettuata la chiamata non viene utilizzato al momento dellavalutazione dell’applicazione della funzione. Vengono utilizzati a questo punto soltantol’argomento e la memoria come definita al momento della chiamata; l’ambiente in cui lavalutazione dell’applicazione ha luogo è quello che era attivo quando la funzione era statadichiarata e che è stato associato al corpo della funzione al momento della valutazionedella dichiarazione della funzione stessa.

9.8 Semantica dei comandi

C [[e := e0]] ρ = E [[e]] ρ ? checkLOC ? λl. R[[e0]] ρ ? λv σ. σ[v/l]

Si controlla se la valutazione della prima espressione e produce una locazione; in questocaso si determina il valore memorizzabile associato alla seconda espressione e0. Il risultatoè una nuova memoria in cui alla locazione ottenuta dalla valutazione di e viene associato ilvalore di e0.

Page 194: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 194/332

194 Capitolo 9 – Linguaggi con contesti

C [[c1; c2]] ρ = C [[c1]] ρ ? C [[c2]] ρ

Il comando c2 viene valutato utilizzando l’ambiente passato come argomento alla funzionedi valutazione della sequenzializzazione e la memoria modificata dalla valutazione del comandoc1.

C [[if e then c1 else c2]] ρ = R[[e]] ρ ? checkBOOL? λb. b → C [[c1]] ρ, C [[c2]] ρ

C [[while e do c]] ρ = fix (λΘ. R[[e]] ρ ? checkBOOL? λb. b → C [[c]] ρ ? Θ, λσ. σ )

Le funzioni di interpretazione semantica di if e then c1 else c2 e di while e do c sonosimili a quelle di TINY commentate nel capitolo precedente.

C [[output e]] ρ = R[[e]] ρ ? λb σ. σ[b :: σ(lout)/lout]

Siccome i possibili output sono sequenze di valori memorizzabili, la funzione di valutazionedi output e valuta l’espressione tramite la R, quindi modifica la memoria aggiungendo ilrisultato della R in testa alla sequenza associata alla locazione lout.

C [[begin d; c end]] ρ = D[[d]] ρ ? λρ0. C [[c]] ρ[ρ0]

Per valutare un blocco, vengono prima valutate le dichiarazioni che si trovano in esso. Ilrisultato di tale valutazione, come visto sopra, è una coppia < ρ0, σ >. Dopo la valutazionedelle dichiarazioni, viene valutato il corpo del blocco utilizzando la nuova memoria e l’ambientepassato originariamente come argomento, aggiornato dal piccolo ambiente ρ0, in cui gli unicilegami sono quelli dichiarati con d.

C [[e(e0)]] ρ = E [[e]] ρ ? checkPROC ? λ p. E [[e0]] ρ ? λv σ. p v σ

La funzione di valutazione della chiamata di procedura, a parte il controllo che il risultato

della valutazione della prima espressione sia una procedura, è analoga a quella relativa allachiamata di funzione vista prima.

9.9 Considerazioni conclusive

La semantica di SMALL descritta in precedenza è tale che la denotazione di un terminequalsiasi è ottenuta componendo sequenzialmente, tramite la funzione ?, le denotazioni dellesue componenti. Tale tipo di semantica è nota come semantica diretta per il fatto che ad ognitermine del linguaggio viene direttamente associata la sua denotazione. Come abbiamo visto,la semantica diretta permette descrivere adeguatamente ed in modo compatto un linguaggiorelativamente complicato.

Page 195: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 195/332

9.9 Considerazioni conclusive 195

La semantica diretta ha purtroppo l’inconveniente di non permettere di descrivere inmodo naturale costrutti che prevedono anche una esecuzione non sequenziale delle istruzioni

di un programma, quali per esempio escape, exit e goto. La causa principale di questoinconveniente è proprio il fatto che con la semantica diretta tutte le istruzioni di un programmavengono valutate nello stesso ordine in cui esse appaiono all’interno del corpo del programmastesso. Inoltre, ogni funzione di valutazione passa sempre il suo risultato intermedio allafunzione di valutazione del resto del programma. Chiaramente, nel caso di salti ed in generaledi comandi che modificano il flusso del controllo, l’approccio diretto risulta non del tuttoadeguato. Infatti, non è immediato capire come, semplicemente componendo funzioni deltipo di quelle viste in precedenza, sia possibile modellare linguaggi che prevedano ordini diesecuzione modificabili.

Per far fronte a questo tipo di problemi, bisogna essere in grado di esprimere anche il

controllo dell’esecuzione in termini di composizione di funzioni e definire la semantica di unlinguaggio in modo tale che anche il controllo sia un argomento esplicito delle funzioni diinterpretazione. L’argomento utilizzato per descrivere il controllo di un linguaggio è chiamatocontinuazione . Esso viene associato ad ogni clausola di interpretazione semantica e serve perindicare quale parte di un programma deve essere interpretata dopo la valutazione di ciascuncostrutto. L’interpretazione di ogni costrutto fornisce sempre informazioni sulla parte diprogramma che deve ricevere il suo risultato. Usualmente, questo viene passato alle funzionidi interpretazione delle istruzioni che seguono testualmente l’istruzione in esame. In alcunicasi (per esempio in presenza di errori o di salti), invece, le continuazioni “normali” vengonoignorate ed il risultato viene passato ad altre continuazioni. Nel caso di salti, il risultato vienepasato a quelle funzioni di interpretazione che valutano la parte di programma che segue

l’etichetta a cui viene richiesto di saltare.Le continuazioni sono state originariamente sviluppate come uno strumento per trattare in

modo semplice i salti incondizionati presenti in vari linguaggi [SW74]; successivamente, essesi sono imposte anche come strumento per descrivere tutti i linguaggi di programmazione,anche quelli senza goto. Infatti, le continuazioni permettono di alleggerire notevolmente lanotazione e di trattare con eleganza ed in modo matematicamente pulito anche situazionidi errore e comandi di fermata (stop, exit) senza dover ricorrere a varianti di funzioni dicomposizione, quali la funzione ?.

Parecchi autori fanno ora riferimento alla semantica denotazionale con continuazioni comealla semantica standard , anche per spingere nella direzione di fissare una metodologia unifi-

cante per la definizione della semantica denotazionale del maggior numero di linguaggi diprogrammazione possibile. Infatti, l’utilizzo di un metodo standard per la descrizione di lin-guaggi diff erenti renderebbe più facile confrontarli; ovviamente il prezzo da pagare è quello dinon poter usare tecniche ad hoc per ogni linguaggio, che in alcuni casi potrebbero semplificarela presentazione della sua semantica.

L’approccio basato sulle continuazioni è noto anche come semantica inversa , in quanto lafunzione di interpretazione semantica di una sequenza di costrutti prevede che il risultato dellavalutazione dell’ultimo costrutto della sequenza sia passato come argomento alla funzione diinterpretazione dei costrutti che lo precedono. Il ruolo di questo argomento sarà essenzialmentequello di ricevere la memoria e l’ambiente risultanti dalla valutazione delle istruzioni precedentie di continuare la valutazione del programma.

Page 196: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 196/332

196 Capitolo 9 – Linguaggi con contesti

9.10 Esercizi

9.1 Informalmente, un programma genera aliasing se durante una sua esecuzione due identificatorivengono legati alla stessa locazione. Definire formalmente tale concetto e dire quali costruttiSMALL possono dar luogo ad aliasing.

9.2 Si modifichi la semantica di SMALL in modo che le locazioni liberate all’uscita dei blocchipossano essere riutilizzate.

9.3 Mostrare, usando le clausole semantiche, che in SMALL è possibile l’autoapplicazione, vale adire il passaggio di una procedura come parametro a se stessa.

9.4 Utilizzando la proprietà vista nell’esercizio precedente, scrivere un programma che, ricevendoin input una stringa u appartenente al linguaggio descritto dall’espressione

(a + b)∗c(a + b)∗

decide se u appartiene al linguaggio delle stringhe palindrome sull’alfabeto a, b.

9.5 Il linguaggio SMALL valuta le espressioni da sinistra a destra o viceversa? Modificare la seman-tica in modo tale che venga scelta l’altra alternativa e mostrare un semplice programma che hauna semantica diversa nei due casi, calcolando la semantica in entrambi i casi.

9.6 Si aggiunga al linguaggio SMALL un comando stop con la semantica informale di far terminare ilprogramma. Se ne dia la semantica e si dimostri che c1; stop e c1; stop; c2 sono semanticamenteequivalenti.

9.7 Estendere il linguaggio SMALL introducendo i comandi restart ed exit, il cui significato è disaltare rispettivamente all’inizio ed alla fine del blocco più interno.

9.8 Fornire una semantica non standard di SMALL, che ad ogni programma associa il numero

corrispondente alle volte che un assegnamento appare nel programma.9.9 Fornire una semantica non standard di SMALL, che ad ogni programma associa il numero

corrispondente alle volte che un assegnamento viene eff ettuato dal programma.

9.10 Ridefinire la semantica di SMALL in modo che si abbia error se una variabile viene usata senzaessere dichiarata.

9.11 Ridefinire la semantica di SMALL in modo che si abbia warning se una variabile viene dichiarata,ma mai usata.

Page 197: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 197/332

Parte III

Sistemi Concorrenti

Page 198: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 198/332

Page 199: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 199/332

Capitolo 10

Operatori per concorrenza enondeterminismo

SOMMARIO

Questo capitolo introduce alcuni degli operatori utilizzati dai calcoli di processo più cono-sciuti. Vedremo come tali operatori possono essere impiegati per costruire processi complessia partire da azioni elementari e processi più semplici. Grazie alla semantica definita in sti-le SOS, il comportamento di un processo composto verrà quindi definito per mezzo della semantica dei processi che lo compongono.

10.1 Azioni esterne ed interne

Un’azione elementare di un sistema rappresenta astrattamente un passo atomico (cioè noninterrompibile) di computazione che viene eff ettuato da un sistema per transire da uno statoad un altro. Un’operazione atomica non permette di osservare stati intermedi attraverso iquali il sistema transisce dall’inizio della sua esecuzione alla sua conclusione. Quando ci sitrova di fronte ad un sistema concorrente da modellare, la prima questione che si pone èquella di identificare le azioni atomiche. Per rispondere a questa domanda occorre esserechiari riguardo al livello di astrazione che si vuole usare per modellare il sistema, poiché ciòche è atomico ad un determinato livello può non esserlo ad un livello di astrazione più basso.

Prendiamo come esempio un conto bancario. Ad un appropriato livello di astrazione, leoperazioni di prelievo e deposito possono essere considerate entrambe atomiche, ma l’opera-zione di trasferimento di denaro da un conto può non esserlo; essa può essere vista come dueseparate operazioni atomiche: un prelievo da un conto, seguito da un deposito in un altro. Adun livello di astrazione più basso il conto bancario potrebbe essere rappresentato come un filedel database centrale della banca. Eseguire un’operazione, come ad esempio un prelievo, puòtradursi in varie operazioni di accesso e modifica al file. Ad un simile livello è ragionevole as-sumere che le operazioni di accesso e modifica siano entrambe atomiche. Abbassando il livellodi astrazione, potremmo immaginare che il file risieda in un disco fisico, e che quindi sianole operazioni di lettura e scrittura del disco ad essere atomiche. Ancora, il file probabilmentesarà diviso su diversi blocchi del disco fisico, per cui la lettura e scrittura del disco è in realtàcomposta da varie letture e scritture atomiche dei suoi blocchi. Infine, potremmo considerareatomiche le letture e scritture dei singoli byte da parte della testina del disco.

Page 200: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 200/332

200 Capitolo 10 – Operatori per concorrenza e nondeterminismo

Per ogni livello di astrazione, ciò che determina se un’operazione è o meno atomica è lapossibilità di dividerla in sotto-operazioni: se la divisione risulta impossibile, l’operazione

deve essere considerata atomica. Tornando all’esempio dei conti bancari, se l’operazione ditrasferimento da un conto ad un altro non fosse atomica, sarebbe possibile osservare lo statoin cui la somma dei due conti bancari è minore della somma dei loro valori iniziali e finali(valori che invece, nel caso di trasferimenti, devono coincidere).

Le azioni di un sistema possono essere di due tipi. Un’azione che rappresenta un’interazionedel sistema con l’ambiente esterno attraverso una porta (o canale ) di comunicazione si diceazione esterna o visibile . Un’azione che è invece il risultato di una qualche computazioneinterna al sistema si dice azione interna o invisibile .

In alcuni calcoli di processo, come ad esempio CCS, le azioni esterne sono convenzional-mente suddivise in azioni di input ed azioni di output . Le azioni di input vengono indicatecon lo stesso nome della porta su cui avvengono mentre le azioni di output vengono indicatecon il nome della porta su cui avvengono con sopra una barra orizzontale. Perciò, se Λ denotal’insieme delle porte, l’insieme delle azioni visibili sarà Act , Λ ∪ a|a ∈ Λ. Le azioni a e asono dette complementari . In CCS l’interazione può avvenire solo tra due processi in paralleloche eseguono simultaneamente azioni complementari (per convenzione si pone anche a = a).Intuitivamente, quando un processo esegue un’azione di input a è come se esso ricevesse unsegnale sulla porta a, mentre quando il processo esegue un’azione di output a è come se ilprocesso stesso emettesse un segnale attraverso la porta a. La distinzione tra input ed outputè del tutto fittizia quando non c’è scambio di valori, come nel caso di CCS, mentre ha unruolo importante e dà un verso alla comunicazione quando associata all’interazione vi è unoscambio di valori, come avviene ad esempio nella variante di CCS con value-passing .

In altri calcoli, come ad esempio in ACP, non si distingue tra azioni di input ed azioni dioutput, per cui le azioni sono sempre indicate con lo stesso nome della porta su cui avvengono.In questo caso l’insieme delle porte Λ e quello delle azioni esterne Act coincidono, cioè sipone Act , Λ. Inoltre, l’interazione può avvenire tra un qualunque numero di processi inparallelo che eseguono simultaneamente azioni correlate tra loro da una opportuna funzione di comunicazione . La funzione di comunicazione definisce l’azione risultante dall’interazionedi due azioni.

Dato che i passi di computazione interna non sono osservabili dall’esterno essi risultanoindistinguibili uno dall’altro per cui per descriverli è sufficiente utilizzare un’unica azioneinterna, solitamente denotata col simbolo τ (o a volte, come in LOTOS, con i). Le azioniinvisibili hanno grande importanza nello studio delle astrazioni e giocano un ruolo essenziale

nel definire equivalenze o preordini tra sistemi concorrenti. Infatti una computazione internapuò essere ignorata ad un certo livello di astrazione mentre ad un livello di astrazione piùbasso può essere vista come il risultato di una interazione tra componenti del sistema.

10.2 Operatori sui processi

In questo capitolo esamineremo gli operatori più frequentemente utilizzati dai calcoli di proces-so. Non considereremo operatori che modellano caratteristiche sofisticate dei sistemi concor-renti quali priorità, tempo, probabilità, ecc. Ci limiteremo invece a considerare gli operatoridi base e ad alcuni operatori che manipolano valori.

Page 201: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 201/332

10.3 Processi di base 201

Nell’approccio che presentiamo i sistemi complessi saranno ottenuti utilizzando operatoriche permettono di comporre sistemi più semplici. Raggrupperemo gli operatori in sei gruppi

principali che corrispondono alle tipiche operazioni di composizione:

Processi di Base. Gli operatori di base costruiscono i processi elementari che sono i mattoniper la costruzione di sistemi complessi.

Sequenzializzazione. Gli operatori di sequenzializzazione permettono di stabilire lasequenza temporale che le componenti di un sistema debbono rispettare.

Scelta. Gli operatori di scelta permettono di descrivere i comportamenti alternativi che unprocesso può avere.

Parallelizzazione. Gli operatori di parallelizzazione permettono di comporre sistemi in

parallelo. Ve ne sono di vari tipi e si diff erenziano per il tipo di comunicazione esincronizzazione che permettono tra le componenti.

Astrazione. Gli operatori di astrazione permettono di astrarre da aspetti ritenuti nonrilevanti o di presentare viste particolari dei sistemi.

Ricorsione. Gli operatori di ricorsione permettono di introdurre sistemi con comportamentiinfiniti a partire da presentazioni finite.

Una ulteriore classificazione degli operatori dei calcoli di processi è quella che li suddividein operatori statici ed operatori dinamici . Un operatore si dice statico se le regole che ne

definiscono la semantica non permettono che l’operatore “sparisca”, ossia se in tutte le regolel’operatore è presente sia a destra che a sinistra della conclusione. In altre parole, per unoperatore statico op, le regole saranno della forma

E i1α1−→ E 0i1 · · · E im

αm−−→ E 0imop(E 1, · · · , E n)

α−→ op(E 01, · · · , E 0n)

dove i1, · · · , im ⊆ 1, · · · , n.Un operatore si dice dinamico se non è statico, ossia se nella conclusione di almeno una re-

gola che lo definisce, avviene che l’operatore è presente prima dell’esecuzione della transizioneed è assente dopo.

Infine gli operatori possono essere deterministici o non deterministici . Un operato-re n-ario op si dice non deterministico se, per certi processi E 1, . . . , E n, può avvenire cheop(E 1, . . . , E n)

µ−→ F e op(E 1, . . . , E n) µ−→ F 0 con F e F 0 diversi.

Nel presentare gli operatori ricorreremo frequentemente all’esempio di un distributoreautomatico di bevande. Di volta in volta il comportamento del distributore sarà arricchito omodificato per mezzo di nuovi operatori.

10.3 Processi di base

I processi di base sono costanti (cioè, operatori senza argomenti) e rappresentano i processielementari.

Page 202: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 202/332

202 Capitolo 10 – Operatori per concorrenza e nondeterminismo

Processo inattivo. Il processo più elementare di tutti è quello inattivo ossia quel processoche non esegue alcuna attività. Esso viene solitamente indicato con i simboli nil, 0, δ o stop.

La sua semantica è definita dal fatto di non avere regole di transizione. Per semplificare lanotazione si omette spesso il processo inattivo quando è preceduto da almeno un’azione.

Il processonil

può quindi rappresentare un distributore automatico rotto: esso non accetta monete e nonoff re bevande.

Terminazione. La terminazione è a volte esplicitamente denotata dalla costante di proces-so exit (o, skip) che può solo eseguire l’azione speciale

√ (pronunciato “tick”) per indicare la

terminazione e trasformarsi in un processo inattivo, come formalizzato dal seguente assioma

exit√ −→ stop

Riconoscere la terminazione di un processo è importante quando da essa dipende l’iniziodell’esecuzione di un altro processo, come, per esempio, nella concatenazione di processi.

Nei calcoli di processo che prevedono la terminazione esplicita, tipicamente si usa exit perrappresentare terminazione con successo e stop, o δ , per rappresentare terminazione senzasuccesso.

Processo azione. Alcuni calcoli di processo, invece di usare come strumento elementarel’operazione di prefixing, prevedono che le azioni siano esse stesse considerate come delle

costanti di processo (cioè, come operatori di processo senza argomenti). Il comportamento diun tale processo elementare consiste semplicemente nell’esecuzione dell’azione corrispondenteper poi trasformarsi nel processo speciale

√ che indica terminazione con successo. L’assioma

utilizzato è in questo caso il seguente:

µ µ−→ √

Sfruttando questo operatore un distributore automatico “disonesto” che riceve una moneta esi ferma verrebbe descritto semplicemente da

coin

Chaos. Il processo chaos rappresenta un processo completamente sottospecificato che può

comportarsi come qualsiasi processo. In pratica, chaos può eseguire una qualsiasi sequenza diazioni e fermarsi in qualsiasi momento. Le regole d’inferenza che definiscono la sua semanticaoperazionale sono:

chaos a−→ chaos chaos

a−→ stop

10.4 Operatori di sequenzializzazione

Gli operatori di sequenzializzazione sono operatori dinamici che permettono di mettere insequenza più processi: un processo inizierà la sua esecuzione quando il processo precedentesarà terminato. La sequenzializzazione ha quindi senso se i processi da sequenzializzare hannotermine.

Page 203: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 203/332

10.4 Operatori di sequenzializzazione 203

Azione prefissa (prefixing). Si tratta di un’operazione molto comune. Ad ogni azione µdell’insieme delle azioni si associa un operatore unario, denotato con µ.· oppure con µ

→ ·,

che ad ogni processo E associa un nuovo processo µ.E che può eseguire l’azione µ per poicomportarsi come E . La semantica è definita dall’assioma

µ.E µ−→ E

Si tratta quindi di un operatore dinamico e deterministico.Ad esempio l’espressione α.β .τ .0 indica un processo che esegue in sequenza le azioni visibili

α e β , poi eff ettua un’azione interna ed infine si comporta come 0, il processo che non svolgenessuna azione.

Un esempio più concreto è dato dal seguente termine

coin → choc → stop

che descrive un distributore automatico (un po’ limitato) che in cambio di una moneta fornisceuna barretta di cioccolato e poi si ferma.

Composizione sequenziale o enabling. L’operatore binario composizione sequenzialetra processi si indica con ; . A volte, con la la stessa semantica, si usa il simbolo · · cheè chiamato enabling o il simbolo · • · che è chiamato prodotto. Intuitivamente, se E ed F sono processi, la semantica del processo E ; F prevede che inizialmente venga eseguito E e che,quando E segnala la sua terminazione (indicata dall’azione

√ ), cominci l’esecuzione di F . Le

regole di inferenza che definiscono la semantica dell’operatore composizione sequenziale sonole seguenti

E

µ

−→ E 0E ; F

µ−→ E 0; F (µ 6= √ ) E

−→ E 0E ; F

τ −→ F

Con l’operatore di sequenzializzazione un distributore automatico limitato ma “onesto” puòessere descritto, considerando le azioni come processi, da

coin; choc

esso prende una moneta e, dopo che il processo di acquisizione della moneta è terminato, off reuna barretta di cioccolato.

Disabling. L’operatore binario disabling, indicato con [>, viene di solito usato in congiun-zione con l’enabling. Intuitivamente, se E ed F sono processi, il processo E [> F inizialmente

si comporta come E ma può essere interrotto in qualsiasi momento da F , anche prima dellasua terminazione. Se invece E segnala la sua terminazione, F viene eliminato perché è venutomeno il suo ruolo.

E µ−→ E 0

E [> F µ−→ E 0 [> F

(µ 6= √ )

E √ −→ E 0

E [> F τ −→ E 0

F µ−→ F 0

E [> F µ−→ F 0

Un possibile esempio di uso di questo operatore è il seguente

(coin → choc → exit) [> (bang → choc → exit)

che descrive un distributore automatico che in cambio di un colpo ben assestato fornisce labarretta di cioccolato anche quando non è stata inserita alcuna moneta.

Page 204: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 204/332

204 Capitolo 10 – Operatori per concorrenza e nondeterminismo

10.5 Operatori di scelta

Gli operatori di scelta permettono di esprimere scelte tra comportamenti alternativi. Si trattadi operatori dinamici (perché scompaiono quando la scelta viene eff ettuata) e, naturalmente,non deterministici. Con essi, e con gli operatori visti in precedenza, possiamo già modellareLTS ed automi a stati finiti.

Scelta (mista) o somma. L’operatore binario scelta , scritto +, permette di esprimereuna scelta tra due possibili comportamenti. Cominciamo col vedere le semplici regole chedefiniscono l’operatore

E µ−→ E 0

E + F µ−→ E 0

F µ−→ F 0

E + F µ−→ F 0

Osserviamo che l’operatore è non-deterministico, infatti il processocoin → choc → stop + coin → water → stop

può evolvere con l’azione coin nel processo choc → nil o nel processo water → nil. Taleprocesso rappresenta quindi un distributore automatico che, a sua scelta, dopo l’introduzionedi una moneta decide se l’utente è aff amato o assetato ed off re una barretta di cioccolato oun bicchiere d’acqua.

L’operatore può anche modellare scelte che vengono guidate dall’esterno. Un possibileesempio è il seguente

coin → (choc → stop + water → stop)

che descrive un distributore automatico che in cambio di una moneta fornisce, a sceltadell’utente, una barretta di cioccolato o un bicchiere d’acqua.Riassumendo, se E ed F hanno delle azioni iniziali in comune allora il processo E + F

risulta non-deterministico, e in tal caso si parla di scelta interna, se invece le azioni iniziali diE sono diverse dalle azioni iniziali di F , allora il processo E + F risulta deterministico, e intal caso si parla scelta esterna.

Dato che l’operatore + risulta essere commutativo e associativo, è possibile definire unasomma generale con più di due operandi . La sintassi di solito usata per tale operatore èP

i∈I E i e la semantica è data dalla seguente regola

E jµ−→ E 0 jX

i∈I

E i µ−→ E j ( j ∈ I )

Esempio 10.1. [Bill-Ben] Utilizzando gli operatori visti fino a qui possiamo scrivere unprocesso che ha come grafo delle transizioni quello della Figura 10.1. Infatti, se allo stato q 0associamo il processo

play. work. τ .nil + work. play. τ .nil

abbiamo che, grazie alla semantica degli operatori, dallo stato q 0 escono due archi distinti(transizioni (q 0,play,q 1) e (q 0,work,q 2) ) che raggiungono due stati diff erenti q 1 e q 2, asso-ciati rispettivamente ai processi work. τ .nil e play. τ .nil. Da questi, tramite altri due archi

Page 205: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 205/332

10.5 Operatori di scelta 205

q 0

q 1

q 2

q 3 q 4 p l a y

w o r k

w o r k

p l a y

τ

Figura 10.1: Grafo delle transizioni di un LTS

(transizioni (q 1,work,q 3) e (q 2,play,q 3) ), si raggiunge sempre lo stesso stato q 3, associatoal processo τ .nil. Lo stato q 3 ha un solo arco uscente (transizione (q 3, τ , q 4) ) con il quale siraggiunge lo stato q 4, associato al processo nil.

In pratica otteniamo un LTS formato da 5 stati, 3 azioni (o etichette) e 5 transizioni:hq 0, q 1, q 2, q 3, q 4 , play, work, τ ,

(q 0,play,q 1), (q 0,work,q 2), (q 1,work,q 3), (q 2,play,q 3), (q 3, τ , q 4)i.

di cui una una possibile rappresentazione è data dal grafo delle transizioni in Figura 10.1.

L’operatore + è l’operatore di scelta più comunemente usato nelle algebre di processi.Come abbiamo visto esso può rappresentare, a seconda dei casi, una scelta interna o unascelta esterna. In alternativa a tale operatore è possibile usare due operatori che rendono lascelta esclusivamente interna, ossia a carico del processo, o esclusivamente esterna, ossia acarico dell’ambiente.

Scelta interna. L’operatore binario scelta interna pura ⊕ affida il compito di scegliere unotra due comportamenti al processo stesso. La semantica è definita dai due seguenti assiomi

E ⊕ F τ −→ E E ⊕ F

τ −→ F

Come si vede la scelta è eff ettuata esibendo un’azione interna ed è quindi completamenteincontrollabile dall’ambiente.

Con questo operatore tramite il termine

coin → (choc → stop ⊕ water → stop)

è possibile descrive il distributore automatico che decide se l’utente è aff amato o assetato efornisce a sua scelta una barretta di cioccolato o un bicchiere d’acqua.

Scelta esterna. L’operatore binario scelta esterna prevede invece che la scelta sia eff et-tuata solo tramite l’esecuzione di un’azione visibile e quindi sotto il controllo dell’ambienteesterno. Anche in questo caso comunque, come nel caso dell’operatore scelta mista, se i dueprocessi a cui la scelta è applicata possono eseguire azioni visibili comuni, la scelta sfugge alcontrollo dell’ambiente e diventa non deterministica. Le regole di inferenza che definiscono la

Page 206: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 206/332

206 Capitolo 10 – Operatori per concorrenza e nondeterminismo

semantica dell’operatore sono le seguenti

E α

−→ E 0E F

α−→ E 0(α 6= τ ) F

α

−→ F 0E F

α−→ F 0(α 6= τ )

E τ −→ E 0

E F τ −→ E 0F

F τ −→ F 0

E F τ −→ E F 0

Con questo operatore è possibile limitare l’arbitrio del nostro distributore automatico. Adesempio, il termine

coin →

(choc → stop ⊕ water → stop) water → stop

descrive un distributore automatico che non può rifiutarsi di off rire l’acqua. Infatti, se dopoaver ricevuto la moneta la componente a sinistra di decidesse di off rire solo una barrettadi cioccolato, allora la componente a destra di continuerebbe a garantire la possibilità discegliere l’acqua. L’evoluzione sarebbe la seguente:

coin → (choc → stop ⊕ water → stop) water → stop

coin−−→(choc → stop ⊕ water → stop) water → stop

τ −→(choc → stop water → stop)

È opportuno notare che, invece, il termine

coin → (choc → stop ⊕ water → stop ) ⊕ water → stopnon fornisce garanzie; infatti una sua possibile evoluzione è

coin →(choc → stop ⊕ water → stop) ⊕ water → stop coin−−→

(choc → stop ⊕ water → stop) ⊕ water → stop τ −→

choc → stop ⊕ water → stop τ −→

choc → stop choc−−→

stop

10.6 Operatori di parallelismo

Gli operatori di parallelismo permettono di ottenere processi complessi tramite la composizio-ne parallela di processi più semplici. Si tratta in generale di operatori statici che modellizzanola strutturazione di processi in sottoprocessi.

Composizione parallela (á la Milner). L’operatore binario “|” permette sia l’interleaving delle azioni eseguibili dalle componenti parallele sia l’interazione tra due processi che eseguonoazioni complementari. Informalmente, nel processo E |F le azioni di E e di F sono considerateindipendenti le une dalle altre e qualsiasi interleaving tra loro è possibile; inoltre, azioni visibilicomplementari α e α possono dare origine a sincronizzazioni. Quando vi è una sincronizzazione

Page 207: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 207/332

10.6 Operatori di parallelismo 207

essa viene percepita dall’esterno come un’azione τ . Le regole di inferenza che definiscono lasemantica dell’operatore sono

E µ−→ E 0

E |F µ−→ E 0|F

F µ−→ F 0

E |F µ−→ E |F 0

E α−→ E 0 F

α−→ F 0

E |F τ −→ E 0|F 0

(α 6= τ )

Per mezzo dell’operatore composizione parallela possiamo modellare non solo il nostrodistributore automatico ma anche le sue interazioni con un utente ipotetico. Il termine

coin → (choc → stop ⊕ water → stop)

| (coin → choc → stop)

rappresenta il sistema costituito dalla composizione parallela del distributore automatico edell’utente. Una possibile computazione prevede che l’utente inserisca la moneta con l’azione

coin e ottenga il cioccolato con l’azione choc:coin → (choc → stop ⊕ water → stop)

| (coin → choc → stop)

τ −→(choc → stop ⊕ water → stop) | (choc → stop)

τ −→(choc → stop) | (choc → stop)

τ −→stop | stop

Va detto che questo sistema prevede anche altre computazioni in cui le sincronizzazioni nonavvengono, come in

coin

→(choc

→stop

⊕ water

→stop) | (coin

→choc

→stop)

coin

−−→(choc → stop ⊕ water → stop) | (coin → choc → stop) coin−−→(choc → stop ⊕ water → stop) | (choc → stop)

che sostanzialmente cattura il fatto che il distributore off re la possibilità di inserire la monetaanche ad altri utenti e che l’utente può inserire la sua moneta anche in altri distributori.Nel seguito, vedremo come “forzare” le sincronizzazioni quando discuteremo gli operatori diastrazione.

Merge. Alcuni calcoli, quali ad esempio ACP, utilizzano, per la composizione parallela tradue processi, l’operatore k . Anche questo operatore permette sia l’interleaving che l’interazio-ne tra i due processi. La diff erenza rispetto all’operatore | sta nel modo in cui viene espressal’interazione. Come abbiamo visto, nel caso dell’operatore | , si usa la nozione di complemen-tarità tra azioni. Nel caso dell’operatore k , si usa invece un meccanismo più generale e simodella il fatto che l’esecuzione simultanea di due azioni qualunque può originare una sincro-nizzazione. A questo scopo viene introdotta una funzione di comunicazione γ : Λ × Λ → Λ

(dove Λ è l’insieme delle azioni) avente la proprietà di essere commutativa (cioè tale cheγ (a, b) = γ (b, a)) e associativa (cioè tale che γ (γ (a, b), c) = γ (a, γ (b, c))). Dati due elementia, b ∈ Λ, l’elemento γ (a, b) viene interpretato come l’azione risultante dalla sincronizzazione diun processo che esegue l’azione a con uno che esegue l’azione b. In generale si ammette che lafunzione γ sia una funzione parziale e talvolta, come ad esempio nei calcoli di processi TCSPe LOTOS, si impone γ (a, a) = a. Inoltre, poiché γ (a, b) è visibile, essa può essere usata perulteriori sincronizzazioni con altre azioni. Quindi, mentre | permette solo la sincronizzazione

Page 208: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 208/332

208 Capitolo 10 – Operatori per concorrenza e nondeterminismo

di due processi, k permette la sincronizzazione di più processi. Le regole di inferenza chedefiniscono la semantica dell’operatore sono

E µ−→ E 0

E k F µ−→ E 0 k F

F µ−→ F 0

E k F µ−→ E k F 0

E a−→ E 0 F

b−→ F 0

E k F γ (a,b)−−−→ E 0 k F 0

dove µ ∈ Λ ∪ τ .Il sistema costituito da un distributore automatico e da un utente potrebbe essere così

descritto (dove usiamo l’operatore “ .” per le azioni prefisse):

getCoin.(giveChoc.nil + giveW ater.nil) k putCoin.getChoc.nil

dove si pone γ (getCoin, putCoin) = ok e γ (giveChoc, getChoc) = ok. Anche in questo caso,

come per l’operatore | , le sincronizzazioni non sono obbligatorie; vedremo in seguito comeforzare le sincronizzazioni a cui siamo interessati.L’operatore k può essere espresso in termini di operatori di parallelismo più basilari come

specificato dall’equazione E k F = E TF +F TE +E |cF , dove T e |c sono gli operatori left-mergee communication-merge che illustriamo adesso.

Left-merge e communication-merge. L’operatore T è noto come left-merge e la suasemantica dice che l’azione iniziale deve essere eseguita dal processo di sinistra dopodiché ilcomportamento del sistema è regolato da k. L’unica regola semantica è

E µ−→ E 0

E TF µ−→ E 0 k F

L’operatore |c è noto come communication-merge e la sua semantica dice che l’azioneiniziale deve essere un’interazione tra i due processi dopodiché il comportamento del sistemaè regolato da k. L’unica regola semantica è

E a−→ E 0 F

b−→ F 0

E |cF γ (a,b)−−−→ E 0 k F 0

Interleaving Gli operatori di parallelismo che abbiamo visto finora permettono ai processiin parallelo di sincronizzarsi nell’esecuzione di certe azioni. Al contrario, l’operatore binariointerleaving ||| permette esclusivamente l’esecuzione indipendente dei due processi argomento.Le regole semantiche sono

E µ−→ E 0

E ||| F µ−→ E 0 ||| F

F µ−→ F 0

E ||| F µ−→ E ||| F 0

Consideriamo il processoa.b.nil ||| c.d.nil

esso ammette le seguenti computazioni che lo fanno evolvere in nil ||| nil

abcd, acdb, cdba, acbd, cadb, cabd

Page 209: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 209/332

10.6 Operatori di parallelismo 209

Composizione parallela con interfaccia (á la Hoare) L’operatore binario |[L]|, doveL

⊆ Λ, permette sia l’interleaving che l’interazione tra due processi; quest’ultima si ha per

tutte le azioni che appartengono all’insieme L. L’operatore è utilizzato nelle algebre di pro-cessi, come ad esempio CSP, in cui non si fa distinzione tra azioni di input ed azioni di outpute la sincronizzazione tra processi è ottenuta richiedendo che essi eseguano le stesse azionisimultaneamente. Le regole di inferenza che definiscono la semantica dell’operatore sono

E µ−→ E 0

E |[L]| F µ−→ E 0 |[L]| F

(µ 6∈ L) F

µ−→ F 0

E |[L]| F µ−→ E |[L]| F 0

(µ 6∈ L)

E a−→ E 0 F

a−→ F 0

E |[L]| F a

−→ E 0 |[L]| F 0

(a ∈ L)

L’operatore |[L]| è in relazione con alcuni degli operatori visti in precedenza. In particolare,se si definisce γ (a, a) = a per ogni a ∈ L, gli operatori |[L]| e k hanno semantiche equivalenti.Se invece si prende L = ∅, gli operatori |[L]| e ||| risultano equivalenti.

Prodotto (o parallelo con esecuzione sincrona). Se E ed F sono processi, l’operatorebinario × permette di formare il processo E × F in grado di eseguire un’azione solo se questaè il risultato del prodotto di un’azione iniziale di E ed una azione iniziale di F . In pratica, lecomponenti E e F di E × F devono procedere in maniera sincrona; cioè, non è possibile cheuna componente resti ferma mentre l’altra eff ettua un’azione.

Perché la definizione abbia senso è richiesto che sull’insieme delle azioni sia definita un’o-perazione di prodotto, denotata anch’essa con ×, che rende tale insieme un gruppo abeliano.Ricordiamo che un gruppo abeliano è costituito da un insieme A e da un’operazione binaria× su A tale che

• × è associativa e commutativa,

• esiste un elemento speciale 1 ∈ A, detto elemento neutro, tale che α × 1 = 1 × α = α,per ogni α ∈ A,

• per ogni α ∈

A esiste un elemento, detto opposto di α e denotato con α, tale cheα × α = α × α = 1.

La semantica operazionale dell’operatore sui processi è definita dalla seguente regolad’inferenza

E α−→ E 0 F

β−→ F 0

E × F α×β−−−→ E 0 × F 0

Come si vede, si tratta di un’operatore statico.Consideriamo come esempio il processo (a.b.0 + c.(d.0 + e.0)) × a.1.0. Il grafo delle

transizioni associato è il seguente

Page 210: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 210/332

210 Capitolo 10 – Operatori per concorrenza e nondeterminismo

(a.b.0 + c.(d.0 + e.0))× a.1.0

b.0× 1.0 0× 0

(d.0 + e.0)× 1.0

0× 0

0× 01

b

c × ¯ a

d

e

10.7 Operatori di astrazione

Spesso è utile vedere un processo come una black-box e modificarne il comportamento restrin-gendo o ridenominando le azioni che può eff ettuare. Gli operatori di astrazione permettono

questo tipo di modifiche sui processi e si rendono quindi utili per modificare il livello diastrazione a cui un sistema è descritto facilitando così la composizionalità dei processi stessi.

Restrizione. L’operatore unario ·\L , dove L ⊆ Λ, permette di restringere le azioni visibilidel processo a cui è applicato. Il processo E \L potrà eseguire solo le azioni non incluse inL ed il cui complementare non è incluso in L. Ovviamente non ha senso impedire che unprocesso esegua un’azione interna e perciò non è permesso che τ appartenga ad L. QuandoL contiene una sola azione, cioè L = a, scriveremo, per semplicità, E \a invece di E \a.La semantica operazionale è definita dalla regola d’inferenza

E µ−→ E 0

E \L µ−→ E 0 \L(µ , µ

6∈ L)

Come si vede l’operatore è deterministico e statico.Vediamo un esempio. Modelliamo il nostro distributore automatico come la composizione

parallela di due processi, uno che controlla l’inserimento della moneta e l’altro che off re labarretta di cioccolato o l’acqua. Per fare in modo che le due componenti comunichino senzainterferenze con l’ambiente esterno usiamo la restrizione nel modo seguente

(coin.ok.nil) | ok.(choc.nil + water.nil)

\ ok

Messo in parallelo con un utente coin.choc.nil, una computazione possibile è la seguente

(coin.ok.nil) | ok.(choc.nil + water.nil) \ ok | coin.choc.nilτ −→

(ok.nil) | ok.(choc.nil + water.nil)

\ ok | choc.nilτ −→

nil | (choc.nil + water.nil)

\ ok | choc.nilτ −→

nil | nil

\ ok | nil

Si osservi che un utente malizioso che tentasse di eseguire la sequenza di azioni ok.choc.nilper ottenere il cioccolato senza inserire una moneta non riuscirebbe ad interagire con ildistributore.

Page 211: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 211/332

10.7 Operatori di astrazione 211

Questo modo di combinare la restrizione con la composizione parallela è usato spessoper costringere i processi concorrenti a sincronizzarsi sull’uso di alcuni canali. Potremmo

per esempio costringere il distributore e l’utente a sincronizzarsi sull’azione coin nel modoseguente

(coin.ok.nil) | ok.(choc.nil + water.nil)

\ ok | coin.choc.nil

\ coin

Osserviamo infine che c’è una certa corrispondenza tra i processi (E |F )\L e E |[L]| F : inentrambi i casi i processi E ed F devono necessariamente sincronizzarsi se vogliono eseguireazioni di L, nel secondo caso però l’azione risultante dalla sincronizzazione è visibile ancheall’esterno.

Esempio 10.2. [Bill-Ben] Abbiamo visto che il grafo delle transizioni associato al processo

play.work.τ .nil + work.play.τ .nil

è quello della Figura 10.1. Vediamo adesso che vi sono altri processi che hanno lo stesso grafodelle transizioni. Si consideri il processo

( play.meet.nil | work.meet.nil) \ meet

Non è difficile rendersi conto che il grafo delle transizioni ad esso associato è ancora quello diFigura 10.1.

Abilitazione. L’operatore unario · L consente a un processo di eseguire solo le azionicontenute in L (e le loro complementari). Si tratta quindi di un operatore che si comportain maniera complementare alla restrizione. La semantica operazionale è definita dalla regolad’inferenza

E µ−→ E 0

E L µ−→ E 0 L

(µ ∈ L ∨ µ ∈ L ∨ µ = τ )

Encapsulation. L’operatore unario δ H , dove H ⊆ Λ, ha l’eff etto di rinominare le azioniα appartenenti ad H in δ bloccandone così l’esecuzione. In pratica, il processo δ H (E ) sicomporta come E eccettuato il fatto che esso non può eseguire le azioni che compaiono in H

e le loro complementari (e, di conseguenza, ciò che li segue sintatticamente). La semanticaoperazionale è definita dalla regola di inferenza (ove si assume che l’azione invisibile nonappartenga a H )

E µ−→ E 0

(µ 6∈ H )δ H (E )

µ−→ δ H (E 0)

Si noti la stretta corrispondenza con (la regola che definisce) la semantica operazionaledell’operatore di restrizione (in pratica, E \H e δ H (E ) si comportano allo stesso modo).

Page 212: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 212/332

212 Capitolo 10 – Operatori per concorrenza e nondeterminismo

Hiding. L’operatore unario ·/L, con L ⊆ Λ, “nasconde” le azioni appartenenti all’insieme Le fa in modo che vengano percepite al di fuori del sistema come azioni invisibili. Tuttavia, di-

versamente dalla restrizione, lascia inalterata la capacità dei processi di eff ettuare transizioni.La semantica operazionale è definita dalle seguenti regole di inferenza

E µ−→ E 0

(µ 6∈ L)E/L

µ−→ E 0/L

E α−→ E 0

(α ∈ L)E/L

τ −→ E 0/L

Come si vede, si tratta di un operatore statico.Possiamo modellare il nostro distributore automatico per mezzo della composizione

parallela con interfaccia e dell’operatore hiding

(coin.ok.nil) |[ok]| ok.(choc.nil + water.nil)

/ ok

Questo modo di abbinare composizione parallela con interfaccia e operatore hiding è moltocomune.

Osservazione 10.3. Si noti che (E |[L]| F )/L e (E | F )\L non si comportano, in generale,allo stesso modo. Infatti, a di ff erenza del secondo, il primo non consente sincronizzazioni su canali non appartenenti ad L.

Esempio 10.4. [Bill-Ben] Il processo

( play.meet.nil |[meet]| work.meet.nil)/meet

ha anch’esso come grafo delle transizioni quello di Figura 10.1.

Si può infine osservare che, mentre la restrizione preserva il determinismo, non accadealtrettanto per l’operatore hiding. Si consideri per esempio il processo τ .α.nil + β .nil. Essoè deterministico, mentre se nascondiamo l’azione β , ossia consideriamo il processo (τ .α.nil +β .nil)/β , esso non è più deterministico perché per mezzo dell’azione τ può andare in α.nil oin nil.

Rietichettatura (o relabelling). L’operatore unario ·[f ], dove f : Λ → Λ è una funzionedall’insieme delle etichette in se stesso, è usato per ridenominare le azioni di un processo. La

semantica operazionale è definita dalla regola di inferenza

E µ−→ E 0

E [f ] f (µ)−−→ E 0[f ]

dove s’intende f (τ ) = τ e f (a) = f (a). Come si vede si tratta di un operatore statico. Essoè usato per gestire meglio la sincronizzazione e per facilitare il compito di costruire processicomplessi a partire da altri più semplici.

Se la funzione f non si comporta come l’identità solo su un insieme finito di punti a1, · · · , an

allora essa viene scritta per semplicità come [b1/a1, · · · , bn/an] dove b1 = f (a1), · · · , bn =f (an). Per esempio [c/a, d/b] è la funzione che rinomina a con c e b con d.

Page 213: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 213/332

10.8 Operatori per definire comportamenti infiniti 213

Consideriamo come esempio il solito distributore automatico

coin. (choc. nil + water. nil)

e un utente italiano che voglia usufruire del distributore per prendere un bicchiere di acqua

soldo. acqua. nil

L’utente può interagire col distributore se gli applichiamo un operatore di rietichettatura

coin. (choc. nil + water. nil) | ( soldo. acqua. nil ) [coin/soldo, water/acqua]

10.8 Operatori per definire comportamenti infiniti

Gli operatori che abbiamo visto finora permettono di definire solo processi il cui compor-tamento è finito, cioè processi che possono eff ettuare solo computazioni di lunghezza finita.Introduciamo adesso i meccanismi che possono essere utilizzati per definire processi in gradodi eff ettuare sequenze infinite di transizioni.

Costanti di processo. Una costante di processo è un processo il cui significato è dato daun’equazione di definizione. Se A è una costante di processo si assume quindi che vi sia ancheuna definizione della forma A , E che definisce A per mezzo del processo E . La semanticaoperazionale per le costanti di processo è ovvia

E µ−→ E 0

A µ−→ E 0

(A , E )

Il potere espressivo di quella che sembra essere una definizione banale sta nel fatto che nul-la impedisce che la costante di processo A venga usata anche nel processo che la definiscepermettendo così definizioni ricorsive o mutuamente ricorsive.

Per convenzione, le costanti di processo sono solitamente indicate con stringhe checominciamo con una lettera maiuscola.

Finalmente siamo in grado di migliorare il nostro distributore automatico e fare in modoche esso sia sempre pronto a servire un nuovo cliente dopo aver finito di servirne un altro. Aquesto scopo definiamo la costante di processo D (distributore) come

D , coin. (choc. D + water. D)

Una possibile computazione del distributore in parallelo con un utente è la seguente

D | coin. choc. nil τ −→

(choc. D + water. D) | choc. nil τ −→

D | nil

che mostra che, dopo aver interagito con l’utente, il distributore è tornato nel suo stato inizialeed attende il prossimo cliente.

Page 214: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 214/332

214 Capitolo 10 – Operatori per concorrenza e nondeterminismo

Esempio 10.5. Vediamo un altro semplice esempio. Consideriamo la costante di processo

Coin , toss.tail.Coin + toss.head.Coin

Esso descrive il lancio reiterato di una moneta che di volta in volta può dare come esito testao croce. Una possibile computazione è

Coin toss−−→ tail.Coin

tail−−→ Coin toss−−→ head.Coin

head−−−→ Coin toss−−→ . . .

Ricorsione. Processi ricorsivi possono essere ottenuti anche per mezzo dell’operatore una-rio recX. ·. Se E è un processo (o, più precisamente, un’espressione di processo) in cui

compare la variabile X allora, intuitivamente, il processo rec X.E (talvolta scritto anche co-me f ix(X = E )) è definito come il processo che si comporta come E in cui le occorrenzedi X sono sostituite con rec X.E stesso. Informalmente possiamo anche dire che rec X.E è equivalente a una definizione della forma X , E . Per definire formalmente la semanticadell’operatore di ricorsione bisogna definire il concetto di occorrenza libera di una variabile.Se E è un’espressione di processo, ossia un processo in cui compaiono delle variabili, alloradiremo che una certa occorrenza di X in E è libera se essa non appartiene al corpo di un ope-ratore della forma recX . Con E F/X si denota il processo ottenuto sostituendo (a livellosintattico) le occorrenze libere di X in E con il processo F .

La semantica è data dalla seguente regola d’inferenza

E rec X.E/X µ−→ E 0

rec X.E µ−→ E 0

La regola dice che il processo rec X.E può fare qualsiasi azione che può fare il processoE rec X.E/X e proseguire nello stesso modo.

Per mezzo di questo operatore il distributore automatico può essere definito come ilprocesso

rec D. coin. (choc. D + water. D)

Una possibile computazione di questo processo è la seguente

rec D. coin. (choc. D + water.D) coin−−→

choc. rec D. coin. (choc. D + water.D)+

water. rec D. coin. (choc. D + water.D)

choc−−→

rec D. coin. (choc. D + water.D) coin−−→ . . .

Mentre il lancio reiterato della moneta può essere descritto da

recC. (toss. tail. C + toss. head. C )

Page 215: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 215/332

10.8 Operatori per definire comportamenti infiniti 215

ed una possibile computazione è la seguente

recC. (toss.tail.C + toss. head. C ) toss

−−→tail.rec C. (toss.tail.C + toss. head. C )

tail−−→recC. (toss.tail.C + toss. head. C )

toss−−→ . . .

L’operatore recX.· costituisce un modo alternativo di trattare la ricorsione rispetto allecostanti di processo. Facendo uso dell’operatore di ricorsione, l’equazione ricorsiva A , E potrebbe essere trasformata nell’equazione non ricorsiva A , recX.E X/A, separando cosìi costrutti usati per esprimere la ricorsione da quelli usati per definire processi. In generale,trattare la ricorsione usando il recX.· è più conveniente dal punto di vista dello sviluppo dellateoria, ma meno comodo da utilizzare in pratica per specificare sistemi.

L’operatore di ricorsione può essere generalizzato per gestire anche la ricorsione mutua.

Siano X i variabili, per i appartenente a un certo insieme di indici I , e siano E i, per i ∈ I ,espressioni di processo in cui possono comparire una o più delle variabili X i. Indichiamo conX = E l’insieme di equazioni X i = E i | i ∈ I . La j-esima componente dell’operatore diricorsione generalizzato è indicata con

f ix j ( X = E )

ed ha la seguente semantica

E j

f ixi( X = E )/X i | i ∈ I µ−→ E 0

f ix j ( X = E ) µ−→ E 0

dove E j f ixi( X = E )/X i | i ∈ I rappresenta il processo ottenuto sostituendo, per ogni i,le occorrenze libere di X i in E j con la scrittura formale f ixi( X = E ).

Replicazione. Un altro operatore usato per descrivere comportamenti infiniti è l’operatoreunario “! ” (letto “bang”). Intuitivamente, !E rappresenta un numero illimitato di copie delprocesso E , tutte composte in parallelo. La sua semantica operazionale può essere definitada una delle seguenti regole di transizione equivalenti:

E µ−→ E 0

! E µ−→ E 0| ! E

oppure E | ! E

µ−→ E 0

! E µ

−→ E 0

Come si vede, si tratta di un operatore statico. Il suo potere espressivo è equivalente a quellodelle definizioni di processo ed a quello dell’operatore di ricorsione. Infatti, ! E può esseredefinito dalla seguente equazione

A , E |A

oppure può essere espresso in termini dell’operatore rec dal processo

recX.(E |X )

Al contrario, ! · può essere utilizzato per codificare equazioni di processo ricorsive e processiricorsivi in modo tale che, se si ignorano le azioni invisibili, i processi risultanti dalle codifiche sicomportino come quelli originali. Per esempio, supponiamo che il processo E usi la costante di

Page 216: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 216/332

216 Capitolo 10 – Operatori per concorrenza e nondeterminismo

processo A definita dall’equazione A , F . Se vogliamo tradurre E in un calcolo che utilizza lareplicazione al posto delle equazioni di definizione, dobbiamo scegliere un a

∈Λ non utilizzato

in E ed F e quindi considerare il processo ( bE | ! a. bF )\a, dove bE ed bF denotano i processiottenuti rimpiazzando in E ed F , rispettivamente, le occorrenze di A con a. nil. Similmente,recX.E è codificato da (a. nil | ! a. bE )\a. Sistemi di equazioni di processo mutuamentericorsive e processi mutuamente ricorsivi potrebbero essere espressi tramite ! · usando lo stessometodo.

Esempio 10.6. Come esempio dell’operatore ! vediamo la seguente definizione di undistributore automatico

! coin. choc. nil

Esso accetta una moneta ed off re una barretta di cioccolato, un numero qualunque di volte.Una sua possibile computazione è la seguente

! coin. choc. nil coin−−→

choc. nil | ! coin. choc. nil coin−−→

choc. nil | choc. nil | ! coin. choc. nil choc−−→

nil | choc. nil | ! coin. choc. nil choc−−→

nil | nil | ! coin. choc. nil

Si può quindi osservare che, una volta ricevuta una moneta, il distributore non è obbligato adare la barretta di cioccolato prima di ricevere una seconda moneta. Se invece si vuole fare inmodo che le azioni di ricezione della moneta e di erogazione della barretta siano strettamentesequenziali, si potrebbe utilizzare il seguente processo ricorsivo

recX. coin. choc.X

Tale processo, codificato usando l’operatore ! , diventa

(a. nil | ! a. coin. choc. a. nil) \ a

Le sue possibili computazioni sono della forma

(a.nil | ! a. coin. choc. a. nil) \ a τ −→

(nil | coin. choc. a. nil | ! a. coin. choc. a. nil) \ a coin−−→

(nil | choc. a. nil | ! a. coin. choc. a. nil) \ a choc−−→

(nil | a.nil | ! a. coin. choc. a. nil) \ a . . .

e quindi il processo ottenuto si comporta “sostanzialmente” (cioè, come sarà formalizzato nelCapitolo 11, a meno di azioni interne) come volevamo.

Page 217: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 217/332

10.9 Sincronia ed asincronia 217

10.9 Sincronia ed asincronia

I termini sincronia ed asincronia sono usati per specificare la modalità di interazione o lamodalità di esecuzione di due o più processi.

Nel caso dell’interazione, si dice che essa è sincrona quando i processi interagenti devonoeff ettuare le azioni di interazione simultaneamente affinché l’interazione abbia luogo. In CCS,per esempio, mittente e destinatario di una interazione su un canale devono eff ettuare le azionidi output e di input nello stesso istante. Nei calcoli in cui l’interazione è sincrona, le azioni diinterazione sono quindi bloccanti nel senso che, se non è possibile eseguirle, il processo che leinvoca si blocca in attesa che ci sia un altro processo pronto per l’interazione. L’interazione èinvece asincrona quando i processi coinvolti non sono obbligati ad eseguire simultaneamente leazioni che portano all’interazione. Nella variante di CCS con interazione asincrona, il processomittente non si blocca mai sull’esecuzione di un output su un canale (la sintassi è tale che

l’output non è più un prefisso, ma è un processo autonomo), mentre il destinatario si bloccanell’esecuzione di un input se l’output corrispondente non è stato precedentemente eseguito.

Nel caso dell’esecuzione, si dice che essa è sincrona quando, ad ogni passo di riduzione di unsistema di processi in parallelo (che in maniera astratta corrisponde ad un istante di tempo),tutti i processi componenti sono obbligati ad eff ettuare un’azione. Tale tipo di comportamen-to si presta a descrivere soprattutto componenti hardware ed è utilizzato da vari calcoli diprocesso (quali ad esempio SCCS, Mejie ed Esterel) che si prefiggono l’obiettivo di descriverele componenti hardware di sistemi concorrenti. L’esecuzione dei processi è asincrona quandoi processi in parallelo non sono obbligati ad eff ettuare azioni simultaneamente; in questo casoquindi la semantica dell’operatore composizione parallela permette anche l’interleaving , cioèl’esecuzione “interallacciata” delle azioni delle varie componenti. Questa è la scelta fatta da

CCS, CSP, ACP e da molte altre algebre di processo.Molti degli operatori di composizione parallela che abbiamo visto, sia con esecuzione asin-

crona che sincrona, possono essere espressi con un unico operatore a patto di dotare l’insiemedelle azioni di un’opportuna struttura algebrica, cioè di trasformarlo in una algebra di sin-cronizzazione . Un’algebra di sincronizzazione determina i possibili interleaving e le possibilisincronizzazioni di due processi composti in parallelo. In particolare un’algebra di sincronizza-zione specifica l’azione risultante dall’interazione di due azioni. Le algebre di sincronizzazionesono così definite.

Definizione 10.7. Un’ algebra di sincronizzazione è una quadrupla hΛ, ∗, 0, •i dove

1. Λ

è un insieme, detto insieme delle etichette, contenente le etichette speciali ∗ e 0,2. • è un’operazione binaria su Λ (cioè • : Λ× Λ → Λ), che è associativa, commutativa e

soddisfa le seguenti proprietà

(a) a • 0 = 0 per ogni a ∈ Λ,

(b) ∗ • ∗ = ∗,

(c) a • b = ∗ implica a = b = ∗, per ogni a, b ∈ Λ.

Date due azioni a e b, a • b rappresenta l’azione risultante dall’interazione sincrona di a eb. Se a • b = 0 s’intende che l’interazione non è ammessa. L’etichetta ∗ rappresenta un’azionefittizia, che può essere eseguita da qualsiasi processo in qualsiasi momento, ed è usata per

Page 218: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 218/332

218 Capitolo 10 – Operatori per concorrenza e nondeterminismo

trattare l’asincronia dell’esecuzione. Nessuna azione “vera” è etichettata da ∗. Quando dueprocessi sono messi in parallelo, un processo può eff ettuare l’azione a senza sincronizzarsi con

un’azione dell’altro processo se a • ∗ 6= 0, ossia se si può sincronizzare con l’azione ∗ .Ad esempio, l’algebra di sincronizzazione per CCS è data dalla seguente tabella, che mo-

stra come in CCS sia permessa solo la sincronizzazione di azioni complementari e come talesincronizzazione produca un’azione invisibile τ

• ∗ τ a a b b · · · 0

∗ ∗ τ a a b b · · · 0τ τ 0 0 0 0 0 · · · 0

a a 0 0 τ 0 0 · · · 0a a 0 τ 0 0 0 · · · 0

b b 0 0 0 0 τ · · · 0

b b 0 0 0 τ 0 · · · 0... ...

... ...

... ...

... . . .

...0 0 0 0 0 0 0 · · · 0

Come altro esempio consideriamo un’algebra di sincronizzazione che costringe asincronizzarsi solo per eseguire una certa azione a. Essa può essere ottenuta imponendo

a • a = a, a • ∗ = 0, a • β = 0 per ogni β 6= a

β • β 0 = 0, β • ∗ = β per ogni β , β 0 6= a

ossia

• ∗ τ a β 0∗ ∗ τ 0 β 0

τ τ 0 0 0 0

a 0 0 a 0 0

β β 0 0 0 0

0 0 0 0 0 0

Come ultimo esempio consideriamo un’algebra di sincronizzazione che assicura che tuttele azioni dei processi composti in parallelo occorrono in maniera asincrona.

• ∗ α 0

∗ ∗ α 0

α α 0 00 0 0 0

Al contrario, quando per ogni a 6= ∗ risulta a • ∗ = 0, l’algebra di sincronizzazione èsincrona, poiché in tal caso la composizione parallela tra processi è puramente sincrona inquanto non è possibile eseguire nessuna azione senza sincronizzarsi con un’altra.

Ad ogni algebra di sincronizzazione è associato in maniera naturale un operatore com-posizione parallela, denotato anch’esso con •, la cui semantica è definita dalla seguenteregola

E α−→ E 0 F

β−→ F 0

E • F α•β

−−→ E 0 • F 0

(α • β 6= 0)

Page 219: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 219/332

10.10 Operatori che manipolano valori 219

dove si assume che E ∗−→ E valga per ogni processo.

Concludendo, possiamo dire che le algebre di sincronizzazione generalizzano i vari operatori

di composizione parallela e sono simili ai gruppi abeliani usati in connessione con l’operatore× . La diff erenza tra una algebra di sincronizzazione ed un gruppo abeliano, è che nell’algebranon esistono necessariamente l’elemento neutro e l’opposto di ogni elemento, mentre esistonole due etichette speciali ∗ e 0.

10.10 Operatori che manipolano valori

Finora abbiamo introdotto azioni ed operatori che non manipolano valori. Consideriamo oraun sistema in cui vi è scambio di informazioni tra le varie componenti e in cui il comportamentodelle varie componenti dipende dalle informazioni ricevute. Si potrebbe pensare che un talesistema non possa essere espresso con gli operatori visti. Le cose non stanno così. Si può infattimostrare, e lo faremo in seguito per CCS, che sotto opportune ipotesi è possibile tradurre unsistema in cui c’è scambio di valori in uno in cui tale scambio non c’è.

I calcoli di processo che supportano il passaggio di valori tra le varie componenti sonodetti calcoli con value-passing . Tali calcoli risultano più espressivi e comodi da usare ma, dalpunto di vista teorico, equivalenti a quelli senza value-passing. Quando si tratta di studiarele proprietà di un calcolo di processi conviene quindi riferirsi alla versione senza value-passingche risulta sicuramente più facile da trattare avendo meno costrutti.

In questa sezione presentiamo gli operatori standard per la manipolazione di valori. Leoperazioni più comuni per trattare valori sono:

• Output di valori. Per inviare il valore dell’espressione e sul canale a si usa la sintassi

a e. Tale sintassi viene vista come una sorta di azione e la si usa perciò come prefisso: seE è un processo, ae.E è il processo che spedisce il valore dell’espressione e sul canale aper poi comportarsi come E . Per esempio: a 1.nil spedisce 1 sul canale a e poi termina.

• Input di valori. Per ricevere un valore su un canale a si usa la sintassi a(x). Se E è unprocesso in cui compare la variabile x, allora a(x).E rappresenta il processo che riceveun valore v sul canale a e poi si comporta come E in cui le occorrenze libere di x sonosostituite dal valore v . Vedremo tra breve l’interazione tra un processo che spedisce unvalore ed uno che lo riceve.

• Comportamento condizionale. Se un processo riceve un valore si potrebbe volereche il suo comportamento dipenda dal valore ricevuto. A questo scopo si usa l’operatore

if . Se E ed F sono processi, il processo if e then E else F si comporta come E sela valutazione (che supponiamo gestita da qualche altro meccanismo) dell’espressione erestituisce true e si comporta come F se la valutazione di e è false.

• Costanti di processo parametriche. Se i processi sono in grado di gestire valoripuò risultare utile permettere che le costanti di processo abbiano dei parametri. Unacostante di processo parametrica A è un processo definito da una equazione della forma

A(x1, . . . , xn) , E

dove E è un processo che può contenere le variabili x1, . . . , xn (oltre che A o altrecostanti di processo). Per esempio: il processo a(x).A(x), dove

A(x) , if x = 0 then nil else b x.nil

Page 220: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 220/332

220 Capitolo 10 – Operatori per concorrenza e nondeterminismo

riceve un valore x sul canale a ed invoca il processo A(x), il quale si blocca se x = 0 espedisce invece il valore x sul canale b se x

6= 0.

Le regole d’inferenza per l’input e l’output sono

(v valore)

a(x).E a(v)−−→ E v/x ae.E

a val(e)−−−−−→ E

dove val(e) rappresenta il valore dell’espressione e ed E v/x rappresenta il processo ottenutosostituendo le occorrenze libere di x in E con il valore v1. Si noti che l’assioma per l’inputpermette un numero di possibili derivazioni per il processo a(x).E pari al numero di elemen-ti dell’insieme dei valori. In particolare, se l’insieme dei valori ha infiniti elementi, l’inputintroduce un infinite branching , cioè una scelta tra infinite possibilità.

Le regole per la sincronizzazione e per il costrutto if sono

E a v−−→ E 0 F

a(v)−−→ F 0

E |F τ −→ E 0|F 0

E a(v)−−→ E 0 F

a v−−→ F 0

E |F τ −→ E 0|F 0

val(e) = true E µ−→ E 0

if e then E else F µ−→ E 0

val(e) = f alse F µ−→ F 0

if e then E else F µ−→ F 0

Come esempio descriviamo un distributore automatico che accetta una moneta da 20 centesimi(o più) ed off re una barretta di cioccolato

coin(x). if x ≥ 20 then choc.nil else nil

Vediamo come il distributore interagisce con un utente

coin(x).if x ≥ 20 then choc.nil else nil | coin 50.choc.nilτ −→

if 50 ≥ 20 then choc.nil else nil | choc.nilτ −→

nil | nil

Ovviamente, così com’è descritto, il distributore non dà il resto e non restituisce la monetase questa è inferiore a 20 centesimi (oltre al problema di funzionare per una volta sola). Siosservi anche che ci siamo permessi di usare in modo promiscuo gli operatori per il passaggio

di valori e quelli senza passaggio di valori.Diamo infine la semantica per le costanti di processo parametriche

E val(e1)/x1, . . . , v a l(en)/xn µ−→ E 0

(A(x1, . . . , xn) , E )A(e1, . . . , en)

µ−→ E 0

Vediamo ora un altro semplice esempio di processo che utilizza il passaggio di valori conlo scopo di mostrare come esso possa essere simulato senza l’uso del passaggio di valori.

1Si noti che il prefisso di input a(x).· è legante nel senso che nel processo a(x).E le occorrenze libere dellavariabile x in E sono legate all’input a(x). Le definizioni di costanti di processo parametriche si comportanoin maniera simile, cioè in A(x1, . . . , xn) , E le occorrenze libere delle variabili xi in E sono legate dalladefinizione.

Page 221: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 221/332

10.10 Operatori che manipolano valori 221

Consideriamo il seguente processo “ forwarder ” che riceve un valore sul canale in e quindi lospedisce sul canale out

F , in(x).out(x). F

Le computazioni del processo risultano quindi essere della forma

F in(v)−−−→ out(v). F

out(v)−−−→ F · · ·

Indichiamo con V l’insieme dei valori che possono essere trasmessi. Per esprimere nel calcolosenza passaggio di valori un processo che si comporta come F associamo a ogni canale adel calcolo con value-passing tanti canali del calcolo senza value-passing quanti sono i valoridi V . In altre parole, ad ogni canale a del calcolo con value-passing associamo un insiemeav | v ∈ V i cui elementi sono canali indicizzati dagli elementi di V . In questo modo, peresempio, un processo della forma in(x). E corrisponde al processoX

v∈V

inv. E v/x.

L’azione in(v) corrisponde all’azione inv e l’azione out(v) corrisponde all’azione outv. L’o-peratore

P esprime la possibilità da parte del processo tradotto di scegliere uno qualunque

degli elementi di V . Ovviamente, se l’insieme V dei valori è infinito la scelta è espressa dauna somma con infiniti termini per cui la traduzione che abbiamo eff ettuato ha senso se V èfinito o se si ammettono le somme di infiniti termini.

Il processo risultante dalla traduzione di F è il seguente

bF , Xv∈V inv.outv. bF

Vediamo ora come può essere tradotto il costrutto if e then E elseF in un calcolo senzavalue-passing. Nella definizione della traduzione, non c’è un costrutto corrispondente a questooperatore, piuttosto, la guardia e è utilizzata per scomporre l’insieme degli indici di ciascunadelle somme risultanti dalla traduzione delle azioni di input in due insiemi: quello degli indiciche rendono vera e, e quello degli indici che la rendono falsa. Per esempio, se V è l’insiemedei numeri naturali, il processo

in(x). if x > 0 then out(x − 1).nil else out(0).nil

è tradotto nel processo(X

v>0

inv.outv−1.nil) + in0.out0.nil

Vediamo infine come tradurre le costanti di processo parametriche. A ciascuna costantedi processo sono associate tante costanti di processo del calcolo senza value-passing quantesono le possibili combinazioni dei valori dei suoi parametri e, quindi, a ciascuna equazionedi definizione sarà associato un insieme di equazioni di definizione, una per ogni costante.Consideriamo per esempio la definizione A(x1, . . . , xn) , E . Alla costante A corrisponderàl’insieme di costanti Av1,...,vn | 1 ≤ i ≤ n : vi ∈ V e l’equazione di definizione precedentesarà tradotta nel seguente insieme, eventualmente infinito, di equazioni

Av1,...,vn

, E v1/x1, . . . , vn/xn | 1≤

i≤

n : vi

∈V

Page 222: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 222/332

222 Capitolo 10 – Operatori per concorrenza e nondeterminismo

Altri operatori che subiscono modifiche nella traduzione sono la restrizione e il relabelling.Nel primo caso, ·\L diventa ·\αv | α

∈L, v

∈V mentre ·[f ] diventa ·[ f ] dove, per definizione,

si pone f (αv) = f (α)v.

Esempio 10.8. Facendo uso delle costanti di processo parametriche si può definire unprocesso Countdown(x) che esegue un conto alla rovescia a partire dal valore x:

Countdown(x) , if x > 0 then tick. Countdown(x − 1) else beep. nil

Se applichiamo lo schema di traduzione che abbiamo delineato, al processo Countdown(3)corrisponderà il processo Countdown3 ed all’equazione di definizione per la costan-te Countdown(x) corrisponderà un insieme infinito contenente le seguenti equazioni didefinizione:

. . . . . . . . .

Countdown10 , tick.Countdown9

. . . . . . . . .

Countdown3 , tick.Countdown2

Countdown2 , tick.Countdown1

Countdown1 , tick.Countdown0

Countdown0 , beep. nil

Osservazione 10.9. Sono stati definiti in letteratura calcoli in cui i processi possono scam-

biarsi altri tipi di informazioni, quali ad esempio record di dati, processi (comunicazione higher-order) o canali di comunicazione ( link mobility). Le teorie matematiche sviluppate per questi calcoli sono basate su idee simili a quelle utilizzate per i calcoli di base ma sonosensibilmente più complicate. Per questo motivo tali calcoli di processo non saranno presi in considerazione in queste note.

10.11 Esercizi

10.1 Si disegnino i grafi di transizione associati ai seguenti termini (i nil finali sono stati omessi):

a) a + a h) τ .a.b τ .a.c

b) a | a i) a.b | a.bc) (a.b | a.c) \ a l) a.b ||| a.be) a.b + a.c m) rec x.a.b.xf ) a.b ⊕ a.c n) recx.(a + b).x

g) τ .a.b + τ .a.c o) A | a, dove A , a.b.A

10.2 Si scriva un termine che descriva un distributore automatico in grado di off rire acqua o cioccolatoun numero illimitato di volte senza accettare monete fino a che non è stato servito l’utenteprecedente. Si risolva l’esercizio in tre modi: con l’operatore di ricorsione, con la definizione dicostanti di processo e con l’operatore di replicazione.

10.3 Si descriva il comportamento del termine D(0) dove D è una costante di processo parametricadefinita nel modo seguente

Page 223: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 223/332

10.11 Esercizi 223

D(q ) , change (q ).D(0)

+ if(q < 40) then coin(x). D(x + q ) else nil+ if(q ≥ 40)then chock. change (q − 40). D(0)else if(q ≥ 20) then water. change (q − 20). D(0) else nil

dove change è l’azione di dare il resto.

Page 224: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 224/332

Page 225: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 225/332

Capitolo 11

Equivalenze comportamentali epreordini di raffinamento

SOMMARIO

Questo capitolo presenta diversi criteri per confrontare sistemi di transizioni etichettate.Alcuni di questi criteri costituiscono delle relazioni di equivalenza sull’insieme dei sistemi ditransizioni, altri invece costituiscono dei preordini su tale insieme. In particolare introdurre-mo l’equivalenza a tracce, la bisimilarità e l’equivalenza testing. Di ciascuna di esse daremo una versione “forte” che considera le azioni invisibili alla stessa stregua delle altre azioni ed una versione “debole” che tratta le azioni invisibili in maniera speciale. Presenteremo inoltre alcune varianti, quali l’equivalenza a tracce complete, la doppia simulazione e la bisimilarità di branching. Concluderemo esaminando il comportamento delle relazioni introdotte nei

confronti della divergenza e la gerarchie a cui danno origine.

11.1 Osservatori, equivalenze e preordini

Come detto nell’introduzione, stabilire se due processi sono equivalenti è interessante ed utilesia al fine di assegnare una semantica formale ai processi sia al fine di dimostrare che l’imple-mentazione di un sistema (come è realizzato) è corretta rispetto ad una data specifica (cosa gli si chiede di fare), quando implementazione e specifica sono entrambe espresse utilizzandolo stesso formalismo.

La nozione di equivalenza da utilizzare dipende fondamentalmente dall’uso previsto peri sistemi in considerazione. In eff etti, il tipo di uso di un sistema determina gli aspetticomportamentali che devono essere presi in considerazione e quelli che possono essere ignorati.Perciò, per ciascuna equivalenza, è importante conoscere le proprietà dei sistemi che essapreserva. Non è quindi sorprendente che in letteratura siano state proposte molte teorie diequivalenza per via dei molti aspetti di un sistema concorrente che potrebbe valere la pena diconsiderare.

Le equivalenze che vedremo sono tutte basate sull’idea che due processi sono equivalentise nessun osservatore (utente) esterno li può distinguere, cioè se i due processi hanno lo stessoinsieme di osservazioni . Le semantiche indotte da questo tipo di equivalenze sono anche detteosservazionali . Ciò che interessa, infatti, non è la struttura interna di un processo, ma ilsuo comportamento in relazione all’ambiente esterno. Pertanto, un’equivalenza ragionevoletra processi non può essere basata sull’uguaglianza delle loro semantiche operazionali, cioè

Page 226: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 226/332

226 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

dei corrispondenti LTS, perché risulterebbe eccessivamente discriminante in quanto conside-rerebbe dettagli dei processi, quali la struttura, non osservabili dall’esterno. Perciò, bisogna

definire dei meccanismi di astrazione che, a partire dalla semantica operazionale, cioè dagliLTS, permettano di ignorare dettagli ritenuti irrilevanti.

Non c’è però ancora completo accordo su quale sia la nozione corretta di osservazione esu come gli esiti di un’osservazione debbano essere usati per distinguere o identificare sistemi.Per questo, in letteratura sono state definite molte equivalenze osservazionali, ciascuna basatasu una specifica e ragionevole nozione di “osservabile”. Difatti, esiste un’intera gamma di equi-valenze che possono essere organizzate in una gerarchia che va dall’equivalenza più restrittiva,che è l’isomorfismo tra i grafi di transizione degli LTS, a quella più debole, che è l’ equivalenza a tracce . Va tenuto conto che ciò che diff erenzia le equivalenze osservazionali è il modo in cuiesse trattano il nondeterminismo. Infatti, se si considerano solo LTS deterministici, tutte leequivalenze coincidono.

Le equivalenze che considereremo possono essere raggruppate in due grandi categorie: leequivalenze forti che considerano l’azione interna alla stessa stregua delle altre azioni e leequivalenze deboli che invece trattano l’azione interna in maniera speciale, nel senso che laconsiderano non osservabile e, ad esempio, astraggono dal fatto che un processo la possaeff ettuare o no.

Quanto detto relativamente alle equivalenze comportamentali, si applica anche ai preordini di ra ffi namento. Questi sono relazioni di (pre)ordinamento e quindi si prestano in manieranaturale a descrivere le relazioni tra descrizioni di uno stesso sistema a vari livelli di astrazione.Infatti, le equivalenze talvolta impongono restrizioni troppo severe ed in particolare richiedonoche i comportamenti di un sistema a vari livelli di astrazione siano identici. I preordini diraffinamento costituiscono quindi un’alternativa ragionevole alle relazioni di equivalenza.

I calcoli di processo utilizzano spesso le nozioni di congruenza e precongruenza (introdottein Sezione 2.5) comportamentale sia per l’analisi dei sistemi che per sviluppare una meto-dologia di stepwise-development che permette di passare dalla specifica all’implementazionedi un sistema complesso eff ettuando una serie di sostituzioni di componenti con altre com-ponenti equivalenti o più raffinate. Però, mentre equivalenze comportamentali e preordinidi raffinamento possono essere definiti direttamente sugli LTS in maniera indipendente daglioperatori di uno specifico calcolo di processi, non altrettanto possiamo fare per congruenze eprecongruenze. Come abbiamo visto, infatti, una congruenza è una relazione di equivalenzache soddisfa anche la proprietà di sostituzione : sistemi equivalenti possono essere usati inmodo intercambiabile all’interno di sistemi più grandi. Più formalmente, un contesto c[ ] losi può definire come una descrizione di un processo con un “buco”, [ ], eff ettuata usando glioperatori di un determinato linguaggio. Dato un processo E scritto nello stesso linguaggio,c[E ] rappresenta il processo ottenuto riempiendo il buco con E . Un’equivalenza ≈ è una con-gruenza per il linguaggio in considerazione se da E ≈ F , deriva c[E ] ≈ c[F ] per ogni contestoc[ ] costruito usando gli operatori del linguaggio. Il problema di determinare se le equivalenzeed i preordini introdotti in questo capitolo sono rispettivamente congruenze e precongruenzesarà aff rontato nel Capitolo 12 relativamente allo specifico calcolo di processi CCS.

In questo capitolo introdurremo alcune semantiche osservazionali che permettono di con-frontare stati di un LTS. Le definizioni delle semantiche quindi saranno date senza fare riferi-mento ad un insieme specifico di operatori. Nel capitolo successivo vedremo che tali definizionisi possono riportare senza alcuna modifica in un calcolo di processi specifico come CCS. Ciòè reso possibile dal fatto che lo stesso calcolo può essere visto come un unico LTS, dove gli

Page 227: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 227/332

11.2 Relazioni forti 227

p

p1a

p2

b

p3

c

p4

d

q

q 1a

q 2

b

q 4

c

q 3

b

q 5

d

r

r2

a

r4

b

r6

c

r1

a

r3

b

r5

d

Figura 11.1: Tre LTS con cui evidenziare le diff erenze tra equivalenza a tracce, equivalenza

testing e bisimilarità forte

stati corrispondono ai processi CCS.Definiremo le semantiche osservazionali come relazioni tra stati di uno stesso LTS, piutto-

sto che tra stati di due LTS diversi, questo perché a volte ci servirà confrontare stati di unostesso LTS. Ovviamente, le definizioni si applicano facilmente a stati di due LTS in quantol’unione disgiunta di due LTS è ancora un LTS.

11.2 Relazioni forti

In questa sezione introdurremo alcune relazioni tra stati di LTS che trattano le azioni degliLTS tutte allo stesso modo, senza distinguere tra azioni esterne, ossia visibili, ed azioni interne.Pertanto, tali relazioni saranno definite su un LTS hQ,A, −→ i generico il cui insieme di azioniA non contiene azioni trattate in modo “speciale”.

Cominceremo con l’introdurre le seguenti tre equivalenze: a tracce, bisimilarità e testing.Esse ci forniranno dei criteri che ci permetteranno di eguagliare e/o distinguere, ad esempio,gli stati p, q ed r degli LTS della Figura 11.1. Vedremo infatti che i tre stati sono indistin-guibili per l’equivalenza a tracce, in quanto tutti in grado di eseguire le stesse sequenze diazioni, mentre sono distinti per la bisimilarità che è basata su un gioco di sfide reciprochein cui i sistemi procedono sfidandosi a vicenda sulla capacità di eseguire una determinataazione; l’equivalenza testing, invece, che considera le capacità di interazione e le potenzialità

di deadlock dei sistemi, eguaglia q ed r e li diff erenzia da p.Concluderemo con la definizione di alcuni preordini di raffinamento e con l’introduzio-

ne di altre equivalenze (tracce complete e doppia simulazione) ottenute come varianti delleequivalenze viste.

11.2.1 Equivalenza basata sulle tracce

Nella teoria dei linguaggi formali, esiste una ben precisa nozione di equivalenza per gli automia stati finiti. Si tratta dell’equivalenza dei linguaggi accettati che stabilisce che due automisono in relazione tra loro se accettano le stesse sequenze di simboli (si veda Sezione 3.4). NelCapitolo 3 abbiamo visto che, diff erentemente dagli automi, gli LTS non contengono “stati

Page 228: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 228/332

228 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

di accettazione”, quindi l’equivalenza dei linguaggi accettati non può essere applicata diret-tamente. Tuttavia, se supponiamo che ogni stato di un LTS è uno stato di accettazione,

allora il linguaggio accettato da un LTS è formato dalle sequenze di etichette, dette tracce ,di tutte le sequenze di transizioni che può eseguire. Quindi, nel caso dell’equivalenza a trac-ce, un’osservazione di un processo è una sequenza finita di azioni eseguita dal processo insuccessione.

Definizione 11.1 (Traccia). Siano hQ,A, −→ i un LTS, q ∈ Q e s ∈ A∗. La sequenza s è una traccia di q se esiste q 0 ∈ Q tale che q

s−→ q 0. Denoteremo con T (q ) l’insieme di tutte le tracce di q .

Definizione 11.2 (Equivalenza a tracce). Siano hQ,A, −→ i un LTS, p ∈ Q e q ∈ Q. Gli stati p e q sono detti equivalenti a tracce, scritto p =T q , se T ( p) = T (q ).

Si può notare che nelle definizioni precedenti non c’è distinzione tra azioni interne ed esterne;tutte possono apparire in una traccia e sono trattate allo stesso modo.

Sebbene semplice da definire, l’equivalenza a tracce =T risulta essere inadeguata per LTSnon deterministici, in cui cioè esiste perlomeno uno stato che ha due transizioni etichettatecon la stessa etichetta verso stati diff erenti tra loro, com’è illustrato dal seguente esempio.

Esempio 11.3. [Macchina distributrice di tè e caff è] Consideriamo una macchinadistributrice di tè e caff è il cui grafo delle transizioni sia il seguente:

p0

20¢

tea

20¢

coffee

A partire dallo stato p0, dopo aver inserito 20¢, si può ottenere un tè oppure si possono inserirealtri 20¢ e quindi ottenere un caff è; e così via. Consideriamo ora una variante della macchinail cui grafo delle transizioni sia il seguente:

q 0

20¢

tea

20¢ 20¢

coffee

L’insieme delle tracce a partire dagli stati p0 e q 0 è lo stesso; precisamente è l’insieme disequenze generate dalla seguente espressione regolare

Page 229: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 229/332

11.2 Relazioni forti 229

(20¢ · (tea + 20¢ · c offee))∗

o equivalentemente, per via della distributività, dall’espressione regolare

(20¢ · tea + 20¢ · 20¢ · c offee)∗.

Malgrado il fatto che i due stati p0 e q 0 siano equivalenti a tracce, è chiaro che essi, e quindile macchine corrispondenti, non sono equivalenti per un utente esterno. Questo perché laseconda macchina è non deterministica: dopo che ha ricevuto 20¢, si può trovare in uno statoin cui è solo possibile emettere tea (e non può più ricevere 20¢), oppure può essere in unostato in cui può solo accettare 20¢ (e non può emettere tea) per emettere c offee. È chiaroche un utente non sarà contento di avere a che fare con una macchina che si comporta inquesto modo dal momento che l’utente non avrebbe alcuna garanzia di ottenere la bevandaeff ettivamente desiderata.

Il problema sta quindi nel considerare equivalenti una macchina deterministica e una nondeterministica e, quindi, meno affidabile.

In conclusione, se siamo interessati al comportamento interattivo degli LTS, allora un LTSnon deterministico non può essere considerato equivalente ad uno deterministico. Il problemacon l’equivalenza a tracce e gli LTS non deterministici è che, anche quando due stati hannole stesse tracce, durante l’esecuzione delle stesse si possono incontrare stati non equivalenti,ossia stati con tracce diverse (come si vede nel caso degli LTS dell’esempio precedente). Ciònon succede per gli LTS deterministici.

Considerando sistemi che interagiscono con l’ambiente esterno, diventa importante sape-re, ad esempio, se certe interazioni avranno sempre luogo, oppure se esiste la possibilità di

raggiungere uno stato di deadlock , cioè uno stato da cui non è possibile eff ettuare azioni.Il comportamento riguardo al deadlock è in eff etti un’altra proprietà dei sistemi concorrentiche non è catturabile soddisfacentemente dall’equivalenza a tracce, come mostra il seguenteesempio.

Esempio 11.4. Si vede facilmente che gli stati p0 e q 0 dei due LTS

p0 p1 p2a b

q 0

q 3

q 1 q 2

a

a

b

sono in relazione =T , però p0 può sempre eseguire l’azione visibile b dopo aver eff ettuatol’azione a, mentre q 0 dopo aver eff ettuato l’azione a può raggiungere uno stato in cui non èpossibile eff ettuare alcuna azione.

Esempio 11.5. Consideriamo l’esempio dei tre LTS della Figura 11.1 di pagina 227. È facilevedere che tutti e tre gli LTS hanno il seguente insieme di tracce a partire, rispettivamente,dagli stati p, q ed r:

,a,ab,abc,abd

Pertanto, si ha p =T q =T r, come già anticipato.

Page 230: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 230/332

230 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

11.2.2 Bisimilarità forte

Le considerazioni della sezione precedente ci suggeriscono un modo per arricchire le osservazio-ni fatte sul comportamento degli LTS non deterministici: le sequenze di esecuzione dovrebbero “attraversare” stati equivalenti. Il forte potere discriminante delle relazioni ottenute in questomodo è dovuto proprio a questo loro carattere ricorsivo. In pratica, rispetto alla semanticaa tracce, nel caso della bisimilarità forte l’osservatore esterno, in qualsiasi momento duranteuna computazione del sistema osservato, può eff ettuare quante copie1 vuole del sistema nelsuo stato corrente ed osservarle indipendentemente in modo da osservare tutte le possibilicomputazioni a partire da quello stato. Quindi, il risultato di un’osservazione è ora un alberoanzicché una traccia.

Definizione 11.6 (Bisimulazione forte). Sia hQ,A, −→ i un LTS. Una relazione R ⊆ Q×Q è una bisimulazione forte se, dati p e q tali che

h p, q

i ∈R, le seguenti condizioni sono soddisfatte:

1. per ogni a ∈ A e p0 ∈ Q, se p a−→ p0 allora q

a−→ q 0 per qualche q 0 ∈ Q tale che h p0, q 0i ∈ R;

2. per ogni a ∈ A e q 0 ∈ Q, se q a−→ q 0 allora p

a−→ p0 per qualche p0 ∈ Q tale che h p0, q 0i ∈ R.

Intuitivamente, se due stati sono in relazione di bisimulazione forte, è possibile per ognunodei due simulare il comportamento dell’altro: da qui il termine bi simulazione. Più specifica-mente, perché una relazione sia una bisimulazione forte, gli stati in relazione fra loro devonoessere in grado di eseguire le stesse transizioni, muovendosi verso stati che sono ancora inrelazione fra loro. In pratica, ciò significa che una bisimulazione forte è una relazione chiusa per transizioni . Diremo che due stati sono equivalenti secondo la bisimulazione forte, o chesono bisimili, se esiste una bisimulazione forte fra di loro.

Definizione 11.7 (Bisimilarità). Sia hQ,A, −→ i un LTS. Due stati p, q ∈ Q sono fortemente bisimili, scritto p ∼ q , se esiste una bisimulazione forte R che contiene h p, q i.

In pratica, la relazione ∼, detta anche bisimilarità forte , è l’unione di tutte le possibilibisimulazioni. Cioè, formalmente, abbiamo

∼ ,[

R | R è una bisimulazione forte

Esempio 11.8. Consideriamo i due LTS seguenti.

q 0

q 1

q 2

q 3

q 4

a

a

b

c

p0 p1

p2

p3

a

b

c

Gli stati p0 e q 0 non sono fortemente bisimili. Se lo fossero anche gli stati p1 e q 1, in cui p0 eq 0 si trasformano dopo aver eff ettuato una transizione etichettata con a, dovrebbero esserlo,ma non c’è alcuna bisimulazione forte R che contiene la coppia h p1, q 1i. Infatti, la transizionedi p1 etichettata c non può essere simulata da q 1 che non è in grado di eff ettuare transizionietichettate c.

1In realtà questa è solo un’approssimazione del reale potere di osservazione richiesto, che va sotto il nomedi global testing e che non esploreremo oltre.

Page 231: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 231/332

11.2 Relazioni forti 231

Un ragionamento simile a quello dell’esempio precedente ci permette di distinguere i dueLTS dell’Esempio 11.3 (macchina distributrice di tè e caff è).

Esempio 11.9. Consideriamo di nuovo l’esempio dei tre LTS della Figura 11.1 di pagina227. È facile vedere che gli stati q e r non sono fortemente bisimili. Infatti, se fossero bisimili,altrettanto dovrebbero essere q 1 ed r1, dal momento che la transizione da r in r1 etichettataa non può essere simulata da q che con la transizione in q 1. Però, la transizione di q 1 in q 2etichettata b non può essere simulata dall’unica transizione di r1 in r3 dal momento che glistati q 2 ed r3 non possono essere bisimili in quanto hanno transizioni etichettate diversamente.

Con ragionamenti simili, si può dimostrare che gli stati p e q non sono fortemente bisimili.Infatti, se lo fossero, anche p1 e q 1 dovrebbero esserlo e quindi anche q 2 e p2, dal momentoche la transizione da q 1 a q 2 etichettata b non può che essere simulata dalla transizione da p1a p2. È chiaro però che gli stati p2 e q 2 non sono bisimili perché q 2 non è in grado di simularela transizione di p2 etichetta d.

In maniera analoga si prova che p ed r non sono fortemente bisimili.

Esempio 11.10. Si noti che abbiamo

a

a

b

b

a b

mentre i due LTS hanno ovviamente grafi di transizione non isomorfi.

Esempio 11.11. Vediamo ora un esempio più articolato. Consideriamo i due LTS seguenti.

p0

p1

p2

a

a

b

a

b

a

q 0

q 1

q 2

a

a

ba

Si ha p0 ∼ q 0. Per dimostrarlo, è sufficiente dimostrare che la relazione

R , h p0, q 0i, h p0, q 2i, h p1, q 1i, h p2, q 1i

è una bisimulazione forte. Possiamo anche rappresentare graficamente la relazione R diretta-mente sugli LTS mettendo in corrispondenza tra loro gli stati fortemente bisimili. Nella figurasottostante, tale corrispondenza è evidenziata tramite le linee tratteggiate

Page 232: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 232/332

232 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

p0

p1

p2

a

a

ba

b

a

q 0

q 1

q 2

a

a

ba

Le bisimulazioni e la bisimilarità hanno diverse proprietà interessanti. Dimostriamo dap-prima che la proprietà di essere una bisimulazione forte è preservata da alcune operazioni sullerelazioni (si rivedano eventualmente le definizioni di inversa e di composizione di relazionibinarie viste nella Sezione 2.2).

Proposizione 11.12. Si assuma che ogni S i, con i ∈ I , sia una bisimulazione forte e che I d

sia la funzione identità su Q. Allora le seguenti relazioni sono bisimulazioni forti.

1. Id

2. S −1i

3. S 1S 2

4. ∪i∈I S i

Dimostrazione. Dimostreremo solo la 3, le altre sono altrettanto semplici. Supponiamo dun-que che h p, ri ∈ S 1S 2. Supponiamo inoltre che p

a−→ p0 e facciamo vedere che ciò implica che,per qualche r 0, r

a−→ r 0 e h p0, r0i ∈ S 1S 2.

Per definizione di composizione tra relazioni binarie, per qualche q , si ha cheh p, q i ∈ S 1 ∧ hq, ri ∈ S 2

Allora, dal momento che h p, q i ∈ S 1 che è una bisimulazione, per qualche q 0 abbiamo che

q a−→ q 0 ∧ h p0, q 0i ∈ S 1

Inoltre, poiché hq, ri ∈ S 2 che è una bisimulazione, per qualche r 0 si ha che

r a−→ r 0 ∧ hq 0, r0i ∈ S 2

Da ciò segue anche che ( p0, r0) ∈ S 1S 2. In modo del tutto simile si dimostra che se supponiamoche r a−→ r 0, allora possiamo trovare un p 0 tale che p

a−→ p 0 e h p0, r0i ∈ S 1S 2.

Dimostriamo ora che la bisimilarità è la più grande tra le bisimulazioni e che è unaequivalenza.

Proposizione 11.13.

1. ∼ è la più grande bisimulazione forte;

2. ∼ è una relazione di equivalenza.

Dimostrazione. Dimostriamo i due asserti separatamente.

Page 233: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 233/332

11.2 Relazioni forti 233

1. Dalla Proposizione 11.12(4) si vede che l’unione di bisimulazioni forti è ancora unabisimulazione forte: dunque, anche

∼ lo è e include tutte le altre bisimulazioni.

2. Per dimostrare che ∼ è una relazione di equivalenza, cioè che è riflessiva, simmetrica etransitiva, ragioniamo come segue.Riflessività. Dalla Proposizione 11.12(1) segue che ∀ p ∈ Q p ∼ p.Simmetria. Se p ∼ q allora h p, q i ∈ S per qualche bisimulazione forte S . Allorahq, pi ∈ S −1 e, per la Proposizione 11.12(2), S −1 è una bisimulazione forte; quindiq ∼ p.Transitività. Se p ∼ q e q ∼ r allora h p, q i ∈ S 1 e hq, ri ∈ S 2 per qualche bisimulazioneforte S 1 ed S 2. Dunque h p, ri ∈ S 1S 2 e quindi p ∼ r per la Proposizione 11.12(3).

Infine, dimostriamo una proprietà di ∼ che nel seguito sarà talvolta usata al posto della

sua definizione per dimostrare che due stati sono fortemente bisimili.

Proposizione 11.14. Siano hQ,A, −→ i un LTS, p, q ∈ Q. Si ha p ∼ q se e solo se ∀a ∈ A

i) ∀ p0 ∈ Q : p a−→ p0 allora ∃q 0 ∈ Q : q

a−→ q 0 ∧ p0 ∼ q 0;

ii) ∀q 0 ∈ Q : q a−→ q 0 allora ∃ p0 ∈ Q : p

a−→ p0 ∧ p0 ∼ q 0.

Dimostrazione. Definiamo dapprima una nuova relazione, ∼0 in termini di ∼ nel modoseguente

p ∼0 q se per ogni a ∈ A risulta:

1. ∀ p ∈ Q : p a−→ p0 allora ∃q 0 ∈ Q : q a−→ q 0 ∧ p0 ∼ q 0;

2. ∀q ∈ Q : q a−→ q 0 allora ∃ p0 ∈ Q : p

a−→ p 0 ∧ p0 ∼ q 0.

Dalla Proposizione 11.13(1), sappiamo che ∼ è una bisimulazione forte; dalle definizioni dibisimulazione forte e di ∼0, possiamo allora dedurre che

p ∼ q implica p ∼0 q (11.1)

Rimane da dimostrare il viceversa, cioè che p ∼0 q implica p ∼ q . Per questo, è sufficientedimostrare che la relazione ∼0 è una bisimulazione forte. Procediamo come segue. Sia p ∼0 q e p

a

−→ p0. Dobbiamo trovare un q 0 tale che q

a

−→q 0 e p0

∼0 q 0. Per la definizione di

∼0 possiamo

trovare un q 0 tale che q a−→ q 0 e p0 ∼ q 0. Da (11.2) segue allora che p0 ∼0 q 0, e con questo siconclude la prova.

Come abbiamo visto negli esempi, la bisimulazione forte è provvista di una tecnica diprova piuttosto efficace: per dimostrare che due stati sono bisimili è sufficiente trovare unabisimulazione forte che contiene la coppia formata dai due stati. Tuttavia, ciò non è sempreagevole poiché tale relazione può avere un numero elevato di elementi.

Esempio 11.15. Definiamo un semplice semaforo binario come segue:

Sem , get.put.Sem

Page 234: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 234/332

234 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

dove get e put corrispondono alle tipiche operazioni P e V sui semafori originariamente usateda Dijkstra. Un tale semaforo è quindi una risorsa che può essere alternativamente acquisita

e rilasciata.Definiamo ora un semaforo più generale, cioè un semaforo n-ario (con n ≥ 1), che ammette

una qualsiasi sequenza di get e put purché il numero di get meno il numero di put rimanganell’intervallo tra 0 e n, estremi inclusi.

Semn(0) , get.Semn(1)

Semn(k) , get.Semn(k + 1) + put.Semn(k − 1) (0 < k < n)

Semn(n) , put.Semn(n − 1)

Indichiamo ora con S em(n) la composizione parallela di n semafori binari, cioè

Sem(n)

, Sem | Sem | . . . | Sem

Intuitivamente, ogni get su Sem(n) acquisisce uno qualsiasi dei semafori binari liberi checompongono S em(n). Ci aspettiamo così di poter dimostrare che

Semn(0) ∼ Sem(n)

Per esempio, consideriamo il caso n = 2, e dimostriamo che Sem2(0) ∼ Sem(2). A tale sco-po, è sufficiente trovare una bisimulazione forte R che contenga la coppia hSem2(0),Sem(2)i.In eff etti, consideriamo la seguente relazione

R , hSem2(0),Sem | Semi, hSem2(1),Sem0 | Semi,

hSem2(1),Sem | Sem0i, hSem2(2),Sem0 | Sem0i

dove Sem0 , put.Sem. Si noti che la seconda e la terza coppia hanno la stessa prima compo-nente, mentre le seconde componenti sono chiaramente fortemente bisimili, dal momento chela composizione parallela è commutativa. Perciò, una delle due coppie è “ridondante”. L’ideaè quindi che potremmo cercare un modo di evitare di dover eplicitamente considerare tutti glielementi di una bisimulazione che sono identici “up to” (a meno di) bisimilarità forte. Nell’e-sempio precedente il risparmio è minimo (una sola coppia), ma se consideriamo per esempioil caso n = 3 abbiamo che nella bisimulazione

R ,

hSem3(0),Sem | Sem | Sem

i,

hSem3(1),Sem0 | Sem | Semi, hSem3(1),Sem | Sem0 | Semi, hSem3(1),Sem | Sem | Sem0i,hSem3(2),Sem0 | Sem0 | Semi, hSem3(2),Sem | Sem0 | Sem0i, hSem3(2),Sem0 | Sem | Sem0i,hSem3(3),Sem0 | Sem0 | Sem0i

ci sono ben quattro coppie su otto che sono ridondanti! Le definizioni e le proposizioni cheseguono formalizzano tale idea.

Introduciamo allora la nozione di bisimulazione forte up to ∼ che ci permetterà di renderepiù efficiente la tecnica di prova della bisimulazione forte. Ricordiamo che se R è una relazionebinaria tra stati, la notazione ∼ R ∼ indica la composizione delle relazioni binarie ∼ e R epoi di nuovo ∼; più specificamente, p ∼ R ∼ q significa che per qualche p0 e q 0 abbiamo che

p∼

p0, p0Rq 0, q 0 ∼

q .

Page 235: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 235/332

11.2 Relazioni forti 235

Definizione 11.16 (Bisimulazione forte up to ∼). Sia hQ,A, −→ i un LTS. Una relazione R

⊆ Q

×Q è una bisimulazione forte up to

∼ se, dati p e q tali che

h p, q

i ∈ R, le seguenti

condizioni sono soddisfatte

1. per ogni a ∈ A e p 0 ∈ Q, se p a−→ p 0 allora q

a−→ q 0 per qualche q 0 ∈ Q tale che h p0, q 0i ∈∼R ∼;

2. per ogni a ∈ A e q 0 ∈ Q, se q a−→ q 0 allora p

a−→ p0 per qualche p0 ∈ Q tale che h p0, q 0i ∈∼R ∼.

L’utilità della nozione di bisimulazione forte up to ∼ deriva dal fatto che per stabilire se p ∼ q è sufficiente trovare una qualche bisimulazione forte up to ∼ che contenga la coppiah p, q i; ciò è quanto asserito dalle seguenti proposizioni.

Proposizione 11.17. Se R è una bisimulazione forte up to ∼ allora ∼ R ∼ è una bisimulazione forte.

Dimostrazione. Supponiamo che p ∼ R ∼ q . Per simmetria, sarà sufficiente dimostrare chese p

a−→ p0 allora q a−→ q 0 e p0 ∼ R ∼ q 0. Poiché per ipotesi p ∼ R ∼ q , dalla definizione di

bisimulazione forte up to ∼ segue che per qualche p1 e q 1 abbiamo che p ∼ p1Rq 1 ∼ q . Ora,da p ∼ p1 e p

a−→ p0 segue che, per qualche p01, p1a−→ p 01 con p 0 ∼ p01. Dall’ipotesi che R è una

bisimulazione forte up to ∼, da p1Rq 1 e p1a−→ p01, segue che q 1

a−→ q 01 e p01 ∼ R ∼ q 01. Infine,da q 1 ∼ q e q 1

a−→ q 01 segue che, per qualche q 0, q a−→ q 0 e q 01 ∼ q 0. Concludendo, abbiamo che

q a−→ q 0 e p 0 ∼ p01 ∼ R ∼ q 01 ∼ q 0, e, quindi, la tesi.

Proposizione 11.18. Se R è una bisimulazione forte up to ∼

allora R⊆∼

.

Dimostrazione. Per la Proposizione 11.12(1), Id ⊆∼; dunque I d R I d = R ⊆∼ R ∼.Per la proposizione precedente, ∼ R ∼ è una bisimulazione forte, quindi, per laProposizione 11.13(1), abbiamo ∼ R ∼⊆∼, e la tesi segue per transitività.

Concludiamo l’argomento con alcune osservazioni. Si può dimostrare che sistemi forte-mente bisimili hanno lo stesso comportamento da un punto di vista del deadlock, cioè lostesso potenziale di deadlock; nella Sezione 13.4, definiremo una particolare logica modale,chiamata Hennessy-Milner Logic (HML), che permette la formulazione di semplici proprietàdei sistemi, e la useremo per rendere precisa questa aff ermazione. Inoltre, ∼ ha algoritmi diverifica molto efficienti che lavorano in tempo polinomiale rispetto alle dimensioni del LTS da

verificare. Nel prossimo capitolo, dimostreremo che ∼ è una congruenza per il CCS.

11.2.3 Equivalenze basate su testing

Sebbene sistemi fortemente bisimili abbiano lo stesso potenziale di deadlock, il contrario nonè vero, cioè, in generale, sistemi aventi lo stesso comportamento riguardo al deadlock possononon essere bisimili. Si può quindi dire che la bisimilarità forte è eccessivamente sensibile allediff erenze non osservabili della struttura ramificata (branching) dei sistemi. Ciò è testimoniatodal fatto che gli stati q e r dell’esempio di Figura 11.1 non sono bisimili. Sostanzialmenteciò succede perché r non è sempre in grado, dopo aver fatto a, di eff ettuare la sequenza b · c,mentre q lo è. Tuttavia, non sarebbe necessario doverli distinguere, perché per entrambi lascelta tra le azioni c e d è nondeterministica, cioè non controllabile, mentre il potenziale di

Page 236: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 236/332

236 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

deadlock è lo stesso. La diff erenza tra i due LTS risiede nel momento in cui la scelta vienefatta. Ciò si riflette sulla diversa struttura branching dei due LTS ma non è di interesse

da parte di un osservatore esterno che può solo interagire con gli LTS (quindi, controllare ilcomportamento riguardo il deadlock) e non può invece osservarne la struttura interna.

In questa sezione, definiremo una equivalenza che tiene conto di queste considerazioni (equindi eguaglia gli stati q ed r). A questo scopo utilizzeremo l’approccio ‘testing’ che è basatosu una nozione esplicita di osservatore che esegue dei test sui sistemi sotto osservazione e neesamina l’esito. In questo scenario, risulta importante non soltanto sapere se, dato un parti-colare test, un processo risponde positivamente oppure no, ma anche se il processo rispondein maniera consistente ogni volta che il test viene eseguito. Più specificamente, possiamopensare ad un insieme di sistemi e ad un insieme di test; due sistemi saranno equivalenti(rispetto a questo insieme di test) se superano esattamente gli stessi test. Questa naturaleequivalenza può essere espressa tramite altre due equivalenze tra sistemi: la prima formulata

in termini dell’abilità di rispondere positivamente ad un particolare test , la seconda in terminidell’incapacità di non rispondere positivamente ad un particolare test ; nell’ultimo caso vedre-mo come un processo p sia equivalente ad un processo q se, per ogni test a cui p rispondepositivamente, anche q risponde positivamente, e viceversa. Attraverso la congiunzione diqueste due equivalenze se ne otterrà una terza.

Supponiamo di dover confrontare LTS le cui azioni appartengono ad uno stesso insieme A(dati degli LTS qualsiasi, è semplice ricondursi a questa situazione, basta prendere l’unionedegli insiemi di azioni degli LTS in considerazione). Un osservatore è un LTS il cui insiemedi azioni è Aw , A ∪ w, con w 6∈ A; in pratica, un osservatore esegue dei test su un LTS edeff ettua l’azione visibile w quando il LTS sotto esame passa con successo un test. Nel seguito,indichiamo con O l’insieme degli osservatori. Per determinare se uno stato q soddisfa o no un

osservatore o si considera l’insieme Comp(q, o) delle computazioni dalla configurazione inizialehq, oi e si determina l’esito di ogni computazione c.

Definizione 11.19 (Computazione). Dati due LTS hQ,A, −→ i e hO, Aw, −→ i e presi due stati q ∈ Q e o ∈ O, una computazione c dalla configurazione iniziale hq, oi è una sequenza di configurazioni hq i, oii, con i ≥ 0, cioè di coppie di stati, tale che

1. hq 0, o0i coincide con hq, oi;

2. tra due configurazioni consecutive, diciamo hq i, oii e hq i+1, oi+1i, si può derivare una transizione hq i, oii a−→ hq i+1, oi+1i usando la seguente regola d’inferenza

E a

−→ E 0 F

a

−→ F 0

a ∈ AhE, F i a−→ hE 0, F 0i

3. se la sequenza è finita allora l’ultimo elemento, diciamo hq k, oki, è tale che per nessun a ∈ A e per nessuna configurazione hq 0, o0i, con q 0 ∈ Q e o0 ∈ O, sia possibile derivare una transizione hq k, oki a−→ hq 0, o0i usando la regola precedente.

Indichiamo con Comp(q, o) l’insieme di tutte le computazioni dalla configurazione iniziale hq, oi.

Definizione 11.20 (Esito di una computazione).Una computazione c ∈ Comp(q, o) ha successo se esiste una configurazione hq n, oni ∈ c, con n

≥0, tale che on

w

−→ .

Page 237: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 237/332

11.2 Relazioni forti 237

Definizione 11.21 (Soddisfacimento di un osservatore).

i) q may satisfy o se esiste una computazione c ∈ Comp(q, o) che ha successo;

ii) q must satisfy o se ogni computazione c ∈ Comp(q, o) ha successo.

A questo punto possiamo introdurre l’equivalenza may e l’equivalenza must .

Definizione 11.22 (Equivalenze may e must).

may: Dati p, q ∈ Q diremo che p è equivalente may a q , scritto p 'm q , se per ogni o ∈ O si ha p may satisfy o se e solo se q may satisfy o;

must: Dati p, q ∈ Q diremo che p è equivalente must a q , scritto p 'M q se per ogni o ∈ Osi ha p must satisfy o se e solo se q must satisfy o.

Possiamo ora definire l’equivalenza di testing in termini delle due appena introdotte.

Definizione 11.23 (Equivalenza testing). Dati p, q ∈ Q diremo che p è equivalente testinga q , scritto p 'test q , se p 'm q e p 'M q .

Esempio 11.24. Consideriamo l’esempio della Figura 11.1. È facile dimostrare che gli stati p e q non sono must equivalenti (e quindi neanche test equivalenti). A tale scopo è sufficientetrovare un osservatore che li distingue. Un tale osservatore è il processo o , a.b.c.w. Infattisi ha p must satisfy o, ma q must satisfy o non vale dato che esiste una computazione daq | o che porta nello stato d | c.w.

Difficile invece risulta dimostrare la must equivalenza di q e r dato che l’insieme degliosservatori da considerare è infinito. Stesso discorso vale per la dimostrazione che tutti e tregli stati sono may equivalenti. Nella sezione successiva definiremo delle tecniche di prova al-ternative per le varianti deboli delle equivalenze testing; tecniche simili possono essere definiteper le equivalenze introdotte in questa sezione.

Concludendo, le equivalenze definite seguendo l’approccio basato sul testing sono difficilida verificare. Infatti, risulta relativamente semplice dimostrare che due LTS non sono inuna certa relazione (basta trovare un controesempio), mentre diventa assai più complicato, ocomunque lungo e tedioso, verificare che due LTS sono in relazione (bisogna infatti prenderein considerazione tutti i possibili osservatori e le risultanti osservazioni).

11.2.4 Preordini di raffinamento

In questa sezione introdurremo alcuni preordini di raffinamento e studieremo le relazioni trai loro nuclei e le equivalenze viste finora.

Preordine basato sulle tracce

Il primo preordine è definito in termini della relazione di contenimento tra insiemi di tracce.

Definizione 11.25 (Preordine basato sulle tracce). Siano hQ,A, −→ i un LTS, p, q ∈ Q. Si dice che p è minore rispetto alle tracce di q , scritto p

vT q , se T ( p)

⊆T (q ).

Page 238: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 238/332

238 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

Chiaramente, bisogna dimostrare che la relazione vT è un preordine.

Proposizione 11.26. vT è un preordine.

Dimostrazione. Bisogna far vedere che vT è riflessiva e transitiva. Per la riflessività si trattadi dimostrare che T (q ) vT T (q ) per ogni q ∈ Q, e ciò segue dal fatto che T (q ) ⊆ T (q ) (cioè dalfatto che la relazione tra insiemi ⊆ è riflessiva). Per la transitività si tratta di dimostrare cheT ( p) vT T (q ) e T (q ) vT T (r) implicano T ( p) vT T (r), e ciò segue dal fatto che la relazione⊆ è transitiva.

È immediato verificare che il nucleo (si veda la Definizione 2.5) del preordine appena definitocoincide con l’equivalenza a tracce.

Proposizione 11.27. Siano

hQ,A,

−→ i un LTS, p, q

∈Q. Si ha p =T q se e solo se p

vT q

e q vT p.

Preordine di simulazione

Informalmente, dire che “q simula p”, o che “ p è simulato da q ”, significa che il modello dicomportamento di q è almeno altrettanto ricco quanto quello di p. La definizione formale ditale relazione è la seguente.

Definizione 11.28. Sia hQ,A, −→ i un LTS. Una relazione R ⊆ Q × Q è una simulazionese, dati p, q ∈ Q tali che h p, q i ∈ R, vale la seguente condizione:

per ogni a ∈

A e p0 ∈

Q, se p a

−→ p0 allora q

a

−→ q 0 per qualche q

0 ∈ Q tale che

h p0, q 0i ∈ R.

Diremo che q simula p, scritto p v q , se esiste una simulazione R tale che h p, q i ∈ R.

Non è difficile dimostrare il seguente risultato.

Proposizione 11.29. v è un preordine.

Esempio 11.30. Riprendiamo l’Esempio 11.8 di pagina 230. È facile dimostrare che p0simula q 0. Infatti, a tale scopo, è sufficiente definire una relazione binaria tra gli stati dei due

LTS che contenga la coppia hq 0, p0i e che sia una simulazione. Per esempio, una tale relazioneè la seguente:R , hq 0, p0i, hq 1, p1i, hq 2, p1i, hq 3, p2i, hq 4, p3i

La seguente proposizione evidenzia il legame esistente tra il concetto di bisimulazione equello di simulazione.

Proposizione 11.31 (Definizione alternativa di bisimulazione).Sia hQ,A, −→ i un LTS. Una relazione R ⊆ Q × Q è una bisimulazione se e solo se R e R−1

sono simulazioni.

La dimostrazione è lasciata come esercizio.

Page 239: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 239/332

11.2 Relazioni forti 239

Preordini basati su testing

Basandoci sul concetto di soddisfacimento di un osservatore, possiamo introdurre i seguentitre preordini: preordine may , preordine must e preordine test .

Definizione 11.32 (Preordini di testing). Siano hQ,A, −→ i e hO, Aw, −→ i due LTS, p, q ∈ Qe o ∈ O. Scriveremo

p vm q se, per ogni o ∈ O, p may satisfy o implica q may satisfy o;

p vM q se, per ogni o ∈ O, p must satisfy o implica q must satisfy o.

p vtest q se p vm q e p vM q ;

È evidente dalla definizione che le relazioni equivalenza may, equivalenza must edequivalenza test sono in eff etti i nuclei dei preordini appena definiti.

Proposizione 11.33. Siano hQ,A, −→ i un LTS, p, q ∈ Q. Si ha

p 'm q se, e solo se, p vm q e q vm p;

p 'M q se, e solo se, p vM q e q vM p;

p 'test q se, e solo se, p 'm q e p 'M q .

Esempio 11.34. Riprendiamo l’Esempio 11.8 di pagina 230. È facile dimostrare che p0 6v

M

q 0; infatti, preso l’osservatore o , a.b.w si ha p0 must satisfy o, ma q 0 must satisfy o nonvale dato che esiste una computazione che parte da q 0 | o e porta nello stato c | b.w.

Con tecniche simili a quelle che introdurremo nella sezione successiva a proposito dellevarianti deboli dei preordini testing, si può dimostrare che q 0 vM p0, q 0 'm p0 e, quindi,q 0 vtest p0.

11.2.5 Altre equivalenze forti

Equivalenza a tracce complete

Un modo per raffinare le osservazioni su cui si basa l’equivalenza a tracce consiste nel tenerconto separatamente delle tracce finite di uno stato che portano lo stato in uno stato terminale.In pratica, oltre che una sequenza di azioni, si tratta di osservare se questa porta in uno statodi deadlock.

Definizione 11.35 (Traccia completa). Siano hQ,A, −→ i un LTS, q ∈ Q e s ∈ A∗. La sequenza s è una traccia completa di q se esiste q 0 tale che q

s−→ q 0 e q 0 6a−→ per qualsiasi a ∈ A. Denoteremo con CT (q ) l’insieme di tutte le tracce complete di q .

Definizione 11.36 (Equivalenza a tracce complete). Siano hQ,A, −→ i un LTS, q ∈ Q e s ∈ A∗. Gli stati p e q si dicono essere equivalenti a tracce complete, scritto p =CT q , se T ( p) = T (q ) e C T ( p) = CT (q ).

Page 240: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 240/332

240 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

Si noti che se non si richiedesse anche T ( p) = T (q ) nella definizione di p =CT q , cioè se sidefinisse “ p =CT q se C T ( p) = C T (q )”, =CT non sarebbe un raffinamento di =T . Infatti, ad

esempio, gli LTS seguenti hanno le stesse tracce complete ma non hanno le stesse tracce.

a

b

b

a

Dalla definizione di =CT si ottiene banalmente che se due stati sono in relazione =CT

allora essi sono sicuramente equivalenti a tracce. Però il contrario non è sempre vero, cometestimonia l’Esempio 11.4 di pagina 229: si ha infatti p0 =T q 0 e p0 6=CT q 0 poiché gli stati

p0 e q 0 hanno le tracce ε, a e ab, ma q 0 ha la traccia completa a che non appartiene a p0 (il

quale dopo a può sempre fare b).Tuttavia, anche questa equivalenza non è del tutto soddisfacente da un punto di vistadell’interazione con l’ambiente esterno. Difatti, si ha p0 =CT q 0 dove p0 e q 0 sono gli stati ini-ziali delle due descrizioni della macchina distributrice di tè e caff è dell’Esempio 11.3 di pagina228 (infatti abbiamo CT ( p0) = C T (q 0) = ∅). Questo perché, come nel caso dell’equivalenzabasata sulle tracce, vale ancora il fatto che stati di un LTS non deterministico che hannole stesse tracce complete possono passare, durante l’esecuzione delle stesse, attraverso statiaventi tracce diff erenti (come lo stesso esempio testimonia).

Doppia simulazione

Introduciamo ora il nucleo della relazione di simulazione.

Definizione 11.37 (Doppia simulazione). La doppia simulazione, denotata con ', è il nucleodel preordine di simulazione (quindi, ' , v ∩ v−1).

Dato che la bisimilarità è l’unione di tutte le bisimulazioni e che una relazione è una bisi-mulazione se essa stessa e la sua inversa sono simulazioni (vedere Proposizione 11.31), risultanaturale chiedersi quale sia la relazione tra ∼ e '. In eff etti si ha che ∼ implica ', cioè “ pè bisimile a q ” implica “ p simula q ” e “q simula p” (perché ovviamente ogni bisimulazione èuna simulazione ed è inoltre simmetrica). Il contrario però non vale! Per esempio, conside-riamo gli LTS dell’Esempio 11.4 di pagina 229. Non è difficile dimostrare che la relazioneR1 = h p0, q 0i, h p1, q 1i, h p2, q 2i è una simulazione, e quindi q 0 simula p0, e che la relazioneR2 = hq 0, p0i, hq 1, p1i, hq 2, p2i, hq 3, p1i è una simulazione, e quindi p0 simula q 0. Perciò,

p0 ' q 0. D’altro canto, q 0 è meno affidabile di p0 perché ha più possibilità di andare indeadlock, quindi, per quanto detto sulla bisimulazione, ci aspettiamo che p0 6∼ q 0. In eff etti,una ipotetica relazione di bisimulazione R che contenga la coppia h p0, q 0i, dovrebbe anchecontenere la coppia h p1, q 3i, dato che alla transizione q 0

a−→ q 3, p0 può solo replicare con la

transizione p0a−→ p1. Però, q 3 è incapace di rispondere alla transizione p1

b−→ p2 che p1 puòeff ettuare; quindi R non potrebbe soddisfare la definizione di bisimulazione.

11.3 Relazioni deboli

In questa sezione introdurremo le seguenti equivalenze di tipo debole: a tracce deboli, bisi-mulazione debole, bisimulazione di branching, testing ed equivalenza basata sui fallimenti.

Page 241: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 241/332

11.3 Relazioni deboli 241

Ricordiamo che tali equivalenze trattano in maniera speciale l’azione interna τ degli LTS esaranno quindi definite su un LTS del tipo

hQ, Aτ ,

−→ i con Aτ , A

∪τ . La sezione con-

clusiva esaminerà, in particolare, il trattamento dei processi con comportamento divergente(cioè capaci di eseguire sequenze infinite di azioni interne) da parte delle equivalenze debolied introdurrà alcune semplici varianti delle relazioni viste (quali, ad esempio, fair testing).

Esempio 11.38. Consideriamo la seguente specifica di una macchina distributrice di caff è,la quale, dopo l’inserimento di una moneta, e prima della produzione del caff è, si occupa dimacinarne i grani.

p0coin grinding coffee

Le azioni interne necessarie alla macchina per produrre il caff è non dovrebbero tuttavia essereosservabili da un utente esterno. Quindi, il comportamento della macchina da un punto divista delle interazioni con l’ambiente esterno dovrebbe essere quello specificato dal seguenteLTS.

q 0coin coffee

In eff etti, un tale comportamento può essere approssimato modificando il LTS iniziale, adesempio tramite l’applicazione dell’operatore di hiding visto nel capitolo precedente, perastrarre dall’azione di macinatura del caff è. Si ottiene così il seguente LTS.

p0coin τ coffee

Però, gli stati p0 e q 0 dei due LTS non sono equivalenti rispetto a nessuna delle nozioniesaminate nella sezione precedente, anche se, osservandone il comportamento dall’esterno, emettendosi nell’ottica che τ non è osservabile, non è possibile individuare delle diff erenze. Ilproblema è che nessuna delle equivalenze forti viste nella sezione precedente tiene conto dellaparticolare natura delle azioni interne.

11.3.1 Equivalenza basata sulle tracce deboli

Definiamo ora la variante debole dell’equivalenza a tracce. Si ricordi, dal Capitolo 10, cheq

s=⇒ q 0 indica che lo stato q può trasformarsi nello stato q 0 tramite l’esecuzione di una sequenza

s di azioni visibili ciascuna delle quali può essere preceduta e seguita da un qualsiasi numerodi azioni interne τ .

Definizione 11.39 (Traccia debole). Siano hQ, Aτ , −→ i un LTS, q ∈ Q e s ∈ A∗. La sequenza s è una traccia debole di q se esiste q 0 tale che q

s=⇒ q 0. Denoteremo con L(q )

l’insieme di tutte le tracce deboli di q .

Definizione 11.40 (Equivalenza a tracce deboli). Siano hQ, Aτ , −→ i un LTS, p ∈ Q e q ∈ Q.Gli stati p e q si dicono equivalenti a tracce deboli, scritto p ≈L q , se L( p) = L(q ).

Page 242: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 242/332

242 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

11.3.2 Bisimulazione debole

Per diminuire la sensibilità alle azioni interne rispetto alla bisimulazione forte, la bisimulazionedebole considera l’azione interna in modo speciale per cui, quando un sistema eff ettua un’a-zione interna, l’altro sistema può rispondere eff ettuando un numero qualsiasi (anche nullo) diazioni interne. Introduciamo prima una notazione tecnica.

Definizione 11.41. Sia hQ, Aτ , −→ i un LTS. Se s ∈ (Aτ )∗ allora con s ∈ A∗ indichiamo la

sequenza (eventualmente vuota) di azioni visibili ottenuta cancellando tutte le occorrenze di τ

da s.

Intuitivamente, s rappresenta il “contenuto visibile” (cioè gli elementi diversi da τ ) dellasequenza s e può essere definita induttivamente sulla lunghezza di s. In particolare, dataµ

∈Aτ , abbiamo

µ = se µ = τ µ se µ 6= τ

Adesso è possibile definire la bisimulazione debole come segue.

Definizione 11.42 (Bisimulazione debole). Sia hQ, Aτ , −→ i un LTS. Una relazione R ⊆Q × Q è una bisimulazione debole se, dati p e q tali che h p, q i ∈ R, le seguenti condizioni sono soddisfatte:

1. per ogni µ ∈ Aτ e p0 ∈ Q, se p µ−→ p0 allora q

µ=⇒ q 0 per qualche q 0 ∈ Q tale che

h p0, q 0i ∈ R;

2. per ogni µ ∈ Aτ e q 0 ∈ Q, se q µ

−→ q 0 allora p µ

=⇒ p0 per qualche p0 ∈ Q tale che hq 0, p0i ∈ R.

Due stati p e q sono debolmente bisimili, o osservazionalmente equivalenti, scritto p ≈ q , se esiste una bisimulazione debole R che contiene h p, q i. La bisimilarità debole o equivalenzaosservazionale, ≈, è l’unione di tutte le bisimulazioni deboli. In modo equivalente, possiamoscrivere:

≈ ,[

R | R è una bisimulazione debole

Esempio 11.43. Consideriamo di nuovo l’Esempio 11.38. Non è difficile rendersi conto che

gli stati p0 e q 0 dei due LTS sono osservazionalmente equivalenti.

Dimostriamo ora proprietà analoghe a quelle dimostrate per le bisimulazioni a labisimilarità forti anche per le corrispondenti relazioni deboli.

Proposizione 11.44. Si assuma che ogni S i, con i ∈ I , sia una bisimulazione debole e che Id sia la funzione identità su Q. Allora le seguenti relazioni sono bisimulazioni deboli.

1. Id

2. S −1i

3. S 1S 2

Page 243: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 243/332

11.3 Relazioni deboli 243

4. ∪i∈I S i

Dimostrazione. La dimostrazione si svolge in modo simile a quanto fatto in precedenza per labisimulazione forte (Proposizione 11.12). Nel punto 3 abbiamo bisogno del seguente semplice

risultato: se hq, ri ∈ S 2 e q µ=⇒ q 0 allora, per qualche r 0, r

µ=⇒ r 0 e (q 0, r0) ∈ S 2.

Proposizione 11.45.

1. ≈ è la più grande bisimulazione debole;

2. ≈ è una relazione di equivalenza.

Dimostrazione. La dimostrazione segue le argomentazioni usate nella Proposizione 11.13,utilizzando però la Proposizione 11.44 anzicché la Proposizione 11.12.

Proposizione 11.46. Siano hQ, Aτ , −→ i un LTS, p, q ∈ Q. Si ha p ≈ q se, e solo se,∀µ ∈ Aτ

i) ∀ p0 ∈ Q : p µ−→ p0 allora ∃q 0 ∈ Q : q

µ=⇒ q 0 ∧ p0 ≈ q 0;

ii) ∀q 0 ∈ Q : q µ−→ q 0 allora ∃ p0 ∈ Q : p

µ=⇒ p0 ∧ p0 ≈ q 0.

Dimostrazione. Cominciamo col definire una nuova relazione, ≈0, in termini di ≈ nel modoseguente

p ≈0 q se per ogni µ ∈ Aτ risulta:

1. ∀ p0 ∈ Q : p µ−→ p 0 allora ∃q 0 ∈ Q : q

µ=⇒ q 0 ∧ p0 ≈ q 0;

2. ∀q 0 ∈ Q : q µ−→ q 0 allora ∃ p0 ∈ Q : p

µ=⇒ p 0 ∧ p0 ≈ q 0.

Dalla Proposizione 11.45(1) sappiamo che ≈ è una bisimulazione debole. Dalle definizioni dibisimulazione debole e di ≈0, possiamo allora dedurre che

p ≈ q implica p ≈0 q (11.2)

Rimane da dimostrare il viceversa, cioè che p

≈0 q implica p

≈ q . Per questo, è sufficiente

dimostrare che la relazione ≈0 è una bisimulazione debole. Procediamo come segue. Sia p ≈0 q e p

µ−→ p0. Dobbiamo trovare un q 0 tale che q µ=⇒ q 0 e p 0 ≈0 q 0. Per la definizione di ≈0

possiamo trovare un q 0 tale che q µ=⇒ q 0 e p0 ≈ q 0. Da (11.2) segue allora che p0 ≈0 q 0, e con

questo si conclude la prova.

Presentiamo ancora ulteriori proprietà di ≈ e cominciamo proprio dal caso emblematicoche la distingue da ∼, cioè il trattamento dell’azione τ .

Proposizione 11.47. Sia hQ, Aτ , −→ i un LTS e sia p ∈ Q. Si ha

p

≈ τ .p

Page 244: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 244/332

244 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

Dimostrazione. Dal momento che abbiamo mostrato l’uguaglianza di ≈ e ≈0 (introdotta nelladimostrazione della Proposizione 11.46), la tesi risulta dimostrata se proviamo che p

≈0 τ .p.

Dapprima consideriamo una transizione p µ−→ p0 di p: chiaramente τ .p τ −→ p µ−→ p0, quindiτ .p

µ=⇒ p0, e ovviamente p0 ≈ p 0. Consideriamo ora la sola transizione che τ .p può fare, ossia

τ .p τ −→ p: questa è chiaramente corrisposta dalla transizione nulla p

ε=⇒ p di p (dato che τ = ε).

Abbiamo dunque che p ≈0 τ .p e di conseguenza p ≈ τ .p.

Dimostriamo ora una proprietà che fornisce un criterio alternativo per poter stabilire cheuna data relazione è una bisimulazione debole.

Proposizione 11.48. Sia hQ, Aτ , −→ i un LTS. Una relazione R ⊆ Q×Q è una bisimulazione debole se, e solo se, dati p, q ∈ Q tali che h p, q i ∈ R ed s ∈ A∗, le seguenti condizioni sonosoddisfatte:

1. per ogni p0 ∈ Q, se p s=⇒ p0 allora q

s=⇒ q 0 per qualche q 0 ∈ Q tale che h p0, q 0i ∈ R;

2. per ogni q 0 ∈ Q, se q s=⇒ q 0 allora p

s=⇒ p0 per qualche p0 ∈ Q tale che hq 0, p0i ∈ R.

Dimostrazione. (⇒) Supponiamo che R sia una bisimulazione debole. Sia p s=⇒ p0, così che

p t−→ p 0 dove t = (µ1 . . . µn) ∈ A∗

τ e t = s. Allora p µ1−→ p1

µ2−→ · · · µn−→ p0 e dal momento che

R è una bisimulazione debole abbiamo che esiste q 0 ∈ Q tale che q µ1=⇒ q 1

µ2=⇒ · · ·

µn=⇒ q 0 e

p0 R q 0. Da ciò segue che q t=⇒ q 0, e quindi q

s=⇒ q 0. La tesi segue allora per simmetria.

(⇐) Supponiamo che p µ−→ p0. Se µ = τ allora p

ε=⇒ p0 e così dal punto 1 si ha q

ε=⇒ q 0 con

p0Rq 0; ma µ = ε, quindi q µ=⇒ q 0 come richiesto. Se µ 6= τ allora p µ=⇒ p0, e grazie al punto 1q

µ=⇒ q 0 con p0Rq 0; ma µ = µ e quindi q

µ=⇒ q 0 come richiesto. Anche in questo caso, la tesi

segue allora per simmetria.

Lo sviluppo di tecniche di prova che permettano di ridurre la cardinalità delle bisimulazionideboli con cui si lavora è almeno altrettanto importante quanto nel caso delle bisimulazioniforti. Nei sistemi reali infatti ci sono in generale molti stati che sono debolmente bisimili manon identici a causa della presenza di alcuni τ ; sarebbe tedioso trattarli come stati diff erentiquando si esibiscono delle bisimulazioni deboli. La nozione di bisimulazione debole up to ≈ èquindi anche più importante di quella di bisimulazione forte up to ∼. Tuttavia, nel caso della

bisimulazione debole, non è altrettanto semplice definire tecniche di prova ‘up to’ tipo quelleintrodotte per la bisimulazione forte. Si potrebbe infatti pensare di riadattare in manieraingenua la Definizione 11.16 come di seguito:

Sia hQ, Aτ , −→ i un LTS. Una relazione R ⊆ Q × Q è una bisimulazione debole upto ≈ se, dati p, q ∈ Q tali che h p, q i ∈ R, le seguenti condizioni sono soddisfatte:

1. per ogni µ ∈ Aτ e p0 ∈ Q, se p µ−→ p0 allora q

µ=⇒ q 0 per qualche q 0 ∈ Q tale

che h p0, q 0i ∈≈ R ≈;

2. per ogni µ ∈ Aτ e q 0 ∈ Q, se q µ−→ q 0 allora p

µ=⇒ p0 per qualche p0 ∈ Q tale

che h

q 0, p0

i ∈≈R

≈.

Page 245: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 245/332

11.3 Relazioni deboli 245

Il problema è però che ≈ R ≈ non è una bisimulazione debole, cioè ≈ R ≈6⊆≈. Quindi,per dimostrare che p

≈ q , non basterebbe trovare una bisimulazione debole up to

≈ R che

contenga la coppia h p, q i.Vediamo infatti un controesempio. Consideriamo gli stati p0 e q 0 dei seguenti due LTS

p0 q 0 q 1 q 2τ a

e definiamo la relazione R , h p0, q 0i. In base alla “definizione” precedente, R è una bi-simulazione debole up to ≈. Infatti, p0 non ha transizioni, quindi non c’è bisogno che q 0faccia alcuna transizione. Invece, q 0 ha una transizione etichettata τ nello stato q 1 a cui p0risponde senza muoversi; per cui otteniamo la coppia h p0, q 1i. Ora, poiché stiamo ragionandoup to ≈, e poiché q 1 ≈ q 0, possiamo richiedere che h p0, q 0i sia in R (che, per definizione, èvero), anzicché chiedere che lo sia

h p0, q 1

i. Quindi, R è una bisimulazione debole up to

≈, ma

chiaramente p0 e q 0 non sono bisimili.Il problema in eff etti è dovuto al fatto che le transizioni τ possono essere ignorate, come nel-

l’esempio precedente. La definizione “naturale” presentata in precedenza può essere modificataimponendo condizioni più restrittive che considerino µ-discendenti anzicché µ-derivate.

Definizione 11.49 (Bisimulazione debole up to ≈). Sia hQ, Aτ , −→ i un LTS. Una relazione R ⊆ Q × Q è una bisimulazione debole up to ≈ se, dati p e q tali che h p, q i ∈ R, le seguenti condizioni sono soddisfatte

1. per ogni µ ∈ Aτ e p0 ∈ Q, se p µ=⇒ p0 allora q

µ=⇒ q 0 per qualche q 0 ∈ Q tale che

h p0, q 0i ∈≈ R ≈;

2. per ogni µ ∈ Aτ e q 0 ∈ Q, se q µ=⇒ q 0 allora p

µ=⇒ p0 per qualche p0 ∈ Q tale che

h p0, q 0i ∈≈ R ≈.

Analogamente a quanto fatto per la bisimulazione forte up to ∼ si possono dimostrare(con tecniche simili) le seguenti proprietà, che ci autorizzano, dovendo dimostrare che p ≈ q ,a dimostrare più semplicemente l’esistenza di una bisimulazione debole up to ≈ R tale cheh p, q i ∈ R.

Proposizione 11.50. Se R è una bisimulazione debole up to ≈ allora ≈ R ≈ è una bisimulazione debole.

Proposizione 11.51. Se R è una bisimulazione debole up to ≈ allora R ⊆≈.

Un inconveniente nella definizione di bisimulazione debole up to ≈ è l’uso di µ=⇒ al

posto di µ−→ . Questo comporta la necessità di considerare non solo µ-derivate ma anche µ-

discendenti: i µ-discendenti potrebbero essere molto più numerosi delle µ-derivate e, talvolta,potrebbero addirittura essere infiniti. La seguente proposizione fornisce un criterio alternativoper stabilire se una relazione R è una bisimulazione debole up to ≈ che permette di consideraresolo µ-derivate a patto di raff orzare alcuni vincoli (richiedendo ∼ al posto di ≈, sebbene questarichiesta può a volte essere eccessiva [SM92]).

Proposizione 11.52. Sia hQ, Aτ , −→ i un LTS ed R ⊆ Q × Q. Se h p, q i ∈ R implica che per ogni µ

∈Aτ le seguenti condizioni sono soddisfatte

Page 246: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 246/332

246 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

1. se p µ−→ p0 allora, per qualche q 0 ∈ Q, q

µ=⇒ q 0 e h p0, q 0i ∈∼ R ≈

2. se q µ−→ q 0 allora, per qualche p0 ∈ Q, p µ=⇒ p0 e h p0, q 0i ∈≈ R ∼

allora R è una bisimulazione debole up to ≈.

Nel Capitolo 13, facendo uso della logica HML, vedremo che l’equivalenza osservazionale,anche se ignora le azioni interne, gode di un grado di sensibilità al deadlock simile a quellodella bisimulazione forte.

11.3.3 Bisimulazione di branching

Questa equivalenza si pone tra la bisimulazione forte e quella debole, in quanto da una parte

tratta le azioni interne in modo speciale (come fa la bisimulazione debole), dall’altra cercadi preservare la struttura di branching dei sistemi (come fa la bisimulazione forte) non igno-rando del tutto gli stati intermedi attraversati eff ettuando azioni interne. L’idea è quindi diindebolire le richieste fatte dalla bisimulazione forte, considerando il ruolo speciale rivestitodalle azioni interne, in modo da uguagliare LTS quali

a τ b a b

che sono invece diff erenziati da ∼, ed al contempo esaminare gli stati attraversati durantel’esecuzione di una sequenza di azioni interne, per diff erenziare LTS quali i seguenti

p0 p1

p2

p3 p4

a

c

τ

b

q 0

q 1

q 5

q 2

q 3

q 6

q 4

a

a

c

τ

b

b

che invece non sono diff erenziati da ≈.

Esercizio 11.53. Si considerino gli LTS precedenti e si dimostri che p0 e q 0 sonoosservazionalmente equivalenti. Suggerimento: si verifichi che la relazione

R , h p0, q 0i, h p1, q 1i, h p2, q 2i, h p3, q 3i, h p4, q 4i, h p3, q 5i, h p4, q 6i

è una bisimulazione debole.

Definizione 11.54 (Bisimulazione di branching). Sia hQ, Aτ , −→ i un LTS. Una relazione simmetrica R ⊆ Q × Q è una bisimulazione di branching se, dati p, q ∈ Q tali che h p, q i ∈ R

e p µ−→ p0, con µ ∈ Aτ e p0 ∈ Q, almeno una delle seguenti condizioni è soddisfatta:

1. µ = τ e h p0, q i ∈ R

2. q =⇒

q 00 µ

−→ q 0 per qualche q 0, q 00

∈Q tali che

h p, q 00

i ∈R e

h p0, q 0

i ∈R.

Page 247: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 247/332

11.3 Relazioni deboli 247

Gli stati p e q sono branching bisimili, scritto p ≈b q , se esiste una bisimulazione di branching R contenente

h p, q

i. La bisimilarità di branching,

≈b, è l’unione di tutte le bisimulazioni di

branching. In modo equivalente, possiamo scrivere:

≈b ,[

R | R è una bisimulazione di branching

Si noti che nel caso 2 della definizione, µ può anche essere τ . Quindi, se µ = τ , è sufficienteche una delle due condizioni sia soddisfatta, mentre se µ 6= τ , deve necessariamente esseresoddisfatta la seconda condizione.

Esempio 11.55. Consideriamo gli LTS precedenti e dimostriamo che p0 e q 0 non sonobranching bisimili. Il problema è dovuto alla transizione etichettata a da q 0 in q 5. Infatti, p0può rispondere soltanto eff ettuando a e andando in p1 (e non in p3 come invece permette la≈), ma p1 e q 5 non sono chiaramente branching bisimili poiché p1 ha una transizione c che q 5non ha.

La condizione 2 della Definizione 11.54, può essere espressa in vari modi alternativi tuttiequivalenti tra loro. In particolare, avremmo ottenuto la stessa relazione “raff orzando” (ap-parentemente) la condizione 2 richiedendo che tutti gli stati intermedi in q =⇒ q 00 siano inrelazione con p e permettendo che dopo q 00 a−→ q 0 si possa avere q 0 =⇒ q 000 con q 000, e tutti glistati intermedi, in relazione con p 0. Formalmente, la condizione è la seguente

2. q = q 1τ −→ q 2

τ −→ . . . τ −→ q n = q 00 µ−→ q 0 = q 01

τ −→ q 02τ −→ . . .

τ −→ q 0m = q 000 per certistati q i, q 0 j

∈ Q tali che

h p, q i

i ∈ R e

h p0, q 0 j

i ∈ R, per 1

≤ i ≤

n e 1 ≤

j ≤

m (con1 ≤ n, 1 ≤ m).

che graficamente è così rappresentabile

p p′

q 1 q 2 . . . q n q ′

1 q

2 . . . q

m

µ

τ τ τ µ τ τ τ

Quindi, riassumendo possiamo dire che la bisimulazione di branching considera due stati

equivalenti soltanto se hanno la stessa capacità di eseguire azioni e se gli stati intermedi,anche quelli raggiunti attraverso azioni interne, hanno comportamento equivalente.Si può dimostrare che l’unione di tutte le bisimulazioni di branching è la più grande

bisimulazione di branching e che essa è una equivalenza.

Proposizione 11.56.

1. ≈b è la più grande bisimulazione di branching;

2. ≈b è una relazione di equivalenza.

La dimostrazione è lasciata come esercizio.

Page 248: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 248/332

248 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

11.3.4 Relazioni basate su testing

Per definire le varianti ‘deboli’ delle relazioni basate sul testing, dobbiamo modificare la no-zione di computazione per permettere che una configurazione possa evolvere anche quando,in maniera asincrona, l’osservatore od il processo osservato eseguono una azione interna. Alsolito, supponiamo che w 6∈ Aτ sia un’azione speciale usata per indicare il successo di unesperimento. Indicheremo con Aτ w l’insieme Aτ ∪ w.

Definizione 11.57 (Computazione). Siano hQ, Aτ , −→ i e hO, Aτ w, −→ i due LTS e sianoq ∈ Q e o ∈ O. Una computazione c dalla configurazione iniziale hq, oi è una sequenza di configurazioni hq i, oii (con i ≥ 0), cioè una sequenza di coppie di stati, tale che

1. hq 0, o0i coincide con hq, oi;

2. tra due configurazioni consecutive, diciamo hq i, oii e hq i+1, oi+1i, si può derivare una transizione hq i, oii τ −→ hq i+1, oi+1i usando una delle seguenti regole d’inferenza

E τ −→ E 0

hE, F i τ −→ hE 0, F iF

τ −→ F 0

hE, F i τ −→ hE, F 0iE

a−→ E 0 F a−→ F 0

a ∈ AhE, F i τ −→ hE 0, F 0i

3. se la sequenza è finita allora l’ultimo elemento, diciamo hq k, oki, è tale che per nessu-na configurazione hq 0, o0i, con q 0 ∈ Q e o0 ∈ O, sia possibile derivare una transizione hq k, oki τ −→ hq 0, o0i usando una qualsiasi delle tre regole precedenti.

Indichiamo con Comp(q, o) l’insieme di tutte le computazioni dalla configurazione iniziale

hq, oi.

Le nozioni di ‘esito di una computazione’ (Definizione 11.20) e ‘soddisfacimento’ (Defi-nizione 11.21) di un osservatore restano invariate, così come pure le definizioni dei preordini(Definizione 11.32) e delle equivalenze (Definizioni 11.22 e 11.23), per i quali useremo gli stessisimboli. Quindi, l’unica diff erenza, è che le relazioni deboli sono basate sulla nuova nozionedi computazione.

Vediamo ora un paio di esempi che illustrano il tipo di relazioni indotte dalle definizioniprecedenti e i ragionamenti necessari per dimostrarle.

Esempio 11.58. Consideriamo i seguenti due LTS e dimostriamo che p1 'test q 1.

p1

p3

p2 p4

a

τ

b

≃test q 1

q 2

q 3

q 5

q 4

q 6

τ

τ

a

b

b

Possiamo ragionare così. Dobbiamo dimostrare che p1 'm q 1 e p1 'M q 1.Cominciamo a dimostrare che p1 'm q 1. Supponiamo che, per un qualche osservatore o

si abbia p1 may satisfy o. Se o w=⇒ allora abbiamo anche q 1 may satisfy o; altrimenti, p1

may satisfy o implica che o o a=⇒

o 0 w=⇒

o o b=⇒

o00 w=⇒

, in entrambi i casi abbiamo q 1 may

Page 249: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 249/332

11.3 Relazioni deboli 249

satisfy o. Ragionando in maniera simile possiamo convincerci che q 1 may satisfy o implica p1 may satisfy o, per ogni osservatore o.

Dimostriamo ora che p1 'M q 1. Supponiamo che per un qualche osservatore o si abbia p1 must satisfy o. Se o

w−→ allora abbiamo anche q 1 must satisfy o. Altrimenti, cioè seo 6w−→ , p1 must satisfy o implica che per ogni o1 tale che o =⇒ o1 dobbiamo avere che o

esiste uno stato intermedio o0 tale che o0 w−→ , oppure o1b

=⇒ o2 ed esiste uno stato intermedioo0 tale che o0 w−→ , oppure o1

a−→ o2 ed esiste uno stato intermedio o0 tale che o0 w−→ . È facilevedere che in tutti i casi q 1 si comporta come p1 relativamente all’osservatore o. Ragionandoin maniera simile possiamo dimostrare l’implicazione inversa.

Quindi la tesi è dimostrata.

Esempio 11.59. Consideriamo i seguenti due LTS e dimostriamo che q 2 vtest p2.

p2a

⊒test

⊑test

q 2

. . .

a

τ

τ τ τ

Possiamo ragionare così. Dimostriamo dapprima che q 2 vm p2. Supponiamo che, per unqualche osservatore o, si abbia q 2 may satisfy o. Ciò implica che o

w=⇒ oppure o

a=⇒ o0 w

=⇒ ;in entrambi i casi abbiamo che p2 may satisfy o.

Dimostriamo ora che q 2 vM p2. Supponiamo che q 2 must satisfy o. Poiché q 2 puòeseguire una sequenza infinita di azioni interne, l’ipotesi q 2 must satisfy o implica che

o w−→ (altrimenti ci sarebbe una computazione, quella formata dalla sequenza infinita diazioni interne, lungo la quale l’osservatore non ha l’opportunità di eff ettuare azioni e, quindi,neanche l’opportunità di eff ettuare

w−→ ); perciò, si ha pure p2 must satisfy o. In eff etti,q 2 vM p2 vale anche se in q 2 sostituiamo a con una qualsiasi altra azione; così facendo però,q 2 vm p2, e quindi q 2 vtest p2, non vale più.

Dimostrare invece che p2 6vtest q 2 è più semplice perché basta esibire un controesempio.Per esempio, se consideriamo il seguente osservatore

oτ w

abbiamo che p2 must satisfy o ma non è vero che q 2 must satisfy o (per via della compu-tazione formata dalla sequenza infinita di azioni interne che q 2 può eff ettuare), quindi la tesiè dimostrata.

Abbiamo già detto, nel caso delle varianti forti delle relazioni testing, che esse sono difficilida verificare, ciò è anche testimoniato dai due esempi precedenti. Possiamo però definire unacaratterizzazione alternativa delle relazioni in modo da ovviare a questo inconveniente. Talecaratterizzazione è indipendente dalla nozione di osservatore ed è definita in termini dellesequenze di azioni che un LTS può eseguire e dell’insieme di azioni che un LTS deve accettare.Per esempio, per l’equivalenza testing, si tratterà di controllare che due LTS possano eseguirele stesse sequenze di azioni e che, dopo ogni sequenza lungo la quale non c’è divergenza (cioèpossibilità di eseguire sequenze infinite di azioni interne), possano scegliere la loro prossima

Page 250: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 250/332

250 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

azione dallo stesso insieme di azioni. Un ulteriore vantaggio della caratterizzazione alternativaè che essa permette un confronto più agevole con le altre equivalenze studiate.

In eff etti, la caratterizzazione alternativa del preordine may è data dal preordine vL

definito in termini di inclusione dei linguaggi.

Definizione 11.60. Siano hQ, Aτ , −→ i un LTS, p, q ∈ Q. Si dice che p è minore rispettoalle tracce deboli di q , scritto p vL q , se L( p) ⊆ L(q ).

Teorema 11.61 (Caratterizzazione alternativa di vm). Sia hQ, Aτ , −→ i un LTS e siano p, q ∈ Q. Si ha p vm q se e solo se p vL q .

Dimostrazione. Caso ‘se’. Supponiamo che p vL q e che p may satisfy o, dove o è unosservatore generico. L’ipotesi p may satisfy o significa che esiste s ∈ A∗ tale che p

s=⇒ e

o s w==⇒ ; in particolare ciò significa che s ∈ L( p). Pertanto, se per assurdo q may satisfy o

non valesse, dato che comunque o s w

==⇒ , avremmo che q 6s

=⇒ , cioè s 6∈ L(q ), che contradirebbel’ipotesi p vL q . Quindi dev’essere q may satisfy o, da cui segue che p vm q .

Caso ‘solo se’. Cominciamo col definire, per ogni sequenza s ∈ A∗, diciamo s = a1 · · · an

(n ≥ 0), il seguente osservatore “canonico” o(s):

o(s) ,

oi| 0 ≤ i ≤ n + 1,

ai| 1 ≤ i ≤ n ∪ w,

oiai+1−−→ oi+1| 0 ≤ i ≤ n − 1 ∪ on

w−→ on+1

che possiamo visualizzare graficamente nel modo seguente:

o(s) o1 o2 · · ·

on−1 on on+1

a1 a2 an w

Non è difficile dimostrare che vale la seguente proprietà:

p may satisfy o0 se e solo se s ∈ L( p). (11.3)

Supponiamo ora che p vm q e s ∈ L( p). Dall’ipotesi che s ∈ L( p) e dalla proprietà precedentesegue che p may satisfy o0. Dall’altra ipotesi, segue allora che q may satisfy o0. Applicandonuovamente la Proprietà (11.3) si ha che s ∈ L(q ) e, quindi, la tesi.

Una banale conseguenza del teorema precedente è che l’equivalenza may 'm coincide conquella a tracce deboli, cioè ≈L (se veda Definizione 11.40).

La caratterizzazione alternativa del preordine must non è così diretta come la precedentee fa uso delle seguenti definizioni ausiliarie.

Definizione 11.62. Siano hQ, Aτ , −→ i un LTS, q ∈ Q, s ∈ A∗, Q0 ⊆ Q e L ⊆f A (cioè Lsottoinsieme finito di azioni visibili).

• q diverge, scritto q ⇑, se esiste una sequenza infinita di stati q 0, q 1, . . . tale che q = q 0 e q i

τ → q i+1 per ogni i ≥ 0.

• q diverge su s, scritto q ⇑ s, se esiste un prefisso s0 (eventualmente vuoto) di s ed un

q 0 ∈ Q tale che q s0=⇒ q 0 e q 0 ⇑. Scriviamo q ⇓ s se q ⇑ s non è vera e in questo caso

diciamo che q converge su s.

Page 251: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 251/332

11.3 Relazioni deboli 251

• q è totalmente convergente se q ⇓ s0 è vera per ogni s0 ∈ A∗.

( q after s) , q 0 ∈ Q | q s

=⇒ q 0 è l’insieme degli stati che q può raggiungere dopo aver e ff ettuato s ∈ A∗ ed un numero qualsiasi di azioni invisibili.

• ( q must L) se per ogni stato q 0 ∈ Q tale che q =⇒ q 0 esiste a ∈ L tale che q 0 a=⇒ .

• ( Q0 must L) se per ogni stato q 0 ∈ Q0 si ha q 0 must L.

Quindi, uno stato è divergente se può eseguire una sequenza infinita di azioni interne,ignorando in tal modo il suo ambiente; uno stato diverge su s se, durante l’esecuzione di s,può raggiungere uno stato divergente.

A questo punto possiamo introdurre la caratterizzazione alternativa del preordine must .

Definizione 11.63. SianohQ, Aτ ,

−→ iun LTS, p, q

∈Q. Si pone p 4M q se per ogni s

∈A∗e per ogni L ⊆f A si ha che p ⇓ s implica:

1. q ⇓ s;

2. (( p after s) must L) implica (( q after s) must L).

Il vantaggio di questa caratterizzazione alternativa è che la complessità di dimostrare chedue stati sono equivalenti si riduce drasticamente in quanto si riducono le sequenze di azionida considerare. Intanto, dalla definizione del preordine, è evidente che per dimostrare che

p 4M q , vanno considerate solo le sequenze s lungo le quali p non diverge. In tal caso, laseguente proprietà ci dice che se p vM q allora anche q non diverge lungo s e se s è una tracciadi q lo è anche di p.

Lemma 11.64. Siano hQ, Aτ , −→ i un LTS, p, q ∈ Q. Se p vM q allora, per ogni s ∈ A∗, p ⇓ s implica

1. q ⇓ s e

2. s ∈ L(q ) implica s ∈ L( p).

Dimostrazione. 1. Ragioniamo per assurdo. Supponiamo che esista una sequenza s ∈ A∗,diciamo s = a1 · · · an, tale p ⇓ s e q ⇑ s. Allora, se prendiamo l’osservatore

o , oi| 0

≤i

≤n

∪of , ow,

ai| 1 ≤ i ≤ n ∪ τ , w,oi

τ −→ ow, oiai+1−−→ oi+1| 0 ≤ i ≤ n − 1 ∪ on

τ −→ ow, oww−→ of

che possiamo visualizzare graficamente nel modo seguente

o0

ow of

o1 o2 · · · on−1 on

τ

τ

τ τ τ

w

a1

a2 an

Page 252: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 252/332

252 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

abbiamo p must satisfy o0 mentre q must satisfy o0 è falso, cioè p 6vM q . Ciòcontraddice l’ipotesi p

vM q , quindi dev’essere q

⇓s.

2. Ragioniamo per assurdo. Supponiamo che esista una sequenza s ∈ A∗, diciamo s =a1 · · · an, tale p ⇓ s, s ∈ L(q ) e s 6∈ L( p). Allora, se prendiamo l’osservatore

o0 ,

oi| 0 ≤ i ≤ n ∪ of , ow,

ai| 1 ≤ i ≤ n ∪ τ , w,

oiτ −→ ow, oi

ai+1−−→ oi+1| 0 ≤ i ≤ n − 1 ∪ oww−→ of

che possiamo visualizzare graficamente nel modo seguente

o0

o

w

of

o1 o2 · · · on−1 on

τ

τ

τ τ

w

a1

a2 an

abbiamo p must satisfy o0 mentre q must satisfy o0 è falso, cioè p 6vM q . Ciòcontraddice l’ipotesi p vM q , quindi dev’essere s ∈ L( p), da cui segue la tesi.

Si può anche dimostrare che per ogni sequenza s che non è una traccia per uno stato q siha che (q after s) =

∅e viceversa; da ciò segue banalmente che se s

6∈L(q ) allora (q after

s) must L è vero, per ogni insieme di azioni L. Quindi, per verificare se p vM q , è sufficientelimitarsi a considerare le sequenze s lungo le quali p non diverge e che sono anche tracce di p.

Lemma 11.65. ( q after s) must ∅ se e solo se s 6∈ L(q ).

Dimostrazione. (⇐) È banale, in quanto se s 6∈ L(q ) questo implica che (q after s) = ∅.(⇒) Ragioniamo per assurdo e supponiamo che s ∈ L(q ). Allora esiste un q 0 tale che q

s=⇒ q 0

quindi l’insieme (q after s) non è vuoto (contiene almeno q 0). Evidentemente, non c è una ∈ ∅ tale che q 0 a

=⇒ e quindi dovremmo concludere che (q after s) must ∅ è falso, chesarebbe in contraddizione con l’ipotesi.

Sfruttando la proprietà precedente, si può dimostrare che se p 4M q e se p non divergelungo s, allora se s è una traccia di q lo è anche di p.

Lemma 11.66. Se p 4M q e p ⇓ s allora s ∈ L(q ) implica s ∈ L( p).

Dimostrazione. Ragioniamo per assurdo, supponiamo cioè che essendo vere le ipotesi valeanche che s 6∈ L( p). Allora, per il Lemma 11.65 abbiamo che ( p after s) must ∅. Per viadelle ipotesi, ciò implica che (q after s) must ∅. Quindi, ancora per il Lemma 11.65, si hache s 6∈ L(q ), che contraddice l’ipotesi. Quindi, dev’essere s ∈ L( p).

Nel seguito, per qualsiasi stato r ∈ Q di un LTS hQ, Aτ , −→ i, indicheremo con Init(r)l’insieme a ∈ A | r

a=⇒ , cioè l’insieme delle azioni visibili che r può immediatamente eseguire

(eventualmente precedute da una sequenza di azioni invisibili).

Page 253: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 253/332

11.3 Relazioni deboli 253

Teorema 11.67 (Caratterizzazione alternativa di vM ). Sia hQ, Aτ , −→ i un LTS e siano p, q

∈Q. Si ha p

vM q se e solo se p 4M q .

Dimostrazione. Dimostriamo prima che p vM q implica p 4M q . Dal Lemma 11.64 segueche, per ogni s ∈ A∗, se p ⇓ s allora q ⇓ s. Resta da dimostrare che, per ogni s ∈ A∗ tale che

p ⇓ s e per ogni L ⊆f A, si ha che ( p after s) must L implica (q after s) must L. Sianos = a1 · · · an e L = b1, . . . , bm; consideriamo il seguente osservatore

o ,

oi| 0 ≤ i ≤ n ∪ of , ow,ai| 1 ≤ i ≤ n ∪ τ , w,

oiτ −→ ow, oi

ai+1−−→ oi+1| 0 ≤ i ≤ n − 1 ∪ onbj−→ ow| b j ∈ L ∪ ow

w−→ of

che possiamo visualizzare graficamente nel modo seguente

o0

ow of

o1 o2 · · · on−1 on

τ

τ

τ τ

b1 · · · bm

w

a1

a2 an

È facile verificare che ( p after s) must L implica p must satisfy o che a sua volta, per viadell’ipotesi, implica che q must satisfy o. Questo implica che (q after s) must L; infatti,per come è fatto l’osservatore o, abbiamo o che s 6∈ L(q ) o che per tutti gli stati q 0 tali che

q s=

⇒ q 0, è vero che q 0

bj=

⇒ per qualche b j

∈L.

Ora, dimostriamo che p 4M q implica p vM q . Dimostreremo una aff ermazione equi-valente cioè che preso un osservatore o qualsiasi abbiamo che se q must satisfy o è falsoallora anche p must satisfy o è falso. In altri termini, dimostreremo che se esiste unacomputazione senza successo c1 ∈ Comp(q, o) allora esiste una computazione senza successoc2 ∈ Comp( p, o). Se una tale c1 esiste allora il fatto che c1 non ha successo può dipendere dauna delle seguenti ragioni:

1. c1 = hq 0, o0ihq 1, o1i · · · hq n, oni, q = q 0 e o = o0, hq n, oni 6τ −→ , oi 6w−→ e q i ⇓ e oi ⇓ perogni i : 0 ≤ i ≤ n.

2. c1 = hq 0, o0ihq 1, o1i · · · hq n, oni · · · , q = q 0 e o = o0, q m ⇑ oppure om ⇑ per qualche

m : 0 ≤ m ≤ n, e oi 6w

−→ per ogni i : 0 ≤ i < m.3. c1 = hq 0, o0ihq 1, o1i · · · hq i, oii · · · , q = q 0 e o = o0, q i ⇓ e oi ⇓ e oi 6w−→ e hq i, oii τ −→ per

ogni 0 ≤ i.

Per dimostrare la tesi è allora sufficiente determinare in ciascuno di questi casi unacomputazione c2 ∈ Comp( p, o) senza successo.

1. In questo caso esiste un s ∈ A∗ tale che q s=⇒ q n, o

s=⇒ on, q ⇓ s, o ⇓ s, e (q after

s) must Init(on) è falso. Ora, se p ⇑ s, allora il fatto che o s=⇒ on e che oi 6w−→ per

ogni i : 0 ≤ i ≤ n implica che c2 esiste. D’altro canto, se p ⇓ s, il Lemma 11.66implica che s ∈ L( p), cioè p

s=⇒ p0 per qualche stato p0. È quindi possibile costruire una

computazione c2 =h p, o

i· · ·

h p0, on

i in cui gli stati dell’osservatore sono esattamente gli

Page 254: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 254/332

254 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

stessi di quelli della computazione c1. Inoltre, dall’ipotesi p 4M q , abbiamo che il fattoche (q after s) must Init(on) è falso implica che ( p after s) must Init(on) è pure

falso, perciò anche c2 non ha successo.

2. In questo caso esiste un s ∈ A∗ tale che q s=⇒ q n, o s

=⇒ on, e q ⇑ s oppure o ⇑ s. Da ciò, pervia dell’ipotesi p 4M q , segue che p ⇑ s oppure o ⇑ s. Quindi possiamo costruire unacomputazione c2 ∈ Comp( p, o) in cui gli stati dell’osservatore lungo la computazionesono gli stessi che nella computazione c1, e quindi abbiamo che c2 deve essere senzasuccesso.

3. Poiché, per ogni stato q k della computazione c1, q k ⇓ allora abbiamo che per s ∈ A∗

tale che q s=⇒ q k e o

s=⇒ ok si ha q ⇓ s. Ora, se p ⇑ s, allora, poiché o

s=⇒ ok e oi 6w−→ per

ogni 0 ≤ i, è possibile costruire una computazione c2 ∈ Comp( p, o) che non ha successo.

Altrimenti, se p ⇓ s, per il Lemma 11.66, abbiamo che s ∈ L( p) cioè esiste uno statostato p 0 tale che p s=⇒ p0. Il ragionamento può essere ripetuto per ogni k ≥ 0, in questo

modo possiamo costruire una computazione c2 ∈ Comp( p, o), eventualmente infinita,che non ha successo.

Esempio 11.68. Riconsideriamo i due LTS presentati nell’Esempio 11.58 di pagina 248.Vogliamo vedere il tipo di ragionamento che bisogna seguire per dimostrare che p1 'test q 1utilizzando le caratterizzazioni alternative; quindi vogliamo dimostrare che p1 ≈L q 1, che

p1 4M q 1 e che q 1 4M p1. La validità della relazione p1 ≈L q 1 è ovvia dato che p1 e q 1hanno le stesse tracce deboli. Per dimostrare che p1 4M q 1 consideriamo solo le sequenzedi azioni visibili s ∈ L( p) perché altrimenti avremmo p after s = q after s = ∅ (datoche L( p) = L(q )) e quindi, per qualsiasi L, ( p after s) must L e (q after s) must Lvalgono. Se prendiamo s = allora p after = p1, p2; quindi, affinché ( p after ) must

L dev’essere b ∈ L. Dato che q after = q 1, q 2, q 3, segue allora che (q after ) must L.Se s = a allora p after a = p3. Quindi, ( p after a) must L è falso per qualsiasi insiemeL: se L = ∅, ciò segue dal Lemma 11.65; altrimenti, cioè se L 6= ∅, segue dal fatto che p3 6α−→per qualsiasi α ∈ A. Quindi, non c’è bisogno di fare alcuna verifica su (q after s) must L.Analogo ragionamento può essere ripetuto nel caso s = b. Con un ragionamento simile si puòdimostrare che q 1 4M p1, e quindi la tesi.

11.3.5 Relazioni basate sui fallimenti

Introduciamo ora un preordine basato sulle nozioni di rifiuto e fallimento.

Definizione 11.69. Siano hQ, Aτ , −→ i un LTS, q ∈ Q, s ∈ A∗ ed un insieme finito di azioni B ⊆f A.

1. q rifiuta B se per tutti i b ∈ B, non esiste q 0 tale che q b=⇒ q 0.

2. hs, Bi è un fallimento per q se q ⇑ s oppure se esiste q 0 tale che q s=⇒ q 0 e q 0 rifiuta B.

Indichiamo con F (q ) l’insieme di tutti i fallimenti di q .

Page 255: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 255/332

Page 256: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 256/332

256 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

11.4 Trattamento della divergenza

Le equivalenze viste hanno comportamenti piuttosto diff erenti riguardo le computazioni diver-genti , cioè le computazioni formate da sequenze infinite di transizioni interne τ senza alcunainterazione con l’ambiente esterno. Per esempio, l’equivalenza a tracce deboli ≈L è incapacedi distinguere il deadlock dalla divergenza, come mostra il fatto che

p0 ≈L q 0

τ

Da questo punto di vista, l’equivalenza a tracce (forti) =T ha un comportamento miglioreperché tiene conto delle azioni interne ed è quindi in grado di distinguere i due precedentiLTS.

Gli stati p0 e q 0 sono anche osservazionalmente equivalenti e ciò quindi rivela un tratta-mento non sempre adeguato della divergenza anche da parte della bisimilarità debole ≈. Inqualche modo, la bisimulazione incorpora nella sua definizione un concetto di fairness per cuise è possibile scegliere infinitamente spesso di eff ettuare una determinata azione allora primao poi quell’azione verrà eff ettuata. Così, se un processo ha la possibilità di evitare l’esecuzionedi una sequenza infinita di azioni interne, ≈ assume che prima o poi lo farà. Per esempio, idue stati p1 e q 1 dei seguenti LTS

p1a b

q 1a b

τ

sono bisimili debolmente. Questa proprietà è cruciale per poter usare ≈

come criterio di

correttezza per la verifica di sistemi quali i protocolli di comunicazione. D’altro canto, comesi è visto, essa comporta che sistemi alcuni dei quali divergono ed altri no possano essereconsiderati equivalenti.

Al contrario, l’equivalenza must (e, quindi, anche l’equivalenza test) è più sensibile alproblema della divergenza, come si può anche intuire dalla definizione alternativa del preordinemust (Definizione 11.63). Se infatti prendiamo come osservatore lo stato o del seguente LTS

oτ w

abbiamo che p0 must satisfy o mentre non è vero che q 0 must satisfy o; quindi, p0 6vM q 0e p0 6vtest q 0, e di conseguenza i due stati non sono né must né test equivalenti.

Esercizio 11.74. Dimostrare che q 0 vM p0 e q 0 vtest p0.

Tra le varianti dei preordini testing che sono state studiate in letteratura, ne sono stateintrodotte anche alcune che trattano la divergenza in maniera simile a quanto appena dettoper la bisimulazione debole. Di seguito ne presentiamo una. A tale scopo, modifichiamo lanozione di successo di una computazione (Definizione 11.20) in modo da ignorare l’esistenzadi eventuali computazioni divergenti.

Definizione 11.75 (Esito di una computazione).Siano hQ,A, −→ i e hO, Aw, −→ i due LTS, q ∈ Q e o ∈ O. Una computazione c ∈ Comp(q, o)della forma hq 0, o0i, hq 1, o1i, hq 2, o2i, . . . ha successo se per ogni configurazione hq i, oii ∈ c, con i≥

0, si ha h

q i, oi

i w=⇒

.

Page 257: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 257/332

11.5 Gerarchie tra le relazioni 257

=CT ≃

=T ≈L≡≃m

≃F ≡≃M

≈b

Figura 11.2: Gerarchie tra le equivalenze presentate in questo capitolo nel caso di processitotalmente convergenti: R1 −→ R2 significa R2 ⊂ R1. I simboli hanno il seguente signifi-cato: =T equivalenza a tracce forti, =CT equivalenza a tracce (forti) complete, ' doppiasimulazione, ∼ bisimilarità forte, ≈L equivalenza a tracce deboli, 'm equivalenza may, 'F

equivalenza basata sui fallimenti, 'M equivalenza must, ≈ bisimilarità debole, ≈b bisimilaritàdi branching.

Si noti che di fatto la definizione appena data indebolisce la richiesta posta dalla De-finizione 11.20 affinché una computazione abbia successo cosicché anche una computazionedivergente può avere successo.

Definizione 11.76 (Soddisfacimento di un osservatore).

Siano hQ,A, −→ i e hO, Aw, −→ i due LTS, q ∈ Q e o ∈ O. Si dice che q fair-must satisfy

o se ogni computazione c ∈ Comp(q, o) ha successo.

Se riconsideriamo l’esempio precedente, abbiamo ora che q 0 fair-must satisfy o.

Abbiamo anche che p fair-must satisfy o0, dove p e o0 sono gli stati dei seguenti LTS

p a b

τ

o′

a b w

Basandoci su questa nuova definizione di soddisfacimento di un osservatore, possiamodefinire il seguente ordinamento.

Definizione 11.77 (Preordine fair-must). Siano hQ,A, −→ i e hO, Aw, −→ i due LTS, p, q ∈ Qe o ∈ O. Si dice che p vF M q se per ogni o ∈ O si ha che p fair-must satisfy o implica q fair-must satisfy o.

Non è difficile dimostrare che vF M è un preordine.

11.5 Gerarchie tra le relazioni

Innanzitutto, va ricordato che nel caso di LTS deterministici tutte le equivalenze coincidono.Consideriamo allora il caso più generale dgli LTS non deterministici.

Se ci limitiamo al caso di LTS totalmente convergenti , le relazioni che abbiamo definitoin questo capitolo possono essere raggruppate, a seconda che si tratti di equivalenze fortio deboli, nelle due gerarchie mostrate in Figura 11.2 (gerarchie simili valgono anche per icorrispondenti preordini). Di seguito, commentiamo alcuni dei risultati riassunti nella figura.

Nel caso che tutti gli LTS considerati siano totalmente convergenti si ha:

Page 258: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 258/332

258 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

• p vM q implica q vm p: ciò è un’immediata conseguenza del Lemma 11.66 e dellecaratterizzazioni alternative dei preordini

vM e

vm;

• p vF q implica q vL p : infatti, per ogni fallimento hs, Bi di p, si ha s ∈ L( p).

Si può anche dimostrare che vF e vM coincidono.Inoltre, sempre nel caso dgli LTS totalmente convergenti, l’equivalenza osservaziona-

le è un raffinamento anche dell’equivalenza must. Per dimostrarlo, facciamo uso dellacaratterizzazione alternativa di quest’ultima.

Proposizione 11.78. Siano p, q ∈ Q totalmente convergenti. Si ha che p ≈ q implica p vM q .

Dimostrazione. Dimostrare la tesi equivale a dimostrare che p 6vM q ⇒ p 6≈ q. Utilizzando lacaratterizzazione alternativa di

vM (Definizione 11.63), dall’ipotesi che p e q sono totalmente

convergenti e dal fatto che p 6vM q segue che esistono s ∈ A∗ ed L ⊆f A tali che p ⇓ s, q ⇓ s e

se p s=⇒ p0 si ha che Init( p0) ∩ L 6= ∅, ∃q 0 : q

s=⇒ q 0 ∧ Init(q 0) ∩ L = ∅

Ne segue che q 0 6≈ p0 per ogni p0 : p s=⇒ p0 da cui, per la Proposizione 11.48, segue che q 6≈ p e,

quindi, la tesi.

Quindi, dalla definizione del preordine vtest, dalla proposizione precedente e per la Pro-posizione 11.80 (che vale a maggior ragione anche nel caso particolare di sistemi totalmenteconvergenti), otteniamo il risultato seguente.

Teorema 11.79. Siano p, q ∈ Q totalmente convergenti. Si ha che p ≈ q implica p vtest q .

In generale invece, cioè nel caso di LTS non convergenti , le equivalenze 'm e 'M nonsono confrontabili. Per convincerci di ciò, è sufficiente individuare coppie di stati che sono inuna relazione ma non nell’altra, e viceversa. Per esempio, abbiamo che p1 'm q 1 e p1 6'M q 1dove p1 e q 1 sono così definiti:

p1

a

a

c

b

q 1a

b

c

Infatti, usando le caratterizzazioni alternative, sappiamo che p1 ≈L q 1 e che (q 1 after a)must b mentre non è vero che ( p1 after a) must b (in eff etti, si potrebbe dimostrareche p1 vtest q 1).

Se invece consideriamo

p2

τ

aq 2

τ

b

abbiamo p2 'M q 2 (poiché in generale vale che se q ⇑ e q must satisfy o allora o w−→ ) e

p2 6'm q 2 (poiché i due stati non hanno le stesse tracce).Inoltre, sappiamo già che 'M 6⊆≈. In eff etti, per LTS generici, le due relazioni non sono

confrontabili. Consideriamo infatti gli LTS seguenti

Page 259: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 259/332

11.6 Esercizi 259

p a

q

τ

a

Si può vedere facilmente che p ≈ q e p 6'M q , quindi ≈6⊆'M .Invece, c’è una relazione ben precisa tra equivalenza osservazionale ed equivalenza a tracce

deboli come mostra la seguente proprietà (enunciata per il preordine may ma facilmenteadattabile al caso dell’equivalenza).

Proposizione 11.80. Siano p, q ∈ Q. Si ha che p ≈ q implica p vm q .

Dimostrazione. Dimostrare la tesi equivale a dimostrare che p 6vm q ⇒ p 6≈ q . In base alladefinizione alternativa di vm si ha: p 6vm q implica che ∃s : p

s=⇒ ∧ q 6s

=⇒ . La tesi segueallora direttamente dalla Proposizione 11.48 di pagina 244.

11.6 Esercizi

11.1 Sia hQ,A, −→ i un LTS. Dimostrare che una relazione R ⊆ Q × Q è una simulazione forte se esolo se

R−1 a−→ ⊆ a−→ R−1

per ogni a ∈ A.

11.2 Sia hQ,A, −→ i un LTS. Dimostrare che una relazione R ⊆ Q × Q è una bisimulazione forte see solo se

R−1 a−→ ⊆ a−→ R−1 e R a−→ ⊆ a−→ R

per ogni a ∈ A.

11.3 Utilizzando la caratterizzazione delle simulazioni forti vista nell’Esercizio 11.1, si provi che Idè una simulazione e che se R ed S sono simulazioni allora R ∪ S ed RS sono simulazioni.

11.4 Sia hQ,A, −→ i un LTS e sia v l’unione di tutte le simulazioni forti. Si provi che v è unpreordine, ossia che I d ⊆ v e vv ⊆ v.

11.5 Si provi con un esempio che l’intersezione di bisimulazioni forti non è necessariamente unabisimulazione forte.

11.6 Si considerino le seguenti costanti di processo:

Impl , (coin. grind. c offee.nil) /grind

Spec , coin. c offee.nil

Si provi che Impl e Spec sono equivalenti a tracce deboli ma non sono equivalenti a tracce (siricordi che / è l’operatore di hiding).

11.7 Si considerino le seguenti costanti di processo:

R , p. beginRead. endRead. v. R

W , p. beginW rite. endWrite. v. W

S , ¯ p. v. S

Si disegnino i due LTS corrispondenti a

Spec , τ . beginRead. endRead. Spec + τ . beginW rite. endWrite.Spec

Impl , (R | S | W ) \ p, v

Si provi che Impl e Spec sono debolmente bisimili e che non sono fortemente bisimili.

Page 260: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 260/332

260 Capitolo 11 – Equivalenze comportamentali e preordini di ra ffi namento

11.8 Dimostrare che l’unione di tutte le bisimulazioni di branching è una bisimulazione di branchinge che essa è una equivalenza.

11.9 Si dimostri che se la coppia hs, Bi è un fallimento per q e B 0 ⊆ B allora anche la coppia hs, B0iè un fallimento per q .

Page 261: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 261/332

Capitolo 12

Calculus of CommunicatingSystems (CCS)

SOMMARIO

Questo capitolo presenta CCS (Calculus of Communicating Systems, Milner 1980), uno deicalcoli di processo più conosciuti ed utilizzati, ed alcune teorie della concorrenza sviluppate specificamente per esso. Cominceremo con la sintassi e la semantica operazionale di CCS.Quindi vedremo una variante di CCS con passaggio di valori e la sua traduzione nel calcolo con pura sincronizzazione. Successivamente presenteremo specificamente per CCS alcune delle equivalenze e dei preordini comportamentali visti nel capitolo precedente. Studieremo anche quali relazioni sono preservate da tutti gli operatori del linguaggio. Infine, intro-durremo un altro approccio alla definizione della semantica dei sistemi concorrenti, quello algebrico (o assiomatico), tramite caratterizzazioni (dis)equazionali alternative di alcune delle relazioni osservazionali introdotte.

In questo capitolo rivedremo in maniera omogenea alcuni concetti già introdotti, ma ilfatto di aver fissato la sintassi per il linguaggio ci permetterà di concentrarci su due aspettiimportanti che finora erano stati volutamente tralasciati: (pre)congruenze e assiomatizzazioni.

12.1 Sintassi di CCS

CCS [Mil80, Mil89] è basato su un insieme minimale di operatori che possono essere usati

per costruire descrizioni di sistemi a partire da descrizioni di sottosistemi. Gli elementi fon-damentali su cui si basano queste descrizioni, come in ogni altro calcolo di processo, sono leazioni.

Azioni in CCS. Le azioni rappresentano operazioni elementari eseguite in maniera atomicae non interrompibile. In pratica le azioni corrispondono sia ad operazioni di input/output sulleporte di comunicazione, sia a passi computazionali interni di un sistema. Le prime vengonodette esterne , o visibili , dato che permettono l’interazione di un sistema con l’ambiente.

Per formalizzare queste intuizioni, sia Λ un insieme infinito numerabile di etichette, oporte, non contenente il simbolo τ . Un’azione in CCS ha una delle seguenti tre forme:

• a∈Λ, rappresenta l’azione di ricevere un segnale sulla porta a;

Page 262: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 262/332

262 Capitolo 12 – Calculus of Communicating Systems (CCS)

• a, con a ∈ Λ, rappresenta l’azione di emettere un segnale sulla porta a;

• τ rappresenta un passo di computazione interna.La capacità di un sistema di interagire con l’esterno dipende dalle porte che il sistema

utilizza e dalle operazioni di input/output che eff ettua. Quindi, è importante distinguere lediverse porte di comunicazione, mentre non c’è alcuna necessità di distinguere tra loro i passicomputazionali interni, dal momento che essi corrispondono ad operazioni che non possonoinfluenzare l’ambiente di esecuzione o essere da questo influenzate. Perciò, un’unica azione èsufficiente per modellare le operazioni interne dei sistemi in questione.

L’insieme ACC S di tutte le azioni CCS è quindi:

ACC S , Λ ∪ a | a ∈ Λ ∪ τ

Poniamo inoltre α , α, dove α ∈ Λ ∪ a | a ∈ Λ. Si noti che τ non è un’azione valida.Le azioni α e α sono dette complementari , ovvero rappresentano azioni di input e di outputsu uno stesso canale. Essendo τ l’unica azione interna, l’insieme di tutte le azioni esterne èACC S \ τ . Nel seguito, quando non diversamente specificato, utilizzeremo α come elementogenerico di ACC S \ τ e µ come elemento generico di ACC S .

Operatori di CCS. Dopo aver definito l’insieme ACC S delle azioni CCS introduciamo glioperatori che il calcolo mette a disposizione per la descrizione di sistemi interattivi.

Sia C un insieme infinito numerabile di costanti di processo, i cui generici elementi sonodenotati con A, B, C , . . . . Di seguito utilizzeremo p, p1, q , q 0 per denotare processi CCS.CCS fornisce i seguenti operatori per costruire processi.

Processo inattivo: nil rappresenta il processo che non esegue alcuna attività.

Azione prefissa: µ.·, con µ ∈ ACC S , permette di preporre l’azione µ ad un processo. In-tuitivamente, µ.p è capace di eseguire prima l’azione µ e poi di comportarsi come ilprocesso p.

Scelta o somma: · + · rappresenta una scelta tra due comportamenti possibili. Il processo p1 + p2 ha la possibilità di comportarsi come p1 o come p2, a seconda dell’interazioneoff erta dall’ambiente.

Composizione parallela: ·|· permette l’esecuzione concorrente dei due processi argomento.

Il processo p1 | p2 esegue p1 e p2 simultaneamente permettendo anche azioni complemen-tari per la loro sincronizzazione; in questo caso l’azione composta risultante è un’azioneinterna τ .

Restrizione: ·\L, dove L ⊆ Λ, permette di localizzare delle azioni all’interno di un processo.Intuitivamente, p\L si comporta come p eccettuato il fatto che esso non può interagirecon l’ambiente usando azioni, o complementari di azioni, che compaiono in L.

Relabelling: ·[f ], dove f : Λ → Λ, permette di ridenominare le azioni di un processo inmodo da facilitare la costruzione di processi complessi a partire da altri più semplici.Il processo p[f ] si comporta come p, eccetto che ogni azione che p può eseguire vieneridenominata applicandole f .

Page 263: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 263/332

12.1 Sintassi di CCS 263

p ::= nil | µ.p | p1| p2 | p1 + p2 | p\L | p[f ] | C

Tabella 12.1: Sintassi di CCS

Costanti di processo: se C è una costante di processo la cui equazione di definizione èC , p, allora C rappresenta l’invocazione del processo p, analogamente all’invocazione difunzioni o procedure nei linguaggi imperativi. Questo costrutto permette la definizionedi processi ricorsivi.

Nel seguito, indicheremo con P CC S l’insieme di tutti i processi CCS generati dalla sintassi inBackus Naur Form illustrata in Tabella 12.1.

Vediamo ora alcuni esempi di processi CCS.

Esempio 12.1. [Bill-Ben] In CCS, il sistema concorrente Bill Ben di Figura 10.1 può esseredefinito nel modo seguente:

Bill , play. meet. nil

Ben , work. meet. nil

Bill_Ben , (Bill | Ben)\meet

Nell’esempio precedente abbiamo assunto che Λ, l’alfabeto delle azioni atomiche, contenga

play, work e meet. Nei tre esempi che seguono assumeremo che Λ contenga send, recv, msg,ack, get, put, get_ack e put_ack.

Esempio 12.2. Il terminesend.recv.nil

rappresenta un sistema che esegue una sequenza di due azioni: un “input” sul canale send,seguito da un “output” sul canale recv.

Esempio 12.3. La definizione

M , put.get.M + put_ack.get_ack.M

aggiunge all’ambiente una costante di processo M il cui comportamento può essere visto comeun buff er di comunicazione ad una posizione: quando riceve un “messaggio” sul canale put, lospedisce sul canale get, e si comporta in maniera simile per gli “acknowledgment”.

Esempio 12.4. [Un semplice protocollo di comunicazione ] Consideriamo le seguentidefinizioni, dove M è il processo definito nell’esempio precedente.

S , send.msg.ack.S R , msg.recv.ack.R

Page 264: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 264/332

264 Capitolo 12 – Calculus of Communicating Systems (CCS)

Figura 12.1: Architettura di un semplice protocollo di comunicazione

P , (S [ put/msg, get_ack/ack]|M |R[get/msg, put_ack/ack])\ get, put, get_ack, put_ack

P rappresenta un processo CCS corrispondente ad un semplice protocollo di comunicazioneconsistente in un mittente S , un ricevente R e un mezzo di comunicazione M . Il mittenteaccetta ripetutamente “messaggi” sul suo canale send e li spedisce sul suo canale msg, quindiattende un ack sul suo canale ack. Il ricevente si comporta in modo simile: aspetta unmessaggio sul suo canale msg, lo spedisce su recv e spedisce un ack attraverso il canale ack.Gli operatori di relabelling sono dati nella forma a/b, c/d, . . . ; intuitivamente ciò significache il relabelling sostituisce b con a, d con c, etc; le azioni non menzionate restano immutate(cioè, f su queste azioni si comporta come la funzione identità). L’operatore di restrizioneassicura che solo il mittente e il ricevente possono interagire direttamente con il mezzo dicomunicazione.

L’architettura del protocollo è rappresentata in Figura 12.1 per mezzo di un cosiddettografo di flusso. Tale grafo fornisce una descrizione “statica” del sistema evidenziando le com-ponenti in parallelo (nodi del grafo) e la loro struttura di interconnessione (archi del grafo checongiungono ‘porte’), mentre la descrizione “dinamica” del comportamento del sistema è datadal grafo delle transizioni in Figura 12.2.

Alcuni degli esempi visti sopra, illustrano come, nonostante la versione di CCS fin qui con-siderata non supporti esplicitamente il passaggio di valori, sia possibile implementare una limi-

tata forma di scambio di dati, associando una porta ad ogni possibile valore. Nell’esempio 12.3,M è in grado di gestire due “valori”: messaggi e acknowledgment.

Tramite gli operatori CCS si possono implementare molti altri operatori presenti in altrealgebre di processi. Vediamo qui come sia possibile simulare il comportamento di due semplicioperatori.

Hiding p / L , ( p | Ever1 | · · · | Evern) \ L, dove L = a1,...,an, ed Everi , ai.Everi +ai.Everi, per 1 ≤ i ≤ n. In pratica, Everi mette continuamente a disposizione le azioniai e ai e quindi, quando il processo p esegue ai o ai, avviene necessariamente (per viadella restrizione · \ L) la sincronizzazione che dà come risultato τ . In pratica, ai e ai

non sono più visibili, che è proprio l’obiettivo dell’hiding.

Page 265: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 265/332

12.2 Semantica operazionale di CCS 265

Link paq , ( p[mid/out] | q [mid/in]) \mid, dove supponiamo che p e q interagiscano conl’esterno tramite le porte out ed in, rispettivamente, e che mid sia una porta che non è

usata né da p né da q . Per come è definito, l’operatore ·a· mette in comunicazione traloro i due processi argomento obbligandoli a sincronizzarsi sulla porta mid.

12.2 Semantica operazionale di CCS

Vediamo adesso le regole d’inferenza che definiscono la semantica operazionale in stile SOS diogni singolo operatore CCS. Va detto che tutti sono stati già definiti nel Capitolo 10, riteniamotuttavia opportuno riportare qui la loro semantica per facilità di consultazione.

Processo inattivo. Il processo nil non ha regole; di conseguenza, non è capace di eff ettuarealcuna transizione.

Azione prefissa. L’operatore di azione prefissa ha una sola regola. Per questo operatorela regola di inferenza non ha premesse e viene anche detta assioma .

µ.p µ−→ p

La regola aff erma che un processo della forma µ.p può eseguire µ e poi comportarsi come p.

Scelta o somma. L’operatore di scelta ha due regole simmetriche.

p µ−→ p0

p + q µ−→ p 0

q µ−→ q 0

p + q µ−→ q 0

Tali regole ci dicono che un processo della forma p + q può comportarsi come uno dei due(sotto)processi p e q , a seconda dell’interazione off erta dall’ambiente. Va detto che se unodei due sottoprocessi eff ettua un’azione interna, l’ambiente può non riuscire a controllare lascelta.

Composizione parallela. La semantica dell’operatore di composizione parallela è definitada tre regole, le prime due sono simmetriche ed indicano che | intercala le azioni dei dueprocessi argomento.

p µ−→ p 0

p|q µ−→ p 0|q

q µ−→ q 0

p|q µ−→ p|q 0

La terza regola permette ai processi argomento di sincronizzarsi fra di loro eff ettuando azionicomplementari (cioè input ed output sulla stessa porta); in questo caso l’azione risultante èun’azione interna τ .

p α−→ p 0, q

α−→ q 0

p|q τ

−→ p0|q 0

Page 266: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 266/332

266 Capitolo 12 – Calculus of Communicating Systems (CCS)

(pref)µ.p

µ

−→ p

(sum1) p

µ−→ p0

p + q

µ

−→ p0

(sum2)q

µ−→ q 0

p + q

µ

−→ q 0

(par1) p

µ−→ p0

p|q µ−→ p0|q

(par2)q

µ−→ q 0

p|q µ−→ p|q 0

(sincr) p

α−→ p0 q α−→ q 0

p|q τ −→ p0|q 0

(res) p

µ−→ p0

(µ,µ /∈ L) p\L

µ−→ p0\L(rel)

p µ−→ p0

p[f ]f (µ)−−−→ p0[f ]

(def) p

µ−→ p0

(C , p)C

µ−→ p0

Tabella 12.2: Semantica operazionale di CCS

Restrizione. L’operatore di restrizione ha una sola regola.

p µ−→ p0

(µ, µ /∈ L) p\L

µ−→ p0\L

La regola dice che il processo p\L può eseguire solo azioni tali che né loro né le loro com-plementari appartengono all’insieme L

⊆ Λ. La restrizione in eff etti “localizza” le azioni

dell’insieme L, dato che l’operatore proibisce all’ambiente di interagire con il processo usandoquelle azioni. Si noti che l’azione interna τ non può mai essere ristretta.

Relabelling. Anche l’operazione di relabelling ha una sola regola.

p µ−→ p0

p[f ]f (µ)−−→ p0[f ]

dove la funzione f : ACC S → ACC S è un’estensione della funzione f così definita: f (τ ) = τ ,f (a) = f (a) e f (a) = f (a),

∀a

∈Λ. Intuitivamente, p[f ] può eseguire le stesse transizioni di

p, ma le sue azioni visibili sono ridenominate tramite f .

Costanti di processo. La semantica delle costanti di processo è definita da una sola regolache sostanzialmente dice che il comportamento della costante C è dato dal processo p cherappresenta il corpo della definizione C , p.

p µ−→ p 0

(C , p)C

µ−→ p0

Le regole d’inferenza che definiscono la semantica operazionale di CCS sono raggruppatenella Tabella 12.2. Nel seguito, gli operatori composizione parallela, restrizione e relabelling

Page 267: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 267/332

12.2 Semantica operazionale di CCS 267

saranno talvolta detti operatori statici in quanto, esaminando le conclusioni delle corrispon-denti regole operazionali, si può notare che essi sono presenti sia a sinistra che a destra del

simbolo di transizione. Ciò è diff erente dal caso dei restanti operatori che invece saranno dettidinamici .

Esempio 12.5. Consideriamo il processo M dell’esempio 12.3 e vediamo le sue possibilitransizioni. Usando la regola per il prefisso (pref), si deriva la seguente transizione:

put.get.M put−−→ get.M

Usando questo fatto e la regola per la scelta (sum1), si ha anche che:

put.get.M + put_ack.get_ack.M put−−→ get.M

Quindi, usando la regola (def) per le costanti di processo, è possibile determinare che:

M put−−→ get.M

Utilizzando lo stesso tipo di ragionamento e le regole (rel), (par1) e (res), si può dedurreche il processo P dell’esempio 12.4 può eff ettuare la seguente transizione:

P send−−−→

(msg.ack.S )[ put/msg, get_ack/ack]| M | R[get/msg, put_ack/ack]

\ get, get_ack, put, put_ack

Si noti che questa è l’unica azione inizialmente possibile per P , dato che le azioni iniziali di

M e R[·] sono tutte ristrette.

La definizione della semantica operazionale mostra che in realtà lo stesso calcolo di processoCCS può essere visto come un unico LTS. Infatti, abbiamo che la tripla

hP CC S , ACC S , −→ icostituisce un LTS, dove:

• P CC S è l’insieme di tutti i processi CCS sintatticamente corretti,

• ACC S è l’insieme di tutte le azioni CCS,

• −→ indica la relazione di transizione definita dalle regole in Tabella 12.2.

Questa osservazione vale anche per altri calcoli di processo ed ha due conseguenze importanti.La prima è che alcune definizioni, come quelle di equivalenze comportamentali e ordina-

menti per raffinamento, possono essere date in modo indipendente dal linguaggio, definendoledirettamente su LTS generici.

La seconda conseguenza è che ad ogni descrizione in CCS di un sistema, può essere asso-ciato un LTS con uno stato iniziale che rappresenta il sistema. In pratica ciò vuol dire che adogni termine sintattico corrisponde semanticamente un LTS con stato iniziale. Formalmente,ad ogni processo p è associata la quadrupla

hP CC S , ACC S ,

−→ , p

i

Page 268: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 268/332

268 Capitolo 12 – Calculus of Communicating Systems (CCS)

Figura 12.2: Grafo delle transizioni associato a P

che costituisce un LTS con stato iniziale p. Dato che gli insiemi P CC S e ACC S sono infiniti,questa osservazione ha solo una valenza teorica. Abbiamo però che non tutti gli stati in P CC S

sono raggiungibili da p attraverso

−→ e non tutte le azioni di ACC S sono eff ettuabili da p

e dalle sue derivate. Quindi è possibile definire un altro LTS contenente solo i termini CCSraggiungibili da p tramite sequenze di transizioni ed azioni eff ettuabili da p e dalle sue derivate.Se tale LTS contiene un numero finito di stati e di azioni, allora può essere analizzato usandoalgoritmi per la manipolazione di macchine a stati finiti.

Ad esempio, la Figura 12.2 illustra il grafo delle transizioni del LTS a stati finiticorrispondente al protocollo di comunicazione P descritto nell’esempio 12.4.

12.3 CCS con passaggio di valori

Consideriamo un sistema che riceve sul canale in un valore v ∈ V , dove V , v1, v2, . . . , vn, esuccessivamente lo inoltra sul canale out. Una possibile implementazione del sistema in CCS

Page 269: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 269/332

12.3 CCS con passaggio di valori 269

nil Processo inattivo

a(x).·, a e.·, τ .· Azione prefissa (a

∈Λ)P

i∈I · Somma (I insieme di indici)

·|· Composizione parallela

·\L Restrizione (L ⊆ Λ)

·[f ] Relabelling (f : Λ → Λ)

if be then · Operatore condizionale

A(e1, . . . , en) Costanti di processo

Tabella 12.3: Sintassi di CCS con passaggio di valori

è la seguente:

C , inv1.outv1.C +inv2.outv2.C +...invn.outvn .C

In pratica si codificano i valori tramite canali di comunicazione, e si introduce un canale perogni valore.

Ovviamente in un calcolo che permette di trasmettere valori sui canali, lo stesso sistemasarebbe descrivibile in maniera più sintetica nel modo seguente:

C , in(x).outx.C

In questa sezione presentiamo prima CCS con passaggio di valori e quindi la sua traduzionein CCS “puro” (che è quello visto finora) che ci permetterà di riutilizzare per il calcolo conpassaggio esplicito di valori tutti gli strumenti semantici introdotti per la versione “pura”. Sirimanda il lettore interessato alla Sezione 10.10 per considerazioni generali e motivazioni.

La sintassi di CCS con passaggio di valori, riportata nella Tabella 12.3, è del tutto similea quella di CCS puro vista all’inizio di questo capitolo. Ci limitiamo a far notare la presenzadelle espressioni sui valori negli operatori di prefisso e nelle costanti di processo ed anche comeguardia dell’operatore condizionale. Nella tabella, non definiamo la sintassi e la semanticadelle espressioni sui valori, indicate genericamente con e, e di quelle condizionali, indicategenericamente con be; la loro struttura è ininfluente ai fini della definizione della semanticadei processi. Nel resto della sezione, semplicemente assumeremo che esista un meccanismo divalutazione delle espressioni, anche di quelle condizionali, chiuse (cioe, che non contengonovariabili) ed useremo val(e) ∈ V e val(be) ∈ true, false per denotare il valore risultantedalla valutazione delle espressioni e o be, rispettivamente.

Per dare una semantica a CCS con passaggio di valori possiamo seguire più strade. Peresempio, possiamo definire una semantica operazionale in stile SOS simile a quella data perCCS puro oppure possiamo definire una semantica “per traduzione” in espressioni di cui co-nosciamo la semantica, per esempio traducendo ogni processo CCS con passaggio di valori inCCS puro. Il primo approccio è stato accennato nella Sezione 10.10; qui invece seguiremo ilsecondo approccio.

Per definire la traduzione useremo la funzione

b· che prende come argomento un termine in

CCS con passaggio di valori e restituisce il corrispondente termine in CCS puro. La definizione

Page 270: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 270/332

270 Capitolo 12 – Calculus of Communicating Systems (CCS)

F

bF

nil nil

a(x).p Pv∈V av. \ pv/x

a e.p aval(e). b pτ .p τ . b pP

i∈I pi

Pi∈I b pi

p1 | p2 b p1 | b p2 p\L b p\av : a ∈ L, v ∈ V

p[f ] b p[ bf ], dove bf (av) = f (a)v

if b then p

b p se val(be) = truenil altrimenti

A(e1, . . . , en) Aval(e1),...,val(en)

Tabella 12.4: Semantica di CCS con passaggio di valori per traduzione in CCS puro

di b· è riportata in Tabella 12.4. Si noti che, per semplicità, usiamo l’operatore P

al postodell’operatore + anche in CCS puro. A questo proposito, per evitare di dover introdurresomme infinite è essenziale far uso dell’ipotesi che l’insieme dei valori V sia finito. Così, iltermine a(x).p è tradotto nel termine

Pv∈V av. \ pv/x, dove le azioni av rappresentano tutti i

valori che x può assumere. Similmente, il termine A(e1, . . . , en) è tradotto in Aval(e1),...,val(en)

dove al contempo si definiscono tante costanti Av1,...,vn per ogni possibile n-upla di valoriv1, . . . , vn.

12.4 Equivalenze e preordini osservazionali per CCS

In questa sezione approfondiremo le proprietà delle relazioni di bisimulazione e bisimilarità, edei preordini di testing per processi CCS. In particolare, vedremo che mentre la bisimilaritàforte è una congruenza per CCS, nel senso che è preservata da tutti gli operatori del calcolo,altrettanto non si può dire per quella debole e per il preordine di testing. Per questi ultimicomunque presenteremo una utile caratterizzazione della più grande (pre)congruenza in essecontenuta.

Nel resto del capitolo faremo riferimento al sistema di transizioni etichettate che definisce la

semantica operazionale di CCS, cioè hP CC S , ACC S , −→ i. Per cui, anche se non eplicitamentespecificato, i processi e le azioni con cui lavoreremo saranno elementi di P CC S ed ACC S ,rispettivamente. Inoltre, useremo ≡ per indicare identità sintattica di due termini.

12.4.1 Bisimulazioni e bisimilarità forte

Per comodità, riformuliamo la definizione di bisimulazione forte data nel Capitolo 11direttamente per termini CCS.

Definizione 12.6 (Bisimulazione forte per CCS).Una relazione R ⊆ P CC S × P CC S è una bisimulazione forte se, dati due processi p e q tali che

h p, q

i ∈R, allora le seguenti condizioni sono soddisfatte:

Page 271: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 271/332

12.4 Equivalenze e preordini osservazionali per CCS 271

1. per ogni µ ∈ ACC S e p0 ∈ P CC S , se p µ−→ p0 allora q

µ−→ q 0 per qualche q 0 ∈ P CC S tale che

h p0, q 0

i ∈R;

2. per ogni µ ∈ ACC S e q 0 ∈ P CC S , se q µ−→ q 0 allora p

µ−→ p0 per qualche p0 ∈ P CC S tale che h p0, q 0i ∈ R.

Definizione 12.7 (Bisimilarità forte per CCS).Due processi p, q ∈ P CC S sono fortemente bisimili, scritto p ∼ q , se esiste una bisimulazione

forte che contiene la coppia h p, q i. In pratica, la relazione ∼, detta anche bisimilarità forte,è l’unione di tutte le possibili bisimulazioni forti. Cioè, formalmente, abbiamo:

∼,[

R | R è una bisimulazione forte

Nel capitolo precedente abbiamo enunciato e dimostrato alcune proprietà generali della

relazione di bisimulazione forte su LTS generici. Dimostriamo ora che la bisimilarità (∼) èuna relazione di congruenza per CCS, cioè è sostituitiva per tutti gli operatori sui processied anche per le definizioni ricorsive di costanti di processo. Quindi, se due processi CCSsono fortemente bisimili, allora possono essere inter-scambiati in un qualunque contesto CCS.Dimostriamo prima la proprietà per tutti gli operatori CCS.

Proposizione 12.8. Siano p, q,r ∈ P CC S , L ⊆ Λ ed f : Λ → Λ. Allora p ∼ q implica

1. µ.p ∼ µ.q

2. p + r ∼ q + r

3. p|r ∼ q |r4. p \ L ∼ q \ L

5. p[f ] ∼ q [f ]

Dimostrazione. Per dimostrare il punto 1. è sufficiente esibire una bisimulazione forte R0 checontiene la coppia hµ.p, µ.q i. Definiamo R0 a partire da una (qualsiasi) bisimulazione forte R

che contiene la coppia h p, q i, la quale esiste per ipotesi. La definizione è la seguente:

R0 , hµ.p, µ.q i ∪ R

R0 è una bisimulazione forte. Infatti, essa è ovviamente chiusa per transizioni perché R lo è

e perché le uniche transizioni di µ.p e µ.q portano in p e q , rispettivamente.Per il punto 2., si può procedere in maniera simile. Così, se R è una bisimulazione forte

che contiene la coppia h p, q i, allora la bisimulazione forte cercata R0 è la seguente:

R0 , h p + r, q + ri ∪ R ∪ Id

Mostriamo che R0 è chiusa rispetto alle transizioni (già sappiamo che R e Id lo sono). Sia p + r

µ−→ t; questo può essere dovuto a due situazioni:

Caso 1 p µ−→ p0 e t ≡ p0.

Allora, poiché R è una bisimulazione forte e h p, q i ∈ R, esiste q 0 ∈ P CC S tale che q µ−→ q 0

e h

p0, q 0i ∈

R. Dato che R⊆

R0, abbiamo h

p0, q 0i ∈

R0.

Page 272: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 272/332

272 Capitolo 12 – Calculus of Communicating Systems (CCS)

Caso 2 r µ−→ r 0 e t ≡ r0.

In questo caso abbiamo ovviamente q + r µ

−→ r 0 e

hr0, r0

i ∈R0, dato che

hr0, r0

i ∈Id ed

Id ⊆ R0.

La tesi segue grazie ad un argomento simmetrico.Per il punto 3., data una bisimulazione forte R che contiene la coppia h p, q i, è sufficiente

dimostrare che la relazione

R0 , hr1| t, r2| ti : t ∈ P CC S ∧ hr1, r2i ∈ R

è una bisimulazione forte. A quel punto, infatti, la tesi discende dal fatto che, per costruzione,h p| r, q | ri ∈ R0. Vediamo allora che R0 è chiusa per transizioni. Sia r1| t

µ−→ t0; questo puòessere dovuto a tre situazioni distinte:

Caso 1 r1µ

−→ r 01 e t0 ≡ r01| t.Allora, poiché hr1, r2i ∈ R, abbiamo che r2

µ−→ r02 con hr01, r02i ∈ R; da questo si har2| t

µ−→ r 02| t e, per definizione di R0, hr01| t, r02| ti ∈ R0.

Caso 2 t µ−→ t00 e t0 ≡ r1| t00.

Allora, con un ragionamento analogo, abbiamo anche r2| t µ−→ r2| t00 e, per definizione di

R0, hr1| t00, r2| t00i ∈ R0.

Caso 3 µ = τ , r1α−→ r 01 ∧ t

α−→ t00 e t0 ≡ r01| t00.Allora, poiché hr1, r2i ∈ R, abbiamo che r2

α−→ r02 con hr01, r02i ∈ R; da questo si har2| t

τ

−→ r 02| t00 e, per definizione di R0,

hr01| t00, r02| t00

i ∈ R0.

Da quanto detto sopra, tramite un argomento simmetrico, segue che R0 è una bisimulazione.La dimostrazione per 4. è simile e, data una bisimulazione forte R che contiene la coppia

h p, q i, utilizza la bisimulazione forte

R0 , hr1 \ L, r2 \ Li : hr1, r2i ∈ R

La dimostrazione per 5. è simile e, data una bisimulazione forte R che contiene la coppiah p, q i, utilizza la bisimulazione forte

R0 , hr1[f ], r2[f ]i : hr1, r2i ∈ R

Per dimostrare che le definizioni di costanti di processo preservano ∼, estendiamo primala definizione di ∼ al caso dei contesti CCS.

Definizione 12.9. Due contesti CCS C [·] e D[·] sono fortemente bisimili, scritto C [·] ∼ D[·],se per ogni processo p ∈ P CC S si ha C [ p] ∼ D[ p].

Siamo ora pronti a dimostrare, facendo uso della definizione di bisimulazione forte up to∼ introdotta nella Definizione 11.16, la proprietà desiderata1.

1Tale proprietà è una semplificazione di una proprietà più generale in cui si ha a che fare con singoledefinizioni di costanti piuttosto che con sistemi di equazioni di definizione per più costanti (rimandiamo illettore interessato a Milner [Mil89], pag. 99).

Page 273: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 273/332

12.4 Equivalenze e preordini osservazionali per CCS 273

Proposizione 12.10. Se A , C [A], B , D[B] e C [·] ∼ D[·] allora A ∼ B.

Dimostrazione. È sufficiente dimostrare che la seguente relazioneS = hE [A], E [B]i : E [·] contesto CCS

è una bisimulazione forte up to ∼. Infatti, prendendo E [·] ≡ [·] ne deriva che hA, Bi ∈ S equindi A ∼ B. Per dimostrare che S è una bisimulazione forte up to ∼ è sufficiente dimostrareche

se E [A] µ−→ p 0 allora per qualche q 0, q 00 ∈ P CC S , E [B]

µ−→ q 00 ∼ q 0 con h p0, q 0i ∈ S .

La dimostrazione procede per induzione sulla profondità della derivazione con la quale latransizione E [A]

µ−→ p 0 è inferita. Ragioniamo esaminando i vari casi.

Caso 1 E [·] ≡ [·].Quindi E [A] ≡ A e E [B] ≡ B. Perciò A

µ−→ p0, e poiché A , C [A] abbiamo che,con un’inferenza più breve, C [A]

µ−→ p0. Allora, per induzione, possiamo assumere cheC [B]

µ−→ q 00 ∼ q 0 con h p0, q 0i ∈ S . Poiché C [·] ∼ D[·], abbiamo allora che D[B] µ−→ q 000 ∼ q 0

e visto che B , D[B] ne segue che E [B] ≡ B µ−→ q 000 ∼ q 0 con h p0, q 0i ∈ S .

Caso 2 E [·] ≡ µ.F [·]Quindi E [A] ≡ µ.F [A], questo fa si che p0 ≡ F [A]. Abbiamo anche che E [B] ≡µ.F [B]

µ−→ F [B]. Per costruzione hF [A], F [B]i ∈ S , come richiesto.

Caso 3 E [·]

≡E 1[·] + E 2[·]

E [A] ≡ E 1[A] + E 2[A]; ci sono quindi due casi per cui E [A] µ−→ p 0:

• E 1[A] µ−→ p0;

• E 2[A] µ−→ p0.

Esaminiamo il primo caso in quanto il secondo è analogo. Poiché la derivazione diE 1[A]

µ−→ p0 è più corta di quella di E [A] µ−→ p0, per induzione possiamo assumere che

E 1[B] µ−→ q 00 ∼ q 0 con h p0, q 0i ∈ S . È quindi possibile dedurre che E [B] ≡ E 1[B] +

E 2[B] µ−→ q 00 ∼ q 0 come richiesto (dato che già sappiamo che h p0, q 0i ∈ S ).

Caso 4 E [·]

≡E 1[·]|E 2[·]

Quindi E [A] ≡ E 1[A]|E 2[A]. Consideriamo la transizione E [A] µ−→ p0; abbiamo tre casipossibili

• E 1[A] compie l’azione µ e E 2[A] sta fermo;

• E 2[A] compie l’azione µ e E 1[A] sta fermo;

• E 1[A] compie un’azione α e E 2[A] compie l’azione complementare α.

Esaminiamo il terzo caso che è il più complesso; gli altri due procedono in maniera

simile. In questo caso, abbiamo µ = τ , E 1[A] α−→ p01, E 2[A]

α−→ p02 e p0 ≡ p01| p02. Poichéle transizioni da E 1[A] e E 2[A] hanno un’inferenza più corta, per induzione possiamo

assumere che E 1[B] α

−→ q 001 ∼

q 01

con h

p01

, q 01i ∈

S e E 1[B] α

−→ q 002 ∼

q 02

con h

p02

, q 02i ∈

S .

Page 274: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 274/332

274 Capitolo 12 – Calculus of Communicating Systems (CCS)

Quindi, prendendo q 0 ≡ q 01|q 02 e q 00 ≡ q 001 |q 002 abbiamo che E [B] ≡ E 1[B]|E 1[B] τ −→ q 00 ∼

q 0. Rimane da stabilire se

h p0, q 0

i ∈ S . Ora, poiché

h p0i, q 0i

i ∈ S con i = 1, 2, per

definizione di S , per qualche contesto H i[·] si ha p0i ≡ H i[A] e q 0i ≡ H i[B], sempre peri = 1, 2. Prendiamo allora il contesto H [·] ≡ H 1[·]|H 2[·]. Abbiamo H [A] ≡ H 1[A]|H 2[A]e H [B] ≡ H 1[B]|H 2[B] e, quindi, h p0, q 0i ≡ hH [A], H [B]i ∈ S come richiesto.

Caso 5 E [·] ≡ E 1[·]\L oppure E 1[·][R]

Questo caso è più semplice del caso precedente e la prova è lasciata per esercizio allettore.

Caso 6 E [·] ≡ C con C , rQuindi, E è un contesto costante (cioè senza “buchi”). Ne deriva che E [A] ≡ C eE [B] ≡ C ed entrambi hanno la stessa µ-derivata p0; essendo il processo p0 un contestosenza buchi si ha

h p0, p0

i ≡ h p0[A], p0[B]

i e, quindi,

h p0, p0

i ∈S come richiesto.

12.4.2 Bisimulazioni, bisimilarità e congruenza debole

Per comodità, riportiamo su CCS la definizione di bisimulazione debole data nel Capitolo 11.

Definizione 12.11 (Bisimulazione debole per CCS).Una relazione R ⊆ P CC S ×P CC S è una bisimulazione debole se, dati p e q tali che h p, q i ∈ R,allora le seguenti condizioni sono soddisfatte:

1. per ogni µ ∈ ACC S e p0 ∈ P CC S , se p µ−→ p0 allora q

µ=⇒ q 0 per qualche q 0 ∈ P CC S tale

che h p0, q 0i ∈ R;

2. per ogni µ ∈ ACC S e q 0 ∈ P CC S , se q µ−→ q 0 allora p µ

=⇒ p0 per qualche p0 ∈ P CC S tale che h p0, q 0i ∈ R.

Definizione 12.12 (Bisimilarità debole per CCS).

Due processi p, q ∈ P CC S sono debolmente bisimili, o osservazionalmente equivalenti, scritto p ≈ q , se esiste una bisimulazione debole contenente h p, q i. La bisimilarità debole o equi-valenza osservazionale, ≈, è l’unione di tutte le bisimulazioni deboli. In modo equivalente,possiamo scrivere:

≈,[

R | R è una bisimulazione debole

Nel capitolo precedente abbiamo enunciato e dimostrato alcune proprietà generali della

relazione di bisimulazione debole su LTS generici. Dimostriamo adesso che la bisimilaritàdebole è preservata da tutti gli operatori CCS ad eccezione della scelta (ciò a causa dellaprelazione esercitata dell’azione τ in connessione con l’operatore di scelta). Cominciamo conl’operatore di azione prefissa per il quale la proprietà è una immediata applicazione dellaProposizione 11.46.

Proposizione 12.13. Se p ≈ q allora µ.p ≈ µ.q , ∀µ ∈ ACC S .

Dimostriamo ora che gli operatori statici preservano la bisimilarità debole.

Proposizione 12.14. Siano p,q, r ∈ P CC S , L ⊆ Λ ed f : Λ → Λ. Allora p ≈ q implica

1. p | r ≈

q | r

Page 275: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 275/332

12.4 Equivalenze e preordini osservazionali per CCS 275

2. p \ L ≈ q \ L

3. p[f ] ≈ q [f ]

Dimostrazione. La dimostrazione in tutti e tre i casi è simile alla corrispondente per la bisi-milarità forte. Cominciamo a considerare il caso 1. Supponiamo che R è una bisimulazionedebole che contiene la coppia h p, q i. È sufficiente allora dimostrare che la relazione

R0 = hr1| t, r2| ti : t ∈ P CC S ∧ hr1, r2i ∈ R

è una bisimulazione debole. A quel punto, infatti, la tesi segue dal fatto che per costruzionela coppia h p | r, q | ri ∈ R0. Per dimostrare che R0 è una bisimulazione debole, prendiamo unagenerica transizione r1| t

µ−→ t0 e consideriamo i tre casi possibili:

Caso 1: r1µ

−→ r 01 e t0 ≡ r01|t.Allora, poiché hr1, r2i ∈ R, abbiamo che, per qualche r 02 ∈ P CC S , r2

µ=⇒ r 02 e hr01, r02i ∈

R. Quindi r2| t µ=⇒ r 02| t e, per definizione di R0, hr01| t, r02| ti ∈ R0 come richiesto.

Caso 2: t µ−→ t00 e t0 ≡ r1|t00.

Allora, con un ragionamento analogo, r2| t µ−→ r2| t00, e per definizione di R0 abbiamo

hr1| t00, r2| t00i ∈ R0 come richiesto.

Caso 3: µ = τ , r1α−→ r 01 e t

α−→ t00.Allora, poiché hr1, r2i ∈ R, abbiamo che, per qualche r 02 ∈ P CC S , r2

α=⇒ r 02 e hr01, r02i ∈

R. Quindi r2| t τ =

⇒ r 02| t00 e, per definizione di R0,

hr01| t00, r02| t00

i ∈ R0 come richiesto.

Da questo, tramite un argomento simmetrico, segue che R0 è una bisimulazione debole.La dimostrazione per 2. è simile e, data una bisimulazione debole R che contiene la coppia

h p, q i, utilizza la bisimulazione debole

R0 , hr1 \ L, r2 \ Li : hr1, r2i ∈ R

La dimostrazione per 3. è simile e, data una bisimulazione debole R che contiene la coppiah p, q i, utilizza la bisimulazione debole

R0 , hr1[f ], r2[f ]i : hr1, r2i ∈ R

Abbiamo quindi dimostrato che la bisimilarità debole è preservata da tutti gli operatori adeccezione della scelta. Purtroppo, come già accennato in precedenza, la bisimulazione debolenon è completamente sostitutiva perché non è preservata dall’operatore di scelta. Abbiamoinfatti che p ≈ q non implica p + r ≈ q + r, per qualsiasi processo r .

Per mostrare che ≈ non è una congruenza, è sufficiente esibire due processi p e q e uncontesto C [·] tali che p ≈ q e C [ p] 6≈ C [q ]. Prendiamo i processi a.nil e τ .a.nil ed il contesto []+b.nil. Ora, dalla Proposizione 11.47, segue che τ .a.nil ≈ a.nil. Tuttavia, abbiamo C [τ .a.nil] 6≈C [a.nil]. Infatti, la transizione C [τ .a.nil]

τ −→ a.nil deve essere messa in corrispondenza conuna discendenza etichettata con del processo C [a.nil]; l’unica discendenza possibile è quindiquella che lascia il processo C [a.nil] invariato. D’altra parte, si ha a.nil

6≈C [a.nil], dato che

Page 276: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 276/332

276 Capitolo 12 – Calculus of Communicating Systems (CCS)

C [a.nil] può eseguire una transizione b che non può essere eseguita da a.nil; ciò quindi mostrache C [τ .a.nil]

6≈ C [a.nil]. Concludendo,

≈ non è una congruenza, e la causa è l’interazione

dell’operatore di scelta con le azioni interne iniziali di un processo.Data l’importanza che riveste la possibilità di sostituire un termine con uno equivalente in

qualsiasi contesto, si pone quindi il problema di determinare quale sia la più grande congruenzacontenuta in ≈. Indichiamo tale relazione con il simbolo ≈c. Formalmente la si può definirecome una relazione di congruenza tale che ≈c⊆≈ e per ogni altra congruenza R tale cheR ⊆≈ si ha R ⊆≈c. Per definizione, tale congruenza esiste (Id è una congruenza ed inoltreId ⊆≈); però la precedente definizione di ≈c è poco utile in pratica, per cui sarebbe megliotrovare una caratterizzazione alternativa. A tale scopo introduciamo la relazione congruenza osservazionale , denotata col simbolo ∼=.

Definizione 12.15. Due processi p, q ∈ P CC S sono osservazionalmente congruenti, scritto

p ∼= q , se per ogni µ ∈ ACC S

1. per ogni p0 ∈ P CC S , se p µ−→ p0 allora esiste q 0 ∈ P CC S tale che q

µ=⇒ q 0 e p0 ≈ q 0;

2. per ogni q 0 ∈ P CC S , se q µ−→ q 0 allora esiste p0 ∈ P CC S tale che p

µ=⇒ p0 e p0 ≈ q 0.

Si noti la somiglianza con la proprietà di ≈ data dalla Proposizione 11.46 di pagina 243.In eff etti,le due relazioni diff eriscono soltanto in due aspetti: nella definizione di ∼= si usa

µ=⇒

al posto di µ=⇒ , che si usa invece nella definizione di ≈, e la definizione di ∼= non è ricorsiva.

Il primo punto implica che ogni azione di p o q deve essere corrisposta da almeno un’azionedell’altro processo. Questo comunque vale solo per l’azione iniziale, in quanto successivamentesi richiede p 0 ≈ q 0 e non p0 ∼= q 0 (infatti, come si è detto, la definizione di ∼= non è ricorsiva).

Vogliamo innanzitutto dare una caratterizzazione di∼= che mostri quanto questa sia vicina

alla bisimilarità debole ≈. Introduciamo allora la nozione di sorta di un processo p per indicarel’insieme delle porte usate da p. Formalmente possiamo dare la seguente definizione.

Definizione 12.16. Sia L ⊆ ACC S \ τ . Se le azioni di un processo p e di tutte le sue derivate sono elementi di L ∪ τ allora diremo che L è una sorta di p, o anche che p ha sorta L, e scriveremo p : L.

Chiaramente ogni processo ha una sorta “minima”, data dall’intersezione di tutte le suesorte, ma non è sempre facile determinarla (data una porta che compare nella sintassi delprocesso, bisogna fare un’analisi semantica per capire se il processo può eff ettivamente eff et-tuare un’azione su quella porta). Un modo piuttosto naturale per assegnare una sorta adogni processo p è per induzione sulla sintassi; questa viene chiamata sorta sintattica di p ed

indicata con L( p).

Definizione 12.17. La sorta (sintattica) L( p) di un processo p è definita come segue (per induzione sulla sintassi di p):

L(nil) , ∅L(α.p) , α ∪ L( p)

L(τ .p) , L( p)

L( p + q ) , L( p) ∪ L(q )

L( p|q ) , L( p) ∪ L(q )

L( p\L) , L( p) \ (L ∪ L)

L( p[f ]) ,

f (α)|α ∈ L( p)

Page 277: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 277/332

12.4 Equivalenze e preordini osservazionali per CCS 277

dove si suppongono assegnate le sorte L(A) alle costanti di processo A ∈ C in modo tale che per ogni equazione di definizione A , p si abbia L( p)

⊆L(A).

La nozione di sorta sintattica ci sarà utile in seguito quando sarà necessario poter scegliereporte “nuove” rispetto a quelle utilizzate dai processi presi in considerazione. Sarà infattisufficiente supporre che sia sempre possibile scegliere una porta che non appartiene alle sorte(sintattiche) di tali processi. Una prima applicazione è nella dimostrazione della proposizionesuccessiva.

Proposizione 12.18. Siano p, q ∈ P CC S tali che L( p) ∪ L(q ) ⊂ ACC S . Allora p ∼= q se, e solo se, per ogni r ∈ P CC S , p + r ≈ q + r.

Dimostrazione. (⇒) Dall’ipotesi p ∼= q e dalla Proposizione 12.19, segue che h p, q i ∈ R perqualche bisimulazione debole R. A partire da R, definiamo allora la seguente relazione:

R0 , ( p + r, q + r) : r ∈ P CC S ∪ R ∪ Id

e dimostriamo che è una bisimulazione debole. Sia p + r µ−→ t; questo può essere dovuto a due

situazioni:

Caso 1 p µ−→ p0 e t ≡ p0.

Allora, poiché h p, q i ∈ R ed R è una bisimulazione debole, abbiamo che, per qualche q 0,q µ=⇒ q 0 e h p0, q 0i ∈ R. Quindi, dato che R ⊆ R0, abbiamo che h p0, q 0i ∈ R0.

Caso 2 r µ−→ r 0 e t ≡ r0.

In questo caso abbiamo ovviamente q + r µ−→ r0, quindi q + r

µ=⇒ r0. Ora, dato che

hr0, r0i ∈ Id ed I d ⊆ R0 abbiamo anche hr0, r0i ∈ R0.La tesi segue da un argomento simmetrico.

(⇐) Ragioniamo per assurdo, quindi supponiamo che p 6∼= q . Allora, senza perdita digeneralità, possiamo supporre che per qualche µ ∈ ACC S e p0 ∈ P CC S si ha p

µ−→ p0 e o (i)

non esiste q 0 ∈ P CC S tale che q µ=⇒ q 0, oppure (ii) per ogni q 0 ∈ P CC S tale che q

µ=⇒ q 0 si

ha p0 6≈ q 0. Sia r ≡ α.nil dove α 6∈ L( p) ∪ L(q ). Vogliamo arrivare a contraddire l’ipotesi p + r ≈ q + r. Nel caso (i), abbiamo che p + r

µ−→ p0 e q + r 6µ=⇒ . Ora, se µ 6= τ , ciò vuol dire

che q + r 6µ=⇒ ; se invece µ = τ , abbiamo p0 6≈ q + r dato che q + r

α−→ e p0 6α−→ . Perciò in ogni

caso non esiste t tale che q + r µ=⇒ t e p0 ≈ t. Nel caso (ii), poiché α 6= µ, tutte le µ-derivate t

di q + r sono dovute a q , cioè q µ=⇒

t; quindi, date le assunzioni del caso (ii), p 0 6≈

t. Quindi,

in entrambi i casi si ha p + a.nil µ−→ p0 ma non esiste t ∈ P CC S tale che q + a.nil

µ=⇒ t e p0 ≈ t.

Per via della proprietà di ≈ data dalla Proposizione 11.46, ciò contraddice l’ipotesi che, perogni r ∈ P CC S , p + r ≈ q + r.

Possiamo ora facilmente mostrare che ∼= si posiziona tra ∼ e ≈.

Proposizione 12.19. Valgono le seguenti inclusioni: ∼ ⊆∼= e ∼= ⊆ ≈.

Dimostrazione. Come prima cosa notiamo che dal fatto, facilmente verificabile dalle definizio-ni, che ogni bisimulazione forte è anche una bisimulazione debole discende che ∼⊆≈. Questofatto, la Proposizione 11.14 di pagina 233 e la definizione di ∼= implicano che ∼⊆ ∼=. Dimo-striamo ora l’inclusione

∼=

⊆≈. Per la Proposizione 12.18, p

∼= q implica p + nil

≈ q + nil.

Page 278: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 278/332

278 Capitolo 12 – Calculus of Communicating Systems (CCS)

Ora, poiché p +nil ∼ p, q +nil ∼ q e ∼⊆≈, abbiamo p+nil ≈ p e q +nil ≈ q . Per transitivitàpossiamo quindi concludere che p

≈q .

Vogliamo analizzare quanto le nozioni di congruenza osservazionale e bisimilarità debo-le sono vicine. Così, dalla definizione di ∼=, si ricava immediatamente che prefissando conun’azione processi debolmente bisimili si ottengono processi osservazionalmente congruenti.

Proposizione 12.20. Se p ≈ q allora µ.p ∼= µ.q .

Anche la nozione di stabilità gioca un ruolo importante per passare da ≈ a ∼=. Si ricordiche un sistema si dice stabile se non ha derivazioni τ (Sezione 3.5); analogamente, un processo

p ∈ P CC S è stabile se p 6τ −→ .

Proposizione 12.21. Se p e q sono stabili, allora p ≈ q implica p ∼= q .

Dimostrazione. Sia p α−→ p0. Per ipotesi, e per la Proposizione 11.46 di pagina 243, esiste q 0tale che q

α=⇒ q 0 e p0 ≈ q 0. Per via dell’ipotesi di stabilità, α 6= τ e, quindi,

α=⇒ e

α=⇒

coincidono. Ne segue allora che q α=⇒ q 0 e, quindi, p ∼= q segue per definizione.

Dimostriamo ora un risultato tanto inatteso quanto importante e che mostra ancora unavolta come le nozioni di bisimilarità debole e di congruenza osservazionale siano vicine. Questorisultato è stato dimostrato per la prima volta da Matthew Hennessy e verrà sfruttato inseguito per provare la completezza dell’insieme di assiomi che introdurremo.

Proposizione 12.22 (Lemma di Hennessy). p ≈ q se e solo se p ∼= q o τ .p ∼= q o p ∼= τ .q

Dimostrazione. (

⇐) Tutte le implicazioni seguono dal fatto che p0 ∼= q 0 implica p0

≈ q 0

(Proposizione 12.19), eventualmente usando il fatto che r ≈ τ .r (Proposizione 11.47) ed ilfatto che ≈ è transitiva.

(⇒) Assumiamo che p ≈ q , e consideriamo tre casi esaustivi. Primo, se per qualche p0 ∈ P CC S si ha che p

τ −→ p0 e p0 ≈ q allora, dalla definizione di ∼=, segue che p ∼= τ .q .Secondo, se per qualche q 0 ∈ P CC S si ha che q

τ −→ q 0 e p ≈ q 0 allora, ragionando come prima,segue che τ .p ∼= q . Se nessuno dei due casi precedenti si verifica, allora si può mostrare che

p ∼= q nel modo seguente. Supponiamo dapprima che p α−→ p0 con α 6= τ ; dal momento che

p ≈ q abbiamo che esiste q 0 tale che q α=⇒ q 0 e q 0 ≈ p0. Da ciò segue che q

α=⇒ q 0 e p0 ≈ q 0

come richiesto dalla definizione di ∼=. Nell’altro caso, cioè se p τ −→ p0, allora, dal momento che

p ≈ q , abbiamo q =⇒ q 0 e p0 ≈ q 0. Ora, non può essere che q 0 ≡ q , altrimenti ricadremmonel primo caso considerato, quindi q

τ =⇒

q 0 come richiesto dalla definizione di ∼= (assieme al

fatto già noto che p 0 ≈ q 0). La tesi segue allora da un argomento simmetrico.

Concludiamo con una importante proprietà di ∼=: quella di essere una congruenza.

Proposizione 12.23. ∼= è una relazione di equivalenza.

Dimostrazione. Discende direttamente dalla definizione di ∼= e dal fatto che ≈ èun’equivalenza.

Facciamo ora vedere che ∼= è preservata da tutti gli operatori CCS.

Proposizione 12.24. Se p ∼= q allora µ.p ∼= µ.q , p + r ∼= q + r, p|r ∼= q |r, p \ L ∼= q \ L e p[f ]

∼= q [f ].

Page 279: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 279/332

12.4 Equivalenze e preordini osservazionali per CCS 279

Dimostrazione. µ.p ∼= µ.q discende direttamente dalla proposizione precedente e dalla Pro-posizione 12.20. Le rimanenti uguaglianze si possono dimostrare applicando direttamente la

definizione di ∼=.Per dimostrare che ∼= è preservata dall’operatore di scelta, supponiamo che p ∼= q e che

r ∈ P CC S e facciamo vedere che p + r ∼= q + r. Supponiamo allora che p + r µ−→ t. Ci sono

due casi possibili. Se p µ−→ t allora, dall’ipotesi p ∼= q , segue che esiste q 0 ∈ P CC S tale che

q µ=⇒ q 0 e t ≈ q 0. La tesi per questo caso segue allora dal fatto che q + r

µ=⇒ q 0. Se r

µ−→ t allora,ovviamente, q + r

µ=⇒ t. La tesi segue tramite un argomento simmetrico.

Per dimostrare che ∼= è preservata dall’operatore di composizione parallela, supponiamoche p ∼= q e che r ∈ P CC S e facciamo vedere che p|r ∼= q |r. Supponiamo allora che p|r

µ−→ t. Cisono tre casi possibili. Se p

µ−→ p0 e t ≡ p0|r allora, dall’ipotesi p ∼= q , segue che esiste q 0 ∈ P CC S

tale che q µ=⇒ q 0 e p0 ≈ q 0. Poiché ≈ è preservata dall’operatore di composizione parallela,

abbiamo p 0|r≈

q 0|r e quindi la tesi per questo caso è dimostrata. Se r µ

−→ r 0 e t

≡ p|r0 allora,

ovviamente, abbiamo anche q |r µ=⇒ q |r0. Inoltre, dall’ipotesi p ∼= q , dalla Proposizione 12.19 edal fatto che ≈ è preservata dalla composizione parallela segue che p|r0 ≈ q |r0, che dimostra

la tesi per questo caso. Se µ = τ , p α−→ p 0, r

α−→ r 0 e t ≡ p0|r0 allora, dall’ipotesi p ∼= q , segueche esiste q 0 ∈ P CC S tale che q

α=⇒ q 0 e p0 ≈ q 0. Quindi q |r

τ =⇒ q 0|r0 e poiché ≈ è preservata

dall’operatore di composizione parallela, abbiamo p0|r0 ≈ q 0|r0 e quindi la tesi anche in questocaso è dimostrata. Possiamo allora concludere tramite un argomento simmetrico.

Per dimostrare che ∼= è preservata dall’operatore di restrizione, supponiamo che p ∼= q eche L ⊆ Λ e facciamo vedere che p \ L ∼= q \ L. Supponiamo che p \ L

µ−→ t. Ciò vuol direche, per qualche p0 ∈ P CC S , µ, µ 6∈ L e t ≡ p0 \ L (ciò può essere dimostrato per induzionesulle regole di Tabella 12.2). Dall’ipotesi p ∼= q , segue che esiste q 0 ∈ P CC S tale che q

µ=⇒ q 0 e

p0 ≈ q 0. Poiché µ, µ 6∈ L, abbiamo anche che q \ L µ

=⇒ q 0 \ L. Inoltre, poiché ≈ è preservatadalla restrizione, abbiamo p 0 \ L ≈ q 0 \ L. La tesi segue da un argomento simmetrico.

Per dimostrare che ∼= è preservata dall’operatore di relabelling, supponiamo che p ∼= q eche f : Λ → Λ e facciamo vedere che p[f ] ∼= q [f ]. Supponiamo che p[f ]

µ−→ t. Ciò vuol dire che,

per qualche µ0 ∈ ACC S e p0 ∈ P CC S , f (µ0) = µ, p µ0

−→ p0 e t ≡ p0[f ] (ciò può essere dimostratoper induzione sulle regole di Tabella 12.2). Dall’ipotesi p ∼= q , segue che esiste q 0 ∈ P CC S

tale che q µ0

=⇒ q 0 e p0 ≈ q 0. Segue allora che q [f ] µ=⇒ q 0[f ]. Inoltre, poiché ≈ è preservata dal

relabelling, abbiamo p 0[f ] ≈ q 0[f ]. La tesi segue da un argomento simmetrico.

Per completare la dimostrazione che ∼= è una congruenza, ci resta da far vedere che èpreservata2 anche dalle definizioni delle costanti di processo. Estendiamo prima la definizione

di ∼= al caso dei contesti CCS, quindi enunciamo la proprietà desiderata.

Definizione 12.25. Due contesti CCS C [·] e D[·] sono osservazionalmente congruenti, scrittoC [·] ∼= D[·], se per ogni processo p ∈ P CC S si ha C [ p] ∼= D[ p].

Proposizione 12.26. Se A , C [A], B , D[B] e C [·] ∼= D[·] allora A ∼= B.

Dimostrazione. Si comincia col dimostrare che la relazione

S = hE [A], E [B]i : E [·] contesto CCS

2Anche nel caso di ∼=, come già fatto per ∼, ci limiteremo a considerare una semplificazione di una proprietàgenerale in cui si ha a che fare con singole definizioni di costanti piuttosto che con sistemi di equazioni didefinizione per più costanti (rimandiamo il lettore interessato a Milner [Mil89], pag. 155).

Page 280: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 280/332

280 Capitolo 12 – Calculus of Communicating Systems (CCS)

gode della seguente proprietà

se E [A] µ

−→ p 0 allora per qualche q 0 ∈ P CC S , E [B] µ

=⇒ q 0 con p 0S ≈ q 0se E [B]

µ−→ q 0 allora per qualche p 0 ∈ P CC S , E [A] µ=⇒ p0 con p0 ≈ S q 0.

(12.1)

La dimostrazione procede per induzione sulla profondità della derivazione con la quale latransizione E [A]

µ−→ p0 è inferita (il caso della transizione E [B] µ−→ q 0 è analogo). I dettagli sono

simili a quelli della dimostrazione della Proposizione 12.10. Ora, per la Proposizione 11.52 dipagina 245, il fatto che S soddisfa la proprietà precedente implica che S è una bisimulazione

debole up to ≈. Infatti, l’uso di µ=⇒ al posto di

µ=⇒ rende la proprietà (12.1) più forte di

quella su cui si basa la Proposizione 11.52. Quindi p0S ≈ q 0 e p0 ≈ S q 0 implicano p0 ≈ q 0.Perciò, prendendo E [·] ≡ [·], per cui abbiamo E [A] ≡ A e E [B] ≡ B , otteniamo A ∼= B pervia della definizione di ∼=.

In questa sezione abbiamo introdotto una semantica osservazionale completamente sosti-tutiva e molto vicina alla bisimilarità debole. Si potrebbe allora pensare che la bisimilaritàdebole sia ridondante. Invece, le dimostrazioni basate sulla costruzione di bisimulazioni debolisono molto convenienti, ed inoltre, stabilire la bisimilarità debole è molto naturale e spessomeccanizzabile. Una volta stabilito che p ≈ q , proposizioni quali la 12.21 e 12.22 possonoessere utilizzate per stabilire che p ∼= q . Concludiamo la sezione mostrando alcuni esempi.

Esempio 12.27.

1. a.τ .b.nil ≈ a.b.nil e a.τ .b.nil ∼= a.b.nil.

2. τ .a.nil ≈ a.nil ma τ .a.nil 6∼= a.nil, dato che la transizione τ

−→ di τ .a.nil non puòcorrispondere ad una transizione

τ =⇒ di a.nil.

3. Svc ∼= P , dove Svc , send.recv.Svc e P è il processo (corrispondente ad un sempliceprotocollo di comunicazione) definito in Sezione 12.2.

12.4.3 Equivalenze basate su testing

In questa sezione studiamo il comportamento dell’equivalenza test 'test relativamente aglioperatori CCS. Purtroppo risulta che neanche 'test è una congruenza. Per dimostrarlo bastaindividuare un contesto che non preserva la relazione

'test. Ragioniamo allora come segue.

Sappiamo che a 'test τ .a; infatti, a 'm τ .a vale perché i due processi hanno le stesse traccedeboli e a 'M τ .a vale perché gli unici osservatori interessanti sono w e a.w che non possonodistinguere i due processi. Se ora consideriamo il contesto b + [ ], otteniamo che b + a 6'test

b + τ .a. Infatti, abbiamo che b + a must satisfy b.w mentre non è vero che b + τ .a must

satisfy b.w perché la computazione (b + τ .a)|b.w τ −→ a|b.w non ha successo.

In maniera simile a quanto fatto per la bisimilarità debole, è possibile modificare legger-mente la definizione dei preordini must e test in modo che i preordini e le equivalenze risultantisiano preservati da tutti gli operatori CCS.

Definizione 12.28 (Precongruenza must). p vcM q se e solo se p vM q ∧ (q

τ −→ ⇒ p τ −→ ).

Definizione 12.29 (Precongruenza test). pv

c

test

q se e solo se pv

test q ∧

(q τ

−→ ⇒ p

τ

−→ ).

Page 281: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 281/332

12.5 Ragionamento equazionale in CCS 281

(riflessività)t1 = t1

(simmetria)t1 = t2

t2 = t1(transitività)

t1 = t2 t2 = t3

t1 = t3

(sostitutività)t1 = t01 . . . tk = t0k

C (t1, . . . , tk) = C (t01, . . . , t0k)C operatore di arità k

Tabella 12.5: Regole d’inferenza

La diff erenza è minima ma fondamentale: si richiede infatti che se q può inizialmentefare un’azione interna, allora anche p deve poter fare inizialmente un’azione interna. Si puòin eff etti dimostrare che vc

M è una precongruenza per CCS ed anche che è la più grandeprecongruenza contenuta in

vM (ciò giustifica la notazione usata). Un risultato analogo vale

per vctest e per le equivalenze che costituiscono i nuclei dei preordini.

12.5 Ragionamento equazionale in CCS

Come abbiamo detto nell’Introduzione esistono vari approcci per definire semantiche formaliper calcoli di processo. Finora abbiamo esaminato l’approccio operazionale; in questa sezioneesamineremo l’approccio equazionale . Tale approccio permette di stabilire la validità o menodi una relazione tra processi attraverso semplici manipolazioni sintattiche dei processi stessi,quindi senza utilizzare la semantica operazionale.

L’approccio equazionale consiste nell’individuare un certo numero di regole d’inferenza che

costituiscono quello che si chiama sistema di prova . Ciò che distingue un sistema di prova daun altro è l’insieme degli assiomi, che può essere visto come un’algebra di processi. Linguaggidi processi diff erenti ed equivalenze diff erenti conducono ad algebre di processi diff erenti.Come vedremo infatti, gli assiomi sono specifici della relazione che si intende catturare (peresempio, bisimilarità o testing).

Oltre agli assiomi, un sistema di prova contiene di solito le regole d’inferenza presentatenella Tabella 12.5. Esse riflettono il fatto che ogni termine è uguale a se stesso (riflessività ),che se un termine è uguale ad un altro allora è vero anche il contrario (simmetria ), chetermini uguali ad uno stesso termine sono uguali tra loro (transitività ), e che all’interno dicerti contesti termini uguali possono essere sostituiti gli uni agli altri (sostitutività ). In praticaciò vuol dire che la relazione risultante dal sistema di inferenza è una equivalenza e, talvolta,

una congruenza (quando la sostituzione si può applicare a tutti i contesti del linguaggio). Leregole nella Tabella 12.5 vengono di solito usate implicitamente per la costruzione di “prove”per cui nel seguito menzioneremo solo gli assiomi dei vari sistemi. Quando esiste una provaper i termini t1 e t2 usando le regole suddette e gli assiomi di un certo insieme E , scriveremoE ` t1 = t2.

Data una certa assiomatizzazione , cioè un certo insieme di assiomi, ed una relazione diequivalenza, ad esempio, comportamentale è importante stabilire la relazione esistente tra leuguaglianze che l’assiomatizzazione ci permette di dimostrare e la relazione in questione. Inparticolare, è importante garantire che:

1. l’assiomatizzazione è corretta : ovvero, tutte le uguaglianze che riusciamo a dimo-strare nel sistema di prova valgono per l’equivalenza comportamentale che stiamo

Page 282: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 282/332

282 Capitolo 12 – Calculus of Communicating Systems (CCS)

(A1) p + q = q + p(A2) p + (q + r) = ( p + q ) + r

(A3) p + nil = p(A4) p + p = p

Tabella 12.6: Assiomatizzazione di ∼ per CCS di base: insieme E 1

considerando;

2. l’assiomatizzazione è completa : ovvero, tramite il sistema di prova riusciamo a dimo-strare tutte le uguaglianze che valgono per l’equivalenza comportamentale che stiamoconsiderando.

La correttezza è ovviamente un’assoluta necessità; un sistema di prova non corretto non èutilizzabile, dato che permette la derivazione di uguaglianze che non hanno un corrispettivonell’equivalenza comportamentale scelta. La completezza è desiderabile, dato che un sistemacompleto garantisce che è possibile derivare tutte le uguaglianze determinate dall’equivalenzacomportamentale.

In questa sezione, presenteremo alcune assiomatizzazioni corrette e complete, per certeclassi di processi, della bisimilarità forte, della congruenza osservazionale e dei preordini basatisu testing.

12.5.1 Assiomatizzazione di ∼Presentiamo l’assiomatizzazione di ∼ per CCS in modo incrementale, partendo da CCS “dibase” e considerando successivamente sottolinguaggi di CCS sempre più ampi.

Assiomatizzazione per CCS di base. CCS di base contiene solo il processo costante nil,l’operatore di azione prefissa e quello di scelta; di conseguenza permette solo la definizionedi sistemi “sequenziali” (senza parallelismo) e finiti (che eseguono sequenze finite di transi-zioni). L’assiomatizzazione di ∼ per CCS di base consiste di soli quattro assiomi, elencati inTabella 12.6, detti anche leggi monoidali .

Indichiamo con E 1 l’insieme che contiene i quattro assiomi di Tabella 12.6. Per convenienzaassociamo un nome ad ogni assioma; in questo caso gli assiomi si chiamano (A1)-(A4). Ogni

assioma è dato in termini processi arbitrari del linguaggio in considerazione, in questo casoCCS di base. In (A2), per esempio, p, q e r sono processi generici, e l’assioma asserisceche, sostituendo ad ogni processi generico qualunque processo CCS di base, l’uguaglianza èverificata.

Commentiamo brevemente gli assiomi dell’insieme E 1. Gli assiomi (A1) e (A2) indicanorispettivamente che + è commutativo e associativo. Questo significa che espressioni dellaforma p1 + . . . + pn, anche se non contengono parentesi nelle giuste posizioni, sono legittimeed hanno un significato preciso, dato che tutte le giustapposizioni di parentesi sono equivalenti.L’assioma (A3) indica che nil è l’elemento neutro per +. Questi primi tre assiomi fanno sìche CCS di base sia un monoide. L’ultimo assioma è detto anche legge di assorbimento, datoche permette di “assorbire” copie multiple della stesso processo in una sola.

Page 283: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 283/332

12.5 Ragionamento equazionale in CCS 283

(A1)-(A4) dalla Tabella 12.6

(Exp) Pi∈I µi.pi | Pj∈J µ0j .q j = Pi∈I µi. pi | Pj∈J µ0j .q j +Pj∈J µ

0j .

(P

i∈I µi.pi) | q j

+P(i,j) | µi=µ0

j τ .( pi | q j )

Tabella 12.7: Assiomatizzazione di ∼ per CCS di base con parallelo: insieme E 2

Esempio 12.30. Mostriamo come usare assiomi per costruire prove equazionali.

a.(b.nil + nil) + (a.nil + a.b.nil) = a.b.nil + (a.nil + a.b.nil) da (A3)= a.b.nil + (a.b.nil + a.nil) da (A1)

= (a.b.nil + a.b.nil) + a.nil da (A2)

= a.b.nil + a.nil da (A4)

Questa prova stabilisce che a.(b.nil + nil) + (a.nil + a.b.nil) = a.b.nil + a.nil in quattro passi,dove ogni passo rappresenta una “applicazione” di un assioma ad un sottotermine, in mododa produrne un altro, facendo uso delle regole d’inferenza di Tabella 12.5 di cui si è dettoall’inizio di questa sezione. Quindi, possiamo scrivere

E 1

`a.(b.nil + nil) + (a.nil + a.b.nil) = a.b.nil + a.nil

È possibile dimostrare che E 1 è un’assiomatizzazione corretta e completa di ∼ per CCSdi base.

Assiomatizzazione per CCS di base con parallelo. Analizziamo adesso il sottolinguag-gio ottenuto aggiungendo a CCS di base l’operatore di composizione parallela. Per questomotivo, lo chiameremo CCS di base con parallelo. Come si può intuire, gli assiomi (A1)-(A4)rimangono corretti per CCS di base con parallelo, ma non sono ovviamente completi, datoche nessun assioma menziona il parallelo; quindi, per esempio, non possiamo uguagliare p|q e q | p. Per definire un’assiomatizzazione completa per questo nuovo sottoinsieme di CCS, oc-corre aggiungere degli assiomi per il parallelo. La nuova assiomatizzazione è presentata inTabella 12.7.

L’unico nuovo assioma, (Exp), è conosciuto come legge di espansione , dato che mostra comeun termine costruito usando il parallelo come operatore principale (cioè, al livello più alto),può essere “espanso” in un altro che invece utilizza la somma come operatore al livello più alto.In questo modo, tramite applicazioni ripetute di (Exp), è possibile eliminare completamentel’operatore di composizione parallela da un termine.

In eff etti, (Exp) è il più complicato assioma di CCS, e merita ulteriori commenti. In primoluogo, si ricordi la definizione dell’operatore

Pi∈I · data nella Sezione 10.5: dato un indice I

e un insieme di termini della forma pi, indicizzato da I , si definisce P

i∈I pi come nil se I èvuoto e come la somma di tutti i pi altrimenti. Si noti allora che (Exp) può essere applicatoa un termine p1| p2 solo se p1 e p2 hanno una certa forma: ognuno deve essere una somma

Page 284: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 284/332

284 Capitolo 12 – Calculus of Communicating Systems (CCS)

di termini il cui operatore più esterno è quello di azione prefissa. Ancora, bisogna dire che(Exp) è uno schema di assiomi; al variare di I e J si ottengono assiomi diversi. Infine, la parte

destra di (Exp) consiste di tre sommandi, ognuno dei quali corrisponde ad una diversa regolaSOS per l’operatore di composizione parallela: il primo sommando permette al sottoterminea sinistra del parallelo di “muoversi” in modo autonomo; il secondo fa la stessa cosa con quellodi destra; il terzo sommando gestisce le possibili sincronizzazioni.

Per vedere come (Exp) può essere usato nelle prove, presentiamo un paio di esempi.

Esempio 12.31. Vediamo un semplice esempio di applicazione della legge di espansione.

p , α. p0 + β . p00 q def

= α. q 0 + γ . q 00 r def

= p | q

Applicando la legge si ottiene:

r def

= (α. ( p0 | q ) + β . ( p00 | q )) + (α. ( p | q 0) + γ . ( p | q 00)) + τ . ( p0 | q 0)

Se conosciamo la sintassi dei processi p0, p00, q 0, q 00 possiamo iterare il procedimento fino adavere un processo con solo prefissi e somme.

Esempio 12.32. Mostriamo che E 2 ` nil|b.nil = b.nil; ricordiamo che nil sta per il terminePi∈∅ pi, con pi qualsiasi.

nil|b.nil = nil + b.(nil|nil) + nil da (Exp)

= b.(nil|nil) da (A3) due volte= b.(nil + nil + nil) da (Exp)

= b.nil da (A3) due volte

Più in generale, per ogni processo CCS di base con parallelo p si può dimostrare cheE 2 ` nil| p = p; quindi, | ha nil come elemento neutro. È possibile inoltre dimostrare che perogni p1, p2 e p3, E 2 ` p1| p2 = p2| p1 e E 2 ` p1|( p2| p3) = ( p1| p2)| p3; conseguentemente, | ècommutativo e associativo.

È possibile dimostrare che E 2 è un’assiomatizzazione corretta e completa di ∼ per CCSdi base con parallelo.

Assiomatizzazione per CCS finito. Consideriamo ora il sottolinguaggio di CCS che com-prende tutti gli operatori a parte le costanti di processo; in letteratura questo sottolinguaggioè noto col nome di CCS finito. In altre parole, CCS finito estende CCS di base con parallelocon gli operatori di restrizione e relabelling; gli assiomi per questo linguaggio sono presentatiin Tabella 12.8.

Gli assiomi per \L e [f ] esprimono solo come questi operatori interagiscono con nil, azioneprefissa e somma. Il fatto che non ci siano regole che descrivono l’interazione tra | e \L oppuretra \L e [f ], è una conseguenza del fatto che le occorrenze più interne di ciascun operatorestatico possono essere eliminate con l’uso ripetuto degli assiomi per l’operatore in questionein aggiunta agli assiomi (A1)-(A4).

Page 285: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 285/332

12.5 Ragionamento equazionale in CCS 285

(A1)-(A4) da Tabella 12.6; (Exp) da Tabella 12.7

(Res1) nil\L = nil

(Res2) (µ.p)\L =

nil se µ, µ ∈ Lµ.( p\L) altrimenti

(Res3) ( p + q )\L = p\L + q \L(Rel1) nil[f ] = nil(Rel2) (µ.p)[f ] = f (µ).( p[f ])(Rel3) ( p + q )[f ] = p[f ] + q [f ]

Tabella 12.8: Assiomatizzazione di ∼ per CCS finito: insieme E 3

L’argomento precedente può essere formalizzato e usato per di mostrare che l’insieme diregole E

3 costituisce un’assiomatizzazione corretta e completa di

∼ per CCS finito. Ciò è

proprio quello che faremo nel resto di questa sezione.Cominciamo col dimostrare che le leggi introdotte nelle Tabelle 12.6, 12.7 e 12.8 sono

corrette rispetto a ∼. Per ciascuna legge, la dimostrazione può procedere esibendo una bisi-mulazione forte che contiene i due termini coinvolti nella legge. Una tale bisimulazione la sipuò costruire eff ettuando l’unione della relazione identità con quella che contiene coppie ditermini di CCS finito della forma di quelli coinvolti nella legge in questione. Alternativamente,la prova può consistere nel dimostrare che i termini CCS coinvolti nella legge hanno le stesseµ-derivate per ogni µ ∈ ACC S ; a questo punto la tesi deriva sfruttando la proprietà di ∼ datadalla Proposizione 11.14 di pagina 233. Per illustrare entrambi i metodi, useremo il primonella dimostrazione di correttezza delle leggi monoidali ed il secondo in quella della legge di

espansione. La dimostrazione della correttezza delle leggi per restrizione e relabelling è invecelasciata per esercizio al lettore.

Proposizione 12.33 (Leggi monoidali). Le leggi nella Tabella 12.6, cioè

1. p + q = q + p

2. p + (q + r) = ( p + q ) + r

3. p + p = p

4. p + nil = p

sono corrette rispetto a

∼.

Dimostrazione. Per ciascuna legge t1 = t2 bisogna esibire una bisimulazione forte R tale cheht1, t2i ∈ R. Dimostreremo solo la correttezza della legge 2.; le altre dimostrazioni seguonoprocedimenti simili ma sono più semplici. Definiamo la relazione seguente:

R , h p + (q + r), ( p + q ) + ri : p, q,r ∈ P CC S ∪ Id

e mostriamo che R è chiusa rispetto alle transizioni (si ricordi che I d lo è). Supponiamo che p + (q + r)

µ−→ t. Allora, dalle regole della semantica operazionale per la somma, si ha che p

µ−→ t oppure q µ−→ t oppure r

µ−→ t. In ognuno dei casi, usando ancora le regole della semanticaoperazionale per la somma, possiamo facilmente inferire che ( p + q ) + r

µ−→ t. La tesi segueda un argomento simmetrico.

Page 286: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 286/332

286 Capitolo 12 – Calculus of Communicating Systems (CCS)

Proposizione 12.34 (Legge di espansione). La legge (Tabella 12.7)

Pi∈I µi.pi | P j∈J µ0 j .q j = Pi∈I µi. pi | P j∈J µ0 j .q j +P j∈J µ

0 j .

(P

i∈I µi.pi) | q j

+P(i,j) | µi=µ0

j τ .( pi | q j )

è corretta rispetto a ∼.

Dimostrazione. È sufficiente dimostrare che i termini CCS coinvolti nella legge di espansionehanno le stesse µ-derivate per ogni µ ∈ ACC S ; a questo punto la tesi deriva dalla proprietà di∼ espressa dalla Proposizione 11.14. Supponiamo allora che

Pi∈I µi.pi|

P j∈J µ0 j .q j

µ−→ t.

Dalle regole della semantica operazionale per la composizione parallela, otteniamo che si devepresentare una delle seguenti tre situazioni:

Caso 1 µ = µk per qualche k ∈ I , P

i∈I µi.piµk−→ pk e t ≡ pk|(

P j∈J µ

0 j .q j );

Caso 2 µ = µ0l per qualche l ∈ J , P

j∈J µ j .p j

µ0

l−→ q l e t ≡ (P

i∈I µi.pi)|q l;

Caso 3 µ = τ , µk = µ0l per qualche k ∈ I ed l ∈ J , P

i∈I µi.piµk−→ pk,

P j∈J µ

0 j .q j

µ0

l−→ q l et ≡ pk|q l.

In ognuno dei casi, usando le regole della semantica operazionale per la somma, possiamo

facilmente inferire che il termine a destra del simbolo di = nella legge di espansione ha t come µ-derivata. Infatti, per ciascuna delle tre situazioni precedenti, abbiamo un caso corrispondente

Caso 1 P

i∈I µi. pi | P

j∈J µ0 j .q j

µk−→ pk|(P

j∈J µ0 j .q j ) per qualche k ∈ I ;

Caso 2 P

j∈J µ0 j .

(P

i∈I µi.pi) | q j µ0

l−→ (P

i∈I µi.pi)|q l per qualche l ∈ J ;

Caso 3 P

(i,j) |µi=µ0

j τ .( pi | q j ) τ −→ pk|q l per qualche (k, l) ∈

n(i, j) | µi = µ0 j

o.

In maniera simile si può dimostrare il contrario, cioè che ogni µ-derivata del termine a destradel simbolo di = è anche una µ-derivata del termine a sinistra. Per quanto detto prima, ciòè sufficiente per ricavare la tesi.

Proposizione 12.35 (Leggi per restrizione e relabelling). Le leggi della Tabella 12.8, cioè

1. nil\L = nil

2. (α.p)\L =

nil se α, α ∈ Lα.( p\L) altrimenti

3. ( p + q )\L = p\L + q \L

4. nil[f ] = nil

5. (α.p)[f ] = f (α).( p[f ])

Page 287: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 287/332

12.5 Ragionamento equazionale in CCS 287

6. ( p + q )[f ] = p[f ] + q [f ]

sono corrette rispetto a ∼.

Proposizione 12.36 (Correttezza). E 3 ` p = q implica p ∼ q .

Dimostrazione. Le precedenti tre proposizioni dimostrano la correttezza degli assiomi; quindila tesi si riduce a dimostrare la correttezza delle regole di inferenza di Tabella 12.5. Ora,dimostrare la correttezza delle prime tre regole equivale a dimostrare che ∼ è una relazionedi equivalenza, cosa che abbiamo fatto con la Proposizione 11.13(2), mentre dimostrare lacorrettezza della quarta regola equivale a dimostrare che ∼ è preservata da tutti gli operatoridi CCS finito, cosa che abbiamo fatto con la Proposizione 12.8. Ne segue quindi che il sistemadi prova illustrato è corretto per ∼ su processi di CCS finito.

Occupiamoci ora di dimostrare la completezza del sistema di prova per ∼ su CCS finito.A questo scopo introduciamo una forma sintattica particolare per i processi a cui comunquetutti i processi di CCS finito sono riconducibili.

Definizione 12.37 (Standard form). Un processo p ∈ P CC S è in standard form (s.f.) se

p ≡mX

i=1

µi.pi

dove ogni pi è anch’esso in standard form.

In pratica, un processo in s.f. è un processo CCS di base. In particolare, nil è in s.f. (è il

caso limite per m = 0). Inoltre, si ricordi che l’ordine degli addendi può essere ignorato grazieagli assiomi (A1) ed (A2) in Tabella 12.6.

Nel seguito indicheremo con prof ( p) la profondità di una s.f. p definita come il massimonumero di azioni prefisse innestate presenti in p. Si noti che prof (nil) = 0. La profondità diuna s.f. ci fornirà in alcune dimostrazioni un parametro su cui applicare induzione. Dimostria-mo ora che usando gli assiomi delle Tabelle 12.7 e 12.8 possiamo trasformare ogni processofinito in un processo finito che non contiene composizione parallela, restrizione o relabelling.

Lemma 12.38. Per ogni processo p di CCS finito, esiste un processo p0 in s.f. tale che E 3 ` p = p0.

Dimostrazione. Si procede eliminando dapprima le occorrenze più interne di ciascun operatorestatico ed iterando il procedimento fino a che tutti gli operatori statici non sono stati eliminati.Non è difficile infatti dimostrare, ragionando per induzione su prof ( p) nei primi due casi e suprof ( p) + prof (q ) nell’ultimo, i seguenti tre fatti:

1. Se p è una s.f. ed f : Λ → Λ allora E 3\ (Exp) ` p[f ] = p0 per qualche s.f. p0;

2. Se p è una s.f. ed L ⊆ Λ allora E 3\ (Exp) ` p \ L = p0 per qualche s.f. p0;

3. Se p e q sono s.f. allora E 2 ` p|q = p0 per qualche s.f. p0.

A questo punto il processo ottenuto è un processo CCS di base e si possono usare le leggidell’insieme E 1 per eliminare nil da ogni scelta. Il risultato è un processo in s.f..

Page 288: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 288/332

288 Capitolo 12 – Calculus of Communicating Systems (CCS)

Facendo uso delle s.f. possiamo dimostrare la completezza dell’insieme di leggi E 3 rispettoa

∼ per CCS finito.

Proposizione 12.39 (Completezza). p ∼ q implica E 3 ` p = q .

Dimostrazione. Assumiamo che p ∼ q ed inoltre, per via del lemma precedente, che p e q sono entrambi in s.f., cioè p ≡ Pm

i=1 µi.pi e q ≡ Pn j=1 µ j .q j . La dimostrazione procede per

induzione sulla massima tra le profondità di p e di q , che indichiamo con k .Se k = 0, allora entrambi i processi (essendo in s.f.) sono il processo nil e la regola

d’inferenza (riflessività) in Tabella 12.5 ci permette di inferire che E 1 ` nil = nil.Se k > 0, allora almeno uno tra p e q è diverso dal processo nil; supponiamo sia p. Sia

µ.p0 un sommando di p. Allora p µ−→ p0; inoltre, dal fatto che p ∼ q , sappiamo che esiste

un qualche q 0 tale che q µ−→ q 0 e p0 ∼ q 0. Poiché q è in s.f., µ.q 0 è un sommando di q . Ora,

p0 e q

0 sono in s.f. e la massima tra le loro profondità è minore di k, quindi, per induzione,

E 3 ` p0 = q 0. Perciò, il sommando µ.p0 di p può essere provato uguale ad un sommando di q .Similmente, ogni sommando µ0.q 0 di q può essere provato uguale tramite il sistema di prova adun sommando di p. Applicando un ragionamento simmetrico si può dimostrare il contrario.La tesi, cioè E 3 ` p = q , segue usando l’assioma (A4) per eliminare eventuali sommandiduplicati.

Assiomatizzazione per tutto CCS. Allo scopo di assiomatizzare l’intero linguaggio, oc-corrono regole per termini che includono le costanti di processo. Sfortunatamente, risultatiderivanti dalla teoria della computabilità ci dicono che non esiste un’assiomatizzazione com-pleta di ∼ per tutto CCS. Sono comunque state sviluppate due utili euristiche per ragionare

anche in presenza di costanti di processo e definizioni ricorsive.Entrambe le tecniche hanno la forma di regole di inferenza. La prima regola chiama-ta regola di unrolling , stabilisce che l’invocazione di un processo è equivalente al corpodell’invocazione.

(Unr) C , p

C = p

La seconda regola di inferenza è chiamata principio di unique fixpoint induction (UFI) e sibasa sulle nozioni di equazione e soluzione. Data una variabile di processo X e un termineCCS t che potenzialmente contiene la variabile X (in forma “libera”), l’espressione X = t èdetta equazione . Un processo CCS p è soluzione di X = t se e solo se p ∼ t[ p/X ], dovet[ p/X ] è il termine ottenuto rimpiazzando tutte le occorrenze della variabile X in t con p.

Un’equazione ha soluzione unica a meno di ∼ se, per ogni coppia di soluzioni p e q , si ha p ∼ q . Possiamo ora formulare la regola (UFI) come segue:

(UFI) p = t[ p/X ] q = t[q/X ]

p = q (X = t ha soluzione unica)

Questa regola ci permette di concludere che due termini sono uguali se è possibile dimostra-re (i) che sono entrambi soluzioni della stessa equazione e (ii) che l’equazione ha una solasoluzione (a meno di ∼).

Si possono fare alcune osservazioni su questa ultima regola. In primo luogo, ogni equazioneX = t ha una soluzione: posto infatti X , t, è facile vedere che il processo X è soluzionedi X = t. In eff etti, (UFI) è utile solo nel caso in cui siamo in grado di capire quando

Page 289: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 289/332

12.5 Ragionamento equazionale in CCS 289

un’equazione ha soluzione unica. Fortunatamente, è possibile definire una classe di equazioniche ha le caratteristiche richieste.

Nel resto di questa sezione3, supporremo per semplicità che tutti i termini consideraticontengano al più la stessa variabile di processo X .

Definizione 12.40. Sia X una variabile e t un termine CCS che contiene X . Allora X si dice guardata in t se ogni occorrenza di X in t compare nello scopo di un operatore di azione prefissa.

Per esempio, X è guardata in a.X e τ .X |(b.(X + c.nil)) ma non è guardata in X + b.X .Dimostriamo ora che se X è guardata in t, allora la prima mossa di t è indipendente dalprocesso sostituito al posto di X .

Proposizione 12.41. Se X è guardata in t e t[ p/X ] µ−→ p0, allora, per qualche termine CCS

t0, abbiamo p0 ≡ t0[ p/X ] e t[q/X ]

µ

−→ t0[q/X ] per ogni q ∈ P CC S .Dimostrazione. La dimostrazione procede per induzione sulla profondità della derivazione conla quale la transizione t[ p/X ]

µ−→ p0 è inferita. Ragioniamo esaminando i vari casi per t.

Caso 1 t ≡ Y , cioè t è una variabile di processo.Quindi X 6= Y poiché X , se occorre in t, è guardata in t. Ma Y [ p/X ] ≡ Y non haderivate quindi questo caso non si può presentare.

Caso 2 t ≡ µ0.t1.Quindi dobbiamo avere µ0 ≡ µ e p0 ≡ t1[ p/X ]. Ovviamente abbiamo anche t[q/X ] ≡µ.t1[q/X ]

µ−→ t1[q/X ]. La tesi segue allora prendendo t0 ≡ t1.

Caso 3 t ≡ t1 + t2.Quindi, con un’inferenza più breve, abbiamo che o t1[ p/X ]

µ−→ p0 o t2[ p/X ] µ−→ p0. Nel

primo caso, per induzione, possiamo assumere che per qualche termine CCS t01 si ha p0 ≡ t01[ p/X ] e t[q/X ]

µ−→ t01[q/X ] per ogni q ∈ P CC S . Nel secondo caso, sempre perinduzione, possiamo assumere che per qualche termine CCS t02 si ha p0 ≡ t02[ p/X ] et[q/X ]

µ−→ t02[q/X ] per ogni q ∈ P CC S .

Caso 4 t ≡ t1|t2.Consideriamo la transizione t[ p/X ]

µ−→ p0; data la forma di t abbiamo tre casi possibili

• t1[ p/X ] compie l’azione µ e t2[ p/X ] sta fermo;

• t2[ p/X ] compie l’azione µ e t1[ p/X ] sta fermo;• t1[ p/X ] compie un’azione α e t2[ p/X ] compie l’azione complementare α.

Esaminiamo il terzo caso che è il più complesso; gli altri due procedono in maniera simile.

In questo caso, abbiamo µ = τ , t1[ p/X ] α−→ p01, t2[ p/X ]

α−→ p02 e p0 ≡ p01| p02. Poiché letransizioni da t1[ p/X ] e t2[ p/X ] hanno un’inferenza più breve, per induzione, possiamoassumere che esistono due termini CCS t01 e t02 tali che p01 ≡ t01[ p/X ], p02 ≡ t02[ p/X ],

t1[q/X ] α−→ t01[q/X ] e t2[q/X ]

α−→ t02[q/X ] per ogni q ∈ P CC S . La tesi segue alloraprendendo t0 ≡ t01|t02.

3La proprietà che dimostreremo si potrebbero generalizzare a sistemi di equazioni di definizione con piùvariabili, ma rimandiamo il lettore interessato a Milner [Mil89], pag. 103.

Page 290: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 290/332

290 Capitolo 12 – Calculus of Communicating Systems (CCS)

Caso 5 t ≡ t1\L oppure t1[f ].Questi casi sono più semplici del caso precedente e la loro prova è lasciata per esercizio

al lettore.

Caso 6 t ≡ C con C , r.Quindi, non ci sono occorrenze di X in t, perciò abbiamo C

µ−→ p 0. La tesi segue allorafacilmente prendendo t0 ≡ p0.

Possiamo finalmente dimostrare l’unicità delle soluzioni di un’equazione a meno di ∼.

Teorema 12.42. Sia X guardata in t. Allora l’equazione X = t ha soluzione unica a menodi ∼.

Dimostrazione. Per definizione, dobbiamo dimostrare che se p

∼ t[ p/X ] e q

∼ t[q/X ] allora

p ∼ q . Cominciamo a dimostrare che la seguente relazione

S = ht0[ p/X ], t0[q/X ]i : var(t0) ⊆ X ∪ Id

è una bisimulazione forte up to ∼ dove la condizione var(t0) ⊆ X indica che t0 è un termineCCS che o non contiene variabili di processo o contiene la variabile X . Per simmetria, èsufficiente dimostrare che

se t0[ p/X ] µ−→ p0 allora, per qualche q 0 ∈ P CC S , t0[q/X ]

µ−→ q 0 con h p0, q 0i ∈∼ S ∼.

Come per la proposizione precedente, la dimostrazione procede per induzione sulla profonditàdella derivazione con la quale la transizione t0[ p/X ]

µ

−→ p 0 è inferita. Ragioniamo esaminando

i vari casi.

Caso 1 t0 ≡ X , cioè t0 è proprio la variabile di processo X .Quindi X [ p/X ] ≡ p

µ−→ p0, perciò, dato che p ∼ t[ p/X ], abbiamo che t[ p/X ] µ−→ p00 ∼ p0.

Poiché X è guardata in t, per la Proposizione 12.41, p00 ≡ t00[ p/X ] e t[q/X ] µ−→ t00[q/X ].

Dato che t0[q/X ] ≡ X [q/X ] ≡ q ∼ t[q/X ], allora abbiamo t0[q/X ] µ−→ q 0 ∼ t00[q/X ].

Riassumendo abbiamo p0 ∼ t00[ p/X ] S t00[q/X ] ∼ q 0 come richiesto.

Caso 2 t0 ≡ µ0.t1.Quindi dobbiamo avere µ0 ≡ µ e p0 ≡ t1[ p/X ]. Ovviamente abbiamo anche t0[q/X ] ≡µ.t1[q/X ]

µ−→ t1[q/X ]. La tesi segue dal fatto che per costruzione ht1[ p/X ], t1[q/X ]i ∈ S .

Caso 3 t0 ≡ t1 + t2.Quindi, con un’inferenza più breve, abbiamo che o t1[ p/X ]

µ−→ p0 o t2[ p/X ] µ−→ p0. Nel

primo caso, per induzione, abbiamo che, per qualche q 01 ∈ P CC S , t0[q/X ] µ−→ q 01 con

h p0, q 01i ∈∼ S ∼. Nel secondo caso, sempre per induzione, abbiamo che, per qualcheq 02 ∈ P CC S , t0[q/X ]

µ−→ q 02 con h p0, q 02i ∈∼ S ∼.

Caso 4 t0 ≡ t1|t2.Consideriamo la transizione t0[ p/X ]

µ−→ p0; data la forma di t0 abbiamo tre casi possibili

• t1[ p/X ] compie l’azione µ e t2[ p/X ] sta fermo;

• t2[ p/X ] compie l’azione µ e t1[ p/X ] sta fermo;

Page 291: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 291/332

12.5 Ragionamento equazionale in CCS 291

• t1[ p/X ] compie un’azione α e t2[ p/X ] compie l’azione complementare α.

Esaminiamo il terzo caso che è il più complesso; gli altri due procedono in maniera simile.In questo caso, abbiamo µ = τ , t1[ p/X ]

α−→ p01, t2[ p/X ] α−→ p02 e p0 ≡ p01| p02. Poiché le

transizioni da t1[ p/X ] e t2[ p/X ] hanno un’inferenza più breve, per induzione, possiamo

assumere che esistono q 01, q 02 ∈ P CC S , tali che t1[q/X ] α−→ q 01, t2[q/X ]

α−→ q 02, h p01, q 01i ∈∼S ∼ e h p02, q 02i ∈∼ S ∼. Rimane da stabilire se h p01| p02, q 01|q 02i ∈∼ S ∼. Ora, poichéh p0i, q 0ii ∈∼ S ∼ con i = 1, 2, per definizione di S , per qualche termine t0i si ha p0i ∼ t0i[ p/X ]e q 0i ∼ t0i[q/X ], sempre per i = 1, 2. Prendiamo allora il termine t00 ≡ t01|t02. Abbiamot00[ p/X ] ≡ t01[ p/X ]|t02[ p/X ] e t00[q/X ] ≡ t01[q/X ]|t02[q/X ] e, quindi, poiché ∼ è preservatadall’operatore di composizione parallela, abbiamo p01| p02 ∼ t00[ p/X ] S t00[q/X ] ∼ q 01|q 02come richiesto.

Caso 5 t0 ≡ t1\L oppure t0 ≡ t1[f ] oppure t ≡ C con C , r.Questi casi sono più semplici del caso precedente e la loro prova è lasciata per esercizioal lettore.

Ora, prendiamo t0 ≡ X . Ne deriva che hX [ p/X ], X [q/X ]i ≡ h p, q i ∈ S e, quindi, che p ∼ q ,che è ciò che volevamo dimostrare.

Esempio 12.43. Come esempio di applicazione di (Unr) e (UFI), supponiamo di volerdimostrare che A e B sono bisimili, dove A , a.A e B , a.a.B. Consideriamo l’equazioneX = a.a.X . Dimostriamo dapprima che sia A che B sono soluzione di questa equazione:

A = a.A da (Unr)

= a.a.A da (Unr)

B = a.a.B da (Unr)

Dato che X è guardata in a.a.X , X = a.a.X ha soluzione unica e di conseguenza, usando(UFI) si può concludere che A = B.

Per una classe particolare di processi CCS è comunque possibile fornire un’assiomatizza-zione completa, pur potendo tali processi non essere finiti. Si tratta dei cosiddetti processi

sequenziali , cioè quei processi che non fanno uso dei tre operatori statici: composizione paral-lela, restrizione e relabelling. In questo caso serve anche la regola seguente che permette ditrasformare un processo sequenziale qualsiasi in uno guardato:

(Seq1) C , C + p D , p[D/C ]

C = D

dove p[D/C ] indica il processo p in cui le occorrenze della costante di processo C sonorimpiazzate con D . Si può allora enunciare il seguente risultato (che non dimostreremo).

Proposizione 12.44 (Correttezza e completezza). Siano p, q ∈ P CC S processi sequenziali. p

∼ q se e solo se E 1

∪(Unr ), (UFI ), (Seq1)

` p = q .

Page 292: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 292/332

292 Capitolo 12 – Calculus of Communicating Systems (CCS)

(A1)-(A4) da Tabella 12.6; (Exp) da Tabella 12.7;(Res1)-(Res3),(Rel1)-(Rel3) da Tabella 12.8

(τ 1) µ.τ .p = µ.p(τ 2) p + τ .p = τ .p(τ 3) µ.( p + τ .q ) = µ.( p + τ .q ) + µ.q

Tabella 12.9: Assiomatizzazione di ∼= per CCS finito: insieme E 4

12.5.2 Assiomatizzazione di ∼=Occupiamoci ora dell’assiomatizzazione di ∼= per CCS. Seguendo il procedimento usato per∼, consideriamo dapprima CCS finito e quindi CCS completo.

Assiomatizzazione per CCS finito. Cominciamo facendo notare che le leggi nell’insiemeE 3 di Tabella 12.8 sono corrette anche per ∼=, dato che p ∼ q implica p ∼= q . Però, per ottenereun’assiomatizzazione completa per ∼=, occorre aggiungere degli assiomi che riflettano la naturaspeciale dell’azione interna τ . Tali assiomi, noti come “leggi τ ”, sono illustrati in Tabella 12.9.

La legge (τ 1) serve per l’assorbimento delle azioni τ che seguono immediatamente operatoridi azione prefissa. La legge (τ 2) può essere spiegata come segue. Primo, ogni transizione fortedi τ .p è anche una transizione forte di p+τ .p. Secondo, ogni transizione forte di p+τ .p, inclusele transizioni τ , può essere messa in corrispondenza con una appropriata transizione deboledi τ .p. La legge finale, (τ 3) è forse la più difficile da interpretare; si noti che la derivazione

µ.( p + τ .q ) + µ.q µ

−→ q

della parte destra della regola, può essere messa in corrispondenza con la discendenza

µ.( p + τ .q ) µ=⇒ q

della parte sinistra. L’utilità di queste leggi la si apprezzerà nella dimostrazione di completezzaed in particolare in quella del Lemma 12.47.

Dimostriamo adesso la correttezza delle leggi τ .

Proposizione 12.45 (Leggi τ ). Le leggi della Tabella 12.9, cioè

1. µ.τ .p = µ.p

2. p + τ .p = τ .p

3. µ.( p + τ .q ) + µ.q = µ.( p + τ .q )

sono corrette rispetto a ∼=.

Dimostrazione. La correttezza delle leggi segue direttamente dalla definizione di congruenzaosservazionale. Nel punto 1. si usa anche la Proposizione 11.47.

Si osservi anche che tutte le leggi corrette per ∼ e ∼= lo sono anche per ≈, mentre non valeil viceversa: infatti, abbiamo che p ≈ τ .p mentre in generale p 6∼= τ .p.

Possiamo infine dimostrare che l’insieme di leggi E 4 definito in Tabella 12.9 è completo per

∼= su CCS finito. Anche in questo caso faremo uso di alcune forme particolari per i processi.

Page 293: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 293/332

12.5 Ragionamento equazionale in CCS 293

Definizione 12.46 (Full standard form). Un processo p ∈ P CC S è in full standard form (f.s.f.) se

1. p ≡ Pmi=1 µi.pi, dove ogni pi è anch’esso in full standard form;

2. se p µ=⇒ p0 allora p

µ−→ p0.

Possiamo pensare alla f.s.f. come ad una s.f. saturata nel seguente senso: per ogni p µ=⇒ p0

allora µ.p0 appare come sommando di p. Vediamo ora come ogni s.f. può essere saturatautilizzando le leggi τ (Tabella 12.9).

Lemma 12.47 (Saturazione). Se p è una s.f. e p µ=⇒ p0, allora E 4 ` p = p + µ.p0.

Dimostrazione. La prova procede per induzione su prof ( p). Dato che p è una s.f., se p µ=⇒ p 0

allora si deve presentare uno dei seguenti tre casi.

Caso 1 µ.p0 è un sommando di p. La tesi segue dall’assioma (A4).

Caso 2 µ.q è un sommando di p e q τ =⇒ p 0. Allora per induzione E 4 ` q = q + τ .p0, quindi

E 4 ` p = p + µ.q da (A4)= p + µ.(q + τ .p0) da E 4 ` q = q + τ .p0

= p + µ.(q + τ .p0) + µ.p0 da (τ 3)= p + µ.q + µ.p0 da E 4 ` q = q + τ .p0

= p + µ.p0 da (A4)

Caso 3 τ .q è un sommando di p e q µ=⇒

p0. Allora per induzione si ha E

4 ` q = q + µ.p

0,

quindiE 4 ` p = p + τ .q da (A4)

= p + τ .q + q da (τ 2)= p + τ .q + q + µ.p0 da E 4 ` q = q + µ.p0

= p + τ .q + µ.p0 da (τ 2)= p + µ.p0 da (A4)

Questo completa la prova.

Con l’ausilio di questo lemma, possiamo trasformare ogni s.f. in una f.s.f. equivalente.

Lemma 12.48. Per ogni processo p in s.f. esiste un processo p0 in f.s.f. di uguale profondità,tale che E 4 ` p = p0.

Dimostrazione. La dimostrazione procede per induzione su prof ( p). Se prof ( p) = 0 allora p ≡ nil, e quindi p è già in f.s.f.. In caso contrario, per ogni sommando µ.q di p possiamoassumere per induzione che q sia già stato convertito, grazie all’insieme E 4, in f.s.f. senzaincremento di profondità. Ora, consideriamo tutte le coppie (µi, pi), 1 ≤ i ≤ k, tali che

p µi=⇒ pi e p 6µi−−→ pi. Ogni pi deve essere una f.s.f. in quanto è una sottoespressione di qualche

sommando µ.q di p. Dunque

p0 ≡ p + µ1.p1 + · · · + µk.pk

è una f.s.f. di uguale profondità di p, e grazie al lemma di saturazione, E 4 `

p = p0.

Page 294: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 294/332

294 Capitolo 12 – Calculus of Communicating Systems (CCS)

Siamo adesso in grado di dimostrare che E 4 è completo per ∼= su processi di CCS finito.

Proposizione 12.49 (Completezza). p ∼= q implica E 4 ` p = q .

Dimostrazione. Per via del lemma precedente, possiamo assumere che p e q sono in f.s.f.; laprova procede per induzione sulla somma delle profondità di p e q .

Se la somma è pari a zero, allora si ha p ≡ nil ≡ q , e la tesi segue banalmente. In casocontrario, almeno uno tra p e q è diverso da nil; supponiamo sia p. Assumiamo ora che

p ∼= q e che µ.p0 è un sommando di p. Il nostro obiettivo è dimostrare che q ha un sommandoprovabilmente uguale a µ.p0. Dato che p

µ−→ p0 e per ipotesi p ∼= q , esiste un q 0 tale che q µ=⇒ q 0

e p0 ≈ q 0. Inoltre, poiché q è in f.s.f. si ha anche che q µ−→ q 0, e quindi µ.q 0 è un sommando di

q .Non possiamo applicare immediatamente l’induzione, in quanto sappiamo soltanto che

p0 ≈ q 0 e non che p0 ∼= q 0. Ma dalla Proposizione 12.22 sappiamo che p0 ≈ q 0 implica che unodei seguenti tre casi si deve verificare: p0 ∼= q 0 o p0 ∼= τ .q 0 o τ .p0 ∼= q 0.Nel primo caso, dal momento che p 0 e q 0 sono in f.s.f. e di profondità minore di p e q , per

induzione segue che E 4 ` p0 = q 0, quindi che E 4 ` µ.p0 = µ.q 0. Nel secondo caso dobbiamoconvertire τ .q 0 in f.s.f. prima di poter applicare l’induzione. Dal Lemma 12.48 sappiamo cheesiste un q 00 in f.s.f. di uguale profondità di τ .q 0, e quindi di q , tale che E 4 ` τ .q 0 = q 00. Ora, lasomma delle profondità di p0 e q 00 è minore della somma delle profondità di p e q , e quindi perinduzione possiamo inferire che E 4 ` p0 = q 00 e quindi che E 4 ` p0 = τ .q 0. Grazie all’assioma(τ 1) possiamo concludere che E 4 ` µ.p0 = µ.q 0. Il terzo caso è simile a questo.

Dunque, in ognuno dei tre casi, abbiamo mostrato che tramite E 4 ogni sommando µ.p0

di p può essere provato uguale ad un sommando di q . In modo simile, ogni sommando µ0.q 0

di q può essere provato uguale ad un sommando di p. Infine, utilizzando l’assioma (A4) pereliminare eventuali sommandi duplicati, possiamo concludere che E 4 ` p = q .

Assiomatizzazione di ∼= per tutto CCS. Le stesse osservazioni fatte per ∼ valgono per ∼=,quindi non esiste una assiomatizzazione corretta e completa per ∼= su tutto CCS. Nonostanteciò le regole (Unr) e (UFI) valgono ancora, anche se la caratterizzazione delle equazioni chehanno soluzione unica diventa più complessa; non è più sufficiente richiedere solo che lavariabile sia guardata. Infatti, si consideri l’equazione X = τ .X . X è guardata in τ .X , maqualunque processo capace di un’azione iniziale τ è soluzione di questa equazione a meno di∼=. In particolare, τ .a.nil ∼= τ .τ .a.nil e τ .b.nil ∼= τ .τ .b.nil, ma ovviamente τ .a.nil 6∼= τ .b.nil.Comunque, è possibile individuare una classe di equazioni che hanno soluzione unica rispettoa ∼=.

Nel resto di questa sezione4, supporremo per semplicità che tutti i termini consideraticontengano al più la stessa variabile di processo X .

Definizione 12.50. Sia X una variabile e t un termine CCS. X è fortemente guardata in tse ogni sottotermine di t che contiene X , a parte X stesso, è della forma α.t0, con α 6= τ .

Ciò significa che X è fortemente guardata in t se almeno un operatore di azione prefissache coinvolge un’azione visibile precede ogni occorrenza di X in t. Ovviamente X non è

4La proprietà che dimostreremo si potrebbero generalizzare a sistemi di equazioni di definizione con piùvariabili, ma rimandiamo il lettore interessato a Milner [Mil89], pag. 158.

Page 295: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 295/332

12.5 Ragionamento equazionale in CCS 295

fortemente guardata in τ .X . Comunque, il fatto che X sia fortemente guardata in t nonimplica che X = t abbia soluzione unica a meno di ∼=. Infatti, consideriamo l’equazione

X = (a.X |a.nil)\ a .

X è fortemente guardata nella parte destra dell’equazione, tuttavia si può vedere che, peresempio, τ .b.nil e τ .c.nil sono entrambe soluzioni. È possibile risolvere questo problemarichiedendo quanto segue.

Definizione 12.51. Sia X una variabile e t un termine CCS. X è sequenziale in t se ogni sottotermine di t che contiene X , a parte X stesso, è della forma µ.t0 oppure t1 + t2.

Per esempio, X è sequenziale in a.X e τ .X +(b.nil|c.nil) ma non è sequenziale in a.X |b.nil(benché il termine sia fortemente guardato). In pratica, se X è sequenziale in t allora nessuna

occorrenza di X in t ricade nello scopo di un operatore statico.Analogamente al caso della bisimilarità forte, dimostriamo prima che se un termine t con-tiene solo occorrenze fortemente guardate e sequenziali di una variabile di processo X , allora ilcomportamento di t, fino ed incluso l’esecuzione della prima azione visibile, è completamenteindipendente dal processo sostituito al posto di X .

Proposizione 12.52. Se X è fortemente guardata e sequenziale in t e t[ p/X ] µ−→ p0 allora,

per qualche termine CCS t0, abbiamo p0 ≡ t0[ p/X ] e t[q/X ] µ−→ t0[q/X ] per ogni q ∈ P CC S .

Inoltre, X è sequenziale in t0 e, se µ = τ , allora è anche fortemente guardata.

Dimostrazione. La dimostrazione procede per induzione sulla struttura di t. Innanzitutto sinoti che t

≡X non può verificarsi, poiché per ipotesi X è fortemente guardata in t. Ora, se

t ≡ C (C costante di processo), oppure t ≡ t1|t2, oppure t ≡ t1 \ L (L ⊆ Λ), oppure t ≡ t1[f ](f : Λ → Λ), allora, poiché per ipotesi X è sequenziale in t, la variabile X non occorre in t

e quindi t µ−→ p0. La tesi allora segue immediatamente ponendo t0 ≡ p0. Se t ≡ µ0.t00, allora

µ ≡ µ0 e chiaramente p0 ≡ t00[ p/X ] e la tesi segue immediatamente ponendo t0 ≡ t00; si notiche se µ = τ allora X è fortemente guardata anche in t0. Infine, se t ≡ t1 + t2, la tesi seguefacilmente per induzione.

Possiamo finalmente dimostrare l’unicità delle soluzioni di un’equazione a meno di ∼=.

Teorema 12.53. Sia X = t un’equazione con X fortemente guardata e sequenziale in t.Allora X = t ha un’unica soluzione a meno di ∼=.

Dimostrazione. Per definizione, dobbiamo dimostrare che se p ∼= t[ p/X ] e q ∼= t[q/X ] allora p ∼= q . È sufficiente dimostrare che la relazione

S =ht0[ p/X ], t0[q/X ]i : X sequenziale in t0

gode della seguente proprietà

se t0[ p/X ] µ=⇒ p0 allora, per qualche q 0 ∈ P CC S , t0[q/X ]

µ=⇒ q 0 e h p0, q 0i ∈ ≈ S ≈.

se t0[q/X ] µ=⇒ q 0 allora, per qualche p 0 ∈ P CC S , t0[ p/X ]

µ=⇒ p 0 e h p0, q 0i ∈ ≈ S ≈.

(12.2)

Vediamo prima perché ciò ci permette di arrivare alla tesi. Ora, per ogni processo CCS r

ed azione µ, abbiamo che r µ=⇒

r0 implica r µ=⇒

r0. Quindi, la validità della proprietà (12.2)

Page 296: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 296/332

296 Capitolo 12 – Calculus of Communicating Systems (CCS)

implica che S è una bisimulazione debole up to ≈ (Definizione 11.49). Perciò, per la Propo-sizione 11.50, abbiamo che

h p0, q 0

i ∈≈S

≈ implica p 0

≈q 0. Inoltre, poiché per ogni processo

CCS r ed azione µ, r µ−→ r0 implica r µ=⇒ r0, abbiamo che t0[ p/X ] µ−→ p0 implica t0[ p/X ] µ=⇒ p0 et0[q/X ]

µ−→ q 0 implica t0[q/X ] µ=⇒ q 0. Quindi, dalla proprietà (12.2), prendendo t0 ≡ X per cui

abbiamo h p, q i ≡ hX [ p/X ], X [q/X ]i ∈ S , segue che:

se p ≡ t0[ p/X ] µ−→ p 0 allora, per qualche q 0 ∈ P CC S , q ≡ t0[q/X ]

µ=⇒ q 0 e h p0, q 0i ∈ ≈

se q ≡ t0[q/X ] µ−→ q 0 allora, per qualche p0 ∈ P CC S , p ≡ t0[ p/X ]

µ=⇒ p 0 e h p0, q 0i ∈ ≈

che, per definizione di congruenza osservazionale (Definizione 12.15), significa proprio che p ∼= q .

Ci resta allora da dimostrare la proprietà (12.2). La dimostrazione dipende in manieracruciale dalla possibilità di sostituire p con t[ p/X ] convertendo così un termine t0[ p/X ] neltermine fortemente guardato t0[t[ p/X ]/X ] e rendendo applicabile la Proposizione 12.52.

Converrà prima dimostrare una proprietà simile alla (12.2) ma che coinvolge solo azioniinterne e cioè:

se t0[ p/X ] =⇒ p 0 allora, per qualche q 0 ∈ P CC S , t0[q/X ] =⇒ q 0 e h p0, q 0i ∈ ≈ S ≈.

se t0[q/X ] =⇒ q 0 allora, per qualche p 0 ∈ P CC S , t0[ p/X ] =⇒ p 0 e h p0, q 0i ∈ ≈ S ≈. (12.3)

Supponiamo allora che t0[ p/X ] =⇒ p0. Ora, poiché p ∼= t[ p/X ] e ∼= è una congruenza, t0[ p/X ] ∼=t0[t[ p/X ]/X ], quindi per qualche p00 ∈ P CC S , abbiamo t0[t[ p/X ]/X ] =⇒ p00 ≈ p0. Poiché X è fortemente guardata e sequenziale in t0[t/X ], per la Proposizione 12.52, esiste un terminet00 con X sequenziale in esso tale che p00 ≡ t00[ p/X ] e t0[t[q/X ]/X ] =⇒ t00[q/X ]. Poiché per

ipotesi t0[q/X ] ∼= t0[t[q/X ]/X ], per qualche q 0 ∈ P CC S , abbiamo t0[q/X ] =⇒ q 0 ≈ t00[q/X ].Riassumendo, abbiamo p0 ≈ p00 ≡ t00[ p/X ] S t00[q/X ] ≈ q 0. Ciò, per simmetria, è sufficiente adimostrare la proprietà (12.3).

Infine, dimostriamo la proprietà (12.2). Supponiamo innanzitutto che t0[ p/X ] µ=⇒ p0. Al-

lora, poiché t0[ p/X ] ∼= t0[t[ p/X ]/X ], abbiamo t0[t[ p/X ]/X ] =⇒ µ−→ =⇒ p00 ≈ p0. Ora, ap-plicando ripetutamente la Proposizione 12.52 per le transizioni =⇒ µ−→ , otteniamo cheesiste un termine t00 tale che X è sequenziale in t00, t0[t[ p/X ]/X ] =⇒ µ−→ t00[ p/X ] =⇒ p 00 ≈ p0 et0[t[q/X ]/X ] =⇒ µ−→ t00[q/X ]. A questo punto, per la proprietà (12.3), otteniamo t00[q/X ] =⇒ q 00

e p00 ≈ S ≈ q 00, per qualche q 00 ∈ P CC S . Infine, poiché t0[q/X ] ∼= t0[t[q/X ]/X ], abbiamot0[q/X ]

µ=⇒ q 0 ≈ q 00. Perciò p0 ≈ p00 ≈ S ≈ q 00 ≈ q 0, da cui, per transitività di ≈, abbiamo

p0

≈S

≈q 0. Ciò, per simmetria, è sufficiente a concludere che la proprietà (12.2) vale.

Esempio 12.54. Per concludere, presentiamo un esempio per esteso, riguardo l’utilizzodegli assiomi introdotti. Riprendiamo il semplice protocollo di comunicazione P definito inSezione 12.1 di pagina 261 e la sua specifica Svc definita nell’Esempio 12.27 di pagina 280.È possibile stabilire che E 4 ∪ (Unr), (UFI) ` P = Svc nel modo seguente. Si noti primadi tutto che X è fortemente guardata e sequenziale in send.recv.X e quindi l’equazione X =send.recv.X ha soluzione unica a meno di ∼=. Quello che resta da fare è mostrare che sia P che S vc sono soluzioni di questa equazione, dopodiché, utilizzando la regola (UFI), si ha cheP = Svc. Per fare ciò vediamo subito che

Svc = send.recv.Svc da (Unr)

Page 297: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 297/332

12.5 Ragionamento equazionale in CCS 297

quindi S vc è una soluzione. Come per S vc, possiamo derivare che

P = (S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack])\ get, put, get_ack, put_ack

usando (Unr), quindi è sufficiente dimostrare che la parte destra è una soluzione dell’equazionedata, cioè che

(S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack])\ get, put, get_ack, put_ack =

send.recv.(S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack])\ get, put, get_ack, put_ack

A tale scopo procediamo come segue. Abbiamo

(S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack])\ get, put, get_ack, put_ack =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.((msg.ack.S )[ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack])\ . . . =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.τ .((ack.S )[ put/msg, get_ack/ack] | (get.M )| R[get/msg, put_ack/ack]) \ . . . =

per (τ 1)

send.((ack.S )[ put/msg, get_ack/ack] | (get.M ) | R[get/msg, put_ack/ack])\ . . . =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.τ .((ack.S )[ put/msg, get_ack/ack] | M | (recv.ack.R)[get/msg, put_ack/ack]) \ . . . =

per (τ 1)

send.((ack.S )[ put/msg, get_ack/ack] | M | (recv.ack.R)[get/msg, put_ack/ack]) \ . . . =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.recv.((ack.S )[ put/msg, get_ack/ack] | M | (ack.R)[get/msg, put_ack/ack])\ . . . =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.recv.τ .((ack.S )[ put/msg, get_ack/ack] | get_ack.M | R[get/msg, put_ack/ack]) \ . . . =

per (τ 1)

send.recv.((ack.S )[ put/msg, get_ack/ack] | g et_ack.M | R[get/msg, put_ack/ack])\ . . . =

per (Exp), (Rel1)-(Rel3), (Res1)-(Res3)

send.recv.τ .(S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack]) \ . . . =

Page 298: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 298/332

298 Capitolo 12 – Calculus of Communicating Systems (CCS)

(A1)-(A4) da Tabella 12.6; (Exp) da Tabella 12.7(Res1)-(Res3),(Rel1)-(Rel3) da Tabella 12.8

(F1) µ.p + µ.q = µ.(τ .p + τ .q )(F2) p + τ .q v τ .( p + q )(F3) µ.p + τ .(µ.q + r) = τ .(µ.p + µ.q + r)(F4) τ .p v p

Tabella 12.10: Assiomatizzazione di vctest per CCS finito: insieme E 5

per (τ 1)

send.recv.(S [ put/msg, get_ack/ack] | M | R[get/msg, put_ack/ack]) \ . . .

Anche per ∼= è possibile dare un’assiomatizzazione completa per processi CCS sequenziali(cioè che non fanno uso dei tre operatori statici) e, quindi, non necessariamente finiti. Alloscopo di trasformare un processo sequenziale qualsiasi in uno fortemente guardato servonoanche le regole:

(Seq 2) C , τ .C + p D , τ .p[D/C ]

C = D

(Seq 3) C , τ .(C + p) + q D , τ .D + p[D/C ] + q [D/C ]

C = D

(si ricordi che r [D/C ] indica il processo r in cui le occorrenze di C sono rimpiazzate con D).Si può allora enunciare il seguente risultato (che non dimostreremo).

Proposizione 12.55 (Correttezza e completezza). Siano p, q ∈ P CC S processi sequenziali. p ∼= q se e solo se E 1 ∪ (τ 1), (τ 2), (τ 3), (Unr ), (UFI ), (Seq1), (Seq2 ), (Seq3 ) ` p = q .

12.5.3 Assiomatizzazione di vctest, vc

M e vm

Come per ∼ e ∼=, cominciamo con l’introdurre le assiomatizzazioni corrette e complete deipreordini per CCS finito e quindi presentiamo brevemente alcune euristiche per gestire ledefinizioni di processo ricorsive.

Assiomatizzazione per CCS finito. L’assiomatizzazione di vctest per CCS finito è da-

ta dall’insieme E 5 ed è presentata in Tabella 12.10. A diff erenza di quanto abbiamo vistofinora, questa è un’assiomatizzazione disequazionale : essa è usata per dimostrare asserzionidella forma p v q invece che p = q . Come si può vedere, gli assiomi includono disugua-glianze; le uguaglianze come nella regola (F1) vanno interpretate come abbreviazioni per duedisuguaglianze, nelle due direzioni.

L’assiomatizzazione per vcM si ottiene aggiungendo all’insieme E 5 il seguente assioma

(F5) τ .p + τ .q v p

mentre quella per v

m si ottiene aggiungendo a E 5 l’assioma

Page 299: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 299/332

12.5 Ragionamento equazionale in CCS 299

(F6) p v τ .p + τ .q

Per vedere come queste regole possono essere usate per derivare dei risultati, mostriamoche E 5 ∪ (F5) ` a.b.nil + a.c.nil v a.b.nil.

a.b.nil + a.c.nil = a.(τ .b.nil + τ .c.nil) da (F1)

v a.b.nil da (F5)

Occupiamoci ora della correttezza delle assiomatizzazioni in questione. Il Teorema 11.79ci assicura che gli assiomi dell’insieme E 3 (cioè quelli per la bisimilarità forte) sono correttianche per i preordini basati su testing; per lo stesso motivo, anche le leggi τ sono corrette. Lacorrettezza delle leggi (F1)-(F6), invece, si può dimostrare come abbiamo fatto in precedenza.

Per quanto riguarda la completezza delle assiomatizzazioni, questa si dimostra con pro-

cedimenti simili a quelli visti per bisimilarità facendo uso di “forme speciali” per i processi.In particolare, nel caso di vctest si utilizzano le seguenti forme speciali per i processi di CCS

finito (le forme speciali per gli altri due preordini sono simili).

Definizione 12.56 (Insieme saturato). Sia L un insieme non vuoto di insiemi finiti di azioni visibili, cioè L ⊆ P (ACC S ). Sia Act(L) = α | α ∈ L, L ∈ L l’insieme di tutte le azioni di L.Si dice che L è saturato se ∀K ⊆ ACC S

L ∈ L ∧ L ⊆ K ⊆ Act(L) implica K ∈ L

Definizione 12.57 (Forma normale). Un processo è in forma normale se è in una delle due forme seguenti:

a) PL∈L τ .Pα∈L α.pα con pα in forma normale

b) P

α∈L α.pα con pα in forma normale

dove L è un insieme saturato.

Sostanzialmente, la forma normale prevede che un processo sia strutturato in stratialternati dove si fanno solo azioni invisibili o solo azioni visibili. Vale il seguente risultato:

Lemma 12.58. Ogni processo di CCS finito può essere trasformato in forma normale usandole leggi E 5.

Teorema 12.59 (Completezza per vc

test). p vc

test q implica E 5 ` p v q .Dimostrazione. (Traccia) Per il lemma precedente, possiamo supporre che p e q siano in formanormale. Allora avremo p vc

test q se ogni sommando in p è presente anche in q . Supponiamo,per assurdo, che p abbia un sommando che q non ha, allora, sfruttando la saturazione delleforme normali, avremmo che è possibile determinare un insieme L tale che p must L è veromentre q must L è falso; ciò porta all’assurdo p 6vc

test q .

Usando tecniche simili si può dimostrare che

Teorema 12.60 (Completezza per vcM ). p vM q implica E 5 ∪ (F5) ` p v q .

Teorema 12.61 (Completezza per v

m). p

vm q implica E 5

∪(F6)

` p

vq .

Page 300: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 300/332

300 Capitolo 12 – Calculus of Communicating Systems (CCS)

Assiomatizzazione dei preordini per tutto CCS. Per trattare i processi ricorsivi, sipossono usare le regole (Unr) e (UFI) viste nella Sezione 12.5.1. Una condizione sufficiente

affinché un’equazione X = t abbia soluzione unica rispetto a 'ctest è che X sia fortementeguardata e sequenziale in t e che t sia totalmente convergente (si veda la Definizione 11.62).

12.6 Esercizi

12.1 Dimostrare la proposizione seguente che introduce alcune leggi per gli operatori statici derivabilia partire da quelle nelle Tabelle 12.7, 12.8 e 12.9.

Proposizione 12.62 (Leggi derivabili). Le seguenti leggi

1. p|q ∼ q | p

2. p|(q |r)

∼ ( p|q )|r

3. p|nil ∼ p

4. p \ L ∼ p se L( p) ∩ (L ∪ L) = ∅5. p \ K \ L ∼ p \ (K ∪ L)

6. p[f ] \ L ∼ p \ f −1(L)[f ]

7. ( p|q ) \ L ∼ p \ L|q \ L se L( p) ∩ L(q ) ∩ (L ∪ L) = ∅8. p[Id] ∼ p

9. p[f ] ∼ p[f 0] se f L( p) = f 0 L( p)

10. p[f ][f 0] ∼ p[f f 0]

11. ( p|q )[f ] ∼ p[f ]|q [f ] se f (L ∪ L) è biunivova, dove L = L( p) ∪ L(q )

sono corrette rispetto a ∼.

12.2 Mostrare che la legge seguente

(τ 4) p + τ .( p + q ) = τ .( p + q )

è derivabile dall’insieme E 4 definito in Tabella 12.9.

12.3 Relativamente alla definizione di insieme saturato (Definizione 12.56), si dimostri che se L èsaturato, allora valgono le seguenti proprietà:

1. se L1, L2 ∈ L allora (i) L1 ∪ L2 ∈ L e (ii) se L1 ⊆ K ⊆ L2 allora K ∈ L;

2. Act(L) ∈ L.

Page 301: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 301/332

Capitolo 13

Logiche per i sistemi concorrenti

SOMMARIO

Questo capitolo presenta alcune logiche modali e temporali e mostra come utilizzarle per specificare proprietà dei sistemi concorrenti. Dopo aver introdotto in generale le caratteri-stiche delle logiche modali e temporali, descriveremo in dettaglio la logica HML, la logica ACTL ed il µ-calculus modale. Infine, esamineremo la corrispondenza tra le equivalenze indotte dalle logiche e le equivalenze comportamentali presentate nel Capitolo 11.

13.1 Logiche e proprietà di sistemi

I linguaggi per la specifica di processi, come il CCS, consentono di definire sia un sistemaconcorrente che la sua specifica. Inoltre, forniscono tecniche di equivalence checking che

studiano la relazione che lega le due definizioni formali del sistema e permettono di verificarese il sistema rispetta i requisiti richiesti della sua specifica.

Questo tipo di tecniche non sono però utilizzabili nel caso in cui si intenda verificare seun dato sistema verifica una proprietà del tipo “in ogni momento il sistema può eff ettuarel’azione a”. I formalismi che vedremo in questo capitolo, chiamati logiche modali e temporali,permettono di esprimere proprietà di sistemi concorrenti e reattivi, quali deadlock e livelock .

Certamente sarebbe desiderabile disporre di una logica che consenta di formalizzare pro-prietà allo stesso modo in cui queste vengono formulate dal pensiero umano. Purtroppo non èfacile catturare in un’unica logica tutti gli aspetti che possono descrivere le caratteristiche diun sistema, per questo esistono logiche diverse che diff eriscono tra loro proprio per il generedi proprietà che sono in grado di descrivere. La maggior parte delle proprietà dei sistemi

concorrenti si possono suddividere in due categorie di base: proprietà di safety e proprietà diliveness .

Safety . In questa categoria rientrano tutte quelle proprietà del tipo “niente di indesideratoaccadrà nel prosieguo dell’esecuzione del sistema”. Per soddisfare una tale proprietà ilsistema non dovrà mai eff ettuare l’attività “proibita”. Per esempio, una proprietà disafety per una macchina distributrice di te e caff è vista nell’Esempio 11.3, è che la mac-china non distribuirà un te se è stato richiesto un caff è. Normalmente, le proprietà disafety intendono esprimere invarianze , cioè se una condizione vale nello stato iniziale,allora essa resta vera per tutta l’esecuzione del programma. Una di queste proprietà èl’assenza di stati di deadlock che assicura che il sistema non può raggiungere una situa-zione in cui tutte le componenti sono bloccate. Oltre ai deadlock, possono esistere anche

Page 302: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 302/332

302 Capitolo 13 – Logiche per i sistemi concorrenti

altri stati di errore in cui il sistema non deve mai arrivare per non avere comportamentiindesiderati.

Liveness. In questa categoria rientrano tutte quelle proprietà del tipo “qualcosa di positivoaccadrà prima o poi nel prosieguo dell’esecuzione del sistema”. Per soddisfare una taleproprietà il sistema dovrà eff ettuare una qualche attività desiderata. Per esempio, unaproprietà di liveness per una macchina distributrice di te e caff è vista nell’Esempio 11.3,è che la macchina distribuirà un caff è una volta che l’utente ha inserito la giusta quantitàdi denaro. Le proprietà di liveness esprimono il fatto che, nel futuro, una data condizionedebba essere soddisfatta almeno una volta, infinite volte o continuamente da un certopunto in poi. Le proprietà che esprimono il progresso di un sistema sono una classedi proprietà di liveness . Dato un insieme di azioni L = α1, · · · , αn, un sistema hala proprietà di progresso rispetto a L se, in qualunque stato si trovi, esso prima o poi

esegue una azione αi ∈ L.

Molte altre proprietà possono essere descritte come combinazione delle due categorie di base.Tra queste abbiamo alcune proprietà di tipo “infinitario” quali quelle di fairness che esprimonoil fatto che “qualcosa di buono accadrà infinite volte”. Ad esempio, è desiderabile che se unsistema operativo serve due utenti, il controllo passi dall’uno all’altro infinite volte. In altritermini, non succede mai che uno dei due utenti monopolizzi il sistema indefinitamente, poichéquesto non sarebbe equo ( fair ).

Una caratteristica importante di una logica per sistemi concorrenti è il tipo di modello disistema su cui una formula è interpretata. Sostanzialmente questo è o un LTS o una Strutturadi Kripke (KS). Come abbiamo visto nel Capitolo 3, LTS e KS si diff erenziano per quelle che

sono le informazioni associate ai nodi e agli archi dei grafi sui quali entrambi sono basati.L’approccio logico introdotto in questo capitolo costituisce un approccio alternativo a

quelli operazionale (comportamentale) ed assiomatico introdotti nei capitoli precedenti, perlo studio del comportamento dei sistemi concorrenti e distribuiti e delle loro proprietà. Infatti,dati un modello a stati finiti di un sistema ed una formula che descrive una proprietà in unqualche formalismo logico appropriato (quale ad esempio una logica modale o temporale),tramite una tecnica automatica chiamata model checking è possibile verificare (tramite unaesplorazione dello spazio degli stati) se il sistema soddisfa la proprietà. Il model checking èuna tecnica alquanto generale che è applicata in varie aree, quali la verifica di sistemi hardwaree l’ingegneria del software.

Uno dei vantaggi del model checking, che lo distingue dalle altre tecniche di verifica,consiste nel fatto che gli algoritmi, attraverso i quali questa tecnica viene realizzata, sonocompletamente automatici e raggiungono un esito senza richiedere nessun tipo di interventoda parte dell’utente che sta svolgendo la verifica. Questo aspetto rende possibile anche adutenti meno esperti l’utilizzo di queste tecniche di verifica; le uniche conoscenze richieste sonoquelle minime relative ai formalismi di specifica del sistema e delle proprietà da verificare.

L’approccio logico può comunque essere messo in relazione con gli approcci operazionale eassiomatico. Una logica induce una naturale relazione di equivalenza sui sistemi: due sistemisono equivalenti se (e solo se) essi soddisfano le stesse formule. Supponiamo che L sia unalogica, allora possiamo definire la seguente equivalenza tra due sistemi p e q :

p∼L

q ⇐⇒ ∀

ϕ∈

L : p |= ϕ sse q |= ϕ

Page 303: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 303/332

13.2 Logiche proposizionali, loro interpretazioni e modelli 303

Il fatto che due sistemi equivalenti soddisfano esattamente le stesse formule della logica L nonvuol dire che le soddisfano tutte (ovviamente, se L =

∅ allora qualunque coppia di sistemi è

in relazione ∼∅). Spesso risulta che la nozione di equivalenza indotta da una logica coincidecon una nozione di equivalenza tra sistemi definita usando la semantica operazionale od uninsieme di assiomi. Difatti, è naturale che due processi che si comportano allo stesso modosoddisfino le stesse classi di proprietà. In quel caso, si può aff ermare che la logica è espressiva rispetto all’equivalenza considerata. Per le logiche presentate in questo capitolo esamineremole relazioni con le semantiche basate sul concetto di bisimulazione.

Le logiche più utilizzate per esprimere proprietà di sistemi concorrenti sono quelle modali e temporali . Le formule di una logica modale, come la Hennessy-Milner Logic, esprimonocapacità e necessità locali di (uno stato di) un sistema, ma non hanno la capacità di esprimereproprietà riguardanti l’evoluzione nel tempo del sistema. Ad esempio, non possono dire cheuna certa proprietà è sempre vera (in ogni stato di una computazione) o inizierà a valere inuno stato futuro (non conosciuto). Tali proprietà sono invece esprimibili tramite le logichetemporali.

Le logiche temporali si possono raggruppare in due categorie sulla base del modello deltempo sottostante. Le logiche temporali linear time (o lineari) hanno un modello del tempolineare per cui in ogni istante di tempo esiste un unico futuro che si potrà concretizzare. Talilogiche considerano un sistema come l’insieme di tutte le sue possibili computazioni (sequenzedi esecuzione) distinte e permettono di esprimere proprietà delle singole computazioni di unsistema. Le logiche temporali branching time hanno un modello del tempo ad albero (cioèramificato) per cui il futuro non è univocamente determinato; esistono più futuri possibiliciascuno dei quali potrebbe essere quello che eff ettivamente si realizzerà. Sono dotate di ope-

ratori che permettono di esprimere proprietà che si riferiscono al futuro e di quantificare sullepossibili computazioni diff erenti. Tali logiche considerano un sistema come l’albero delle suecomputazioni. Infatti, l’esecuzione di un sistema concorrente non è un qualcosa di lineare,di ‘preconfezionato’, ma è caratterizzata da diverse scelte che vengono compiute in base alvalore assunto a runtime da particolari fattori, che possono essere i dati in input o le variabilid’ambiente, o da eventi indesiderati che possono causare eccezioni. L’albero delle computa-zioni rappresenta in maniera compatta l’esecuzione di un sistema. I nodi interni dell’albero,da cui partono rami diversi, rappresentano stati in cui viene eff ettuata una scelta. Ogni cam-mino nell’albero rappresenta una singola computazione possibile o, a seconda di come lo siinterpreta, un diverso futuro nel quale il sistema può evolvere. Perciò le logiche temporalibranching time permettono di esprimere proprietà che riguardano le scelte che un sistema può

fare durante la sua evoluzione e le possibili computazioni da un certo stato. Questi due tipidi logiche, tuttavia, non sono in generale confrontabili in termini di espressività.

13.2 Logiche proposizionali, loro interpretazioni e modelli

Il nostro interesse per le logiche è motivato dall’intento di utilizzarle per esprimere proprietàdei sistemi concorrenti. A questo scopo, di fondamentale importanza è la relazione di soddisfa-zione per stabilire se un sistema è un modello di una formula. In questa sezione, per illustrarele tecniche di interpretazione di formule basate su modelli, introduciamo una presentazionedelle logiche proposizionali diversa da quella classica.

Page 304: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 304/332

304 Capitolo 13 – Logiche per i sistemi concorrenti

Nel panorama che introdurremo, le logiche proposizionali si collocano alla base di quellemodali e temporali, in quanto definiscono un insieme di operatori comuni a queste diverse

categorie. Il loro nome deriva dal fatto che sono definite a partire da un insieme di proposizioniatomiche ciascuna delle quali può assumere valore true o false. Sia AP = p0, p1, . . . , l’insieme delle proposizioni atomiche. I suoi elementi esprimono proprietà di base che ilsistema in esame garantisce nello stato in cui si trova, come ad esempio file_eliminato, cheindica il fatto che “un certo file è stato eliminato”, o caff è_pronto, che indica il fatto che “ilcaff è è pronto” (si consideri il distributore automatico di bevande dei capitoli precedenti).

La sintassi delle formule della logica proposizionale è definita dalla grammatica seguente:

ϕ ::= AP ¬ϕ ϕ1 ∨ ϕ2

Ossia:

• ogni proposizione atomica di AP è una formula proposizionale;

• la negazione di una formula proposizionale è ancora una formula proposizionale;

• la disgiunzione (∨) di due formule proposizionali è ancora una formula proposizionale.

Usando gli operatori della sintassi di base della logica proposizionale possiamo “derivare”molti altri operatori, tra i quali i principali sono i seguenti:

• le costanti booleane: true , p ∨ ¬ p e false , ¬true, con p ∈ AP ;

• l’operatore ∧ (congiunzione ): ϕ1 ∧ ϕ2 , ¬(¬ϕ1 ∨ ¬ϕ2);

• l’operatore → (implica ): ϕ1 → ϕ2 , ¬ϕ1 ∨ ϕ2;

• l’operatore ↔ (se e soltanto se ): ϕ1 ↔ ϕ2 , (ϕ1 → ϕ2) ∧ (ϕ2 → ϕ1).

Per definire la semantica della logica proposizionale dobbiamo introdurre il concetto di mo-dello. A questo scopo, indichiamo con U il dominio dei valori booleani, cioè U , true, false.Una interpretazione I è una funzione che associa ad ogni proposizione atomica p ∈ AP unvalore booleano, cioè:

I : AP → U .

Il concetto di interpretazione è importante in quanto ci consente di valutare le stesse pro-posizioni atomiche in situazioni diff erenti a ciascuna delle quali è associata una diversa in-terpretazione. Un modello per la logica proposizionale è costituito allora da una coppiaM , h U , I i.

La semantica della logica proposizionale è formalizzata mediante una relazione binaria disoddisfazione , indicata con il simbolo |=, tra un modello M , h U , I i e una formula propo-sizionale ϕ. Tale relazione è definita per induzione sulla sintassi delle formule dalle regoleseguenti:

• M |= p sse I ( p) = true;

• M |= ¬ϕ sse non è vero che M |= ϕ;

• M |= ϕ1

∨ϕ2 sse M |= ϕ1 oppure M |= ϕ2.

Page 305: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 305/332

13.3 Logiche modali proposizionali 305

Nel seguito, talvolta scriveremo M 6|= ϕ se non è vero che M |= ϕ.Diremo che una formula ϕ è soddisfacibile se esiste un modello M tale che M |= ϕ. In tal

caso, diremo anche che M è un modello per ϕ. Diremo che una formula ϕ è valida , scritto|= ϕ, se ogni modello M è tale che M |= ϕ. Si noti che se ϕ è valida, allora ¬ϕ è nonsoddisfacibile. Ad esempio abbiamo che true è valida mentre f alse è non soddisfacibile.

Le formule della logica proposizionale, se da un lato consentono di specificare diverseproprietà che lo stato di un sistema può soddisfare, dall’altro non sono particolarmente adatteper descrivere il cambiamento di queste proprietà nel tempo quando il sistema transisce dauno stato ad un altro. Non è per esempio possibile esprimere, attraverso formule delle logicheproposizionali, proprietà del tipo “dopo aver eff ettuato una certa azione lo stato del sistemaverifica la proprietà ϕ”.

Per trattare proprietà di questo tipo si possono usare le logiche modali.

13.3 Logiche modali proposizionali

Nelle logiche proposizionali ogni evento si intende riferito all’istante presente del tempo. Pro-posizioni come file_eliminato vengono interpretate secondo il significato “il file è stato eliminatoadesso”. Per poter introdurre il concetto di tempo e disporre degli strumenti per definire unordinamento tra gli istanti di tempo considerati, nelle logiche modali1 si introduce un insiemeR di relazioni binarie i cui elementi R ∈ R sono relazioni di transizione tra stati. Ogni relazio-ne R può essere etichettata associando ad ogni suo elemento l’azione che causa il passaggio dauno stato all’altro. Nel caso in cui R sia etichettata, l’insieme AP delle proposizioni atomichepuò non esserci; è questo il caso della logica HML che vedremo nella sezione successiva.

L’operatore principale delle logiche modali che consente di riferirsi ad istanti successividel tempo è diamond , scritto hRiϕ. Il significato di hRiϕ è che “esiste un qualche stato inrelazione R con quello attuale nel quale la proprietà ϕ è verificata”. L’operatore duale didiamond, che prende il nome di box , scritto [R]ϕ, significa che “in qualunque stato in relazioneR con quello attuale la proprietà ϕ è verificata”. In pratica, l’operatore diamond consentedi definire proprietà di “possibilità” (è possibile arrivare in uno stato nel quale è verificata laproprietà espressa dalla formula ϕ), mentre l’operatore box consente di definire proprietà di

“necessità” (tutti gli stati in relazione R con quello attuale soddisfano la proprietà ϕ).Se aggiungiamo alla logica proposizionale le due modalità di cui sopra, otteniamo la logica

modale proposizionale la cui sintassi delle formule è definita dalla grammatica seguente:

ϕ ::= true AP ¬ϕ ϕ1

∨ϕ2 ϕ1

∧ϕ2

hR

iϕ [R]ϕ

Per formalizzare la semantica della logica modale nel corso del tempo sono stati propostimolti modelli diff erenti. A noi qui interessa la semantica basata su strutture di Kripke. Larelazione di soddisfazione , indicata con il simbolo |=, è in questo caso una relazione ternariatra una struttura di Kripke K , hQ, R, AP, I i, uno stato q ∈ Q e una formula modale ϕ. Perconvenienza notazionale, ometteremo K quando è chiaro dal contesto. Quindi, la relazione |=è definita per induzione sulla sintassi delle formule dalle regole seguenti:

• q |= true;

• q |= p sse q ∈ I ( p);

1La logica modale risale ad Aristotele, che la utilizzò per studiare i concetti di possibilità e necessità.

Page 306: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 306/332

306 Capitolo 13 – Logiche per i sistemi concorrenti

• q |= ¬ϕ sse non è vero che q |= ϕ;

• q |= ϕ1 ∨ ϕ2 sse q |= ϕ1 oppure q |= ϕ2;• q |= ϕ1 ∧ ϕ2 sse q |= ϕ1 e q |= ϕ2;

• q |= hRiϕ sse ∃q 0 ∈ Q tale che hq, q 0i ∈ R e q 0 |= ϕ;

• q |= [R]ϕ sse ∀q 0 ∈ Q tale che hq, q 0i ∈ R vale q 0 |= ϕ.

Alcuni degli operatori sono “derivati” nel senso che potrebbero essere eliminati senza checiò influisca sul potere espressivo della logica (li abbiamo posti nella sintassi di base percomodità). Potremmo porre per definizione

ϕ1

∧ϕ2 , ¬(¬ϕ1

∨¬ϕ2) [R]ϕ , ¬

hR

i¬ϕ

e derivare la semantica delle formule ϕ1∧ϕ2 e [R]ϕ da quella degli altri operatori della logica.Nel caso del secondo operatore, possiamo procedere come mostrato di seguito:

q |= [R]ϕ⇔ q |= ¬hRi¬ϕ per definizione di [R]·⇔ ¬(∃q 0 ∈ Q tale che hq, q 0i ∈ R e q 0 |= ¬ϕ) per la semantica di hRi·⇔ ∀q 0 ∈ Q tale che hq, q 0i ∈ R vale q 0 |= ϕ per la semantica di ¬·

Le logiche modali hanno una espressività limitata, puramente “locale”. Infatti, la veritàdi una formula modale di lunghezza n in un modello dipende solo dagli stati a distanza

al più n dallo stato inizialmente considerato per interpretare la formula. Pertanto, la logicamodale è troppo debole per esprimere molte delle proprietà desiderabili dei sistemi informaticiche abbiamo accennato nell’introduzione di questo capitolo. Per ottenere la possibilità diesprimere proprietà “globali”, sono necessarie logiche più potenti, quali quelle temporali.

13.4 La logica HML

HML (Hennessy-Milner Logic [HM85]) è una logica modale e quindi permette di descriverecapacità locali dei sistemi. La principale caratteristica che distingue HML dalle logiche modaliproposizionali presentate nella sezione precedente risiede nel fatto che le relazioni di transizioneR ∈ R sono etichettate con le azioni, appartenenti ad un certo insieme A, che causano il

passaggio da uno stato all’altro. Questo comporta che possiamo fare a meno di AP e diconseguenza il dominio di interpretazione delle formule della logica passa da KS a LTS. Nelseguito, supporremo che i LTS hQ,A,→i usati per interpretare le formule HML (ma anchequelle di ACTL in Sezione 13.6) soddisfano la seguente proprietà

∀q ∈ Q, ∃q 0 ∈ Q, ∃a ∈ A tali che q a−→ q 0 ,

cioè ogni stato ha almeno un successore, quindi i cammini in una tale struttura sono infiniti.Dato un insieme A di azioni (con α, β ∈ A), la sintassi delle formule HML è definita dalla

grammatica seguente:

ϕ ::= true ¬ϕ ϕ1

∨ϕ2 ϕ1

∧ϕ2 <α> ϕ [α]ϕ

Page 307: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 307/332

13.4 La logica HML 307

Nel seguito useremo Φ per indicare l’insieme di tutte le formule HML.I costrutti della logica possono essere informalmente spiegati come segue (si tenga presente

che le formule della logica vanno interpretate rispetto agli stati di un LTS). true è una formulacostante vera per tutti gli stati (false è derivata come al solito). ¬ e ∨ rappresentano i dueoperatori logici standard negazione e disgiunzione (quello di congiunzione è derivato come alsolito). Gli operatori modali permettono di formulare proprietà di un sistema in termini dellerelazioni definite dalle transizioni che si originano a partire da uno stato. Quindi, uno statosoddisfa <α> ϕ se una delle sue α-derivate soddisfa ϕ, mentre soddisfa [α]ϕ se tutte le sueα-derivate soddisfano ϕ.

Per formalizzare la semantica della logica HML, definiamo la relazione di soddisfazione ,indicata con il simbolo |=, come una relazione ternaria tra un LTS S = hQ,A, →i avente lostesso insieme di azioni A assunto per HML, uno stato q ∈ Q e una formula ϕ. Per convenienzanotazionale, ometteremo S quando è chiaro dal contesto. Quindi, la relazione |= è definita

per induzione sulla sintassi delle formule HML dalle regole seguenti:

• q |= true;

• q |= ¬ϕ sse non è vero che q |= ϕ;

• q |= ϕ1 ∨ ϕ2 sse q |= ϕ1 oppure q |= ϕ2;

• q |= ϕ1 ∧ ϕ2 sse q |= ϕ1 e q |= ϕ2;

• q |=<α> ϕ sse ∃q 0 ∈ Q tale che q α→ q 0 e q 0 |= ϕ;

• q |= [α]ϕ sse ∀

q 0

∈Q tale che q

α

→q 0 si ha q 0 |= ϕ.

La definizione della semantica di HML include alcune sottigliezze che meritano di esserecommentate. La formula [α]false è soddisfatta da q se e solo se q non ha α-derivate. Ineff etti, uno stato senza alcuna α-derivata soddisfa [α]ϕ per ogni ϕ. Ciò implica anche che unostato incapace di qualunque azione nell’insieme α1, . . . , αn soddisfa la formula [α1]false ∧. . . ∧ [αn]false e, viceversa, la formula [α1]false ∧ . . . ∧ [αn]false è soddisfatta solo da queglistati che non hanno α-derivate, con α ∈ α1, . . . , αn. Analogamente, uno stato soddisfa<β > true se e solo se ha almeno una β -derivata. In generale, data una sequenza non vuotadi azioni β 1 . . . β m, uno stato è in grado di eff ettuare la sequenza di azioni β 1 . . . β m (cioè,la sequenza è una traccia forte per quello stato) se e solo se lo stato soddisfa la formula<β 1> . . . <β m> true. Consideriamo ora la formula

<β 1> .. . <β m> ([α1]false ∧ . . . ∧ [αn]false)

Uno stato soddisfa questa formula se può eseguire la sequenza β 1 . . . β m e arrivare in uno statoche rifiuta le off erte di interazione che coinvolgono le azioni α1 . . . αn. Quindi, in un ambientecapace prima di eseguire la sequenza β 1 . . . β m e poi di richiedere un’interazione che coinvolgeun’azione tra le α1 . . . αn, lo stato considerato potrebbe andare in deadlock.

Come abbiamo già detto nella sezione precedente, alcuni degli operatori sono “derivati”nel senso che potrebbero essere eliminati senza che ciò influisca sul potere espressivo dellalogica (li abbiamo posti nella sintassi di base per comodità). Potremmo porre per definizione

ϕ1

∧ϕ2 , ¬(¬ϕ1

∨¬ϕ2) [α]ϕ , ¬ <α> ¬ϕ

Page 308: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 308/332

308 Capitolo 13 – Logiche per i sistemi concorrenti

infatti le due coppie di formule hanno lo stesso significato. Inoltre, se K , α1, . . . , αn ⊆ Ae s , α1 · · · αn, allora possono essere utilizzate le seguenti abbreviazioni:

• <K> ϕ per denotare la formula <α1> ϕ ∨ · · · ∨ <αn> ϕ;

• <s> ϕ per denotare la formula <α1> · · · <αn> ϕ;

• [K ]ϕ per denotare la formula [α1]ϕ ∧ · · · ∧ [αn]ϕ;

• [s]ϕ per denotare la formula [α1] · · · [αn]ϕ.

A volte useremo −K per indicare l’insieme complementare di K rispetto ad A (cioè l’insiemeA \ K ) ed il simbolo − per indicare l’insieme di tutte le azioni (cioè A).

Vediamo ora alcuni esempi di formule HML.

• [−]false rappresenta la proprietà di “deadlock forte” perché è soddisfatta solo da queglistati che non sono in grado di eseguire alcuna azione (infatti, nessuno stato potrebbesoddisfare false).

• [− α]false (a volte scritta come [−α]false) è vera in quegli stati che non possonoeff ettuare transizioni con etichette diverse da α.

• <−> true ∧ [−](<−> true ∧ [− α, β ]false) è vera in quegli stati che possono inizial-mente fare un’azione qualsiasi e immediatamente dopo possono solo fare un’azione α oβ .

Esempio 13.1. Consideriamo il grafo delle transizioni di Figura 10.1 relativo all’Esempio 10.2(Bill-Ben) descritto dal termine CCS

Bill_Ben , ( play.meet.nil | work.meet.nil)\meet.

Esaminiamo alcune semplici proprietà del sistema descrivibili con HML.

• Bill_Ben |= (<play><work><τ > true) ∨ (<work><play><τ > true) cioè il sistemapuò fare la sequenza di azioni play work τ o la sequenza play work τ .

• Bill_Ben |= [

− play, work]false cioè non si possono fare azioni iniziali diverse da

play e work.

• Bill_Ben |= [ play][ play]false cioè subito dopo un’azione play non si può eseguirneun’altra uguale.

A questo punto occupiamoci della relazione tra l’equivalenza indotta dalla logica, denotatacon ∼HM L, e la bisimilarità forte ∼. Indichiamo con q 6|= ϕ il fatto che q |= ϕ non è vera.

Definizione 13.2. Siano hQ,A, →i un LTS e p, q ∈ Q. Allora scriveremo p ∼HM L q se per ogni formula HML ϕ, o p |= ϕ e q |= ϕ oppure p 6|= ϕ e q 6|= ϕ.

Definiamo ora una classe speciale di LTS.

Page 309: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 309/332

13.4 La logica HML 309

Definizione 13.3. Diremo che un LTS hQ,A, →i è image-finite se ∀q ∈ Q, ∀s ∈ A∗ l’insieme q 0

∈Q | q

s

−→ q 0 è finito.

Si noti che un LTS è image-finite se, e solo se, ∀q 0 ∈ Q e ∀α ∈ A l’insiemenq 00 ∈ Q | q 0 α−→ q 00

oè finito. Quindi nessun processo derivabile da p ha un numero infinito di

comportamenti. In pratica, la classe dei LTS image-finite è piuttosto grande. Per esempio,

sistemi finite-branching (cioè tali che ∀q ∈ Q l’insiemen

(α, q 0) ∈ A × Q | q α−→ q 0

o è finito)

sono image-finite . In particolare, i LTS che corrispondono ai processi CCS sono image-finite se le definizioni delle costanti di processo coinvolte sono guardate (si tenga comunque presenteche questa condizione è solo sufficiente ma non necessaria). Ora, per LTS image-finite , vale ilseguente importante risultato (che non dimostreremo).

Teorema 13.4. Sia hQ,A, →i un LTS image-finite. Allora, per ogni p, q ∈ Q, p ∼HM L q se

e solo se p ∼ q .

Dimostrazione.

Questo risultato, e le osservazioni precedenti riguardo le formule HTML, confermano chela bisimilarità richiede che stati bisimili abbiano lo stesso “potenziale di deadlock”. Inoltre,il teorema fornisce un utile meccanismo per dimostrare che due stati non sono bisimili: èsufficiente trovare una formula HML soddisfatta da uno e non dall’altro. Vediamo un paio diesempi nel contesto di CCS.

• Consideriamo i processi CCS così definiti: A , a.b.nil + a.c.nil e B , a.(b.nil + c.nil).Dato che A

6∼B ci deve essere (almeno) una formula soddisfatta da uno e non dall’altro.

Una formula di questo tipo è [a] <b> true, che è soddisfatta da B ma non da A.

• Consideriamo ora i processi CCS così definiti: C , a.C e D , a.D + a.nil. Evidente-mente, D può raggiungere uno stato di deadlock dopo una transizione a, mentre C nonandrà mai in deadlock. La formula <a> [a]false li distingue, dato che D la soddisfa adiff erenza di C .

Infine, il Teorema 13.4 si può generalizzare ad LTS generici (cioè non necessariamente image- finite ) a patto di estendere HML con il connettivo logico

Wi∈I (ed il derivato

Vi∈I ) quantificato

rispetto ad insiemi di indici eventualmente infiniti.

I due operatori modali diamond e box possono essere “indeboliti” in modo da poter ana-

lizzare solo le azioni osservabili, ignorando le azioni interne. Si ottiene così la variante weak di HML. Quindi, prendendo un insieme di azioni qualsiasi ma contenente l’azione interna τ ,cioè A ∪ τ , la sintassi delle formule di weak HML è definita dalla grammatica seguente:

ϕ ::= true ¬ϕ ϕ1 ∨ ϕ2 ϕ1 ∧ ϕ2 αϕ ϕ [[α]]ϕ [[ ]]ϕ

dove α ∈ A (cioè α 6= τ ).Intuitivamente, il significato dei nuovi operatori modali è il seguente.

• αϕ (weak-diamond -α): esiste un α-discendente dello stato corrente che soddisfa ϕ.

• ϕ (weak-diamond ): esiste una computazione dallo stato corrente formata da soleazioni interne che porta in uno stato che soddisfa ϕ.

Page 310: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 310/332

310 Capitolo 13 – Logiche per i sistemi concorrenti

• [[α]]ϕ (weak-box -α): ogni α-discendente dello stato corrente soddisfa ϕ. Ovviamente, laformula vale anche se lo stato corrente non ha α-discendenti.

• [[ ]]ϕ (weak-box ): tutte le computazioni dallo stato corrente formate da sole azioniinterne portano in stati che soddisfano ϕ.

Formalmente, poiché weak HML astrae dalle azioni interne che un sistema può eff ettuare,la sua interpretazione va definita su un LTS il cui insieme di azioni contiene l’azione “interna” τ ,cioè un LTS della forma hQ, A∪τ , →i. Quindi, la relazione di soddisfazione |= che determinala semantica delle formule è definita per induzione sulla loro sintassi dalle regole seguenti(mostriamo solo la semantica dei nuovi operatori, poiché quella degli altri non cambia):

• q |= ϕ sse ∃q 0 ∈ Q tale che q =⇒ q 0 e q 0 |= ϕ;

• q |=

α

ϕ sse

∃q 0

∈Q tale che q

α=

⇒ q 0 e q 0 |= ϕ;

• q |= [[ ]]ϕ sse ∀q 0 ∈ Q tale che q =⇒ q 0 si ha che q 0 |= ϕ;

• q |= [[α]]ϕ sse ∀q 0 ∈ Q tale che q α=⇒ q 0 si ha che q 0 |= ϕ.

Vediamo ora alcuni esempi di formule weak HML.

• true significa che c’è la possibilità di fare una sequenza di zero o più τ inizialmente.

• [[α]]β true significa che ogni α-discendente ha almeno un β -discendente.

Anche per weak HML valgono le considerazioni già espresse in precedenza a propositodegli operatori derivati. Per esempio, l’operatore di necessità “debole” è esprimibile nel modoseguente:

[[α]]ϕ , ¬α¬ϕ.

Si possono anche utilizzare abbreviazioni simili a quelle definite per HML. A diff erenza delcaso di HML, −K denota il complemento di K rispetto all’insieme A (che non contiene l’azioneτ ).

Weak HML è più debole di HML poiché, ad esempio, non è in alcun modo capace diesprimere l’operatore <τ > ·, cosicché una formula non può in alcun modo far riferimento alleazioni interne (al contrario, tutti gli operatori di weak HML possono essere espressi in HML).Per quanto riguarda i rapporti con le equivalenze comportamentali, è possibile dimostrare chel’equivalenza indotta da weak HML coincide con la bisimilarità debole (sempre a condizioneche i LTS considerati siano image-finite ), cioè vale un teorema di corrispondenza simile aquello tra HML e bisimilarità forte (anche questo non lo dimostreremo).

Teorema 13.5. Sia hQ,A,→i un LTS image-finite. Allora, per ogni p, q ∈ Q, p ∼W H M L q se e solo se p ≈ q .

Dimostrazione.

Ciò quindi implica che anche se ignora le computazioni interne, la bisimilarità debole (equindi anche l’equivalenza osservazionale) gode ancora di un grado di sensibilità al deadlocksimile a quello della bisimilarità forte. A questo proposito consideriamo i due processi CCSA , a.b.c.nil + a.b.d.nil e B , a.(b.c.nil + b.d.nil). Sappiamo già che questi due processi nonsono in relazione ≈ tra loro; infatti, la formula [[a]]bctrue è soddisfatta da B e nonda A.

Page 311: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 311/332

13.5 Logiche temporali 311

13.5 Logiche temporali

Le logiche temporali sono più espressive delle logiche modali ma non richiedono il backgroundmatematico necessario per capire ed apprezzare le definizioni ricorsive che sono alla basedell’espressività del µ-calculus modale (che vedremo nella Sezione 13.8). Le logiche temporalisi occupano di concetti come “sempre”, “mai”, “qualche volta”, . . . . Costituiscono una brancadella logica di origine antica, ma solo negli anni ’50 sono state studiate matematicamente,a cominciare dal lavoro di Prior [Pri57]. Negli anni ’70 sono state applicate alla verifica dicorrettezza dei sistemi informatici, a cominciare dal lavoro di Pnueli [Pnu77].

Esistono vari aspetti da considerare per definire un modello matematico del tempo: li-neare o ramificato, discreto o continuo, finito o infinito, unidirezionale o bidirezionale, . . . .Come abbiamo visto nella prima sezione di questo capitolo, l’alternativa tra tempo lineare eramificato genera due possibilità egualmente interessanti. Il tempo si dice lineare se in ogni

istante il sistema può evolvere in un solo modo nell’istante successivo; l’evoluzione si raffiguraquindi su una linea retta. Invece, il tempo si dice ramificato se in ogni istante, il sistemapuò evolvere in molti modi, in questo caso l’evoluzione si rappresenta con un albero. Perquanto riguarda gli altri aspetti, le scelte sono dettate dal fatto che lo scopo è fare previsionisul comportamento futuro di un sistema. Pertanto, le logiche temporali specializzate per laverifica di sistemi che presenteremo fanno tutte le seguenti assunzioni:

• il tempo è discreto: tra un istante e l’altro, si hanno solo un numero finito di istantiintermedi;

• il tempo è infinito nel futuro e finito nel passato: c’è un primo istante ma non un ultimo;

• il tempo fluisce dal passato al futuro: siamo interessati a cosa accadrà nel futuro.Infine, si tenga presente che l’espressività di molte logiche temporali linear e branching

time non è confrontabile. Ciò significa che ci sono proprietà esprimibili in una logica lineareche non possono essere espresse in una branching , e viceversa. Inoltre, anche le tecniche peril model checking di queste due classi di logiche sono solitamente piuttosto diff erenti.

Linear Time Logic2 (LTL)

Un notevole incremento del potere espressivo di una logica può derivare dalla capacità diformulare proprietà valide in intervalli di tempo. Per essere in grado di esprimere questo tipodi proprietà, in LTL viene introdotto un nuovo operatore U+, chiamato Until 3. Con questo

nuovo operatore è possibile esprimere formule del tipo:

ψ , ϕ1 U+ ϕ2

La formula ψ va interpretata su un cammino ρ di una struttura di Kripke (intuitivamente unasequenza di stati in cui ogni coppia di stati consecutivi appartiene alla relazione di transizionedella struttura) ed è verificata se la formula ϕ1 è valida negli stati intermedi di tale camminofino a che non si raggiunge uno stato in cui è verificata la formula ϕ2. Graficamente laproprietà può essere rappresentata dallo schema riportato in Figura 13.1.

2Viene anche detta Propositional Linear Time Logic (PLTL).3In letteratura sono state proposte e studiate molte varianti dell’operatore Until . La variante su cui qui ci

basiamo ha il pregio di permetterci di derivare tutti i principali operatori temporali.

Page 312: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 312/332

312 Capitolo 13 – Logiche per i sistemi concorrenti

ϕ1 ϕ1 ϕ1 ϕ1 ϕ2 . . .

Figura 13.1: Proprietà ϕ1 U+ ϕ2

La logica temporale lineare, LTL, si può ottenere aggiungendo alla logica proposizionalel’operatore Until . La sintassi delle formule di LTL è definita dalla grammatica seguente:

ϕ ::= true AP ¬ϕ ϕ1 ∨ ϕ2 ϕ1 ∧ ϕ2 ϕ1 U+ ϕ2

La relazione di soddisfazione , indicata con il simbolo |=, è in questo caso una relazioneternaria tra una struttura di Kripke K , hQ, R, AP, I i, un cammino ρ in K (si veda laDefinizione 3.14) e una formula LTL ϕ. Per convenienza notazionale, ometteremo K quando è

chiaro dal contesto. Quindi, la relazione |= è definita per induzione sulla sintassi delle formuledi LTL dalle regole seguenti:

• ρ |= true;

• ρ |= p sse ρ ≡ q 0 · ρ0 e q 0 ∈ I ( p);

• ρ |= ¬ϕ sse non è vero che ρ |= ϕ;

• ρ |= ϕ1 ∨ ϕ2 sse ρ |= ϕ1 oppure ρ |= ϕ2;

• ρ |= ϕ1 ∧ ϕ2 sse ρ |= ϕ1 e ρ |= ϕ2;

• ρ |= ϕ1 U+ ϕ2 sse ∃i > 0 tale che ρi |= ϕ2 e per ogni 0 < j < i vale ρ j |= ϕ1.

In LTL, alcuni importanti operatori temporali, quali neXt X, Future F e Global G, possonoessere derivati utilizzando l’operatore U+ come mostrato di seguito. È possibile innanzituttodefinire un operatore, detto Until riflessivo, che tenga anche conto dello stato attuale. Taleoperatore, indicato con U∗, è definito come segue:

• ϕ1 U∗ ϕ2 , ϕ2 ∨ (ϕ1 ∧ (ϕ1 U+ ϕ2)).

La diff erenza sostanziale con la formula ϕ1 U+ ϕ2, è che affinché ϕ1 U∗ ϕ2 sia vera, ϕ1 devevalere anche nello stato attuale oppure ϕ2 dev’essere subito vera. Graficamente l’operatore èillustrato in Figura 13.2. Utilizzando gli operatori Until possiamo porre:

• X ϕ , false U+ ϕ;

• F+ϕ , true U+ ϕ;

• F∗ϕ , true U∗ ϕ;

• Gϕ , ¬(true U∗ ¬ϕ).

X è detto neXt in quanto, affinché la formula X ϕ sia verificata, ϕ deve valere in uno statoimmediatamente successivo a quello attuale, cioè raggiunto con un solo passo di transizione.F invece viene chiamato Future in quanto ci consente di esprimere il fatto che la formulaϕ varrà prima o poi in qualcuno degli stati successivi, cioè raggiunti nel futuro: un futuro

Page 313: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 313/332

13.5 Logiche temporali 313

ϕ1 ϕ1 ϕ1 ϕ1 ϕ1 ϕ2 . . .

Figura 13.2: Proprietà ϕ1 U∗ ϕ2

proprio, nel caso di F+ϕ, ed un futuro che contiene anche l’istante presente, nel caso di F∗ϕ.Infine, G viene chiamato Global poiché consente di specificare che una data formula ϕ è validain tutti gli stati di una computazione a partire dallo stato attuale.

Chiudiamo questa sezione con alcuni esempi di formule LTL che mostrano che, a diff e-renza della logica modale, la logica temporale è sufficientemente potente da esprimere molteproprietà globali desiderabili dei sistemi. Se ϕ è una proprietà che si vuole evitare, alloraG¬ϕ dice che ϕ non accadrà mai; questo è un esempio di proprietà di safety . Se ϕ1 e ϕ2

sono proprietà, ϕ1

→ F+ϕ2 dice che, se in un qualche stato vale ϕ1, allora in qualche stato

successivo varrà ϕ2. Per esempio, se un utente chiede l’accesso a una stampante, prima o poilo otterrà; questo è un esempio di proprietà di liveness . Una proprietà di liveness più forteè ϕ1 → X ϕ2; nel caso della stampante, dice che una richiesta di accesso alla stampante èsoddisfatta immediatamente. Combinando gli operatori temporali possiamo esprimere ancheproprietà di fairness . Per esempio, la formula GF∗ϕ significa che ϕ è vera infinite volte,mentre la formula F∗G ϕ significa che ϕ è vera in tutti gli stati salvo un numero finito.

Computation Tree Logic (CTL)

Mentre nel caso delle logiche temporali linear time la logica LTL che abbiamo appena presen-tato è quella più usata, nel caso delle logiche branching time c’è più varietà. In particolare quipresentiamo la Computation Tree Logic (CTL [CE81]). Questa logica deve il suo nome al fattoche viene interpretata su modelli ad albero che rappresentano l’albero delle computazioni delsistema in analisi.

L’idea alla base di CTL è di estendere la logica temporale lineare con due nuovi operatori:i quantificatori esistenziale (E) e universale (A) sui cammini. Così, intuitivamente, se ϕ èuna formula, Eϕ significa che ϕ è vera in qualche cammino, e Aϕ significa che ϕ è vera in ognicammino. Con l’introduzione dei quantificatori, la logica acquisisce la capacità di distingueretra proprietà vere in specifici rami di esecuzione, nei quali può evolvere il sistema eff ettuandoscelte precise, e proprietà vere indistintamente dal ramo seguito nell’albero di evoluzione. InCTL, tuttavia, l’uso dei quantificatori è permesso solo se questi sono immediatamente seguitida un operatore temporale (diversamente dall’estensione CTL∗ [CE81] in cui non c’è alcunarestrizione). La sintassi delle formule di CTL è quindi definita dalla grammatica seguente:

ϕ ::= true AP ¬ϕ ϕ1 ∨ ϕ2 ϕ1 ∧ ϕ2 E (ϕ1 U+ ϕ2) A (ϕ1 U+ ϕ2)

Come si può notare, i quantificatori possono solo essere seguiti da formule che utilizzanol’operatore Until .

La relazione di soddisfazione , indicata con il simbolo |=, è in questo caso una relazioneternaria tra una struttura di Kripke K , hQ, R, AP, I i, un albero delle computazioni inK (si veda la Definizione 3.15) e una formula CTL ϕ. Se per semplicità omettiamo K edidentifichiamo un albero con la sua radice, le clausole che definiscono la semantica delle formulecon i quantificatori è la seguente:

Page 314: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 314/332

314 Capitolo 13 – Logiche per i sistemi concorrenti

Figura 13.3: Rappresentazione schematica del significato delle formule

• q 0 |= E (ϕ1 U+ ϕ2) sse ∃ ρ ∈ Paths(q 0), ∃i > 0 tale che ρ[i] |= ϕ2 e ρ[ j] |= ϕ1 per ogni0 < j < i;

• q 0 |= A (ϕ1 U+ ϕ2) sse ∀ ρ ∈ Paths(q 0), ∃i > 0 tale che ρ[i] |= ϕ2 e ρ[ j] |= ϕ1 per ogni0 < j < i.

La semantica delle altre formule è facilmente adattabile al nuovo modello di interpretazione.Intuitivamente, E (ϕ1 U+ ϕ2) significa che, in qualche cammino, ϕ1 vale fino alla prima

volta in cui vale ϕ2; analogamente, A (ϕ1 U+ ϕ2) dice che ciò vale in ogni cammino.Ovviamente gli operatori derivabili da U+, quali ad esempio X e U∗, sono anch’essi sog-

getti all’utilizzo dei quantificatori. In Figura 13.3 è riportata una rappresentazione graficaschematica del significato dei costrutti derivati. Sono rappresentati in maniera semplifica-ta quattro alberi di derivazione e ciascuno è associato ad una formula verificata dall’alberostesso. Le linee spezzate all’interno dell’albero rappresentano rami di un cammino mentre icerchietti rappresentano i nodi dell’albero. I nodi nei quali è soddisfatta la proprietà ϕ sonorappresentati con un cerchietto nero mentre i nodi che verificano ψ sono quelli vuoti. L’areariempita di grigio indica che tutti i nodi al suo interno verificano la formula ϕ.

Chiudiamo con alcuni esempi di formule CTL. La formula EXϕ equivale a dire che esisteun successore dello stato attuale in cui vale ϕ, proprio come la formula hRiϕ in logica modale.Analogamente, la formula AXϕ equivale a dire che in ogni successore vale ϕ, perciò corri-sponde alla formula [R]ϕ in logica modale. Quindi CTL include la logica modale. Un altroesempio è la formula AGϕ, che significa che ϕ varrà sempre, nel senso che sarà vera in ognistato di ogni cammino che parte dal punto in cui la formula è valutata. Questa è una proprietàdi safety . Notiamo che non è detto che tutti gli stati del modello siano raggiungibili dallostato in cui si valuta la formula; perciò la formula non dice nulla sugli stati irraggiungibili.Analogamente, la formula EF∗ϕ significa che ϕ vale in qualche stato di qualche cammino cheparte dallo stato in cui la formula è valutata. Questa è una proprietà di liveness . Un’altraproprietà di liveness più complicata esprimibile in CTL è AF∗ϕ che significa che in ognicammino esiste uno stato in cui ϕ è vera. Tale proprietà si chiama talvolta “inevitabilità”.Combinando gli operatori lineari abbiamo in CTL formule come A G E F∗ ϕ che significa chein ogni futuro c’è un futuro successivo in cui vale ϕ.

Per fare un esempio di formule CTL∗ che non sono (sintatticamente) in CTL, possiamoconsiderare la formula di fairness E G F∗ ϕ che significa che esiste un cammino in cui ϕ valeinfinite volte. In realtà tale formula non è neanche equivalente ad alcuna formula di CTL.Infatti, alcuni risultati teorici dimostrano che CTL∗ è strettamente più espressiva di CTL.In generale CTL non può esprimere proprietà di fairness poiché non è possibile annidare glioperatori G e F senza inserire tra loro un quantificatore di cammino. L’unica proprietà difairness rilevante che può essere espressa è A G A F∗ ϕ. Benché CTL∗ sia molto espressiva, cisono proprietà che anche CTL∗ non può esprimere, quali le proprietà “cicliche”. Ad esempio,

Page 315: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 315/332

13.6 La logica ACTL 315

non è possibile esprimere il fatto che in qualche cammino una certa proprietà ϕ vale in tuttigli stati in posizione pari. I limiti del potere espressivo di CTL∗ motivano l’introduzione di

logiche più potenti quali il µ-calculus modale, che sarà presentato nella Sezione 13.8.

13.6 La logica ACTL

ACTL (Action-based Computation Tree Logic [DV90]) è una logica temporale di tipo bran-ching time derivata da CTL. Il nome della logica è dovuto al fatto che le formule fannospecifico riferimento alle azioni che il sistema in esame può compiere. Grazie a questa suacaratteristica ACTL consente di descrivere in maniera semplice ed intuitiva le proprietà di unsistema. Le formule di ACTL sono costruite usando i quantificatori di cammino ∀ ed ∃ (perdescrivere la struttura ramificata dell’albero delle computazioni) e gli operatori temporali X ed U (per descrivere le proprietà di un cammino nell’albero).

• ∀ corrisponde all’espressione “per tutti i cammini di computazione”, quindi la proprietàche segue questo quantificatore deve valere in ogni sequenza di azioni a partire dallostato corrente.

• ∃ corrisponde all’espressione “per qualche cammino di computazione”, quindi la proprietàche segue questo quantificatore deve valere almeno in una sequenza di azioni a partiredallo stato corrente.

• X è l’operatore neXt : corrisponde all’espressione “ next time ”, quindi la formula chesegue questo operatore deve valere nello stato successivo del cammino che si staanalizzando.

• U è l’operatore Until : prende in input due formule e indica che esiste uno stato q nelcammino che si sta analizzando in cui vale la seconda formula, ma in tutti gli stati cheprecedono q vale la prima formula.

Formalizziamo ora la struttura della logica ACTL. Per rendere più comprensibile la sintas-si delle formule ACTL scomponiamo la sua definizione distinguendo tre categorie sintattiche:

formule di stato, formule di cammino e formule di azione . Come si è detto la logica è para-metrizzata rispetto ad un insieme di azioni A ∪ τ ; nel seguito, supporremo che α ∈ A. Lasintassi delle formule di ACTL è quindi definita dalla grammatica seguente:

formule di stato ϕ ::= true ¬ϕ ϕ

∨ϕ0

∃γ

∀γ

formule di cammino γ ::= X χϕ X τ ϕ ϕχU χ0ϕ0 ϕχU ϕ0

formule di azione χ ::= α ¬χ χ ∨ χ0

Si noti che nelle formule di stato ogni operatore temporale è preceduto da un quantificatoredi cammino.

Una formula di azione individua un insieme di azioni visibili, che sono appunto quelle chela soddisfano. A volte useremo le formule derivate true, che sta per α ∨ ¬α, per indicarel’insieme di tutte le azioni visibili, e false, che sta per ¬true, per indicare l’insieme vuoto diazioni visibili.

Una novità importante che distingue la logica ACTL dalla logica CTL è che, sebbeneanche quest’ultima avesse delle formule di cammino, in ACTL ad ognuna di queste viene

Page 316: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 316/332

316 Capitolo 13 – Logiche per i sistemi concorrenti

ϕχU χ′ ϕ′

ϕ ϕ ϕ . . . ϕ ϕ ϕ′

. . .

τ ∨ b1 τ ∨ b2 τ ∨ bn a

ϕχU ϕ′

ϕ ϕ ϕ . . . ϕ ϕ′ . . .

τ ∨ b1 τ ∨ b2 τ ∨ bn

dove b1 |= χ, . . . , bn |= χ e a |= χ′

Figura 13.4: Significato delle formule d’azione nell’operatore Until di ACTL

associata una formula di azione. Così, all’operatore neXt viene associata una formula diazione χ o l’azione interna τ ; la formula X χϕ (rispettivamente X τ ϕ) è verificata dallo statocorrente se la formula ϕ vale in tutti gli stati raggiungibili mediante un’azione che rispettaχ (rispettivamente, un’azione interna). In maniera analoga, una formula di cammino conl’operatore Until è verificata dallo stato corrente se eff ettuando zero o più azioni che rispettanoχ si raggiungono sempre stati che verificano ϕ fino a raggiungere, compiendo un’azione cheverifica χ0 (o un’azione qualsiasi, qualora questa non venga specificata) uno stato che verificaϕ0. Una rappresentazione grafica del significato dell’operatore Until in ACTL è riportata inFigura 13.4.

Alcuni utili operatori derivati sono i seguenti:

ϕ ∧ ϕ0 , ¬(¬ϕ ∨ ¬ϕ0) ϕ → ϕ0 , ¬ϕ ∨ ϕ0 ϕ ↔ ϕ0 , (ϕ → ϕ0) ∧ (ϕ0 → ϕ)

Per formalizzare la semantica della logica ACTL, definiamo tre relazioni di soddisfazione ,indicate con il simbolo |=, una per ogni diversa tipologia di formule. Infatti, dato un LTSS = hQ, A∪τ , →i avente lo stesso insieme di azioni visibili A assunto per ACTL, le formuledi stato vanno interpretate rispetto ad uno stato q ∈ Q, quelle di cammino rispetto ad uncammino ρ ∈ Path(q ) (si veda anche la Definizione 3.10), e quelle di azione rispetto adun’azione α ∈ A. Le relazioni |= sono definite come al solito per induzione sulla sintassi delleformule ACTL dalle regole seguenti:

• q |= true;

• q |= ¬ϕ sse non è vero che q |= ϕ;

• q |= ϕ ∨ ϕ0 sse q |= ϕ oppure q |= ϕ0;

• q |= ∃γ sse ∃ρ ∈ Path(q ) tale che ρ |= γ ;

• q |= ∀γ sse ∀ρ ∈ Path(q ) si ha ρ |= γ ;

• ρ |= X χϕ sse ρ = (q, α, q 0)θ, q 0 |= ϕ e α |= χ;

• ρ |= X τ ϕ sse ρ = (q, τ , q 0)θ e q 0 |= ϕ;

Page 317: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 317/332

13.6 La logica ACTL 317

• ρ |= ϕχU χ0ϕ0 sse ∃i > 0 tale che ρ[i + 1] |= ϕ0, ρ[i] |= ϕ e αi |= χ0, dove ρi ≡(ρ[i], αi, ρ[i + 1])ρi+1, e

∀ j : 0

≤ j < i abbiamo ρ[ j] |= ϕ e α j |= χ oppure α j

≡τ , dove

ρ j ≡ (ρ[ j], α j , ρ[ j + 1])ρ j+1;

• ρ |= ϕχU ϕ0 sse ∃i > 0 tale che ρ[i] |= ϕ0 e ∀ j : 0 ≤ j < i abbiamo ρ[ j] |= ϕ e α j |= χ

oppure α j ≡ τ , dove ρ j ≡ (ρ[ j], α j , ρ[ j + 1])ρ j+1;

• α |= β sse α ≡ β ;

• α |= ¬χ sse non è vero che α |= χ;

• α |= χ ∨ χ0 sse α |= χ ∨ α |= χ0.

I due operatori temporali standard Future e Global in ACTL possono essere derivati comemostrato di seguito.

• F ϕ , truetrueU ϕ (“prima o poi nel futuro”) asserisce che ϕ varrà in qualche statosuccessivo del cammino considerato. Infatti, qualsiasi stato soddisfa true e qualsiasiazione visibile soddisfa true.

• Gϕ , ¬F ¬ϕ (“sempre”) asserisce che ϕ vale in ogni stato del cammino considerato(infatti, letteralmente la formula asserisce che non è possibile che prima o poi lungo ilcammino analizzato si arrivi in uno stato che non soddisfa ϕ).

Vediamo ora alcuni esempi di formule ACTL.

• ∃X τ true: esiste un cammino la cui prima azione è silente.

∀X αtrue: tutti i cammini dallo stato corrente iniziano con l’azione α.

• ∃(trueαUfalse): esiste un cammino infinito di sole azioni α e τ .

• Safety(ϕ) , ∀G¬ϕ: non si arriva mai in uno stato in cui vale la condizione ϕ.

• Liveness(ϕ) , ∀F ϕ: in ogni cammino, prima o poi si arriva in uno stato in cui vale ϕ.

Per quanto riguarda i rapporti con le equivalenze comportamentali, è possibile dimostrareche l’equivalenza indotta da ACTL coincide con la bisimilarità di branching (sempre a condi-zione che i LTS considerati siano image-finite ), cioè vale il seguente teorema di corrispondenza(anche questo non lo dimostreremo).

Teorema 13.6. Sia hQ,A, →i un LTS image-finite. Allora, per ogni p, q ∈ Q, p ∼ACTL q se

e solo se p ≈b q .Concludiamo la sezione introducendo il concetto di formula caratteristica di un sistema.

Si tratta della formula più generale associabile ad un sistema che indica il comportamento delsistema stesso. A partire da essa è possibile dimostrare, per implicazione, tutte le formule cheil sistema soddisfa.

Spieghiamo il concetto tramite un esempio. A questo proposito, consideriamo nuovamenteil grafo delle transizioni di Figura 10.1 relativo all’Esempio 10.2 (Bill_Ben). Si potrebbedimostrare che il sistema ha la seguente formula caratteristica:

(∃X play ∀X work ∀X τ (¬∃X truetrue)) ∨ (∃X work ∀X play ∀X τ (¬∃X truetrue))

Descriviamo ora alcune proprietà di Bill_Ben usando la logica ACTL.

Page 318: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 318/332

318 Capitolo 13 – Logiche per i sistemi concorrenti

• ∀X play∨worktrue: tutti i cammini del sistema, cominciano con play o con work.

• ∀(true play∨work U (∀X τ (¬∃X truetrue))): in tutti i cammini, dopo una certa sequenzadi azioni play e work, si va in uno stato in cui si può fare soltanto un’azione interna cheporta in deadlock.

• ∀F (∃X τ true): in ogni cammino, prima o poi, è possibile eff ettuare un’azione interna.Ciò corrisponde alla proprietà Liveness(∃X τ true).

Si potrebbe dimostrare che la formula caratteristica del sistema implica ciascuna delleproprietà suddette.

13.7 Proprietà infinitarie: HML con ricorsione

Come abbiamo accennato alla fine della Sezione 13.3, l’espressività delle formule modali èassai limitata. Queste infatti consentono di esprimere proprietà che descrivono comportamentifiniti di un sistema sistema, mentre si è visto che una delle caratteristiche principali dei sistemireattivi è quella di avere comportamenti infiniti. Tale limitazione deriva del fatto che ognioperatore delle logiche modali consente di studiare le evoluzioni del sistema limitatamente adun passo di esecuzione, per questo, e per il fatto che si possono prendere in considerazionesolamente formule di lunghezza finita, gli unici comportamenti analizzabili sono quelli conun numero finito di azioni. Una misura per esprimere quanto a fondo il comportamento diun sistema può essere studiato utilizzando delle formule modali è costituita dalla così detta

“profondità modale” (modal depth ) della formula. Questa è definita come il massimo livello diannidamento degli operatori modali all’interno di una formula. Ad esempio, se si considerala formula hai[b]true ∨ hcitrue la profondità modale è pari a due; verificare se un processosoddisfa o meno la formula comporta dunque l’analisi di comportamenti del sistema costituitida sequenze di azioni che possono avere una lunghezza massima pari a due.

Per poter esprimere proprietà legate al tempo, quali “il sistema può sempre eff ettuare unacerta azione”, abbiamo introdotto le logiche temporali. Una prima alternativa per rendere lelogiche modali capaci di esprimere proprietà infinitarie potrebbe essere quella di introdurrela possibilità di definire congiunzioni e disgiunzioni infinite. Per esempio, consideriamo ilprocesso CCS C , a.C . C può sempre (in ogni punto della computazione) eseguire un’azionea, cioè la formula <a> true è un’invariante . Chiamiamo questa proprietà Inv(<a> true);potremmo esprimerla in HML nel modo seguente:

Inv(<a> true) , <a> true ∧ [a] <a> true ∧ [a][a] <a> true ∧ . . .

=∞

i=0

[a]i <a> true

La formula può essere interpretata così: affinché un processo sia sempre capace di eseguireun’azione a, tale azione dev’essere possibile subito (come è espresso dalla sottoformula <a>true) e, per ogni i ≥ 0, in ogni stato che il processo può raggiungere eseguendo una sequenzadi i azioni (come è espresso dalla sottoformula [a]i <a> true, dal momento che a è l’unicaazione del nostro sistema).

Come altro esempio, consideriamo il processo CCS D , a.D + a.nil. D può terminarein qualsiasi momento o, equivalentemente, è sempre possibile transire in uno stato in cui la

Page 319: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 319/332

13.7 Proprietà infinitarie: HML con ricorsione 319

formula [a]false è vera. Chiamiamo questa proprietà P os([a]false); potremmo esprimerla inHML nel modo seguente:

P os([a]false) , [a]false ∨ <a> [a]false ∨ <a><a> [a]false ∨ . . .

=∞_

i=0

<a>i [a]false

La formula può essere interpretata così: affinché un processo abbia la capacità di rifiutareun’azione a in un qualche momento della sua esecuzione, tale azione dev’essere rifiutata subito(come è espresso dalla sottoformula [a]false) oppure dev’essere possibile eseguire una sequenzadi i azioni, per qualche i ≥ 0, e raggiungere uno stato in cui a possa essere rifiutata (comeè espresso dalla sottoformula <a>i [a]true, dal momento che a è l’unica azione del nostro

sistema).Il principale inconveniente delle formule infinitarie è che non sono semplici da trattare.Per esempio, esse sono infinitamente lunghe. In alternativa, potremmo estendere la logica mo-dale introducendo la ricorsione . Così facendo, le proprietà temporali possono essere espressecome soluzioni di certe formule ricorsive. Per dare significato alle formule ricorsive è però difondamentale importanza il concetto di punto fisso che arriveremo a definire.

Con la ricorsione siamo ad esempio in grado di esprimere Inv(<a> true) tramite laseguente equazione ricorsiva:

X ≡<a> true ∧ [a]X (13.1)

dove la notazione ϕ ≡ ϕ0 indica che gli insiemi di stati in cui ϕ e ϕ0 sono vere coincidono.In pratica, la relazione di soddisfazione |= permette di associare a ogni formula di HML

ϕ e a ogni LTS S = hQ,A, →i l’insieme di stati in Q in cui la formula è vera, cioè

[[ϕ]] , q ∈ Q | S, q |= ϕ .

Tale equazione introduce una caratterizzazione alternativa, di tipo denotazionale, della se-mantica di una formula HML (mentre finora il significato degli operatori delle logiche èstato descritto specificando quale dev’essere la struttura del modello affinché soddisfi unadata formula). Essa è definita sfruttando la relazione |=, ma possiamo definirla in manieraindipendente, per induzione sulla sintassi delle formule HML, come mostrato di seguito.

[[true]] = Q [[¬ϕ]] = Q \ [[ϕ]][[ϕ1

∨ϕ2]] = [[ϕ1]]

∪[[ϕ2]] [[ϕ1

∧ϕ2]] = [[ϕ1]]

∩[[ϕ2]]

[[<α> ϕ]] =<·α·> [[ϕ]] [[[α]ϕ]] = [·α·][[ϕ]]

dove abbiamo usato gli operatori <·α·>, [·α·] : 2Q → 2Q definiti come

<·α·> E =n

q ∈ Q | ∃q 0 ∈ Q : q α−→ q 0 e q 0 ∈ E

o[·α·]E =

nq ∈ Q | ∀q 0 ∈ Q : q

α−→ q 0 si ha q 0 ∈ E o

Quindi, formalmente, la notazione ϕ ≡ ϕ0 indica che [[ϕ]] = [[ϕ0]].È naturale allora aspettarsi che un insieme E di stati che soddisfa la formula (13.1)

dovrebbe essere tale cheE

≡<·α·> Q

∩[·α·]E

Page 320: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 320/332

320 Capitolo 13 – Logiche per i sistemi concorrenti

È chiaro che E = ∅ è una soluzione dell’equazione; infatti, nessuno stato può soddisfaresia <a> true che [a]false. Così facendo però lo stato corrispondente al processo C non

apparterrebbe a E , quindi questa non è la soluzione che stiamo cercando. In eff etti risultache in questo caso siamo interessati alla massima soluzione dell’equazione, cioè quella in cui[[ϕ]] = C (mentre [[E ]] = ∅ è la minima).

In altri casi siamo invece interessati alla minima soluzione. Per esempio, possiamoesprimere P os([a]false) con la seguente equazione ricorsiva:

Y ≡ [a]false ∨ <a> Y (13.2)

In questo caso, sempre relativamente ai processi C e D, la massima soluzione è [[Y ]] ≡C,D,nil; però tale soluzione non ci va bene perché C non può terminare. La minimasoluzione è invece [[Y ]] ≡ D,nil ed è intuitivamente l’insieme dei processi che soddisfanoP os([a]false). In eff etti, abbiamo visto che la proprietà P os([a]false) si può esprimere comeuna disgiunzione infinita; ciò ricorda le costruzioni basate sui “minimi estremi superiori dellecatene” che vengono utilizzate per caratterizzare i minimi punti fissi delle funzioni continue.

Intuitivamente, prendiamo la massima soluzione per tutte quelle proprietà di un processoche valgono a meno che esso non abbia una computazione finita che falsifica la proprietà. Adesempio, D non soddisfa la proprietà Inv(<a> true) poiché può raggiungere uno stato chenon ha transizioni etichettate a. Al contrario, prendiamo la minima soluzione per tutte quelleproprietà di un processo che valgono se esso ha una computazione finita che prova la proprietà.Per esempio, un processo soddisfa la proprietà P os(<a> true) se ha una computazione cheporta in uno stato che ha una transizione etichettata a; tale computazione prova il fattoche il processo può eseguire una transizione etichettata a in un qualche momento della suaesecuzione.

Quindi quando scriviamo una proprietà definita ricorsivamente vogliamo anche indicarese siamo interessati alla minima o alla massima soluzione dell’equazione. Per questo motivouseremo una notazione diff erente da quella vista finora; anzicché equazioni ricorsive useremoformule parametriche e di volta in volta indicheremo se siamo interessati al minimo o almassimo punto fisso della funzione corrispondente alla formula. Cosicché, relativamente agliesempi visti, per esprimere la proprietà I nv(<a> true) scriveremo la formula:

ν X.(<a> true ∧ [a]X )

dove ν X.· è l’operatore di massimo punto fisso, mentre per esprimere P os([a]false) useremola formula:

µX.([a]false ∨ <a> X )dove µX.· è l’operatore di minimo punto fisso.

L’aggiunta di tali operatori ricorsivi (ciascuno è esprimibile in termini dell’altro usando lanegazione logica) rende HML molto espressiva e capace di esprimere varie proprietà di safety e di liveness . Per esempio, è anche possibile dire che una certa proprietà ϕ1 vale in ognicomputazione finché una certa proprietà ϕ2 diventa vera. Ciò è quanto un operatore di Until permetterebbe di dire. In eff etti possiamo esprimere due diverse interpretazioni:

• Until forte : prima o poi durante una computazione dallo stato corrente si raggiunge unostato q in cui ϕ2 vale ed in tutti gli stati che precedono q vale ϕ1 :

µX.(ϕ2

∨(ϕ1

∧<

−> true

∧[

−]X ))

Page 321: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 321/332

13.8 Il µ-calculus modale 321

• Until debole : ϕ1 vale in tutti gli stati di una computazione finché non si raggiunge unostato in cui vale ϕ2 (ma ciò potrebbe non succedere mai):

ν X.(ϕ2 ∨ (ϕ1 ∧ [−]X ))

Questi sono esempi di proprietà temporali; quindi la logica che si ottiene in questo modo ètemporale. Difatti HML con ricorsione ha un potere espressivo simile al µ-calculus modale (siconsulti [AILS07] per approfondimenti), il quale è in grado di descrivere qualsiasi operatorestandard delle logiche temporali.

13.8 Il µ-calculus modale

Il µ-calculus modale [Koz83] si ottiene aggiungendo alla logica modale gli operatori di massimo

e minimo punto fisso, ovviamente insieme a variabili di punto fisso. Nella nostra presentazionela logica modale di base è ottenuta prendendo alcuni operatori di HML e di weak HML su uninsieme A ∪ τ di azioni. L’utilità degli operatori di minimo e massimo punto fisso derivadal fatto che molti concetti della logica temporale possono essere descritti come punti fissidi certe funzioni su insiemi di stati dei modelli usati per le formule. Perciò, nel µ-calculusmodale si possono esprimere anche proprietà temporali. Ad esempio, è stato dimostrato cheogni formula di CTL∗, e quindi di CTL, ha una formula corrispondente nel µ-calculus.

La sintassi delle formule del µ-calculus modale è definita dalla grammatica seguente:

ϕ ::= true ¬ϕ ϕ ∨ ϕ0 <α> ϕ αϕ Z µZ.ϕ

Una formula si dice ben-formata se ogni sottoformula della forma ν Z.ϕ è tale che la variabileZ è positiva (cioè ogni occorrenza di Z compare sotto un numero pari di simboli di negazione)in ϕ. Tale restrizione garantisce la monotonia ed è necessaria perché le formule non positivepossono dare luogo a funzioni insiemistiche senza punti fissi (ad esempio, la funzione negazioneF definita da F (X ) = ¬X non ha punti fissi nell’insieme potenza di un qualunque insiemenon vuoto). Una formula si dice chiusa se non contiene variabili libere, dove l’unico operatorelegante è µZ.·.

Altri operatori ed abbreviazioni possono essere definiti come abbiamo già fatto per HMLe weak HML.

Per definire la semantica delle formule chiuse e ben-formate conviene usare un approcciobasato sulla semantica denotazionale ed associare ad ogni formula ben-formata ϕ il sottoinsie-

me [[ϕ]] degli stati che soddisfano ϕ. Le formule del µ-calculus sono interpretate sugli stati diun generico LTS S = hQ, A ∪ τ , →i. Questa semantica, che può essere definita al solito perinduzione sulla sintassi delle formule, in eff etti non è molto diversa da quella presentata perHML con ricorsione nella sezione precedente. Tutti i casi sono semplici; l’unica difficoltà stanel definire la semantica di una formula ricorsiva del tipo µZ.ϕ. Nello specifico, una formula ϕ

(che può contenere una variabile Z ) è interpretata come una funzione [[ϕ]] : 2Q → 2Q che, datoun insieme E ⊆ Q che si suppone soddisfi Z , restituisce l’insieme degli stati che soddisfano ϕ.

[[true]](E ) = Q [[¬ϕ]](E ) = Q \ [[ϕ]](E )[[ϕ1 ∨ ϕ2]](E ) = [[ϕ1]](E ) ∪ [[ϕ2]](E ) [[ϕ1 ∧ ϕ2]](E ) = [[ϕ1]](E ) ∩ [[ϕ2]](E )[[<α> ϕ]](E ) =<·α·> [[ϕ]](E ) [[αϕ]](E ) = ·α·[[ϕ]](E )

[[Z ]](E ) = E [[µZ.ϕ]] = T E ⊆ Q | [[ϕ]](E ) ⊆ E

Page 322: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 322/332

322 Capitolo 13 – Logiche per i sistemi concorrenti

dove abbiamo usato gli operatori <·α·>, ·α· : 2Q → 2Q definiti come

<·α·> E 0 = nq ∈ Q | ∃q 0 ∈ Q : q α

−→ q 0 e q 0 ∈ E 0o·α·E 0 =

nq ∈ Q | ∃q 0 ∈ Q : q

α=⇒ q 0 e q 0 ∈ E 0

oVediamo ora se la definizione della semantica denotazionale è ben posta. Innanzitutto,

osserviamo che si può dimostrare che, per ogni formula ben-formata ϕ, la funzione corrispon-dente [[ϕ]] : 2Q → 2Q è monotona nel cpo h2Q, ⊆i. Come detto prima, l’idea sottostante ladefinizione della funzione [[ϕ]] è che se Z ⊆ Q è l’insieme degli stati che soddisfano Z allora[[ϕ]]( Z ) è l’insieme degli stati che soddisfano ϕ. Cos’è allora Z ? Sintatticamente assumeremoche Z è implicitamente dato da una equazione ricorsiva in Z della forma Z = ϕ. Comeabbiamo visto nella sezione precedente, una tale equazione può essere interpretata come un’e-

quazione su insiemi di stati Z = [[ϕ]]( Z ). Ora, poiché [[ϕ]] è una funzione monotona su un cpo,sappiamo che l’equazione Z = [[ϕ]]( Z ) ha soluzione, cioè ammette punti fissi. In particolare,il teorema del “punto fisso” ci dice che

1. [[ϕ]] ha minimo punto fisso dato dall’intersezione dei punti pre-fissi:TE ⊆ Q | [[ϕ]](E ) ⊆ E ;

2. [[ϕ]] ha massimo punto fisso dato dall’unione dei punti post-fissi:SE ⊆ Q | E ⊆ [[ϕ]](E ).

La semantica di µZ.ϕ, che per definizione è il minimo punto fisso della funzione [[ϕ]], è pertantoben definita.

La teoria del punto fisso dice inoltre che se la funzione associata a ϕ è monotòna, laseguente è una catena di approssimanti del minimo punto fisso:

ϕ0 = false e ϕi+1 = ϕ[ϕi/Z ].

Inoltre, in generale l’estremo superiore della catena è strettamente minore del minimo puntofisso (cioè,

S∞i=0 ϕi ⊂ µZ.ϕ); ma se la funzione associata a ϕ è continua si ha che

S∞i=0 ϕi =

µZ.ϕ. In pratica, ciò vuol dire che la formula µZ.ϕ può essere interpretata nel modo seguente

µZ.ϕ ≡ ϕ0 ∨ ϕ1 ∨ ϕ2 ∨ · · ·

Per dualità possiamo porre ν Z.ϕ , ¬µZ.¬ϕ[¬Z/Z ]. Come conseguenza di questa defini-

zione, si può dimostrare che la semantica della formula ν Z.ϕ è il massimo punto fisso dellafunzione corrispondente a ϕ, cioè[

E ⊆ Q | E ⊆ [[ϕ]](E ) .

La teoria del punto fisso dice inoltre che se la funzione associata a ϕ è monotòna, la seguenteè una catena di approssimanti del massimo punto fisso:

ϕ0 = true e ϕi+1 = ϕ[ϕi/Z ].

Inoltre, in generale l’estremo inferiore della catena è strettamente maggiore del massimo puntofisso (cioè, ν Z.ϕ

⊂ T∞i=0

ϕi); ma se la funzione associata a ϕ è continua si ha che ν Z.ϕ =

Page 323: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 323/332

13.8 Il µ-calculus modale 323

T∞i=0 ϕi. In pratica, ciò vuol dire che la formula ν Z.ϕ può essere interpretata nel modo

seguente

ν Z.ϕ ≡ ϕ0 ∧ ϕ1 ∧ ϕ2 ∧ · · ·

Si osservi infine che se Q è finito, diciamo che è formato da k elementi, ogni funzionemonotòna è continua ed inoltre ogni catena dopo al più k elementi si stabilizza , cioè diventacostante. Di conseguenza, il k-esimo elemento di una catena di approssimanti coincide con ilpunto fisso corrispondente.

Con gli operatori di minimo e massimo punto fisso si può esprimere la capacità di svolgereun comportamento nel futuro o di ripeterlo continuamente. In particolare, il costruttore diminimo punto fisso è utile per esprimere proprietà di eventualità forte (prima o poi avvieneuna data condizione), mentre quello di massimo punto fisso è utile per esprimere proprietà diinvarianza nel tempo (un certo comportamento si verifica in ogni stato indicato). Le formule

del µ-calculus possono diventare difficili da comprendere al crescere della loro lunghezza;una euristica che può aiutare a comprenderne il significato consiste nel vedere le formuledinamicamente, come ricerche di stati con certe proprietà svolte muovendosi lungo gli archidel grafo delle transizioni che rappresenta il modello. L’operatore µ dice che la ricerca deveterminare, mentre l’operatore ν dice che la ricerca non deve necessariamente terminare.

Esempi di questa euristica sono i seguenti.

• µZ.(ϕ ∨ <−> Z ) indica che la proprietà ϕ vale inizialmente oppure dopo aver fattoqualunque altra sequenza di azioni. In altri termini la formula dice che deve esistere unostato accessibile da quello iniziale che gode della proprietà ϕ. In pratica corrispondealla formula temporale EFϕ. Infatti, partendo dallo stato in cui la formula è valutata,iteriamo la seguente verifica: se il punto corrente verifica ϕ, abbiamo finito; altrimenti,selezioniamo una direzione (infatti, il diamond modale significa che si sceglie una dire-zione) e continuiamo la ricerca in quella direzione. Il µ all’inizio della formula dice chela ricerca deve terminare, e l’unico modo per terminare la ricerca è trovare uno statoin cui ϕ vale. Notiamo che la formula esprime una proprietà di liveness : qualcosa dibuono, prima o poi, accadrà.

• ν Z.(ϕ ∧ [−]Z ) indica che la proprietà ϕ vale inizialmente e dopo aver fatto qualunquealtra sequenza di azioni. In altri termini la formula dice che tutti gli stati accessibiligodono della proprietà ϕ. In pratica corrisponde alla formula temporale AGϕ. Infatti,partendo dallo stato in cui la formula è valutata, iteriamo la seguente verifica: se lostato corrente verifica ¬ϕ, abbiamo un fallimento; altrimenti, continuiamo la ricerca in

tutte le direzioni (infatti il box modale significa prendere tutte le direzioni). Notiamoche la formula precedente esprime una proprietà di safety : se la negazione ¬ϕ di ϕ èuna proprietà indesiderata, abbiamo che qualcosa di indesiderato non accadrà mai.

Vediamo alcuni altri esempi di formule del µ-calculus.

• [[ ]] <α> true significa che ogni volta che si esegue una sequenza di azioni τ si va in unostato dove è possibile eseguire α.

• [[α]] <β > (γ true ∧ [α, β ]false) significa che in ogni cammino che comincia con unα-discendente, c’è poi la possibilità di eseguire un’azione β per arrivare in uno stato incui esiste un γ -discendente e non si possono eseguire le azioni α e β .

Page 324: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 324/332

324 Capitolo 13 – Logiche per i sistemi concorrenti

• ν Z. <α> Z esprime la capacità di eseguire l’azione α per sempre; quindi, se α = τ ,esprime la capacità di divergere.

• µZ.(< −β > true ∧ [β ]false ∧ [−α]Z ) significa che non è possibile fare l’azione β

fintantoché si fanno azioni diverse da α.

• Safety(ϕ) = ν Z.(¬ϕ∧ [−]Z ) significa che qualunque azione si faccia, si è sempre in unostato nel quale non vale la condizione ϕ.

• Liveness(ϕ) = µZ.(ϕ ∨ (<−> true ∧ [−]Z )) significa che c’è sempre la possibilità difare un’azione e prima o poi arrivare in uno stato in cui vale ϕ.

Combinando i minimi e i massimi punti fissi riusciamo anche a ottenere proprietà di fairness : ad esempio, la formula

ν Y.µZ.(ϕ∧ <−> Y )∨ <−> Z

significa che esiste un cammino infinito ove ϕ occorre infinite volte, quindi corrisponde allaformula temporale EGFϕ.

Si può dimostrare che ogni formula della logica temporale CTL∗ è equivalente a unaformula del µ-calculus, mentre il contrario non è vero. Ad esempio, la formula

ν Z.ϕ∧ <−><−> Z

esprime il fatto che in qualche cammino una certa proprietà ϕ vale in tutti gli stati in posizionepari, proprietà che, come abbiamo già visto, non è esprimibile nella logica temporale. Quindi

il µ-calculus modale è strettamente più espressivo di CTL∗.

Page 325: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 325/332

Bibliografia

[AB84] Didier Austry and Gérard Boudol. Algèbre de processus et synchronisation.

Theor. Comput. Sci., 30:91–131, 1984.

[AILS07] Luca Aceto, Anna Ingolfsdottir, Kim G. Larsen, and Jiri Srba. Reactive Systems:Modelling, Specification and Verification . Cambridge University Press, 2007.

[Bar84] Henk P. Barendregt. The Lambda Calculus: Its Syntax and Semantics . Studiesin Logic 103, second, revised edition, North-Holland, Amsterdam, 1984.

[Bar90] Hendrik Pieter Barendregt. Functional programming and lambda calculus.In Handbook of Theoretical Computer Science, Volume B: Formal Models and Sematics (B), pages 321–363. Elsevier and MIT Press, 1990.

[BB87] Tommaso Bolognesi and Ed Brinksma. Introduction to the ISO SpecificationLanguage LOTOS. Computer Networks , 14:25–59, 1987.

[BHH+06] Bernhard Beckert, Tony Hoare, Reiner Hähnle, Douglas R. Smith, Cordell Green,Silvio Ranise, Cesare Tinelli, Thomas Ball, and Sriram K. Rajamani. Intelligentsystems and formal methods in software engineering. IEEE Intelligent Systems ,21(6):71–81, 2006.

[BHR84] S. D. Brookes, C. A. R. Hoare, and A. W. Roscoe. A Theory of CommunicatingSequential Processes. J. ACM , 31(3):560–599, June 1984.

[BK84a] Jan A. Bergstra and Jan Willem Klop. The algebra of recursively defined processes

and the algebra of regular processes. In Jan Paredaens, editor, ICALP , volume172 of Lecture Notes in Computer Science , pages 82–94. Springer, 1984.

[BK84b] Jan A. Bergstra and Jan Willem Klop. Process algebra for synchronouscommunication. Information and Control , 60(1-3):109–137, 1984.

[CE81] Edmund M. Clarke and E. Allen Emerson. Design and synthesis of synchroni-zation skeletons using branching-time temporal logic. In Dexter Kozen, editor,Logic of Programs , volume 131 of Lecture Notes in Computer Science , pages 52–71.Springer, 1981.

[CGP99] E. M. Clarke, O. Grumberg, and D. A. Peled. Model Checking . MIT Press, 1999.

Page 326: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 326/332

326 Bibliografia

[Chu41] Aalonso Church. The Theory of Lambda Conversion . Princeton University Press,1941.

[DV90] Rocco De Nicola and Frits Vaandrager. Action versus state based logics for tran-sition systems. In Irene Guessarian, editor, Semantics of Systems of Concurrent Processes , volume 469 of Lecture Notes in Computer Science , pages 407–419.Springer Berlin Heidelberg, 1990.

[Fok00] W. Fokkink. Introduction to Process Algebra . Texts in Theoretical ComputerScience. An EATCS Series. Springer, 2000.

[Gor79] Michael J.C. Gordon. The Denotational Description of Programming Languages .Springer-Verlag, 1979.

[Hen88] Matthew Hennessy. Algebraic theory of processes . MIT Press series in thefoundations of computing. MIT Press, 1988.

[HM85] Matthew Hennessy and Robin Milner. Algebraic laws for nondeterminism andconcurrency. J. ACM , 32(1):137–161, January 1985.

[Hoa78] C. A. R. Hoare. Communicating sequential processes. Commun. ACM , 21(8):666–677, 1978.

[Hoa85] C. A. R. Hoare. Communicating Sequential Processes . Prentice-Hall, 1985.Available at http://www.usingcsp.com/cspbook.pdf.

[HP85] D. Harel and A. Pnueli. On the development of reactive systems. In K. R. Apt,editor, Logics and Models of Concurrent Systems , NATO ASI Series, Vol. F-13,pages 477–498. Springer-Verlag, 1985.

[Koz83] Dexter Kozen. Results on the propositional µ-calculus. Theoretical Computer Science , 27(3):333 – 354, 1983.

[Mil80] Robin Milner. A Calculus of Communicating Systems , volume 92 of Lecture Notes in Computer Science . Springer, 1980.

[Mil89] Robin Milner. Communication and Concurrency . PHI Series in computer science.Prentice Hall, 1989.

[Pnu77] Amir Pnueli. The temporal logic of programs. In FOCS , pages 46–57. IEEEComputer Society, 1977.

[Pri57] Arthur Norman Prior. The Logic of Time and Modality . Oxford University Press,1957.

[Sch86] D.A. Schmidt. Denotational semantics: a methodology for language development .Allyn and Bacon, 1986.

[Sch99] Steve Schneider. Concurrent and Real Time Systems: the CSP approach . JohnWiley & Sons, Ltd., 1999. Available at http://www.computing.surrey.ac.uk/personal/st/S.Schneider/books/CRTS.pdf.

Page 327: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 327/332

327

[Sco76] Dana S. Scott. Data types as lattices. SIAM J. Comput., 5(3):522–587, 1976.

[SM92] Davide Sangiorgi and Robin Milner. The Problem of “Weak Bisimulation up to”.In Rance Cleaveland, editor, CONCUR, volume 630 of Lecture Notes in Computer Science , pages 32–46. Springer, 1992.

[SW74] Christopher Strachey and Christopher W. Wadsworth. Continuations: A Mathe-matical Semantics for Handling Full Jumps. Technical report, Tech.Monoghraph,PRG-11, Oxford University, 1974.

[Win99] Glynn Winskel. La Semantica Formale dei Linguaggi di Programmazione . MITPress, 1999.

[Win09] Glynn Winskel. Topics in concurrency. Lecture Notes, 2009.

Page 328: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 328/332

Page 329: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 329/332

Appendice A

Tabelle

A.1 Elenco degli operatori per la concorrenza

Op Uso Significato Regole

Di base

0 0 processo inattivo (nessuna regola)(sinonimi: nil, δ o stop)

exit exit terminazioneexit

√ −→ stop

oppureexit

√ −→ δ

(sinonimo: skip)

µ µ processo azioneµ

µ−→ √

chaos chaos chaoschaos

a−→ chaos chaos a−→ stop

Di sequenzializzazione

. µ.E azione prefissa µ.E µ−→ E

; E ; F comp. sequenziale

o enablingE

µ−→ E 0

E ; F µ−→ E 0; F

(µ 6= √ )

E √ −→ E 0

E ; F τ −→ F

[> E [> F disabling E

µ−→ E 0

E [> F

µ

−→ E 0 [> F

(µ 6= √ )

Page 330: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 330/332

330 Appendice A – Tabelle

E √

−→ E 0

E [> F τ −→ E 0

F µ

−→ F 0

E [> F τ −→ F 0

Di scelta

+ E + F scelta mista

o sommaE

µ−→ E 0

E + F µ−→ E 0

F µ−→ F 0

E + F µ−→ F 0

⊕ E ⊕ F scelta internaE ⊕ F

τ −→ E E ⊕ F τ −→ F

E F scelta esterna E α−→ E 0

E F α−→ E 0

(α 6= τ ) F α−→ F 0

E F α−→ F 0

(α 6= τ )

E τ −→ E 0

E F τ −→ E 0F

F τ −→ F 0

E F τ −→ E F 0

Di composizione parallela

| E | F comp. parallela E

µ−→ E 0

E | F µ

−→ E 0 | F

F µ−→ F 0

E | F µ

−→ E | F 0

E α−→ E 0 F

α−→ F 0

E | F τ −→ E 0 | F 0

(α 6= τ )

k E k F merge E

µ−→ E 0

E k F µ−→ E 0 k F

F µ−→ F 0

E k F µ−→ E k F 0

E α−→ E 0 F

β−→ F 0

E k F

γ (α,β)

−−−−→ E 0 k F 0

T E TF left merge E

µ−→ E 0

E TF µ−→ E 0 k F

|c E |c F communication

merge

E α−→ E 0 F

β−→ F 0

E |c F γ (α,β)−−−−→ E 0 k F 0

||| E ||| F interleaving E

µ−→ E 0

E ||| F

µ

−→ E 0 ||| F

F µ−→ F 0

E ||| F

µ

−→ E ||| F 0

Page 331: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 331/332

A.1 Elenco degli operatori per la concorrenza 331

|[L]| E |[L]| F comp. parallela

con interfaccia

E µ

−→ E 0

E |[L]| F µ−→ E 0 |[L]| F (µ /∈ L)

F µ−→ F 0

E |[L]| F µ−→ E |[L]| F 0

(µ /∈ L)

E α−→ E 0 F

α−→ F 0

E |[L]| F α−→ E 0 |[L]| F 0

(α ∈ L)

× E

×F prodotto

E α−→ E 0 F

β−→ F 0

E × F α×β−−−→ E 0 × F 0

Di astrazione

\ E \L restrizione E

µ−→ E 0

E \L µ−→ E 0\L

(µ, µ /∈ L)

E L abilitazione E

µ−→ E 0

E L µ−→ E 0 L

(µ ∈ L ∨ µ ∈ L ∨ µ = τ )

δ H δ H (E ) encapsulation E µ−→ E 0

(µ 6∈ H )δ H (E )

µ−→ δ H (E 0)

/ E/L hiding E

µ−→ E 0(µ 6∈ L)

E/L µ−→ E 0/L

E α−→ E 0

(α ∈ L)E/L

τ −→ E 0/L

[f ] E [f ] Rietichettaturao relabelling

E

µ

−→ E 0

E [f ] f (µ)−−→ E 0[f ]

Per comportamenti infiniti

A A , P costanti

di processoE

µ−→ E 0

A µ−→ E 0

(A , E )

rec x rec x.E ricorsione E rec x.E/x

µ−→ E 0

rec x.E µ

−→ E 0

Page 332: MSSC1314

7/25/2019 MSSC1314

http://slidepdf.com/reader/full/mssc1314 332/332

332 Appendice A – Tabelle

! !E replicazione

E µ

−→ E 0

!E µ−→ E 0 | !E oppure

E | ! E µ

−→ E 0

! E µ−→ E 0

Per manipolare valori

α(x) inputα(x).E

α(v)−−→ E v/x(v valore)

α e.E outputα e.E

α val(e)

−−−−−→ E

(e espressione)

E | F comunicazione

di valoriE

α(v)−−→ E 0 F α v−−→ F 0

E | F τ −→ E 0 | F 0

(v valore)

if e then E else F E

µ−→ E 0 val(e) = true

if e then E else F µ−→ E 0

(e espressione)

F µ−→ F 0 val(e) = false

if e then E else F µ−→ F 0

(e espressione)

A.2 Alcuni calcoli di processi

CCS: Calculus of Communicating Processes (Milner 1980). L’insieme delle azioniActτ e costituito da un insieme di etichette Λ, dall’insieme Λ delle etichette soprasegnate edall’azione speciale τ , la sintassi è

E ::= nil µ.E

E \L E [f ]

E 1 + E 2 E 1|E 2

recX.E

dove µ ∈ Actτ , L ⊆ Λ, f : Actτ → Actτ con la proprietà che f (α) = f (α) e f (τ ) = τ .

SCCS: Synchronous Calculus of Communicating Processes (Milner 1983). L’insie-me delle azioni Act è un gruppo abeliano costituito da un insieme di etichette Λ, dall’insiemeΛ delle etichette soprasegnate e dall’elemento neutro 1, la sintassi è

E ::= nil µ : E

E L E 1 + E 2

E 1 × E 2 recX.E

dove µ ∈ Act, L ⊆ Λ, l’operatore : denota l’action prefixing. l’operatore di rietichettatura èassente perché può essere espresso per mezzo degli altri operatori.

TCSP: Theoretical Communicating Sequential Processes (Brookes-Hoare-Roscoe1984). L’insieme delle azioni è un insieme Λ, la sintassi è

E ::= stop

skip

a → E

E \L

E [f ]

E 1; E 2

E 1 u E 2

E 1

E 2 E 1 k E 2 E 1 ||| E 2 E 1 |[L

]| E 2 A