Sei sulla pagina 1di 218

Appunti di Modelli di Calcolo

Andrea Cimino Lorenzo Muti Marco Stronati

14 marzo 2011

Licenza Creative Commons: Attribuzione - Non commerciale - Condividi allo stesso modo 2.5 Italia (CC BY-NC-SA 2.5) -

Indice
Introduzione ix

I.

Il linguaggio IMP
1.1. Regole di inferenza e grammatiche . . . . . . . . . . . . . . . . . . 1.1.1. Regole di inferenza . . . . . . . . . . . . . . . . . . . . . . 1.1.2. Un esempio di sistema di regole di inferenza . . . . . . . . 1.2. Sintassi di IMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Semantica operazionale di IMP . . . . . . . . . . . . . . . . . . . . 1.3.1. Stato della memoria . . . . . . . . . . . . . . . . . . . . . 1.3.2. Sistema di regole . . . . . . . . . . . . . . . . . . . . . . . 1.4. Uguaglianza fra programmi in IMP . . . . . . . . . . . . . . . . . . 1.4.1. Dimostrazioni di uguaglianza semplici . . . . . . . . . . . . 1.4.2. Dimostrazioni per programmi non completamente specicati 1.4.3. Computazioni che non terminano . . . . . . . . . . . . . . 1.4.4. Dimostrazioni di non uguaglianza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
3

1. La semantica operazionale di IMP

3 3 4 7 7 7 8 11 11 13 14 16
19

2. Metodi di Induzione

2.1. Principio dellinduzione ben fondata di Noether . 2.1.1. Relazioni ben fondate . . . . . . . . . . 2.1.2. Linduzione ben fondata di Noether . . . 2.2. Altri metodi di induzione . . . . . . . . . . . . . 2.2.1. Induzione matematica debole . . . . . . 2.2.2. Induzione matematica forte . . . . . . . . 2.2.3. Induzione strutturale . . . . . . . . . . . 2.2.4. Induzione sulle derivazioni . . . . . . . . 2.2.5. Induzione sulle regole . . . . . . . . . . 2.3. Ricorsione ben fondata (Well founded recursion)
3. Ordinamenti parziali e teorema del punto sso

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

19 19 22 22 23 23 23 25 27 27
31

3.1. Basi degli ordinamenti parziali . . . . . . . . 3.1.1. Ordinamenti parziali e totali . . . . . 3.1.2. Diagrammi di Hasse . . . . . . . . . 3.1.3. Catene . . . . . . . . . . . . . . . . 3.1.4. Ordinamenti parziali completi (CPO) 3.1.5. Reticoli . . . . . . . . . . . . . . . . 3.2. Verso la teoria del punto sso . . . . . . . . . 3.2.1. Monotonia e continuit . . . . . . . . 3.2.2. Punto sso . . . . . . . . . . . . . . 3.2.3. Il teorema di Kleene . . . . . . . . . 3.2.4. Il teorema di Tarski . . . . . . . . . . 3.3. Operatore delle conseguenze immediate . . . 3.3.1. Loperatore R . . . . . . . . . . . . . 3.3.2. Punto sso di R . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

31 31 33 35 38 40 41 41 43 43 45 46 46 48

iv
4. Semantica denotazionale di IMP

Indice
51

4.1. Semantica denotazionale di IMP . . . . . . . . . . . . . . . . . . 4.1.1. Funzione A . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2. Funzione B . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3. Funzione C . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Equivalenza fra semantica operazionale e semantica denotazionale 4.2.1. Dimostrazione per A e B . . . . . . . . . . . . . . . . . 4.2.2. Dimostrazioni per C . . . . . . . . . . . . . . . . . . . . 4.2.2.1. Dalla semantica operazionale alla denotazionale 4.2.2.2. Dalla semantica denotazionale alla operazionale 4.3. Dimostrare propriet con la semantica denotazionale . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

51 51 52 52 54 55 55 56 57 59

II.

Il linguaggio HOFL
5.1. -calcolo . . . . . . . . . . . . . . . . . . 5.1.1. -calcolo non tipato . . . . . . . . 5.1.2. -calcolo semplicemente tipato . . 5.2. HOFL . . . . . . . . . . . . . . . . . . . . 5.2.1. Sintassi . . . . . . . . . . . . . . . 5.2.2. Regole di inferenza di tipi . . . . . 5.2.3. Problema della tipizzazione . . . . 5.2.3.1. Tipizzazione alla Church 5.2.3.2. Tipizzazione alla Curry . 5.2.4. Sostituzione . . . . . . . . . . . . . 5.3. Semantica operazionale di HOFL . . . . . . 5.3.1. Forme Canoniche . . . . . . . . . . 5.3.2. Regole di inferenza . . . . . . . . .

63
65

5. Sintassi e semantica operazionale di HOFL

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

65 65 66 67 67 68 68 68 69 70 71 72 72
77

6. Complementi di teoria dei domini e semantica denotazionale di HOFL

6.1. Teoria dei domini . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1. CPO per il tipo int . . . . . . . . . . . . . . . . . . . 6.1.2. CPO per il tipo 1 2 . . . . . . . . . . . . . . . . . 6.1.2.1. Costruzione del CPO . . . . . . . . . . . . 6.1.2.2. Loperatore . . . . . . . . . . . . . . . . . 6.1.3. CPO per il tipo 1 2 . . . . . . . . . . . . . . . . 6.1.3.1. Continuit in funzioni del tipo 1 (2 3 ) 6.1.3.2. Continuit in funzioni del tipo D E S . . 6.1.4. Dimostrazioni di continuit . . . . . . . . . . . . . . . 6.1.5. Lifting . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Semantica denotazionale di HOFL . . . . . . . . . . . . . . . . 6.2.1. Costanti . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.2. Variabili . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3. Operazioni binarie . . . . . . . . . . . . . . . . . . . . 6.2.4. Condizionale . . . . . . . . . . . . . . . . . . . . . . . 6.2.5. Coppie . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.6. Selezionatori di coppia . . . . . . . . . . . . . . . . . . 6.2.7. Lambda function . . . . . . . . . . . . . . . . . . . . . 6.2.8. Applicazione di funzione . . . . . . . . . . . . . . . . . 6.2.9. Ricorsione . . . . . . . . . . . . . . . . . . . . . . . . 6.3. La semantica denotazionale composizionale . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

77 78 78 78 78 79 80 81 82 83 84 85 85 85 86 87 88 88 90 90 90

Indice
7. Equivalenza fra le semantiche di HOFL

v
93

7.1. Basi del confronto . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2. Uso del lifting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3. La terminazione operazionale implica la terminazione denotazionale 7.3.1. Forma canonica . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2. Operazioni binarie . . . . . . . . . . . . . . . . . . . . . . 7.3.3. Condizionale . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.4. Selettore da coppia . . . . . . . . . . . . . . . . . . . . . . 7.3.5. Applicazione di funzione . . . . . . . . . . . . . . . . . . . 7.3.6. Ricorsione . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.7. Conclusione . . . . . . . . . . . . . . . . . . . . . . . . . 7.4. La terminazione denotazionale implica la terminazione operazionale 7.5. Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

93 93 94 94 94 95 95 96 96 96 97 97

III. Calcoli di processo


8. Il linguaggio CCS

101
103

8.1. Denizione del linguaggio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1. Sintassi di CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2. Semantica Operazionale . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3. Semantica astratta del CCS . . . . . . . . . . . . . . . . . . . . . . . . . 8.2. Relazioni di equivalenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1. Isomorsmo dei gra . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.2. Stringhe o Trace equivalence . . . . . . . . . . . . . . . . . . . . . . . . 8.3. Bisimilarit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1. Punto sso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1.1. Il CPO dei processi . . . . . . . . . . . . . . . . . . . . . . 8.3.1.2. Loperatore . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4. Congruenza e bisimilarit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.0.3. Bisimilarit una congruenza per il parallelo . . . . . . . . . . 8.4.0.4. Accenno di dimostrazione di bisimilarit per regola del presso 8.5. Logica di Hennessy - Milner . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.6. -calcolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7. Weak Observational equivalence . . . . . . . . . . . . . . . . . . . . . . . . . . 8.8. Weak Observational Congruence . . . . . . . . . . . . . . . . . . . . . . . . . . 8.9. Dynamic congruence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10. Caratterizzazione assiomatica della bisimulazione . . . . . . . . . . . . . . . . . 8.10.1. Teorema di Espansione . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10.2. Assiomi di riduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10.3. Assiomi bisimilarit strong . . . . . . . . . . . . . . . . . . . . . . . . .
9. Il -calcolo

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

105 105 106 108 109 109 109 110 112 112 113 116 116 118 118 119 120 121 122 123 123 123 123
125

9.1. Sintassi di -calcolo . . . . . . . . . . 9.1.1. Sintassi e potenzialit . . . . . . 9.1.2. Free names e bound names . . . 9.2. Semantica operazionale del -calcolo . 9.2.1. Messaggi . . . . . . . . . . . . 9.2.2. Nondeterminismo . . . . . . . . 9.2.3. Matching . . . . . . . . . . . . 9.2.4. Parallelismo . . . . . . . . . . . 9.2.5. Restrizioni, apertura e chiusura . 9.2.6. Replicazione . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

126 126 126 128 128 129 129 129 130 131

vi 9.3. Semantica astratta di -calcolo . . . . . . 9.3.1. Nozioni di equivalenza . . . . . . 9.3.2. Semantica astratta . . . . . . . . 9.3.2.1. Bisimularit ground . . 9.3.2.2. Bisimilarit non ground 9.4. Estensioni del -calcolo . . . . . . . . . 9.4.1. -calcolo asincrono . . . . . . . 9.4.2. HOPI: High-order -calculus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Indice . . . . . . . . . . . . . . . . 132 132 133 133 134 135 135 135

IV. Calcoli di processo probabilistici


10. Teoria della misura e catene di Markov

137
139

10.1. La teoria della misura . . . . . . . . . . . . . . . . . . 10.1.1. I Sigma-eld . . . . . . . . . . . . . . . . . . 10.1.2. Costruire un sigma-eld . . . . . . . . . . . . 10.1.3. Distribuzione probabilistca esponenziale . . . 10.2. Processi Stocastici Markoviani . . . . . . . . . . . . . 10.2.1. Le catene di Markov . . . . . . . . . . . . . . 10.2.2. Catene di Markov a tempo discreto e continuo 10.3. DTMC - Discrete-time Markov Chain . . . . . . . . . 10.3.1. Relazioni con CCS . . . . . . . . . . . . . . . 10.3.2. Denizioni . . . . . . . . . . . . . . . . . . . 10.3.3. Limite di una catena: catene ergodiche . . . . 10.4. CTMC - Continuous-time Markov Chain . . . . . . . . 10.4.1. Denizioni . . . . . . . . . . . . . . . . . . . 10.4.2. Bisimilarit nelle CTMC . . . . . . . . . . . .
11. Estensioni delle catene di Markov e PEPA

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

139 139 140 141 143 143 144 144 144 144 146 147 147 148
151

11.1. Azioni e nondeterminismo nelle catene di Markov . . 11.1.1. CTMC con azioni . . . . . . . . . . . . . . . 11.1.1.1. Reactive CTMC . . . . . . . . . . 11.1.1.2. Logica di Larsen-Skou . . . . . . 11.1.2. CTMC con nondeterminismo . . . . . . . . 11.1.2.1. Segala Automaton - Roberto Segala 11.1.2.2. Simple Segala Automaton . . . . . 11.1.2.3. Altre combinazioni . . . . . . . . 11.1.3. Segala come modello pi generale . . . . . . 11.1.3.1. Segala vs Generative . . . . . . . . 11.1.3.2. Generative Segala . . . . . . . 11.1.3.3. Reactive Segala . . . . . . . . . 11.1.3.4. Simple Segala Segala . . . . . . 11.1.3.5. Simple Segala vs Generative . . . 11.2. PEPA - Performance Evaluation Process Algebra . . 11.2.1. Sintassi di PEPA . . . . . . . . . . . . . . . 11.2.2. Semantica operazionale di PEPA . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

151 151 151 152 152 153 153 154 154 154 154 155 155 155 155 155 155

V.

Appendici

157
159

A. Tabelle riassuntive di sintassi e semantica

A.1. IMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 A.1.1. Sintassi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Indice A.1.2. Semantica operazionale . . . . . . . . . . . . . . . . . A.1.2.1. Regole per Aexpr < a, > n N . . . . . . A.1.2.2. Regole per Bexpr < b, > v {true, false} A.1.2.3. Regole per Com < c, > . . . . . . A.1.3. Semantica denotazionale . . . . . . . . . . . . . . . . . A.1.3.1. A : Aexpr N . . . . . . . . . . . . . A.1.3.2. B : Bexpr B . . . . . . . . . . . . . A.1.3.3. C : Com . . . . . . . . . . . . . . HOFL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2.1. Sintassi . . . . . . . . . . . . . . . . . . . . . . . . . . A.2.2. Regole di inferenza dei tipi . . . . . . . . . . . . . . . . A.2.3. Semantica operazionale . . . . . . . . . . . . . . . . . A.2.3.1. Forme canoniche . . . . . . . . . . . . . . . A.2.3.2. Regole di inferenza . . . . . . . . . . . . . . A.2.4. Semantica denotazionale . . . . . . . . . . . . . . . . . CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.3.1. Sintassi . . . . . . . . . . . . . . . . . . . . . . . . . . A.3.2. Semantica operazionale . . . . . . . . . . . . . . . . . A.3.3. Strong Bisimilarity . . . . . . . . . . . . . . . . . . . . A.3.4. Weak Observational equivalence . . . . . . . . . . . . . A.3.5. Weak Observational Congruence . . . . . . . . . . . . . A.3.6. Dynamic congruence . . . . . . . . . . . . . . . . . . . -calcolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.4.1. Sintassi . . . . . . . . . . . . . . . . . . . . . . . . . . Semantica operazionale . . . . . . . . . . . . . . . . . . . . . . A.5.0.1. Bisimilarit ground . . . . . . . . . . . . . . A.5.0.2. Bisimilarit non ground . . . . . . . . . . . . Modelli probabilistici . . . . . . . . . . . . . . . . . . . . . . . A.6.1. DTMC . . . . . . . . . . . . . . . . . . . . . . . . . . A.6.2. CTMC . . . . . . . . . . . . . . . . . . . . . . . . . . A.6.3. Reactive . . . . . . . . . . . . . . . . . . . . . . . . . . A.6.4. Generative . . . . . . . . . . . . . . . . . . . . . . . . A.6.5. Segala . . . . . . . . . . . . . . . . . . . . . . . . . . . A.6.6. Simple Segala . . . . . . . . . . . . . . . . . . . . . . . PEPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

vii 159 159 159 159 160 160 160 160 161 161 161 162 162 162 162 163 163 163 163 163 163 164 164 164 164 164 164 164 164 165 165 165 165 165 165
167

A.2.

A.3.

A.4. A.5.

A.6.

A.7.

B. Esercizi

B.0.1. Esercizi prima parte . . . . . . B.0.2. Esercizi 23 Marzo 2010 . . . . B.0.3. 2 Febbraio 2000 . . . . . . . . B.0.4. 20 Gennaio 2005 . . . . . . . . B.0.5. Prova scritta del 6 aprile 2005 . B.0.6. Prova scritta del 21 luglio 2005 B.0.7. Prova scritta del 3 Aprile 2007 . B.0.8. Prova scritta del 31/05/06 . . . B.0.9. Prova scritta del 30/04/04 . . . B.0.10. Prova scritta del 23/07/07 . . . B.0.11. Prova scritta del 9 aprile 2010 . B.0.12. Correzione esercizi 23/03/2010 B.0.12.1. Esercizio 1 . . . . . . B.0.12.2. Esercizio 3 . . . . . . B.0.13. Esercizio 4 . . . . . . . . . . . B.0.13.1. Esercizio 6 . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

167 171 175 176 178 179 180 182 183 185 186 189 189 190 191 192

viii

Indice B.0.13.2. Esercizio 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

VI. Elenchi

195

Introduzione
Il corso di modelli di calcolo strutturato in 4 parti: Modelli per il calcolo imperativo, che studieremo con il linguaggio IMP Modelli per il calcolo funzionale, che studieremo con il linguaggio HOFL Modelli per i calcoli di processo, che studieremo con i linguaggi CCS e pi-calcolo Modelli per i calcoli di processo probabilistici e stocastici I primi due modelli saranno deterministici, mentre gli altri saranno non-deterministici. Vedremo in seguito la dierenza. Descriveremo il mondo che ci interessa attraverso la semantica operazionale e la semantica denotazionale. Entrambi questi strumenti ci forniranno una funzione di interpretazione che va dalla sintassi alla semantica dei programmi. Questo ci permetter ad esempio di controllare se due programmi hanno la stessa semantica (il che equivale a dire che fanno la stessa cosa). La semantica denotazionale descrive la funzione di interpretazione in maniera esplicita. Nei Calcoli di Processo probabilistici levoluzione del sistema non-deterministica, ovvero, dato un programma, non si pu determinare a priori il suo comportamento. Addirittura, in PI-Calcolo i programmi possono evolvere. I modelli di calcolo probabilistico tendono ad assegnare alle decisioni un valori di stima (quindi non certi). Questi modelli hanno molta applicazione ad esempio in Biologia. Il calcolo stocastico in particolare riceve linput ad intervalli di ampiezza esponenziale, dunque presenta delle propriet particolari. Inoltre, una tecnica che si pu utilizzare per mostrare lequivalenza tra due programmi la bi-simulazione: non ci interessa come sono fatti i programmi, che prendiamo come scatole nere. Ci interessa il loro comportamento, che osserviamo attraverso due spioncini. In questo modo si pu determinare lequivalenza tra due programmi osservandone il comportamento.

Parte I.

Il linguaggio IMP

1. La semantica operazionale di IMP


1.1. Regole di inferenza e grammatiche
1.1.1. Regole di inferenza
Le regole di inferenza sono strumenti che ci permetteranno di denire la semantica operazionale. Vediamone una denizione formale. Denizione 1.1 (Sistema di regole di inferenza) Un sistema di regole di inferenza, detto anche logica, un insieme di oggetti che determinano le cosiddette formule ben formate (fbf). Le regole sono denite come r = x1 , x2 , . . . , xn /
premesse

y
conseguenza

Questa notazione signica che se ho gi nel mio insieme di formule dimostrate tutte le formule x1 , x2 , . . . , xn posso aggiungervi la formula y. Nellambito della semantica operazionale, una notazione per esprimere queste regole di inferenza costituita da una barra verticale, sopra la quale vi sono le premesse di una regola e sotto la quale vi la conseguenza. Esempio 1.2 (Regola di inferenza) La regola a I b I ab=c cI signica che, se a e b sono due elementi appartenenti ad un certo insieme I e loperatore applicato a tali elementi (qualunque sia il suo signicato) restituisce c, allora c appartiene allinsieme I. La regola 5I un assioma, in quanto non ha premesse (ovvero, la formula sotto la linea vera in qualunque caso). Dalle regole di inferenza nasce un concetto fondamentale del corso, il concetto di derivazione. Denizione 1.3 (Derivazione) Una derivazione, dato un insieme di regole R, un oggetto d tale che ( /y)
R R

y se ( /y) R (concetto di assioma)


R

({d1 , . . . , dn /y) dimostrate)

y se ({x1 , . . . , xn } /y) R e d1

x1 , . . . , dn

xn ({x1 , . . . , xn devono essere gi

La semantica operazionale di IMP

Questa denizione costruisce un albero nel quale come radice abbiamo la proposizione alla quale arriviamo tramite la derivazione, e come foglie abbiamo solamente assiomi. Da questa denizione ne derivano altre due che deniscono cosa sia un teorema. Denizione 1.4 (Teorema) R y (y teorema) d : d

In pratica un teorema unaermazione per la quale esiste una derivazione usando le regole R. Deniamo anche linsieme dei teoremi di R, banalmente, nella maniera seguente. Denizione 1.5 (Insieme dei teoremi in R) IR = {y : R y}

1.1.2. Un esempio di sistema di regole di inferenza


Vediamo un esempio. Esempio 1.6 (Grammatiche viste come sistemi di regole) Prendiamo una grammatica classica che produce tutte le stringhe di parentesi bilanciate: S ::= SS | (S) | Con si indica la stringa vuota. Ogni grammatica si pu scrivere come un sistema di regole di inferenza. Vediamole con la notazione vista precedentemente. s1 L s2 L (1)

s1 s2 L

Questa regola dice che, prese due stringhe s1 ed s2 appartenenti al linguaggio L, anche la stringa s1 s2 appartiene a tale linguaggio: la regola corrispondente alla produzione S ::= SS. Allo stesso modo possiamo derivare le regole sL (s) L (2)

(3)

che corrispondono rispettivamente alle produzioni S ::= (S) e S ::= . Istanziando queste regole possiamo dimostrare formalmente che una stringa appartiene al linguaggio. Notare che la regola )( L (( L (1)

)((( L

perfettamente valida, nonostante la stringa )((( non appartenga al linguaggio (non essendo una stringa di parentesi bilanciate): il signicato della regola : se le stringhe )( ed (( appartengono al linguaggio, allora anche )((( vi appartiene, e questa aermazione vera essendo falsa almeno una delle ipotesi: )( non una stringa di parentesi bilanciate. Passiamo a dimostrare qualcosa di vero.

1.1 Regole di inferenza e grammatiche

(3) (2) (2) L (3) (2) (1)

() = () L (()) L

() = () L

(())() L

Si legge dallalto verso il basso: dal fatto che L, che assioma del nostro linguaggio, deduco che () L tramite la seconda regola, quindi riapplico la seconda regola per dedurre che (()) L ed inne la prima regola per concatenare le due stringhe. Diamo adesso un secondo metodo per formalizzare questo linguaggio che non usi le regole di inferenza. Detta a una stringa e ai liesimo carattere di a, deniamo la quantit f (ai ) = 1 1 se a_i = ( se a_i = )

Possiamo a questo punto dire (aermazione che dimostreremo in seguito) che una stringa a di lunghezza n appartiene al linguaggio se valgono le seguenti propriet : 1. 2.
m i=1 n i=1

f (ai ) 0 f (ai ) = 0

m = 0, 1...n

Per chiarire le idee, si riporta un esempio dei valori che assumono queste sommatorie per la stringa (())(): i= ai = f (ai ) = f (a j ) = 0 1 ( 1 1 2 ( 1 2 3 ) 1 1 4 ) 1 0 5 ( 1 1 6 ) 1 0

i j=1

Abbiamo dunque due metodi dierenti per descrivere il nostro linguaggio: il primo un insieme di regole di inferenza e serve a denire come costruire una stringa che appartiene al nostro linguaggio, il secondo aiuta a controllare che una data stringa appartenga al linguaggio. Si ricorda che con L si indica il linguaggio delle parentesi bilanciate. Dimostriamo adesso che i due metodi sono equivalenti. Questo equivale a dire che a L La dimostrazione si divide in due parti: = le stringhe che rispettano il primo metodo (ovvero, sono prodotte dalla grammatica S ) rispettano anche il secondo metodo; = le stringhe che rispettano il secondo metodo rispettano anche il primo, ovvero la grammatica S genera tutte le stringhe del linguaggio. Dimostriamo =. Come metodo di dimostrazione utilizziamo lInduzione sulle regole: si assume che le premesse siano vere (a L) e si dimostrano le conseguenze, ovvero:
Propriet 1 Propriet 2
m i=1 n i=1 m i=1 n i=1

f (ai ) 0 f (ai ) = 0

m = 0, 1...n

f (ai ) 0

m = 0, 1...n (Il numero di parentesi aperte sempre di quelle chiuse);

f (ai ) = 0 (Il valore della sommatoria parte da 0 e nisce a 0.

La semantica operazionale di IMP

Considerando il graco cartesiano che ha come ascisse il valore di i e come ordinate il valore della sommatoria, le due propriet corrispondono a due propriet che il graco deve rispettare: i suoi valori non devono mai andare sotto lo 0 e il graco deve deve cominciare e nire a 0. Verichiamo che applicando ognuna delle tre regole della grammatica, siano ancora rispettate le propriet 1 e 2. La regola (1) corrisponde al concatenamento dei gra: date le due stringhe che fanno parte del linguaggio (graci sulla sinistra), il graco del concatenamento delle stringhe (graco a destra) continua a rispettare le propriet 1 e 2.

La regola (2) corrisponde alla traslazione verso lalto del graco a sinistra. Anche in questo caso, le propriet 1 e 2 sono rispettate.

Anche per la regola (3) le propriet 1 e 2 sono ovviamente rispettate. Abbiamo dimostrato =. Resta da dimostrare =: le stringhe che rispettano il secondo metodo rispettano anche il primo. Si verica la propriet per una qualsiasi stringa che rispetta il secondo metodo. Individuiamo, per una generica stringa, tre possibili casi: 1. Se n = 0, a = . Allora la regola di inferenza (3) ci dice che appartiene al linguaggio (a L). 2. Il graco inizia da 0, nisce a 0 ma non tocca lo 0. Un esempio dato dal graco in gura:

In questo caso, si pu applicare la regola di inferenza (2) la quale ci dice che data una stringa a , aggiungendo la prima e lultima parentesi si ottiene una stringa a lunga n + 2 appartenente al linguaggio. Guardando questa regola al contrario, abbiamo un metodo per vericare che a L: basta vericare che a L. 3. Il graco tocca 0 in almeno un punto. Un esempio dato dal graco:

In questo caso, si utilizza la regola di inferenza (1) e va mostrato che i blocchi 02 e 28 appartengono al linguaggio. Abbiamo dimostrato che per ogni possibile stringa del linguaggio, esiste una regola di inferenza. Dunque i due metodi sono equivalenti.

1.2 Sintassi di IMP

1.2. Sintassi di IMP


Il linguaggio IMP una versione ridotta allosso di C. Ha pochi tipi di dato int: numeri interi bool: valori booleani pointer: puntatori a locazioni di memoria (assumiamo di averne sempre abbastanza) Non esistono dichiarazioni, n procedure, n blocchi (lallocazione sar dunque statica). La grammatica (assolutamente ambigua!) avr le seguenti produzioni:
Espressioni aritmetiche (Aexpr)

a :: n|x|a0 + a1 |a0 a1 |a0 a1 dove n un naturale, x una locazione, a0 , a1 espressioni aritmetiche.


Espressioni booleane (Bexpr)

b :: v|a0 = a1 |a0 a1 |b|b0 b1 |b0 b1


Comandi (Com)

c :: skip |x := a|c0 ; c1 | if b then c0 else c1 | while b do c Per superare lambiguit insita nella grammatica, le espressioni valide dovranno essere sempre parentesizzate. Esempio 1.7 (Formule valide e non) while b do c1 ; c2 non una formula accettabile (while b do c1 ); c2 una formula accettabile while b do(c1 ; c2 ) una formula accettabile

Data una formula, il controllo che questa sia un teorema nel nostro sistema di regole di inferenza (ovvero una stringa valida del linguaggio) un processo deterministico. Esempio 1.8 (Dimostrazione di appartenenza ad IMP) if(x = 0) then(skip) else(x := x 1)) Com x = 0 Bexp, skip Com, x := (x 1) Com x Aexp, 0 Aexp, skip Com, x := (x 1) Com x 1 Aexp x Aexp, 1 Aexp

1.3. Semantica operazionale di IMP


1.3.1. Stato della memoria
La macchina che eseguir IMP avr una struttura dati : = Loc N che manterr le associazioni fra linsieme LOC delle locazioni e i valori in N. LOC sar sempre grande abbastanza per metterci tutti i valori che desideriamo, e restituir 0 per tutte le locazioni alle quali non associato alcun dato.

8 In denitiva (x) = 0 v

La semantica operazionale di IMP

se x non denita in altrimenti

Esiste una memoria chiamata memoria zero, indicata con 0 . Questa memoria tale che x.0 (x) = 0. Indicheremo il contenuto esatto di una memoria con la notazione = 5 / x ,10 /y , che indica la memoria che contiene 5 nella locazione identicata da x e 10 nella locazione identicata da y. Introduciamo inne il concetto di cambio di un valore in memoria: introduciamo loperatore [n / x ](y) = n (y) se y = x se y x

che cambia il valore restituito da per il valore x e lo lascia uguale per tutti gli altri valori. Notare che [n / x ][m / x ](y) = m [n / x ](y) = (y) se y = x = [m / x ](y) se y x

la composizione di sostituzioni sulla stessa variabile porta dunque ad una riscrittura (allo stesso indirizzo x si assegna prima n e poi m, il risultato che [n / x ][m / x ] = [m / x ]).

1.3.2. Sistema di regole


Vogliamo costruire un sistema di regole di inferenza che ci permetta di formalizzare la semantica del nostro linguaggio IMP. Per prima cosa, deniamo la forma che possono avere le formule ben formate del nostro sistema di regole:
Espressione aritmetica a, n

La valutazione di una Aexpr in produce come ci possiamo aspettare un numero naturale.


Espressione booleana b, u

La valutazione di una Bexpr in produce un valore fra true e false.


Comando c,

La valutazione di un Com in produce un nuovo stato . Passiamo adesso a denire le regole di inferenza che ci permetteranno di comprendere quali di queste formule sono teoremi del nostro sistema. La regola 1.1 banale: indica che il valore di una costante numerica n (intesa come entit sintattica) corrisponde proprio al numero n (inteso come entit semantica, ovvero proprio come idea di numero)

n, n

num

(1.1)

La regola 1.2 altrettanto banale: la valutazione di un identicatore restituisce il valore associato a quellidenticatore nella memoria .

x, (x)

ide

(1.2)

Finalmente una regola con delle premesse: la regola relativa alla somma. La valutazione della sequenza di simboli a0 + a1 in restituisce un valore corrispondente alla somma matematica (indicata nella regola dal simbolo ) dei due valori n0 e n1 ottenuti rispettivamente dalla valutazione di a0 ed a1 in . a0 , n0 a1 , n1

a0 + a1 , n0 n1

sum

(1.3)

1.3 Semantica operazionale di IMP

Evitiamo di riportare le formule per le altre operazioni aritmetiche (prodotto, dierenza, divisione) e per le operazioni binarie booleane (and e or fra due Bexpr, uguaglianza e confronto fra due Aexpr), che di fatto sono identiche alloperazione riportata qua sopra. Unica piccola variazione loperatore di negazione, che un operatore unario. b, v b, v

not

(1.4)

Passiamo alla semantica dei comandi. La regola 1.5 relativa al comando skip, ed ha una semantica semplicissima: lascia la memoria invariata.

skip,

skip

(1.5)

La regola 1.6 relativa allassegnamento. Leetto quello di restituire una memoria identica alla precedente eccetto che per il valore associato ad x. a, m x := a, [m / x ]

assign

(1.6)

La regola relativa alla concatenazione di comandi. Viene valutato il primo comando nella memoria per produrre una memoria , nella quale a sua volta verr valutato il secondo comando. La memoria restituita da questo secondo passaggio la memoria restituita dai due comandi concatenati. c0 , c1 ,

c0 ; c1 ,

concat

(1.7)

Passiamo allif. Questo ha bisogno di due regole dierenti, in quanto la valutazione di un if porta ad uno sdoppiamento del usso di esecuzione. In particolare, abbiamo la regola 1.8 che mostra il comportamento nel caso in cui la guardia sia vera, e la regola 1.9 nel caso in cui la guardia sia falsa. Il ramo da percorrere sar deciso a tempo di esecuzione. b, true c0 ,

if b then c0 else c1 , b, false c1 ,

i f tt

(1.8)

if b then c0 else c1 ,

if f f

(1.9)

Vediamo inne la coppia di regole che mostra il comportamento nel caso in cui si trovi un while. Anche qua abbiamo uno sdoppiamento: in un caso la guardia vera, e questo provoca lesecuzione del corpo del while seguito da unulteriore valutazione del while stesso, mentre nellaltro caso la guardia falsa e lo stato non viene modicato. b, true c, while b do c,

while b do c, b, false while b do c,

while tt

(1.10)

while f f

(1.11)

10

La semantica operazionale di IMP

Notiamo che il while un comando che ha un comportamento lievemente dierente dagli altri: tutte le altre regole tendono a diminuire la dimensione delle regole da valutare, scomponendo il comando o lespressione da valutare in sotto-espressioni. Questo porta intuitivamente a ridurre via via la dimensione delle formule da valutare no a trovare elementi atomici come variabili o costanti. Il while diverso, in quanto nel suo ramo true denito ricorsivamente. Per questo motivo un while, come vedremo, pu ciclare allinnito su se stesso. Vediamo un esempio di come si possono utilizzare queste regole per la valutazione di un programma. Esempio 1.9 (Valutazione di un comando tramite la semantica operazionale) Prendiamo il comando
a a1

c = x := 0; while 0 y do (x := x + (2 y) +1; y := y 1)
c3 c2 c1 c c4

e vediamo di trovarne la semantica. Procederemo con una tecnica goaloriented: prendiamo la formula ben formata c, 27 / x ,2 /y , e controlliamo se esiste un per il quale questa formula un teorema. bene notare che questo equivale a chiedersi: dati una memoria di partenza (27 / x ,2 /y ) e il comando c eseguito sulla memoria, esiste una derivazione in una qualsiasi memoria ?. Notare che questo equivale a chiedersi se il programma termina e, nel caso che termini, quale il contenuto della memoria dopo lesecuzione di c. Utilizziamo la notazione ad albero: in basso manteniamo la formula da dimostrare e sopra costruiamo man mano un albero di regole di transizione. Non riusciamo a farlo per per intero: siamo costretti a lavorare per pezzi. Iniziamo con il quadro generale: per valutare lintero comando c dovremo valutare per prima cosa lassegnamento, che ci restituir un ambiente nel quale ad x stato assegnato 0. Quindi dovremo valutare il while nellambiente cos generato.

0, 0

const ass c1 ,

x := 0, 0 / x =

c, Vediamo la semantica del while. Secondo la regola abbiamo 0 y, true c2 , c1 , c1 ,

seq

Ognuna di queste tre formule va a sua volta dimostrata. Ad esempio, vediamo la dimostrazione del confronto.

0, 0

const

y, (y) = 2 0 y, true

var

0 2 = true

leq

La procedura prevede di continuare a costruire alberi di regole di transizione no a che sulla cima non si trovano solamente assiomi della nostra teoria.

1.4 Uguaglianza fra programmi in IMP

11

1.4. Uguaglianza fra programmi in IMP


Due programmi c1 e c2 in IMP sono equivalenti se vale la seguente propriet. c1 c2 , ( c1 , c2 , )

(1.12)

Questa la denizione generica, che funziona anche per i programmi che non terminano. Due comandi siano uguali (i programmi sono comandi) se e solo se vero che se uno dei due, terminando, va in un certo stato, allora anche laltro termina e va nello stesso stato. Se invece uno dei due non termina (ovvero non esiste un ), anche laltro non deve terminare (anche per laltro non deve esistere un ). Quindi due programmi che, dato un generico stato iniziale, non terminano, sono uguali. A questa denizione pu essere aancata unaltra pi operativa, e forse pi intuitiva, che per funziona solamente per i programmi che terminano. Per dimostrare che due programmi terminano e sono uguali (ovvero terminano nello stesso stato), si pu usare la denizione: c1 , c2 ,

= c1 c2

(1.13)

In altre parole, due comandi sono uguali fra di loro se e solo se, per ogni memoria di partenza, i due comandi valutati in tale memoria restituiscono come risultato la stessa memoria . Notare che limplicazione inversa non vera: possono esserci dei programmi uguali che non terminano e per i quali dunque non esiste un .

1.4.1. Dimostrazioni di uguaglianza semplici


Le prime dimostrazioni che vedremo saranno dimostrazioni che partono da programmi completamente specicati, che operano su memorie non specicate. Vediamo un primo esempio Esempio 1.10 (Uguaglianza fra comandi (1)) Vediamo un semplice esempio di come si pu dimostrare che i due comandi c1 = x := 1; x := 0 c2 = x := 0 sono semanticamente equivalenti. Per farlo basta derivare c1 e c2 come segue. Cominciamo da c1 : 1. c1 , Si parte dalla formula che vogliamo dimostrare, senza legarsi ad alcuno stato in particolare ( la generica memoria). 2. x := 1, x := 0, c1 un comando composto da due comandi (di assegnamento) concatenati. Usiamo la relativa regola di inferenza 1.7 (pag. 9) introducendo un che lo stato della memoria dopo il primo assegnamento e prima del secondo. 3. x := 0, 1 / x Si esegue il secondo assegnamento semplicando la doppia sostituzione della x (la seconda sostituzione mangia la prima). Abbiamo ottenuto = [0 / x ] 4. Per quanto riguarda il secondo comando c2 , la derivazione ancora pi semplice:
=[1 / x ][0 / x ]=[0 / x ] =[1 / x ]

12

La semantica operazionale di IMP

1. c2 , 2. x := 0, 3. In entrambi i casi otteniamo lo stato risultante = [0 / x ]: le semantiche dei due programmi sono dunque equivalenti in accordo con la denizione 1.13.
=[0 / x ]

Esempio 1.11 (Uguaglianza fra comandi (2)) Vogliamo dimostrare che i due comandi c1 = while x c2 = x := 0 0 do x := 0

sono semanticamente uguali. Possiamo facilmente dimostrare che c2 , con = [0/x], in quanto questo il signicato dellassegnamento. Abbiamo dunque come risultato una memoria che si comporta ovunque come tranne che in x, dove restituisce sempre 0. In particolare, se (x) = 0 abbiamo che = . Passiamo ad eseguire simbolicamente c1 . Per farlo, necessario considerare entrambe le regole di inferenza del while (1.11 e 1.10 a pag. 9) in quanto non sappiamo quanto valga x, e di conseguenza se la guardia del while valga true o false, nella memoria . Consideriamo per primo il caso in cui (x) 0. In questo caso abbiamo c1 , (x) (x) 0 0 x := 0, 0 / x (x) = 0 c1 , c1 , 0 / x
=[0 / x ] =[0 / x ]

Il comando viene valutato seguendo il ramo true, quindi viene sviluppato eseguendo il comando x:=0 e valutando nuovamente il while nello stato cos modicato. Evidentemente nel nuovo stato avr che x sar uguale a 0, quindi il while terminer restituendo una memoria identica a eccetto che per il valore di x. Pi semplice il caso in cui (x) = 0: infatti c1 , (x) = 0 Per concludere, si osserva che: Se (x) = 0, allora Se invece (x) c1 , c2 , [0 / x ] = c1 , [0 / x ] c2 , [0 / x ]
=

0, allora

Quindi per tutti i valori di x i due comandi applicati alla generica memoria producono la stessa memoria. In accordo con la denizione 1.13, i due programmi sono equivalenti.

Abbiamo dunque capito lidea di base. Il metodo di dimostrazione per computazioni terminanti sempre il solito: si sviluppano le formule per i due comandi e si mostra che la memoria risultatante la stessa.

1.4 Uguaglianza fra programmi in IMP

13

1.4.2. Dimostrazioni per programmi non completamente specicati


Fino ad ora abbiamo visto dimostrazioni riguardanti programmi completamente specicati: sapevamo in dettaglio quali istruzioni erano eseguite, e lasciavamo parametrica solamente la memoria . Passiamo adesso ad un insieme di esempi nei quali lavoriamo su programmi parametrici: nel prossimo esempio vedremo un uguaglianza fra un while ed un if opportunamente formulato che vale per qualunque guardia b e per qualunque corpo c. Questo non ci porter particolari complicazioni: baster lasciare parametrici i risultati della valutazione di tali blocchi e dimostrare che le nostre conclusioni valgono qualunque sia il loro contenuto.

Esempio 1.12 (Dimostrazioni parametriche (1)) Prendiamo i due comandi c1 = while b do c c2 = if b then c; while b do c else skip vero che b, c c1 c2 ? Analizziamo lesecuzione di c1 nella generica memoria di partenza . Per analizzare il while, non potendo valutare con esattezza la sua guardia, dobbiamo necessariamente analizzare i due casi in cui la guardia valga true e in cui la guardia valga false. Cominciamo supponendo che b, false: ne segue che while b do c, b, false Dunque se la guardia da false, il risultato, come ci potevamo aspettare, che lo stato non viene cambiato. Cosa accade invece quando si esegue il secondo comando c2 sulla stessa memoria ? Vediamolo (con w si indica il codice del while contenuto in c2 ). if b then c; w else skip;, b, false skip,
= =

Anche in questo caso otteniamo lo stesso comportamento: la valutazione del comando non porta alcun cambiamento alla memoria. Quindi se b, false allora, in accordo con la denizione 1.13, c1 c2 . Passiamo a valutare cosa accade nel caso in cui b, true. Per c1 abbiamo il seguente risultato. while b do c, b, true c, w,

Fermiamoci qua, in quanto a questo punto per continuare dovremmo fare altre ipotesi sul risultato della guardia del while. Proviamo a sviluppare c2 . if b then c; while b do c else skip, b, true c; while b do c, b, true c, w, Anche in questo caso, la valutazione di c in porta ad un nuovo stato , nel quale viene valutato il comando while b do c producendo lo stato risultante. Come si vede dallultima riga degli sviluppi di c1 e c2 , questi si riducono agli stessi sottogoal, quindi hanno la stessa semantica. Se due sviluppi si riducono agli stessi sottogoal, signica che , ( while b do c, if b then c; while b do c else skip, ) ovvero, in accordo con la denizione 1.12, abbiamo dimostrato che con b, true, c1 c2 . Unendo i due risultati, si ha che sempre c1 c2 .

14

La semantica operazionale di IMP

Vale la pena di notare che quello appena presentato (riduzione agli stessi sottogoal) in alcuni casi lunico metodo che si ha per valutare la semantica dei comandi while. Essendo il while lunico comando di IMP che pu ciclare allinnito, nei casi in cui la guardia del while sia sempre true oppure non sia data, anche il suo sviluppo in sottogoal innito. Ad esempio, nel caso analizzato adesso non si pu sapere se il comando terminer oppure no (dipende da c, b e ), quello che abbiamo dimostrato che c1 termina se e solo se termina c2 , e che se terminano lo stato nale uguale. Notare inoltre che stavolta, proprio a causa della possibilit di nonterminazione, per dimostrare c1 c2 con b, true abbiamo dovuto utilizzare la denizione di ugualianza 1.12 invece della 1.13. Per chiarire, vediamo una leggera variazione sullesempio appena visto. Esempio 1.13 (Dimostrazioni parametriche (2)) Prendiamo i due comandi c1 = while b do c c2 = if b then w else skip vero che c1 c2 ? Visto che c1 identico al caso precedente, e che lo stesso accade per il ramo di c2 nel quale b, false, ci limitiamo ad analizzare quanto accade per c2 nel caso in cui b, true. Banalmente in questo caso abbiamo if b then while b do c else skip, b, true while b do c, Ci riconduciamo, in denitiva, allaltro caso: dobbiamo valutare un comando while b do c in un ambiente nel quale la valutazione di unespressione booleana b restituisce true. Anche questi due comandi sono uguali.

1.4.3. Computazioni che non terminano


Fino ad ora abbiamo avuto vita facile: abbiamo valutato programmi parametrici o con dati che non mandavano il programma in loop. Ma cosa accade quando il programma specicato ed il suo testo pu provocare situazioni di loop? In questi casi dobbiamo riuscire ad indicare le memorie per le quali questo accade. Riscrivendo per renderla pi semplice la denizione di equivalenza tra programmi 1.12, si vede che c1 e c2 sono equivalenti se c1 , c2 , , c1 , c2 , c1 c2 se, dato un di partenza, terminano nello stesso stato oppure entrambi non terminano. Passiamo a vedere alcuni esempi nei quali questa denizione viene messa in pratica. Esempio 1.14 (Dimostrazioni di nonterminazione) Prendiamo i due comandi c1 = while x > 0 do x := 1 c2 = while x > 0 do x := x + 1 vero che c1 c2 ? Come sempre, possiamo studiare il comportamento di c1 dividendo lo sviluppo in due rami, uno nel quale (x) 0 e laltro nel quale (x) > 0. Nel primo caso vale c1 , (x) 0 Il corpo del while non viene eseguito, e il comando restituisce la stessa identica memoria di partenza. Svolgendo in maniera simile per c2 , si ottiene che c1 e c2 vanno nello stesso stato di partenza.
=

1.4 Uguaglianza fra programmi in IMP

15

Passiamo alla valutazione di c1 nel caso (x) > 0 in cui il corpo del while viene eseguito: qua ci aspetta una sorpresina. c1 , (x) > 0 (x) > 0 (x) > 0 . . . x := 1, c1 , 1/ c1 , x x := 1, 1 / x
=[1 / x ] =[1 / x ][1 / x ]=[1 / x ]

c1 ,

Otteniamo ciclicamente lo stesso identico stato. Questo pu signicare solamente una cosa: essendo il processo di derivazione deterministico, lo svolgimento destinato a svilupparsi in inniti passaggi, in quanto immancabilmente continueremo a trovare lo stesso identico stato senza riuscire mai a ridure i passaggi a qualcosa di pi piccolo. Questo problema si presenta soltanto con il while perch questo lunico comando denito per ricorsione strutturale (vedi la denizione 1.10 a pagina 9), e che di conseguenza pu nonterminare. Vediamo cosa accade per c2 nel caso (x) > 0. c2 , (x) > 0 (x) > 0 (x) > 0
=[(x)+1 / x ] x := x + 1, c1 , c1 , (x)+1 / x x := x + 1, (x)+1 / x c1 , [(x)+1 / x ](x)+1 / x =[(x)+2 / x ] =[(x)+1 / x ] . . .

Si raggiunge la stessa situazione ottenuta in precedenza. Intuitivamente possiamo dire che il nostro while in loop, ma formalmente non possiamo dirlo con immediatezza in quanto ad ogni passo lavoriamo su una memoria diversa. Tuttavia, possibile dimostrarlo con una tecnica induttiva, anticipando un po quel che vedremo nel prossimo capitolo: per induzione sul numero di iterazioni (vedere sezione 2.2.1) abbiamo che al passo 0, cio alla prima iterazione, il while non termina se alli-esimo passo il while non terminato, non lo sar neppure all(i + 1)-esimo, in quanto x > 0 x + 1 > 0. Una dimostrazione formale richiederebbe di dimostrare che alla k-esima iterazione x varr (x) + k, e che dunque x non pu essere minore di 0. Il while dunque non terminer mai per (x) > 0 iniziale, come nel caso precedente. Dunque, secondo la denizione 1.12, c1 c2 .

Consideriamo il comando w = while b do c. Come abbiamo appena visto, per dimostrare la non terminazione del comando, possiamo utilizzare la regola di inferenza sullo stato delle memorie, applicando linduzione matematica: c, i i+1 i = 0, 1, . . . m w, 0 i . b, i true (1.14)

(i) la memoria allinizio della i-esima esecuzione di c. Se in tutte le memorie dei passi successivi a 0 la guardia valutata in true, il while non termina.

16

La semantica operazionale di IMP In alcuni casi, pu essere pi semplice lapplicazione del seguente risultato, che deriva dalla formula sopra:

(1.15) w, Se esiste un insieme S di memorie tali che, per ognuna delle memorie in S , la valutazione della guardia b in quella memoria risulta true e la valutazione del corpo c in quella memoria produce una memoria anchessa appartenente ad S , allora w valutato in una qualunque memoria di S non termina. A livello intuitivo, questo signica che se la valutazione di c fa ricadere lo stato sempre nel solito insieme nito senza mai uscirne, allora il comando non termina. Da notare che questa denizione pi restrittiva della generale 1.14, dato che funziona solo se il ciclo genera un numero nito di stati, ma pu essere di pi facile applicazione. Ad esempio, facendo riferimento allEsempio 1.14, la non-terminazione di c1 si pu dimostrare con 1.15, mentre la non-terminazione di c2 si dimostra con 1.14.

S . c,

S . b, true

1.4.4. Dimostrazioni di non uguaglianza


Esempio 1.15 (Dimostrazioni di nonuguaglianza) Dimostriamo che (while x > 0 do x := 1); x := 0

x := 0

Guardiamo per ora soltanto la prima parte del primo comando (il while). Nel caso (x) 0 si dimostra facilmente che while x > 0 do x := 1, Vediamo la dimostrazione. while x > 0 do x := 1, x > 0, v = false x, n n = (x) Invece con (x) > 0 while x > 0 do x := 1, x > 0, v = true x := 1, = [1/x] while x > 0 do x := 1, while x > 0 do x := 1, [1/x] 0, m m=0 n>m

Espandiamo il sottogoal pi in basso a destra. while x > 0 do x := 1, [1/x] x > 0, [1/x] v = true x := 1, [1/x] [1/x] while x > 0 do x := 1, [1/x]

Otteniamo lo stesso sottogoal: while x > 0 do x := 1, [1/x] , quindi non esiste alcuna prova, dato che il sottogoal individuato dovrebbe essere una sottoprova di se stesso, e questo assurdo. La conclusione che , . while x > 0 do x := 1, (x) > 0 v = v Valutiamo a questo punto il primo comando completo. (while x > 0 do x := 1); x := 0, (while x > 0 do x := 1), x := 0,

1.4 Uguaglianza fra programmi in IMP Nel caso (x) > 0, per quanto visto prima, non c alcuna prova. Guardiamo invece il caso (x) 0 (while x > 0 do x := 1); x := 0, (while x > 0 do x := 1), (x) 0 x := 0, = [0/x]

17

Il comando termina con = [0/x]. Quindi, confrontando il primo ed il secondo comando, si pu dire che x := 0, , . (while x > 0 do x := 1); x := 0, Ovvero, esiste una coppia (, ) per la quale un comando termina e laltro no. Un esempio costituito da ogni con (x) = 1 e = [0/x]. Dunque, in accordo con il teorema 1.12 a pagina 11, i comandi non sono uguali. bene notare unaccortezza logica che si usata per dire che i comandi non sono uguali a partire dallaermazione sopra. Per contraddire unespressione logica come quella che compare in 1.12, suciente lesistenza di un elemento che non rispetta la clausola, detto in termini matematici: x.P(x) Q(x) = x.(P(x) Q(x)) (P(x) Q(x))

Esempio 1.16 (Estensione della grammatica di Aexpr) possibile rivedere la regola per il prodotto aritmetico denita in 1.3 ottenendo dei miglioramenti. Guardiamo innanzi tutto la regola come era stata denita originariamente: a0 , n0 a1 , n1

a0 a1 , n0 n1 Una nuova coppia di regole equivalente dal punto di vista semantico la seguente: a0 , 0 a0 a1 , 0 a0 , n0 n0 0 a1 , n1

a0 a1 , n0 n1

In sostanza, la nuova coppia di regole permette, per le moltiplicazioni il cui primo fattore 0, di evitare il calcolo del secondo fattore (che inutile, visto che 0n = 0 n). Infatti, se si dovesse valutare unespressione di questo tipo, sarebbe suciente luso della prima regola, mentre per tutti gli altri casi si potrebbe usare la regola di sempre. Dimostriamo a questo punto che la regola vecchia e quelle nuove sono uguali dal punto di vista semantico e che entrambe sono deerministiche. Si dimostra per Induzione stutturale: def P(a) = a, n a, n n = n P(a0 a1 ) = a0 a1 , n a0 a1 , n n = n = 4 casi: Due modi possibili per ridurre: 2 li abbiamo gia visti nella dim precedente precedente. a0 a1 , n a0 , n0 a1 , n1 n = n1 n0
def ?

a0 a1 , n a0 , 0

n=0

Per ipotesi induttiva n0 = 0 (Assumiamo la propriet per le sotto espressioni, induzione strutturale).

2. Metodi di Induzione
In questo capitolo studieremo i metodi di induzione che utilizzeremo in seguito per dimostrare alcune propriet dei linguaggi che analizzeremo. Esistono molti tipi di metodi di induzione, ma tutti si basano sul principio di induzione ben fondata di Noether. Studieremo dunque prima questo principio, per poi derivare gli altri metodi successivamente.

2.1. Principio dellinduzione ben fondata di Noether


2.1.1. Relazioni ben fondate
Partiamo da alcune denizioni che ci serviranno in futuro per denire il concetto di relazione ben fondata. Ricordiamo innanzitutto la denizione di relazione. Denizione 2.1 (Relazione su un insieme A) Una relazione su un insieme A un sottoinsieme del prodotto cartesiano A A AA

Una volta denito questo concetto, possiamo denire la catena discendente innita. Denizione 2.2 (Catena discendente innita) Data una relazione su un insieme A, una catena discendente innita una successione innita di elementi di A tali che {ai }i tale che i .ai+1 ai una funzione che va da in A nella quale gli elementi sono via via sempre pi piccoli allinterno dellordinamento (a0 a1 a2 ).

Possiamo dunque denire la nostra relazione ben fondata. Denizione 2.3 (Relazione ben fondata) Una relazione ben fondata se non esiste alcuna catena discendente innita relativa a tale relazione.

Come sempre, deniamo la chiusura transitiva della relazione. Denizione 2.4 (Chiusura transitiva) Data una relazione , la sua chiusura transitiva a a
+ +

il minimo insieme tale che

ba bb

b ca
+

20

Metodi di Induzione

Figura 2.1.: Rappresentazione di una relazione come grafo Passiamo adesso a dimostrare propriet su queste relazioni

Teorema 2.5 (Propriet delle relazioni ben fondate) Se una relazione ben fondata, allora anche senza cicli x|x
+

def

non ha cicli

Dimostrazione. Dimostrazione banale: se x ha cicli posso costruire la sequenza x che evidentemente innita. x1 ... xn x x1 ... xn x x1 ...

Vale anche il seguente Teorema 2.6 (Relazione ben fondata su insiemi niti) Se una relazione su un insieme A senza cicli e A un insieme nito, allora

ben fondata.

Dimostrazione. Anche questa dimostrazione piuttosto banale: se A nito, una sequenza discendente di elementi lunga A + 1 deve, per il pigeon hole theorem, avere due elementi uguali che costituirebbero un ciclo.

Possiamo rappresentare queste relazioni come gra orientati come quello in gura 2.1, nei quali i nodi sono elementi dellinsieme e un arco dal nodo n al nodo m rappresenta la presenza della coppia (n,m) nella relazione. Vediamo un lemma che ci permetter di dimostrare in seguito il principio di induzione di Noether. Lemma 2.7 (Relazione ben fondata) Data una relazione su un insieme a, questa ben fondata se e solo se ogni sottoinsieme non vuoto Q di A possiede un elemento m tale che b m. b Q

Dimostrazione. Come sempre, per dimostrare la doppia implicazione dimostriamo separatamente i due sensi dellimplicazione stessa. Supponiamo che ogni sottoinsieme non vuoto di A abbia un elemento minimale. Supponiamo per assurdo che esista una catena discendente innita: i suoi elementi formerebbero un sottoinsieme di A che non avrebbe un elemento minimale (nel qual caso la catena si fermerebbe a tale elemento). Questo rompe lipotesi, quindi ne dobbiamo concludere che non esistano catene discendenti innite.

2.1 Principio dellinduzione ben fondata di Noether

21

Prendiamo un qualunque sottoinsieme non vuoto Q di A. Prendiamo un elemento a0 Q in modo casuale, e assumiamo che esista una catena an . . . a0 . Allora si hanno due possibilit non esiste alcun b an in Q: in questo caso an ovviamente un elemento minimale. esiste un b an in Q: poniamo b = an+1 ed aggiungiamolo alla catena, per poi ripetere lo stesso controllo. Essendo ben fondata, troveremo sicuramente un elemento am in Q tale che non esiste alcun b am in Q. Tale elemento lelemento minimale in Q. Avendo dimostrato entrambe le implicazioni, la doppia implicazione dimostrata.

Ricordiamo la dierenza tra elemento minimo e minimale: il minimo di un insieme lelemento pi piccolo di ogni altro, cio in relazione con ogni altro elemento dellinsieme un elemento minimale di un insieme non ha elementi pi piccoli allinterno dellinsieme, tuttavia possono esistere altri elementi minimali che quindi non sono in relazione tra loro. Vediamo adesso alcuni esempi di relazioni innite ben fondate e non. Esempio 2.8 (Numeri Naturali) Il minore (stretto) aritmetico sullinsieme N dei numeri naturali un esempio di relazione ben fondata. Infatti non ha ovviamente cicli ha un elemento minore rispetto a tutti gli altri, che lo zero. Qualunque elemento n N si prenda, da esso si pu far partire una catena discendente lunga al massimo n

Esempio 2.9 (Termini e sottotermini) Possiamo denire i nostri programmi come termini di una segnatura con pi sort S e denire una relazione ben fondata che leghi questi termini con i loro sottotermini ti (t1 , . . . , tn ) i = 1, . . . , n

In pratica, dato un termine ti questo minore di tutti i termini che lo utilizzano come argomento. Ad esempio con una segnatura 0 = {c} 2 = { f } abbiamo che: c f (c, c) f ( f (c, c), c) f ( f ( f (c, c), c), f (c, c))

Anche qua abbiamo un elemento minimo che chiude qualunque aspirante catena discendente innita: il termine senza argomenti c. Parleremo pi in dettagio delle segnature quando tratteremo linduzione strutturale 2.2.3.

Esempio 2.10 (Ordinamento Lessicograco) Vediamo un ultimo esempio di relazione ben fondata: linsieme quello delle coppie di interi (per semplicit), e la relazione lordinamento lessicograco di questi interi. cio un ordinamento tale che m, m . n, m n, m n + 1, m

n, m + 1

Anche in questo caso la relazione ben fondata: qualunque catena discendente non pu andare sotto la coppia 0, 0 e, non essendoci ovviamente cicli, questo basta a dimostrarlo.

22

Metodi di Induzione

Esempio 2.11 (Numeri interi) Il minore stretto aritmetico sullinsieme dei numeri interi Z non una relazione ben fondata: esiste infatti una catena discendente innita visto che, contrariamente a quanto accade con i numeri naturali, non esiste un limite inferiore allinsieme Z (ovvero, per ogni elemento della successione ne esiste sempre uno minore).

Vediamo un inne teorema che lega una relazione con la propria chiusura transitiva. Teorema 2.12 (Fondatezza della chiusura transitiva di ) Una relazione ben fondata se e solo se la sua chiusura transitiva

ben fondata.

Dimostrazione. La dimostrazione dritta ovvia, in quanto se ben fondata ovvio che anche la sua chiusura transitiva, visto che ne solo una scrittura compatta. Dimostriamo il senso contrario della doppia implicazione prendendo una catena discendente innita con + a0
+

a1

a2 in questa maniera

Questa pu essere ovviamente trasformata in una catena discendente innita con

a0 = a00

a01

a0n = a1 = a10

a11

...

a1n = a2 = a21

2.1.2. Linduzione ben fondata di Noether


Passiamo a denire il principio di induzione ben fondata di Noether, che la base di tutti i metodi di induzione che vedremo nella prossima sezione. Teorema 2.13 Data una relazione ben fondata

su un insieme A a. P(b)) P(a)) (a A.P(a))

(a A. (b

Dimostrazione. Dimostriamo entrambe le implicazioni ovvio: se a.P(a) allora la parte destra dellimplicazione da dimostrare sempre vera, quindi ovviamente sar vera tutta limplicazione prendiamo linsieme Q = {a A|P(a)} di tutti gli elementi di A per i quali non vale P(a). Dato che ben fondata, per il lemma 2.7 questo sottoinsieme avr un elemento minimale m per il quale vale P(m): per costruzione di Q, ho che b m.P(b) in quanto m il minimo elemento per il quale P non vale. Ma questo contraddice lipotesi, visto che dovrebbe valere a A.(b aP(b)) P(a). Dobbiamo concludere che a A.P(a).

2.2. Altri metodi di induzione


Vediamo adesso alcuni altri metodi di induzione che sono in realt versioni meno generali del principio di induzione di Noether: le utilizzeremo per dimostrare alcune propriet successivamente.

2.2 Altri metodi di induzione

23

2.2.1. Induzione matematica debole


Linduzione matematica debole un principio che si applica per tutte le propriet sullinsieme N dei numeri naturali. Vedendola come caso speciale dellinduzione ben fondata, basta prendere come insieme A e come relazione A= Vediamo lenunciato. Teorema 2.14 (Induzione matematica debole) (P(0) P(n) P(n + 1)) n N.P(n) n mm=n+1

2.2.2. Induzione matematica forte


Linduzione matematica forte unestensione dellinduzione matematica debole ed ottenuta dal principio di induzione di Noether prendendo la relazione n sullinsieme N. Vediamo lenunciato. Teorema 2.15 (Induzione matematica forte) (P(0) (i n.P(n)) P(n + 1)) n N.P(n) mm=n+k

2.2.3. Induzione strutturale


Linduzione strutturale unaltra specializzazione dellinduzione ben fondata di Noether che riguarda linsieme dei termini di una segnatura e la relazione termine-sottotermine che li lega. Denizione 2.16 (Termini su una segnatura tipata) Per denire i termini su di una segnatura tipata abbiamo bisogno di un insieme di sort S che contiene i tipi che potranno assumere i nostri termini una segnatura = { s1 ...sn ,s } con si , s S che un insieme di operatori ognuno dei quali prende in ingresso n parametri si e ritorna come risultato un s, tutti naturalmente appartenenti ai tipi deniti in S Ora possiamo denire linsieme dei termini della segnatura come T = {T ,s } sS

e sono cio istanze degli operatori deniti in . Vediamo come costruire i termini ti T ,si i = 1, . . . , n f s1 ,...,sn ,s f (t1 , . . . , tn ) T ,s A questo punto prendendo come insieme linsieme dei termini appena denito e come relazione ben fondata la relazione termine-sottotermine ti < f (ti , . . . , tn ) i = 1, . . . , n

24 possiamo denire linduzione strutturale. Denizione 2.17 (Induzione strutturale) (t < t. P(t )) P(t) t T . P(t) o in versione pi estesa si S i = 1, . . . , n. s S . f s1 ...sn ,s . ti T ,si i = 1, . . . , n.

Metodi di Induzione

t T

P(t1 ) . . . P(tn ) P( f (t1 , . . . , tn ))

t T . P(t)

Esempio 2.18 (Segnatura in IMP) Per IMP abbiamo S = {Aexp, Bexp, Com} e loperazione ; del tipo ; ComCom,Com , o anche = AexpAexp,Bexp . Per costruire T ,s necessario partire da qualcosa senza argomenti, ad esempio: skip Com skip Com x := a Com

skip; x := a Com

Per ricollegarci allinduzione matematica, potremmo immaginare di avere due sort 0 = {0} e 1 = {succ} e a questo punto la dimostrazione da eettuare sarebbe la seguente: P(0) P(n) P(succ(n)) k . P(k) Linduzione strutturale si applica ad esempio alle grammatiche: prendiamo ad esempio la produzione relativa alle espressioni aritmetiche in IMP a :: n|x|a0 + a1 |a0 a1 |a0 a1 Supponiamo di voler dimostrare una propriet di a. Come possiamo fare? Semplice, basta dimostrare che questa propriet vale per tutte le sue produzioni. In altre parole, se vogliamo dimostrare P(a) dobbiamo saper dimostrare che valgono P(n) per ogni intero n P(x) per ogni identicatore x P(a0 + a1 ) assumendo che valgano P(a0 ) e P(a1 ) P(a0 a1 ) assumendo che valgano P(a0 ) e P(a1 ) P(a0 a1 ) assumendo che valgano P(a0 ) e P(a1 ) Esempio 2.19 (Induzione strutturale) Prendiamo il caso delle espressioni aritmetiche visto sopra, e dimostriamo che a Aexpr, , m N, m N. a, m a, m m = m In altre parole, presa unespressione aritmetica ed una memoria essa restituir sempre uno ed un solo valore. Dimostriamolo con induzione strutturale.

2.2 Altri metodi di induzione

25

a n per sviluppare un numero intero esiste una ed una sola regola, che restituisce sempre lo stesso valore. Quindi ovviamente m = m a x come sopra, esiste un unica regola per sviluppare questa forma di a. Questa regola restituisce (x), ma visto che uguale in entrambi i casi ovviamente otterremo lo stesso valore a a0 + a1 |a0 a1 |a0 a1 per denizione otterremo due risultati m = m0 + m1 e m = m0 + m1 . Per ipotesi dellinduzione strutturale per m0 = m0 e m1 = m1 , quindi ovviamente anche m = m qualunque sia loperazione aritmetica applicatavi.

2.2.4. Induzione sulle derivazioni


Considerare solamente linduzione ben fondata non talvolta suciente: a volte serve un modello di ragionamento che si basa sulle regole di inferenza stesse. Abbiamo visto cosa siano una regola di inferenza ed una derivazione nelle denizioni 1.2 e 1.3. Proviamo a denire una relazione ben fondata sullinsieme delle derivazioni. Denizione 2.20 (Sottoderivazione immediata) Si dice che d sottoderivazione immediata di d, in simboli d d D.

d, se e solo se d della forma (D/y) e

Esempio 2.21 (Sottoderivazione immediata) Nella derivazione num num

1, 1

2, 2 1 + 2, 3

1+2=3

sum

le regole num sono sottoderivazioni immediate della regola sum.

Deniamo adesso il concetto di sottoderivazione propria. Esempio 2.22 (Sottoderivazione propria) Si dice che d sottoderivazione propria si d se e solo se d

d, dove =

+ 1

Visto che esistono degli elementi minimi di , cio gli assiomi, entrambe le relazioni sono ben fondate e possono quindi essere utilizzate per dimostrazioni per induzione. Vediamo un esempio. Esempio 2.23 (Dimostrazione mediante induzione sulle derivazioni) Vogliamo dimostrare che la derivazione di un teorema in IMP deterministica. In simboli, presi un comando c ed una memoria , vogliamo dimostrare la seguente propriet P(d) = , , .d
R

c, d

c, = d.P(d ))

Lo dimostreremo per induzione sulle derivazioni: dobbiamo quindi dimostrare che (d P(d). E questo va fatto per tutte le possibili forme di d. Vediamone alcune.

26

Metodi di Induzione

CHECKME: Controllare se una boiata. Ricordiamo che dire che (d d.P(d )) P(d), ci permette dire che per tutti gli elementi che precedevano d, valeva la propriet del determinismo. Possiamo aermare quindi che linduzione sulle derivazioni non altro che un induzione ben fondata in cui loperatore denito come sopra. I puntini sopra le derivazioni stanno ad indicare proprio il fatto che non sappiamo a priori come fatta la derivazione. Se d un comando skip, abbiamo che = = in quanto lo skip non modica lo stato. Se d un comando di assegnamento, abbiamo due regole della forma . . . . . . a, m X := a, [m /X ] . . . . . . a, m X := a, [m /X ]

Ma in il valore dellespressione aritmetica a sar lo stesso in entrambe le espressioni, dato che la loro valutazione deterministica, e di conseguenza sar uguale anche la memoria restituita dal comando! Se d una concatenazione di comandi, abbiamo due regole della forma . . . c1 , 1 c1 ; c2 , Ovviamente avremo che le derivazioni con le quali si deduce c1 , 1 e c2 , 1 sono sottoderivazioni proprie della derivazione che stiamo analizzando, quindi per loro vale lipotesi induttiva per questo possiamo concludere che 1 = 2 , in quanto entrambe lavorano sulla stessa coppia comando/memoria ma allora anche = , come volevamo dimostrare! Se d un comando condizionale, dobbiamo considerare i due casi in cui la guardia booleana sia vera o falsa. Supponiamo che sia vera: abbiamo ancora due regole della forma . . . b, true . . . c1 , . . . b, true . . . c1 , . . . c2 , 1 . . . c1 , 2 c1 ; c2 , . . . c2 , 2

if b then c1 else c2 , if b then c1 else c2 , Siamo ancora nella situazione del punto precedente: la regola per derivare c1 , sottoderivazione propria della regola in esame, quindi possiamo applicare lipotesi induttiva e concludere che = Inne, se d un comando di tipo while dobbiamo ancora considerare i due casi in cui la guardia sia vera o falsa. Il caso in cui la guardia falsa banale, in quanto lo stato non viene modicato e, come nel caso dello skip, risulta = = . Interessante invece il caso nel quale la guardia vera: abbiamo le due regole b, true c, 1 while b do c, 1

while b do c,

2.3 Ricorsione ben fondata (Well founded recursion)

27

b, true

c, 2

while b do c, 2

while b do c, Come sempre, di sopra abbiamo lo stesso while che troviamo di sotto. Tuttavia, per quanto possa sembrare strambo, il while di sopra comunque sottoderivazione propria di quello di sotto (la denizione parla chiaro!), e quindi possiamo applicarvi lipotesi induttiva che, assieme allapplicazione su c, permette di aermare che anche il ramo true del while deterministico, ponendo ne a questa faticosa dimostrazione.

2.2.5. Induzione sulle regole


Questo ultimo caso di induzione si applica ad insiemi di elementi deniti mediante regole. Si basa sullidea che, immaginando di avere un insieme di regole di transizione che deniscono quali elementi appartengano ad un certo insieme, si debba dimostrare che lapplicazione di una regola non pregiudichi la veridicit di un predicato che vogliamo dimostrare. Formalizziamo qualche concetto. Una regola un oggetto della forma (/y) oppure ({x1 , . . . , xn }/y). Dato questo insieme R di regole, deniamo linsieme dei teoremi come IR = {x | R x} cio linsieme degli elementi per i quali esiste una derivazione. Linduzione sulle regole punta a dimostrare che tutti gli elementi di IR godono di una certa propriet P, e lo fa dimostrando che per ogni assioma (/y) vale P(y) per ogni regola ({x1 , . . . , xn }/y) vale 1 i n.xi IR P(xi ) y IR .P(y) Caso speciale in cui P({d1 , dn /y}) si riduce a P(y) Non si considerano tutte le premesse, ma solo quelle derivabili (X/y) R X IR (x X P(x)) = P(y) x IR .P(x) Linduzione sulle regole vale d y p(d) Q(y) d1 , dn : sono dimostrazioni. x1 , xn : premesse r regola di inferenza Delle regole che non sono raggiungibili, non serve dimostrarle in una dimostrazione. Principio di induzione sulle regole: Qui le formule non centrano niente (Viene chiesto allesame), non si fa induzione sulle formule, centrano le derivazioni che sono fatte con le regole. xi Ir si pu usare o no, non obbligatorio.

2.3. Ricorsione ben fondata (Well founded recursion)


Passiamo al concetto di ricorsione ben fondata. Una ricorsione si dice ben fondata quando riguarda una funzione che nella propria denizione chiama ricorsivamente se stessa su valori minori secondo una certa relazione ben fondata. Linsieme delle funzioni che seguono il principio della ricorsione ben fondata detto insieme delle funzioni primitive ricorsive. Esempio 2.24 (Ricorsione ben fondata) Prendiamo la formula di Peano per il calcolo del prodotto P(0, y) = 0 P(x + 1, y) = y + P(x, y)

28

Metodi di Induzione

Questa formula segue il principio dellinduzione ben fondata, in quanto denita sulla base di se stessa applicata su valori minori secondo una relazione ben fondata (per la precisione lordine lessicograco).

Passiamo ad una formalizzazione di questo concetto. Denito il seguente insieme Denizione 2.25 (Insieme dei predecessori) Linsieme dei predecessori di un insieme I linsieme 1 I = {b B|b I. b b }

Teorema 2.26 (Ricorsione ben fondata) Sia (B, ) una relazione ben fondata su B. Prendiamo una funzione F(b, h) che restituisce valori in un insieme C, dove bB h :<1 {b} C Allora esiste ununica funzione f : B C tale che b B. f (b) = F(b, f
1

{b})

Questo signica se deniamo la funzione ricorsiva f per un certo valore b solo in funzione dei suoi predecessori, allora f pu essere espressa tramite ununica funzione. Nota: la notazione f B indica che la funzione f : B C viene ristretta ai soli valori del dominio appartenenti a B . In seguito denoteremo la semantica delle funzioni ricorsive tramite la teoria del punto sso, tuttavia la ricorsione ben fondata risulta un metodo pi semplice ed altrettanto valido in alcuni casi. Vediamo qualche esempio per chiarire bene il concetto. Esempio 2.27 (Formalizzazione della ricorsione ben fondata) Applichiamo la denizione formale alla formula di Peano vista nellesempio 2.24. Per comodit di notazione, essendo y di fatto un parametro della funzione e non una variabile, indicheremo p(x, y) come py (x). Abbiamo Py (0) = Fy (0, Py ) = 0
1

Py (x + 1) = Fy (x + 1, Py

{x + 1}) = y + Py (x)

Notare che stiamo denendo la F nei due dierenti casi, e che questa F vale per qualunque x gli venga passato.

Esempio 2.28 (Ricorsione ben fondata per una visita di albero in Lisp) Lisp sum(x) = if atom(x)Henv(x) else sum(car(x)) + sum(cdr(x)) Somme di un generico albero car (x) = sottoalbero sinistro di x cdr (x) = sottoalbero destro di x cons(x,y) = costruttore

2.3 Ricorsione ben fondata (Well founded recursion)

29

sum(i) = i sum(cons(x, y)) = sum(x) + sum(y) Segnatura: B = T (alberi binari) Algebra c=w 0 = {0, 1, ...} 2 = cons xi cons(x1 , x2 ) (relazione ben fondata) F(i, ) = i F(cons(x, y), sum) = sum(x) + sum(y) = sum(cons(x, y)) A questo punto possiamo applicare il teorema: calcola uno un solo risultato e non si blocca mai. La semantica denotazionale denita per ricorsione strutturale.

Esempio 2.29 (Funzione di Ackermann) ack(0, 0, z) = z ack(0, y + 1, z) = f (0, y, z) + 1 ack(1, 0, z) = 0 ack(x + 2, 0, z) = 1 ack(x + 1, y + 1, z) = ack(x, ack(x + 1, y, z), z) ack(0, x, y) = x + y ack(1,x+1,y) = ack(0, ack(1, x, y), y) = ack(1,x,y) +y => ack(1, x, y) = x y ack(2, 0, y) 1 ack(2, x+1, y) = ack(2, x, y) y (Esponenziale) ack(2, x, y) = y x In questo caso non possiamo trattare gli argomenti come parametri, ma sono variabili e quindi cambiamo lordinamento dai naturali a quello lessicograco.

3. Ordinamenti parziali e teorema del punto sso


3.1. Basi degli ordinamenti parziali
Intuizione: Gli ordini parziali completi corrispondono a tipi di strutture dati che possono essere usati come ingresso o uscita di un calcolo. Le funzioni calcolabili sono modellata come funzioni continue tra questi dati. Gli elementi di un cpo vengono considerati come punti di informazione e lordinamento x y signica che x approssima y (o x ha la stessa o meno informazione di y), quindi il punto di minore informazione.

3.1.1. Ordinamenti parziali e totali


Finora abbiamo visto solamente come studiare denizioni date mediante ricorsione ben fondata, come ad esempio il mondo delle espressioni aritmetiche o quello delle booleane. Queste denizioni sono estremamente comode, ma hanno un potere espressivo limitato allinsieme di funzioni cosiddette primitive ricorsive. Senza addentrarci troppo nei dettagli, le funzioni primitive ricorsive sono tutte quelle esprimibili mediante programmi del nostro linguaggi IMP nel quale al posto del comando while viene utilizzato un comando FOR che itera su collezioni nite di elementi1 . Un linguaggio cos modicato non pu andare in ciclo, o in altre parole, se deniamo una relazione sullinsieme delle regole del nostro linguaggio tale che una formula ben fondata maggiore nellordinamento rispetto ad una sua sottoderivazione propria, non vengono generate catene discendenti innite. Tuttavia, questo non ci basta. Le funzioni primitive ricorsive sono tante, ma non sono sucienti a descrivere lintero spettro delle funzioni totali. Per esprimere alcune di queste funzioni (ad esempio, la funzione di Ackermann che abbiamo visto nello scorso capitolo) avremo bisogno di costrutti come il while che possono non terminare, e che quindi non rientrano nelle nostre funzioni primitive ricorsive. per questo che abbiamo bisogno di una teoria dierente, che consideri ordinamenti e catene dierenti da quelle che abbiamo visto nora. la teoria del punto sso, che deniremo meglio a met capitolo. La strada per arrivare al punto sso lunga, dunque cominciamo subito con una serie di denizioni che ci serviranno strada facendo.

Denizione 3.1 (Ordinamento Parziale) Un ordinamento parziale (P, ) una relazione P P tale che valgono Propriet riessiva: p p q q q p = p = q r

Propriet antisimmetrica: p Propriet transitiva: p q

r = p

Linsieme P detto poset (partially ordered set).

Notiamo che un qualunque sottoinsieme di un insieme parzialmente ordinato ne eredita la struttura ed quindi ancora un insieme parzialmente ordinato.
1

In particolare, non parliamo del for del linguaggio JavaTM o del C che sono di fatto una riscrittura del while e possono andare in loop, bens del comando foreach utilizzato in linguaggi come C# che itera su collezioni nite di elementi: un comando del genere, intuitivamente, non pu andare in loop a meno che non sia il corpo ad andarci!

32

Ordinamenti parziali e teorema del punto sso

Esempio 3.2 (Ordinamento parziale) Lordinamento N, un ordinamento parziale: infatti vale la propriet riessiva, in quanto n N.n n vale la propriet antisimmetrica, in quanto ovvio che n, m N.n m m n m = n per la propriet della relazione allo stesso modo vale ovviamente la propriet transitiva

Esempio 3.3 (Ordinamento non parziale) Lordinamento N, < non un ordinamento parziale: infatti vale la propriet transitiva, per le propriet di < non vale la propriet antisimmetrica, in quanto p < q questo caso non esistono!) q < p = p = q (in particolare, p e q in

non vale neppure la propriet riessiva: un numero non strettamente minore di se stesso Vale solo una propriet su tre, quindi lordinamento ovviamente non parziale.

Denizione 3.4 (Ordinamento totale) Un ordinamento su un insieme P detto totale se un ordinamento parziale (e dunque valgono le propriet riessiva, antisimmetrica e transitiva) ed inoltre vale p1 , p2 P.x = y x yy x

Un insieme sul quale denito un ordinamento totale detto insieme totalmente ordinato. Vediamo qualche ordinamento particolare che utilizzeremo in futuro. Esempio 3.5 (Ordinamento discreto) Un ordinamento discreto un ordinamento in cui la relazione di ordinamento denita come x.x x. Questo ordinamento ovviamente parziale: la propriet riessiva vale sicuramente, cos come la propriet transitiva (in quanto non denito ordinamento per elementi diversi fra di loro). Inne la propriet antisimmetrica vale, in quanto lunico caso in cui due elementi sono messi a confronto quello in cui i due elementi sono uguali:

Esempio 3.6 (Ordinamento piatto) Un ordinamento piatto un ordinamento in cui esiste un elemento tale che x. x x x e non c nessun altra relazione. In questo caso la propriet transitiva non ha senso, cos come quella antisimmetrica (in quanto non possono esistere due elementi reciprocamente uno minore dellaltro, per denizione). La propriet riessiva, inne, viene dalla denizione.

Per ricollegarci alle relazione ben fondate, un ordine parziale detto ben fondato se il corrispondente ordine stretto una relazione ben fondata.

3.1 Basi degli ordinamenti parziali Enunciamo adesso un teorema che ci risulter comodo in seguito.

33

Teorema 3.7 (Sottoinsiemi di un insieme totalmente ordinato) Se A un insieme totalmente ordinato, B A.B un insieme totalmente ordinato rispetto alla stessa relazione. Utilizzeremo questo teorema quando parleremo di catene: essendo esse sottoinsiemi completamente ordinati di ordinamenti parziali, sapremo che ogni sottoinsieme di un ordinamento totale una catena ogni sottoinsieme di una catena una catena

3.1.2. Diagrammi di Hasse


Rappresentare un ordinamento una cosa piuttosto scomoda. Immaginiamo di voler rappresentare la relazione con un grafo, ad esempio sui numeri naturali: dalln-esimo elemento dovrebbero partire n-1 frecce verso gli elementi minori rispetto a lui! Ci serve una notazione pi compatta. Vediamone una. Denizione 3.8 (Diagramma di Hasse) Deniamo una relazione R tale che: x y y z xRz Una relazione Hasse y z x xRx

da cui si eliminano gli archi dovuti alla transitivit e alla riessivit un diagramma di H = R

In parole povere, togliamo dal grafo completo tutte le frecce riessive e tutte le frecce che collegano due nodi fra i quali esiste un cammino pi lungo. Come facciamo ad essere sicuri che questa notazione descrive completamente la nostra relazione di partenza? Vale il seguente teorema. Teorema 3.9 (Equivalenza fra relazione e chiusura di Hasse) Se P un insieme nito, la chiusura transitiva e riessiva di un diagramma di Hasse uguale alla relazione di ordine parziale originaria. H = Questo discorso, tuttavia, non vale se P un insieme innito: prendiamo ad esempio la relazione (, ), ed aggiungiamoci . Inne estendiamo la relazione con: n e . Applicando Hasse a questo insieme eliminiamo tutti gli archi tra e n, ma quando richiudiamo con * ritroviamo solo gli archi che collegano i vari n tra di loro mentre rimane staccato. Ricordiamo brevemente il concetto di chiusura di una relazione Denizione 3.10 (Chiusura) Una chiusura di una relazione R una relazione R che rispetta le seguenti propriet: xR x xR y

yRz

xR z

34

Ordinamenti parziali e teorema del punto sso

Vediamo ora alcuni punti di interesse dei nostri ordini parziali. Denizione 3.11 (Minimo di un insieme) m S minimo in (S , ) se s S . m s

Notare che il minimo deve essere in relazione con tutti gli elementi dellinsieme. Teorema 3.12 (Unicit del minimo) Il minimo, se esiste, unico.

Dimostrazione. Banalmente m1

m2

m2

m1 per la propriet antisimmetrica implica m1 = m2 .

Duale la denizione di un elemento massimo. Denizione 3.13 (Elemento Minimale di un insieme) m S si dice elemento minimale di (S , ) se s S . s m s = m

Duale la denizione di un elemento massimale. In generale elementi minimo e minimale (massimo e massimale) non sono la stessa cosa, infatti al contrario del minimo il minimale non deve essere in relazione con tutti gli altri elementi e quindi possono esistere pi elementi minimali non in relazione tra loro. Naturalmente nel caso di un ordinamento totale le due denizioni coincidono. Vediamo ora dei concetti simili relativi ai sottoinsiemi di un ordinamento parziale. Denizione 3.14 (Maggiorante (upper bound)) Dato un ordinamento parziale (P, ) ed un sottoinsieme X P diciamo che p P upper bound di X se e solo se q X.q p

da notare una cosa importante: non detto che lupper bound appartenga ad X! Fra tutti gli upper bounds di un sottoinsieme ne pu esistere uno che ci interesser particolarmente. Denizione 3.15 (Minimo dei maggioranti (LUB)) Dato un ordinamento parziale (P, ) ed un sottoinsieme X P il valore p P least upper bound di X, e si indica con lub(X), se e solo se p un upper bound di X per tutti gli upper bounds q p di X, p q

Vediamo due esempi per chiarire cosa sia il lub e perch potrebbe non esistere. Nella gura 3.1 abbiamo due situazioni dierenti di sottoinsiemi di un insieme sul quale stato denito un ordinamento parziale (del quale mostriamo il diagramma di Hasse). Prendendo il sottoinsieme evidenziato dallovale grigio nella gura di sinistra, composto dagli elementi b e c, abbiamo che linsieme degli upper bounds linsieme formato dagli elementi i, h e , in quanto unici

3.1 Basi degli ordinamenti parziali

35

T
T

l
h i l

(a)

(b)

Figura 3.1.: Due sottoinsiemi, dei quali il primo ha LUB e il secondo no. elementi ad essere maggiori di entrambi gli elementi dellinsieme. Questo insieme non ha un minimo: h ed i sono minori rispetto a , ma non sono in relazione fra di loro. Prendendo invece il sottoinsieme evidenziato dallovale grigio in gura di destra, composto dagli elementi a e b, abbiamo che linsieme degli upper bounds comprende anche lelemento f che e minore rispetto a tutti gli altri elementi degli insieme dei maggiori. Possiamo quindi dire che f lub dellinsieme. Dualmente possiamo denire i concetti di Minorante e Massimo dei minoranti.

3.1.3. Catene
Passiamo a denire un altro concetto importante, cio quello di catena. Denizione 3.16 (Catena) Dato un insieme parzialmente ordinato (P, ), un sottoinsieme D di P una catena se i1 , i2 D i1 i2 i2 i1

ovvero una catena un sottoinsieme totalmente ordinato di P.

Una catena (D, ) pu anche essere una sequenza innita di elementi d D d0 ovvero {di }i .di di+1 d1 d2 ...

Possiamo vedere queste catene innite come funzioni : D che associano a inniti passi gli elementi di D. Vediamo qualche propriet di tali catene Teorema 3.17 (Catene di un insieme nito) Se D nito allora ogni sua catena nita.

Vedremo in seguito che per questa ragione D un ordine parziale completo. Nel caso in cui una catena sia nita, si dice che si stabilizza su un particolare valore. Si crea cos una catena del tipo

36

Ordinamenti parziali e teorema del punto sso

d0

d1

...

...

nella quale un certo valore d si ripete allinnito a partire da un certo momento in poi. Notare che anche se avessimo dei cicli del tipo d0 d1 ... d dh dh+1 ... d

per la propriet transitiva e antisimmetrica deve valere per forza dh = dh+1 = . . . = d in quanto se una di quelle uguaglianze cadesse avremmo un elemento in D che sarebbe sia maggiore che minore di d, il che ovviamente impossibile. Denizione 3.18 (Limite di una catena) Nel caso in cui la catena sia nita, lelemento in cui si stabilizza viene dette limite della catena ed proprio il suo LUB.

Denizione 3.19 (Altezza di un insieme) Un insieme parzialmente ordinato (P, ) ha altezza nita se e solo se tutte le catene di P sono nite.

Vediamo un esempio. Esempio 3.20 (Insieme innito con catene nite) Linsieme dei singoletti numeri naturali, con top e bottom. ( {, }, ) n : n

Passiamo ad un altra denizione. Denizione 3.21 (Sottoinsieme diretto) Sia (P, ) un insieme parzialmente ordinato. Un sottoinsieme S di P si dice diretto se ogni sottoinsieme nito di S ha un upper bound in S.

La gura 3.2 dovrebbe far capire la dierenza fra un sottoinsieme diretto ed uno non diretto. Nella gura sopra il sottoinsieme S di N non diretto: se noi prendiamo un sottoinsieme qualunque, questo sicuramente non avr LUB in quanto lunico elemento maggiore nellordinamento rispetto a tutti gli elementi , che non appartiene al sottoinsieme S. Nella gura sotto, invece, il sottoinsieme S di N comprende : qualunque sottoinsieme si prenda in S, esso avr sicuramente top come LUB, in quanto lunico upper bound in comune fra gli elementi di N. Denizione 3.22 (Insieme inclusivo) Sia (D, ) un cpo. Un sottoinsieme P di D inclusivo (o ammissibile) se e solo se per ogni catena {di } in D (n dn P) =
n

dn P

3.1 Basi degli ordinamenti parziali

37

N T

S ...
-3 -2 -1 0 1 2 3

...

(a)

N T S

...

-3

-2

-1

...

(b)

Figura 3.2.: Due sottoinsiemi, uno dei quali diretto e laltro no

Vedremo che la nozione di insieme inclusivo ci torner utile quando parleremo di CPO, cio ordinamenti parziali completi. Vedremo che se abbiamo un CPO (D, ), potremo aermare con certezza che un PO denito su un suo sottoinsieme con lo stesso ordinamento (P D, ) a sua volta completo solo se D inclusivo. Inoltre utilizzeremo questa denizione nel paragrafo 4.3 nel quale parleremo di induzione computazionale. Vediamo un esempio adesso di insieme non inclusivo.

Esempio 3.23 (Fairness, insieme non inclusivo) (D, ) D = {a, b} {a, b} =

Siano queste stringhe la sequenza di scelte di un arbitro che scelga a o b. Una scelta si dice fair se non accade innitamente che ci siano solo a o b (quindi le uniche stinghe unfair sono quelle innite). Linsieme delle stringhe fair non inclusivo infatti scegliendo ad esempio a aa aaa ...

ciascuna di queste stringhe nite fair perch pu sempre essere essere seguita da una b mentre il limite di questa catena una stringa innita di a.

NOTA: le denizioni di insieme diretto e inclusivo sembrano molto legate se non equivalenti, bisogna fare luce! Passiamo ad un importante teorema.

38

Ordinamenti parziali e teorema del punto sso

Teorema 3.24 (Catene di insiemi parzialmente ordinati) Sia (P, ) un insieme parzialmente ordinato. Ogni catena C non vuota di P un insieme diretto.

Dimostrazione. facile vederlo. Una catena un insieme totalmente ordinato per denizione: se, dato un sottoinsieme di C, costruiamo linsieme degli upper bounds di tale insieme questo sar a sua volta totalmente ordinato per il teorema 3.7. Quindi avr un elemento minimo, che sar LUB del sottoinsieme di C.

3.1.4. Ordinamenti parziali completi (CPO)


Arriviamo adesso ad un concetto importantissimo. Stiamo per denire una classe di ordinamenti completi che sono centro dellintero corso: gli ordinamenti parziali completi. Un ordinamento parziale completo una generalizzazione del reticolo completo, ed denito come segue. Denizione 3.25 (Ordinamento parziale completo (CPO)) Un ordinamento parziale detto completo se ogni sua catena ha lub.

Deniamo inoltre il seguente: Denizione 3.26 (Ordinamento parziale completo con bottom) Un ordinamento parziale completo (D, ) con bottom (CPO ) se ha un elemento tale che x D.

Ovviamente un reticolo completo anche un ordinamento parziale completo con bottom, in quanto se tutti i sottoinsiemi possiedono glb e lub allora a maggior ragione li possiederanno le catene. In seguito, indicheremo con CPO un ordinamento parziale completo e con CPO un CPO con bottom. Si noti che qualunque ordinamento parziale che possiede solamente catene nite un CPO, e dunque un ordinamento parziale su un insieme nito sicuramente un CPO. Limportanza dei CPO sta nel fatto che potremo usarli per ammettere lesistenza di un limite di una catena in un insieme con un numero innito di elementi, come vedremo in seguito. Esempio 3.27 (Ordinamento parziale non completo (1)) Vediamo un esempio di ordinamento parziale non completo. (, ) n0 n1 n2 |{ni }| innita

Le catene sono innite, dunque siamo sicuri che non abbiano limite. Tuttavia, se introduciamo un elemento aggiuntivo , lordinamento parziale diventa completo: maggiore rispetto a tutti gli elementi di e dunque risulta essere sicuramente un lub perfetto per le catene innite.

Esempio 3.28 (Ordinamento parziale completo (2)) Prendiamo lordinamento parziale (P, ) e modichiamolo, prendendo (P , ) con P = P {1 , 2 } a b a b, a 1 , a 2 , 1 1 , 2 2 Questo ordinamento parziale non completo, perch nonostante ci siano 2 maggioranti 1 e 2 questi non sono confrontabili fra di loro e quindi non possibile stabilire quale sia il lub.

3.1 Basi degli ordinamenti parziali

39

Esempio 3.29 (Powerset con inclusione) Dato un insieme S, prendiamo come dominio linsieme dei suoi sottoinsiemi (Powerset) e come relazione di ordinamento linclusione (2S , ). Questo insieme rispetta queste propriet: riessivit S S anti-simmetria S1 S2 S2 S1 = S 1 = S 2

transitivit S 1 S 2 S 3 = S 1 S 3 Possiamo concludere che un CPO, infatti ogni catena ha limite: lub(S 0 S 1 S 2 ..) = {d | k. d S k } =
i

Si

Notiamo che in realt il powerset con inclusione possiede anche un elemento = e come vedremo in seguito anche un reticolo, un oggetto molto pi strutturato del CPO.

Figura 3.3.: Powerset con inclusione con 3 elementi

Esempio 3.30 (Funzioni parziali) Prendiamo linsieme di tutte le funzioni parziali sui naturali: P=

Alternativamente possiamo vederlo come un insieme di relazioni ristrette a ritornare un solo valore (cio al comportamento di una funzione). P = {R | nRm nRm = m = m }

Notare che sono sempre parziali perch non imposto che esista sempre m. In questa visione le funzioni sono insiemi e quindi posso ordinarle per inclusione: f g x.( f (x) indenita oppure f (x) = g(x))

In altre parole, una funzione f minore nellordinamento rispetto ad unaltra funzione g se esistono punti in cui g denita ed f no (e non viceversa, ovviamente: in quel caso le due funzioni non sono in relazione).

40

Ordinamenti parziali e teorema del punto sso

Il di questo insieme la funzione indenita ovunque, cio , mentre esistono pi upper bounds, cio le funzioni totali. Un altro modo per denire P quello di aggiungere al codominio lelemento indenito e usare solo funzioni totali: P = . Lordinamento diventa f g x. f (x)

g(x)

cio se f (x) = g(x) pu assumere qualunque valore, lelemento la funzione che restituisce su qualunque ingresso e lupper bound la funzione per cui i. f (i) = . Questa denizione ha il vantaggio che lordinamento sulle funzioni demandato allordinamento sul codominio, che : n. Rimane da dimostrare che lordinamento sia parziale completo.
Dimostrazione. Se (D, ) un ordinamento parziale, allora lo stesso ordinamento vale anche per ogni sottoinsieme (D , ). La completezza invece non assicurata: devo mostrare che per ogni sottoinsieme esiste un lub. Presa una catena R0 R1 R2 . . . con i. nRi m nRi m = m = m , devo mostrare che la propriet vale ancora per il limite della catena n(Ri )m n(Ri )m = m = m Dove il limite denito come Ri = {(n, m)|i.nRi m}. Assumendo la premessa abbiamo che k, k . nRk m nRk m , quindi se prendiamo un k = max{k, k } allora per entrabi vale la relazione nRk m nRk m che per ipotesi implica m = m .

Esempio 3.31 (Sequenza di funzioni) Deniamo una sequenza di funzioni { fi }i tale che fk (n) = Vediamo qualche applicazione di esempio. f0 (0) = 3 f1 (0) = 3 f2 (0) = 3 f3 (0) = 3 f4 (0) = 3 3 se n pari n k altrimenti

f2 (2) = 3 f3 (2) = 3 f4 (2) = 3

f4 (4) = 3

Ogni passo della catena pi denito del precedente. Il limite la funzione denita su tutti i pari e indenita altrove; anche il limite quindi una funzione parziale.

3.1.5. Reticoli
Spesso in luogo dei PO si preferisce utilizzare delle strutture che prevedono delle propriet pi forti detti reticoli. Denizione 3.32 (Reticolo) Un reticolo un insieme parzialmente ordinato (P, ) tale che per ogni sottoinsieme costituito da due elementi di P esistono lub e glb.

Vediamo un esempio di reticolo.

3.2 Verso la teoria del punto sso

41

Esempio 3.33 (Reticolo) Se prendiamo linsieme ( {, }, ) avremo che n : n , per denizione di avranno chiaramente come lub e come glb. e . Qualunque coppia di elementi in si prenda,

Estendiamo la denizione individuando un sottoinsieme dei reticoli che ha propriet molto pi interessanti. Denizione 3.34 (Reticolo completo) Un insieme parzialmente ordinato (P, ) un reticolo completo se X P esistono lub(X) e glb(X). In questo caso lub(P) = il massimo del reticolo

glb(P) = il minimo del reticolo Il reticolo completo si dierenzia dal reticolo normale per il fatto che viene richiesta lesistenza di lub e glb non solo per le coppie di elementi, ma per tutti i sottoinsiemi. una propriet molto pi forte, ma che ci permetter di fare ipotesi a loro volta molto pi forti su tali insiemi. Notare che ogni reticolo nito un reticolo completo e, come vedremo nella sezione 3.1.4, ogni reticolo completo un CPO. Vediamo un esempio di reticolo non completo. Esempio 3.35 (Reticolo non completo) (, ) un reticolo, ma non completo in quanto ad esempio linsieme dei numeri pari non ha lub.

3.2. Verso la teoria del punto sso


3.2.1. Monotonia e continuit
Ora che abbiamo denito correttamente un CPO (D, ), vogliamo denirci sopra delle funzioni che abbiamo un punto sso: ricerchiamo dunque, per ogni F, un valore d tale che d = F(d) dD

Vedremo che trovare un punto sso di una funzione rappresenter il problema principale per la ricerca di una soluzione ai nostri problemi. Troveremo che potremo aermare con certezza che esiste un punto sso solo per certe classi di funzioni, e che solo in certi casi avremo una procedura che lo calcoli in tempo nito. Vediamo inizialmente di denire due propriet sulle nostre funzioni che ci aiuteranno a comprenderne la forma. Per prima cosa introduciamo una notazione nuova. Notazione Con la notazione i {ai } si intende il limite della successione {ai } per i sempre pi grande. Deniamo adesso la prima propriet interessante, cio la monotonia. Denizione 3.36 (Monotonia) Una funzione F su un CPO (D, ) monotona se e solo se d, e D.d e F(d) F(e)

42

Ordinamenti parziali e teorema del punto sso

La funzione in pratica deve mantenere la struttura del dominio. Questo ci porta anche a dire che se di una catena e F monotona allora anche F(di ) una catena, in quanto lordinamento denito sul dominio di partenza non viene variato dalla funzione. Vediamo un esempio. Esempio 3.37 (Funzione non monotona) Esempio di funzione non monotona su un CPO con b f (a) = a

a, b

c: f (c) = c

f (b) = a

Questa funzione modica lordinamento: non vale b relazione.

f (b)

f (c) in quanto a e c non sono in

Vediamo adesso la seconda propriet interessante, la continuit. Denizione 3.38 (Continuit) Una funzione F su un CPO (D, ) continua sse per ogni catena d denita su D si ha F(
i

di ) =
i

F(di )

In altre parole, presa una funzione F questa continua se la funzione applicata al limite del CPO restituisce un risultato uguale al limite del CPO ottenuto applicando la funzione a tutti gli elementi del CPO di partenza. Esempio 3.39 (Funzione monotona non continua) Dato ( {}, ) CPO, deniamo la funzione f (n) = 0 f () = 1 Scelta una catena del tipo 0 2 4 6 ... Abbiamo che f( La funzione non quindi continua. di ) = f () = 1 f (di ) = 0

Queste due nozioni sono in forte relazione fra di loro, come possiamo vedere dalle seguenti propriet. Cominciamo a limitare il nostro campo capendo come si comportano queste due propriet con catene nite. Teorema 3.40 (Relazione fra monotonia e continuit (1)) Se una catena {di } nita allora ogni funzione monotona denita su tale catena continua.

Dimostrazione. Data d0 d1 ... dk dk ... questa sar una catena nita con limite di = dk (ricordiamo che una catena nita considerata come una catena innita nella quale dopo un numero nito di passi tutti gli elementi sono uguali).

3.2 Verso la teoria del punto sso


Visto che f monotona, possiamo concludere che la catena f (d0 ) f (d1 ) ... f (dk ) f (dk ) ...

43

si stabilizza su f (dk ), che sar dunque limite della catena risultante. Quindi f(
i

di ) =
i

f (di )

ed ovviamente la funzione continua.

Il seguente teorema non verr dimostrato. Teorema 3.41 (Relazione fra monotonia e continuit (2)) Una funzione continua anche monotona

3.2.2. Punto sso


Possiamo nalmente denire formalmente cos un punto sso. Denizione 3.42 (Punto sso) Sia f una funzione continua su un CPO . Un elemento d si dice punto sso se e solo se vale: f (d) = d Linsieme dei punti ssi denotato con Fix( f ).

Deniamo anche un altro importante insieme di elementi che costituiscono la strada verso il nostro punto sso. Denizione 3.43 (Punto presso) Sia f una funzione continua su un CPO . Un elemento d si dice punto presso se e solo se vale: f (d) d

Data una funzione f, indicheremo con g f p( f ) (greatest xed point) il suo massimo punto sso, e con l f p( f ) (least xed point) il minimo punto sso. Abbiamo visto cos un punto sso, ma le domande pi pressanti sono quando questo punto esiste e come possiamo trovarlo. Daremo due risposte a questa domanda il teorema del punto sso o di Kleene il teorema di Tarski

3.2.3. Il teorema di Kleene


Questa prima caratterizzazione del punto sso dovuta a Kleene, che ha costruito questo teorema. Vediamo prima questo banale lemma che ci servir per la dimostrazione

44

Ordinamenti parziali e teorema del punto sso

Lemma 3.44 (Limite indipendente dallinizio della catena) Due catene a0 a1 = f (a0 ) a2 = f (a1 ) . . . stesso limite! ai ai+1 = f (ai ) ai+2 = f (ai+1 ) . . . nelle quali un elemento e ottenuto in funzione del precedente mantengono uguale il valore del limite togliendo un numero nito di elementi dalla testa della catena.

Grazie a questo lemma, possiamo dimostrare il seguente teorema. Teorema 3.45 (Teorema del punto sso (o teorema di Kleene)) Sia f : D D una funzione continua su un ordinamento parziale completo con elemento bottom CPO . Allora esiste un valore f ix( f ) = f n ()
n

tale che 1. x(f) punto sso di f f ( f ix( f )) = f ix( f ) 2. x(f) il minimo punto presso di f f (d) d f ix( f ) d

Dunque, in particolare, f ix(x) il minimo punto sso di f (l f p(f)).

Dimostrazione. Per prima cosa, vediamo che f n () una catena. Abbiamo Denendola per costruzione possiamo dire f n+1 (x) = f ( f n (x)) Per induzione vediamo che f 0 () = sicuramente il minimo, in quanto minore di qualunque altra cosa Dobbiamo dimostrare il passo induttivo, e cio che f n () f n+q (). Sappiamo per ipotesi induttiva che n1 n f () f (), e che f monotona: dunque possiamo concludere f n1 () f n () f ( f n1 ()) f ( f n ()), che e per denizione equivalente a quanto vogliamo dimostrare. Siamo dunque certi che il limite esiste, in quanto per la denizione di CPO che troviamo a pagina 38 una catena ha sempre un limite. Sulla base di questo, dimostriamo le due aermazioni 1. Dobbiamo dimostrare che x(f) un punto sso di f. Questo facilmente dimostrabile Per denizione abbiamo f ( f ix( f )) = f (
n

f ()

f ( f ()

...

f 0 (x) = x

f n ())

Visto che f continua possiamo riscrivere come f(


n

f n ()) =
n

f ( f n ()) =
n

f n+1 ()

3.2 Verso la teoria del punto sso

45

per il lemma 3.44 abbiamo che, essendo f n+1 () uguale a f n () dalla quale stato tolto il primo elemento, f n+1 () =
n n

f n () = f ix( f )

Riunendo le uguaglianze, abbiamo che f ( f ix( f )) = f ix( f ), e che dunque x(f) punto sso per f. 2. Assumiamo lesistenza di un punto d tale che f (d) d (d ovviamente un punto presso per f). Vogliamo dimostrare per induzione che f ix( f ) = i f n () d. Vediamolo per induzione.
Caso base banale: per denizione f 0 () = e Caso induttivo Al solito, assumiamo f n ()

d. d e dimostriamo f n+1 () per denizione

d. Anche questo passo semplice:

f n+1 () = f ( f n ()) f (d) d Ne concludiamo che x(f) minimo punto presso di f.

per la monotonia di f per ipotesi

Laermazione dunque completamente dimostrata: x(f) allo stesso tempo punto sso e minimo punto presso, quindi anche minimo punto sso.

La continuit della funzione e la presenza dellelemento nellinsieme sono necessari per la presenza del l f p. Dimostriamolo attraverso due esempi. Esempio 3.46 ( necessario) Prendiamo ({True,False},Identit), completo, ha monotonia, ha punti ssi. I punti ssi per sono due, nessuno minimo. Quindi necessaria la presenza dellelemento .

Esempio 3.47 (Continuit necessaria) Prendiamo come cpo {1 , 2 } con x e f: f (n) = n + 1 abbiamo che f non continua di = 1 Prendiamo la catena dei numeri primi 2 3 5 7 ... Il punto sso di f per denizione 2 ma f ix( f ) = f n ()) = =0 f () 1 f ( f ()) 2 ... . . . = 1 f( di ) = 2 f (di ) = 1 f (1 ) = 2 f (2 ) = 2

quindi non si riesce a raggiungere il punto sso con il metodo iterativo.

3.2.4. Il teorema di Tarski


Il teorema di Tarski da una dierente interpretazione del punto sso, trovandolo a partire da una funzione monotona (e NON necessariamente continua!) e da un reticolo completo.

46

Ordinamenti parziali e teorema del punto sso

Teorema 3.48 (Teorema di Tarski) Sia f una funzione monotona su un reticolo completo (D, ). Allora f ha un minimo punto sso e in particolare l f p( f ) = glb({x D| f (x) x})
Dimostrazione. Prendiamo X = {x D| f (x) x}, e prendiamo m = glb(X). x per denizione del glb. x f (m)

Preso un qualunque x X avremo ovviamente che m Per la monotonia di f avremo dunque che f (m) x. Quindi siamo sicuri che f (m) punti pressi. Per la monotonia di f, f (m) Ma ovviamente m

f (x), e visto che x X avremo che x X. f (x)

glb(X) = m, dunque m punto presso e per sua denizione il minimo dei m f ( f (m) f (m), il che implica che f (m) X e che dunque m f (m)

f (m) f (m)

m m = f (m):

Si conclude che m sia punto sso che minimo punto presso, ed dunque minimo punto sso.

Quindi abbiamo due risultati che garantiscono lesistenza del minimo punto sso: funzione monotona su CPO funziona continua su CPO Il primo garantisce solo lesistenza del l f p mentre il secondo ha ipotesi pi forti, e fornisce un metodo per calcolarlo.

3.3. Operatore delle conseguenze immediate


3.3.1. Loperatore R
Quanto visto in questo capitolo una branca importante della logica e della matematica, ma dobbiamo ancora vedere come possiamo applicare questi concetti al nostro campo di studi. Vediamo adesso unapplicazione che ci torner utilissima nei prossimi capitoli, dove vedremo la semantica denotazionale di IMP e gli altri linguaggi. Immaginiamo di avere un sistema di regole di inferenza, e si consideri come dominio nel quale operiamo linsieme delle formule ben formate F di questo sistema di regole. Se prendiamo linsieme 2F tutti i sottoinsiemi di F e la relazione di sottoinsieme, questi formano un CPO come visto nellesempio 3.29. Vogliamo mostrare che, una volta denito un particolare operatore su tale CPO, linsieme di teoremi IR di un certo insieme di regole R un punto sso di tale operatore. Questo operatore si chiama operatore delle conseguenze immediate, e lo andiamo a denire immediatamente. Denizione 3.49 (Operatore delle conseguenze immediate ( R)) Dati un insieme di regole R e un insieme B F , loperatore delle consegueze immediate denito come R(B) = y|(X /y ) R.X B

In altre parole, R(B) linsieme delle conseguenze immediate di B, cio delle formule ben formate che possibile dedurre dalle regole contenute nellinsieme B: una formula y appartiene a R(B) se appare come

3.3 Operatore delle conseguenze immediate

47

conseguenza in una regola della quale tutte le premesse sono contenute in B. Loperatore tenta di applicare tutte le regole nei possibili modi per derivare le conseguenze di B e sotto alcune condizioni ha punto sso. Immaginiamo adesso di costruire una successione di sottoinsiemi nel CPO che stiamo studiando cos denita il della catena linsieme vuoto ogni elemento della catena ottenuto applicando allelemento precedente R Guardando la sequenza di elementi della catena, notiamo che a qualunque passo otteniamo un sovrainsieme dellinsieme precedente. Dimostriamolo. Teorema 3.50 (Catena di applicazioni R()) Se costruisco una successione {Ai }i di sottoinsiemi di formule ben formate F , nella quale A0 = An+1 = R(An ) allora una catena sul CPO 2F ,

Dimostrazione. Dimostriamolo il primo punto per induzione: 1. Dobbiamo dimostrare che A0 A1 . facile farlo: A0 linsieme vuoto, quindi chiunque sia A1 sar sovrainsieme dellinseme vuoto. 2. Dobbiamo dimostrare che An An+1 o, in altre parole, y An y An+1 . Per ipotesi induttiva supponiamo che z An1 z An . Quindi, visto che y An X An1 . X /y R, avremo che X An1 An , e che dunque X An . Ma ovviamente questo, assieme allesistenza della regola X /y R, implicano che y debba essere presente anche in An+1 !

Cominciamo a studiare alcune propriet del nostro operatore R(B). Teorema 3.51 (Monotonia di R) monotono. Loperatore R
Dimostrazione. Facile dimostrarlo: se un dato y appartiene a R(B1 ) vuol dire che esiste una regola (X /y ) nellinsieme di regole R, e che X B1 . Ma questo signica che X B2 , e che y R(B2 ).

Teorema 3.52 (Continuit di R ) Se R un insieme di regole di inferenza in cui tutte le regole hanno un numero nito di premesse, loperatore R continuo.
Dimostrazione. Se R continuo, vuol dire che n R(Bn ) = R( n Bn )2 . Possiamo spezzare questa aermazione in due parti, sfruttando la propriet antisimmetrica. Dobbiamo dunque dimostrare che
2

notare che utilizziamo il simbolo per indicare il limite: essendo ogni catena composta da elementi uno sottoinsieme dellaltro, il limite della catena non altro che lunione di tutti i suoi elementi

48
1. 2. R(Bn ) R( R(Bn ) R( Bn ) Bn )

Ordinamenti parziali e teorema del punto sso

n n

n n

Vediamole separatamente. 1. Dobbiamo dimostrare che


n

R(Bn ) R(

Bn )

Prendiamo una generica catena {Bn } nel nostro insieme delle parti dellinsieme delle formule ben formate di R. Visto che il nostro insieme un CPO , questa catena avr lub che corrisponder al limite della catena stessa. Per denizione dunque avremo che Bn n Bn , e poich R monotona varr anche R(Bn ) R n Bn . n Bn come maggiorante. Visto che per denizione n R(Bn ) Anche questa sar una catena, che avr R per denizione il minimo dei maggioranti della catena, avremo sicuramente la formula da dimostrare come conseguenza. 2. Dobbiamo dimostrare che
n

R(Bn ) R(

Bn ). Questo equivalente a dire Bn ) y R(Bn )

y.y R(

Assumiamo la premessa. Se X un insieme nito possiamo fare poco. Ma possiamo vivere tranquillamente nellassunzione che X sia nito (e che dunque ogni regola abbia un numero nito di premesse): in questo caso k.X Bk , in caso contrario X non apparterrebbe neppure al limite! Ma allora y R(Bk ), e quindi siamo sicuri che y R(Bk ): questo signica ovviamente che y n R(Bn ), come volevasi dimostrare. Dalle due formule dimostrate, per la propriet di antisimmetria di possiamo concludere che i due insiemi sono uguali e che dunque R completa.

3.3.2. Punto sso di R


A questo punto, abbiamo tutti i tasselli. Abbiamo un ordinamento parziale con bottom sul quale stato denito un operatore continuo, quindi sono sicuro che questo operatore ha punto sso. In questo caso linsieme dei teoremi IR linsieme denito come IR =
i i IR

dove
0 IR = n+1 IR = y| def X n n /y R.X IR IR def

n In parole povere, IR contiene tutti i teoremi denibili tramite n derivazioni, ed IR contiene tutti i teoremi denibili. Vediamo adesso che I R punto sso di R.

Teorema 3.53 (Punto sso di R) Dato un insieme R, vale f ix(R) = IR


n n+1 n n n n Dimostrazione. facile vedere che IR = y| X /y R.X IR IR = R(IR ) IR = R(IR ). Quindi la successione n n IR la stessa vista nel teorema 3.50. Essendo R una funzione completa su un CPO , per il teorema del punto sso abbiamo

f ixR =
n

Sn =
n

n IR = IR

3.3 Operatore delle conseguenze immediate


dove S n = Rn () S0 = = R(S n )

49

n+1

Mostriamo prima che S n+1 S n per induzione matematica 0) S 1 n) S n+1 S n S n+2 S n+1 per monotonia di R. Vogliamo ora mostrare per induzione matematica che
n S n = IR ?

0) In 0 sono entrambe . n) Dobbiamo mostrare che


n IR = S n

n+1 IR = S n+1

Assumiamo la premessa e usiamo il risultato della precedente dimostrazione


n+1 n n IR = R(IR ) IR = R(S n ) S n

= S n+1 S n = S n+1

Da cui abbiamo che


n n.S n = IR

quindi IR =
n IR = n n def S n = f ix(R)

Esempio 3.54 (Insieme di regole con R non continuo) P(1) P(x) P(x + 1) x dispari P(x) P(0)

Notare che la terza regola ha innite premesse. Qui non vero che {Bn }n n R(Bw ) = R(n Bn ) Scegliamo la catena di tutti i numeri dispari {P(1)} {P(1), P(3)} {P(1), P(3), P(5)} . . .

Abbiamo costruito una catena che buona nellordinamento che abbiamo. Se vado a vedere R nel generico elemento della sequenza, ossia R(S i ) Si R(S 1 ) {P(1)} {P(1), P(2)} {P(1), P(3)} {P(1), P(2), P(4)} S i = {P(1), P(3), P(5), . . .} R(S i ) = {P(1), P(2), P(4), . . .} {P(1), P(3), P(5)} {P(1), P(2), P(4), P(6)}

50

Ordinamenti parziali e teorema del punto sso

R(

S i ) = {P(1), P(2), P(4) . . . P(0) }


3a regola

La terza regola di applica solo quando sono presenti tutti i dispari, cio al limite. Non continua. R() . . . {} {P(1)} {P(1), P(2)} . . . f ix(R) =
n

Rn () = {P(1), P(2), . . .}

R( f ix(R)) = {P(0), P(1), P(2) . . .} Il teorema del punto sso non vale perch facendo f ix(R) non troviamo il punto sso, che invece R( f ix(R)).

Esempio 3.55 (Stringhe di una grammatica) Grammatica S::= lambda | (S) | SS S0 = S 1 = + () + = S 2 = + () + = + () S 3 = + () + (()) + ()()

4. Semantica denotazionale di IMP


Denire la semantica di un linguaggio di programmazione un lavoro che pu essere svolto in maniere completamente dierenti fra di loro. Introduciamo adesso un secondo formalismo per denire la semantica del nostro linguaggio IMP: la semantica denotazionale. Se la semantica operazionale un formalismo che concettualmente si avvicina al concetto di interprete, in quanto prende in ingresso un programma ed uno stato e restituisce il risultato della computazione su tale stato, la semantica denotazionale si avvicina pi al concetto di compilatore. Infatti, prende in ingresso il solo programma e restituisce una funzione (ovvero un programma scritto in un altro formalismo) che prende in ingresso lo stato iniziale e restituisce lo stato nale. Per farlo, ci servir un metalinguaggio nel quale esprimere questa funzione. Questo linguaggio il -calcolo, che deniremo nella sezione 5.1.1.

4.1. Semantica denotazionale di IMP


Come abbiamo visto nellintroduzione, la semantica una funzione che prende un programma e ne restituisce il signicato, o denotazione. Abbiamo anche visto che la semantica operazionale lega linterpretazione ad uno stato che deve essere fornito assieme al programma mentre la semantica denotazionale fornisce una funzione alla quale si passa lo stato per vedersi fornire un risultato. La nostra semantica per IMP sar in realt divisa in tre funzioni separate, una per ogni categoria sintattica di IMP. Avremo dunque le funzioni A : Aexpr N che prende in ingresso unespressione aritmetica e restituisce una funzione da stati ad interi B : Bexpr B che prende in ingresso unespressione booleana e restituisce una funzione da stati a boolean C : Com oppure Com funzione da stati a stati Vediamo separatamente queste tre funzioni. , che prende in ingresso un comando e restituisce una

4.1.1. Funzione A
Vogliamo denire la funzione di interpretazione semantica relativa alle espressioni aritmetiche A : Aexpr N La deniremo per ricorsione strutturale, lavorando come nel caso della semantica operazionale sulla struttura della grammatica che denisce le espressioni in Aexpr. Vediamo la notazione. Notazione Nellespressione A n = .n abbiamo che A , come detto precedentemente, una funzione Aexpr N n una generica Aexpr. In generale dentro le parentesi e andranno espressioni in Aexpr

52 A n una funzione N, cos come .n

Semantica denotazionale di IMP

la notazione A n indicher lapplicazione di A n allargomento , ottenendo ovviamente un elemento di N. Solitamente utilizzeremo uguaglianze del tipo A n =n per evitarci di scrivere ogni volta il allinizio dellespressione, anche se formalmente sarebbe pi corretto scrivere A n = .n Possiamo passare a denire le regole per A .
Costanti Per le costanti la regola semplicissima.

A n =n La semantica di una costante n semplicemente il corrispondente valore numerico.


Variabili Per le variabili la regola ancora banale.

A x = x Si tratta dellapplicazione della funzione ambiente, che ricordiamo essere una funzione da identicatori a valori numerici, allidenticatore x.
Espressioni binarie Per le espressioni binarie la regola dice

A a0 + a1 = A a0 +A a1 Stesso discorso possiamo fare per sottrazione e moltiplicazione. Abbiamo dunque dato la denizione di A per ricorsione strutturale.

4.1.2. Funzione B
La funzione B sostanzialmente analoga alla precedente, ad eccezione ovviamente del tipo di dato restituito che B invece che N. I discorsi fatti sui tipi delle espressioni in gioco sono analoghi a quelli fatti precedentemente, cos come le regole di transizione. Vediamo solo brevemente, per curiosit, lunica che si distacca leggermente da quanto visto con A . B b = b Al solito, i due sono simboli uguali ma hanno un signicato dierente.

4.1.3. Funzione C
La funzione C , al solito, si dierenzia abbastanza dallaltra gamma di funzioni. Se come sempre abbiamo i comandi banali come C skip = C x := a =
A a

/x

che si risolvono facilmente, le cose possono facilmente complicarsi in questo caso. C c1 ; c2 = C c2 (C c1 )

4.1 Semantica denotazionale di IMP

53

Se la valutazione di C c1 restituisce la situazione diventa complessa: come comportarsi in caso di computazioni che non terminano?. Tuttavia facile trovare una soluzione. Basta denire, a partire da una qualunque funzione f : una funzione f : tale che f (x) = f (x) se x = altrimenti

In pratica, se una funzione interna restituisce anche tutte le funzioni che utilizzeranno lo stato da essa prodotto restituiranno . Nella sequenzializzazione di comandi lespressione C c1 , eseguita per prima, che potrebbe non terminare. La versione riveduta della concatenazione dunque C c1 ; c2 = C c2

(C c1 )

Torniamo alla semantica. La regola per gestire lif ancora pi semplice di quella operazionale. C if b then c1 else c2 = B b C c1 , C c2 Si utilizza pari pari il costrutto di -calcolo che modella il condizionale. Passiamo allunico caso complesso, cio il while. Una denizione immediata ma scorretta! sarebbe C while b do c = B b C while b do c

(C c ) ,

Ricordiamo che vogliamo dare la semantica denotazionale per ricorsione strutturale, in modo da ottenere la propriet di composizionalit: ogni comando deve essere costruito dalla denotazioni dei suoi immediati sottocomandi. Vediamo come questa denizione non ne segua i principi in quanto nella parte destra abbiamo il termine stesso. La propriet di composizionalit quindi non presente nella semantica operazionale dove infatti la regola del while viene trattata facendone lunfolding e dove il while riappare nelle premesse. Ritornando al paragone della semantica denotazionale con un compilatore vediamo come questo approccio non sia possibile perch nella traduzione del programma saremmo costretti ad eseguirlo senza una memoria di partenza. Per risolvere il problema ci viene in aiuto il concetto di punto sso. Prima di tutto riscriviamo la formula esplicitando il fatto che lo stato un parametro della funzione -calcolo C while b do c = .B b C w A questo punto deniamo una funzione cos tipata = . . B b (C c ),
( )

(C c ) ,

La funzione dunque una funzione ( ) , della quale dobbiamo cercare, ammesso che esista, un punto sso. Naturalmente si pu dimostrare che la continua. Questa una denizione valida: la semantica del while dunque la minima che soddisfa = e cio il minimo punto sso della funzione . C while b do c = f ix con f ix = n ( f. fn ())

54

Semantica denotazionale di IMP

Esempio 4.1 (Semantica denotazionale di un comando) Consideriamo il comando w = while true do skip e calcoliamone la semantica. C w = x dove = B true C skip , = C skip = =

Abbiamo dunque una situazione in cui deve valere = , cio lidentit. La formula vale per qualunque : per questo che consideriamo il minimo punto sso, che nelloccasione ovviamente la funzione ovunque indenita . In eetti, la semantica della funzione proprio questa: la funzione ovunque indenita, cio per qualunque memoria in input il programma non termina.

Vediamo quel che abbiamo appena visto in via teorica. Dobbiamo appoggiarci alla teoria del punto sso. Il nostro dominio ( , ). Abbiamo gi visto nellesempio 3.30 che, considerando le funzioni come coppie in un insieme F ((a, b) F f (a) = b), questo ordinamento parziale completo ha un bottom Se dimostriamo che monotona e continua, abbiamo anche dimostrato che ha minimo punto sso. Per dimostrarlo, ci conviene considerarla come funzione parziale : In questo modo possiamo vedere : con le regole di inferenza B b

come insieme di coppie , . Rappresentiamo la relazione

C c

B b

Se consideriamo B e C date, e costruiamo le regole su tali funzioni, otterremo un insieme di regole di inferenza innito in cui ciascuna regola ha un numero nito di premesse. Quindi per il teorema di Kleene possiamo concludere che R , cio linsieme delle conseguenze immediate di R , monotono e continuo, e che dunque R ha minimo punto sso.

4.2. Equivalenza fra semantica operazionale e semantica denotazionale


Passiamo adesso a vedere come si dimostra lequivalenza fra le due semantiche che abbiamo dato per IMP. Il punto di partenza sono due cose fondamentalmente diverse fra di loro: da una parte abbiamo una manciata di formule del tipo e, x v, che valutano una certa espressione e in uno stato e fanno corrispondere un valore v. Dallaltra abbiamo funzioni che vanno dal dominio sintattico di riferimento ad una funzione che prende lo stato e restituisce un risultato. I due oggetti sono sensibilmente dierenti, e dimostrarne lequivalenza ci porta ad una dimostrazione piuttosto insidiosa. Vediamo come si dimostra nei tre domini.

4.2 Equivalenza fra semantica operazionale e semantica denotazionale

55

4.2.1. Dimostrazione per A e B


I due domini sintattici delle espressioni aritmetiche e booleane sono domini sui quali la nostra valutazione semantica va sempre a buon ne. Quindi possiamo limitarci a dimostrare la seguente propriet. P(a) = a, A a
def

a Aexpr

In pratica, vogliamo dimostrare che la valutazione dellespressione aritmetica a nella memoria con la semantica denotazionale restituirebbe esattamente il valore restituito dallapplicazione della semantica denotazionale di a alla stessa memoria . Tornando alla metafora che vede la semantica operazionale come uninterprete e la semantica denotazionale come un compilatore, si controlla che lesecuzione dellinterprete dia lo stesso risultato dellesecuzione del programma compilato. La prova fatta banalmente per induzione strutturale. Vediamo alcune dimostrazioni.
Costanti Si dimostra facilmente mediante lapplicazione della semantica denotazionale che

P(n) = n, A n = n, n
Variabili Si dimostra facilmente mediante lapplicazione della semantica denotazionale che

def

P(x) = x, A x = x, x
Espressioni binarie In espressioni del tipo a0 a1 , dove un generico operatore che corrisponde

def

alloperatore vero , per linduzione strutturale possiamo assumere P(a0 ) = a0 , n0 e P(a1 ) = a1 , n1 . Con queste premesse possiamo asserire che P(a0 a1 ) = a0 a1 , A a0 a1 = a0 a1 , A a0 A a1 = a0 a1 , a0 a1
def

Ovviamente il discorso sulle espressioni rimanenti perfettamente analogo: tutte le espressioni binarie si dimostrano nella stessa maniera.

4.2.2. Dimostrazioni per C


Il discorso per il dominio dei comandi leggermente pi complesso: un comando potrebbe non terminare. Fare una dimostrazione come quella precedente signicherebbe solo che i due valori sono uguali, ma non assicurerebbe niente nel caso in cui un comando non termini. Noi vogliamo che se un comando c termina in semantica operazionale, termini in semantica denotazionale con lo stesso output se un comando c non termina in semantica operazionale, non termini neppure in semantica denotazionale. Per farlo, occorre fare due dimostrazioni separate: dobbiamo dimostrare P ( c, ) = C c = , ovvero che il fatto che la semantica operazionale sul comando c con la memoria restituisca una memoria implica che questultimo debba essere risultato della semantica denotazionale applicata a . P (c) = C c = c, , ovvero il contrario Facendo questo siamo sicuri di aver dimostrato la doppia implicazione.
def def

56
4.2.2.1. Dalla semantica operazionale alla denotazionale

Semantica denotazionale di IMP

Per questa prima dimostrazione, dovendo dimostrare propriet di una regola, procediamo ovviamente per induzione sulle regole. Prenderemo dunque una regola, assumeremo valida la propriet sulle premesse e dimostreremo la conseguenza in base a quanto assunto. Le dimostrazioni seguiranno questo schema. Prenderemo la regola della semantica operazionale che ha come conseguenza il costrutto sul quale lavoriamo Assumiamo vera la propriet per le conseguenze Utilizziamo la semantica denotazionale dei sotto-costrutti, che otterremo convertendo le conseguenze, per dimostrare quanto vogliamo dimostrare.
Assegnamento

Prendiamo la regola dellassegnamento.

a, m x a,
m

/x
def

Dobbiamo considerare gi dimostrato (come fatto tra laltro nella sezione scorsa) che P( a, m) = A a = m. Vediamo brevemente che P x a,
m

/x

def

= C x

a =

A a

/x =

/x

che dimostra quel che volevamo dimostrare.


Concatenazione

Prendiamo la regola della concatenazione c1 ,

c0 ,

c0 ; c1 , Questa volta dobbiamo assumere che valgano P ( c0 , ) = C c0 = e lanaloga P ( c1 , Vediamo che P c0 ; c1 , come volevasi dimostrare.
Condizionale
def def

).

= C c0 ; c1 = C c0 ; c1

(C c0 ; c1 ) = C c0 ; c1

Il condizionale al solito diviso in due regole assolutamente speculari: la dimostrazione la stessa per luna o per laltra regola. Dimostriamo la regola con la guardia vera. b, true c0 ,

if b then c0 else c1 , Assumiamo la validit di P( b, true) = B b = true e P ( c0 , ) = C c0 = . Vediamo che


def def def

P if b then c0 else c1 , come volevasi dimostrare.

= C if b then c0 else c1 = B b C c0 , C c1 = C c0 =

4.2 Equivalenza fra semantica operazionale e semantica denotazionale


Iterazione

57

Il while va suddiviso nei suoi due casi, abbastanza dierenti fra di loro, ma prima facciamo un ragionamento preliminare. Sappiamo che C while b do c = f ix() con = ..B b (C c ) , . Essendo la nostra semantica un punto sso, deve valere la relazione C while b do c = C while b do c = .B b C while b do c

(C c ) ,

Notare che questa non una denizione della semantica del while, bens solamente una sua propriet in quanto non denisce univocamente la semantica. Questa propriet diventer vera al momento dellesecuzione, motivo per cui non pu essere utilizzata per denire la semantica. Ma torniamo alla dimostrazione. Partiamo dal caso in cui la guardia falsa. b, false while b do c, Al solito assumiamo P( b, false) = B b = false, e dimostriamo P ( while b do c, ). La formula ricavata sopra diventa semplicemente B b C while b do c in quanto B b falso per ipotesi. Nel caso in cui la guardia sia vera abbiamo b, true c, while b do c,
def

(C c ) , =

while b do c, Possiamo assumere la propriet valida sulle premesse: P( b, true) = B b = true P( c, ) = C c = P( while b do c, ) = C while b do c =

Riprendiamo la nostra riscrittura della regola del while. B b C while b do c

(C c ) , =

C while b do c

(C c ) =

C while b do c =

Notare che lasterisco pu essere tolto dal momento che siamo sicuri che il comando verr eseguito su una memoria e non su . La formula dunque dimostrata anche in questo caso: possiamo essere sicuri che anche per il while le due semantiche sono esattamente equivalenti.
4.2.2.2. Dalla semantica denotazionale alla operazionale

Per dimostrare nel senso inverso, utilizziamo invece uninduzione strutturale. Per ogni produzione c dei comandi, dimostreremo def P(c) = C c = c,

58

Semantica denotazionale di IMP

cio che se la semantica denotazionale di c restituisce allora anche loperazionale su c deve fare la stessa cosa. Come prima, dimostriamolo per ogni categoria sintattica. La tecnica generale di dimostrazione sar la seguente: assumeremo la premessa dellimplicazione, e la scomporremo in aermazioni pi semplici vedremo che queste aermazioni pi semplici corrispondono, per ipotesi induttiva, a formule ben formate della semantica operazionale utilizzeremo queste formule ben formate come premesse per dimostrare la conseguenza cercata

Skip

Dobbiamo dimostrare P(skip) = C skip = skip,

Per dimostrare limplicazione, assumiamo vera lipotesi C skip = : viene immediato dimostrare che skip, per denizione. Abbiamo dunque facilmente dimostrato il fatto.

Assegnamento

Dobbiamo dimostrare P(x a) = C x a = x a,

Assumiamo ancora vera lipotesi, e dimostriamo la conseguenza. Per denizione, = [n / x ] dove A a = n. Questo implica a, n, che pu essere utilizzato come premessa della regola x a, [n / x ] che la formula che vogliamo dimostrare.

Concatenazione

Dobbiamo dimostrare P(c1 ; c2 ) = C c1 ; c2 = c1 ; c2 ,

Al solito, assumiamo vera lipotesi. Sappiamo che C c1 ; c2 = C c2 (C c1 ) = . Visto che abbiamo supposto che la computazione termini, possiamo eliminare lasterisco dalla seconda applicazione e prendere C c1 = e C c2 = , che implicano rispettivamente c1 , e c2 , . Queste sono proprio le premesse della regola operazionale della concatenazione, che ci permettono di concludere c1 ; c2 , , come volevasi dimostrare.

Condizionale

Dobbiamo dimostrare

P(if b do c1 else c2 ) = C if b do c1 else c2 = if b do c1 else c2 , Al solito, abbiamo due casi perfettamente speculari. Ci limitiamo a dare la dimostrazione per il caso in cui la guardia sia falsa. Assumiamo la premessa. Vale dunque C if b do c1 else c2 = = B b C c1 , C c2 = C c2 = , in quanto B b = false. Per B b = false b, false e C c2 = c2 , , che sono la premessa di if b do c1 else c2 , in semantica operazionale, come volevasi dimostrare.

4.3 Dimostrare propriet con la semantica denotazionale


Iterazione

59

Dobbiamo dimostrare P(while b do c) = C while b do c = while b do c,

Vediamo di trasformarla in una forma pi comoda. Il problema che nella forma classica, che utilizza il punto sso, non sono esplicitate le iterazioni, che al contrario sono esplicitate nella semantica operazionale. Abbiamo che C while b do c = f ix = n = while b do c, while b do c, while b do c, while b do c,

n.n =

Su questultima denizione possiamo applicare unulteriore induzione matematica sopra linduzione strutturale che stiamo gi eseguendo. Linduzione matematica ci assicurer la validit della propriet P per tutte le iterazioni precedenti del while, linduzione strutturale si occuper come sempre di assicurare tale validit per il resto. Procediamo con linduzione matematica.
P(0) Banalmente abbiamo

= while b do c, che sempre vera in quanto la parte destra dellimplicazione sempre falsa (x.x = )
P(n) P(n+1) Assumiamo come vera A(n) = n =
def

while b do c, , e dimostriamo A(n + 1) = = while b do c, . Al solito, assumiamo la premessa: questa n ) = , ovvero pu essere riscritta come ( n+1 B b n (C c ) , =

def

Vediamo adesso i due casi in cui b corrisponde a true o false. Se B b = false, abbiamo = . Ma possiamo assumere per lipotesi dellinduzione strutturale che b, false, che proprio la premessa della regola while b do c, : esattamente quel che volevamo dimostrare! Se B b = true, dobbiamo rieseguire il while: abbiamo = (n ) (C c ). Al solito, possiamo togliere lasterisco in quanto siamo sicuri che tutto converge ad un e non c bisogno di considerare il caso . Possiamo dunque dire che C c = e dedurre, grazie allipotesi dellinduzione strutturale, che c, . Inoltre, possiamo sempre per linduzione strutturale dedurre che b, true. A questo punto, interviene linduzione matematica: sappiamo che vale A(n) = n = while b do c, . Abbiamo dedotto dunque le tre premesse della regola del while vero, e possiamo considerarne vera la conseguenza.

4.3. Dimostrare propriet con la semantica denotazionale


Per dimostrare le propriet della semantica denotazionale abbiamo bisogno in generale di poter provare queste propriet per i punti ssi, e in particolare vogliamo poter studiare i funzionali attraverso i quali arriviamo a questi punti ssi.

60

Semantica denotazionale di IMP

Denizione 4.2 (Induzione computazionale) Linduzione computazionale aerma che P inclusivo P d D.d P = F(d) P

f ix(F) P
Dimostrazione. Dalle ipotesi abbiamo che P e inoltre F() P da cui per induzione matematica n F n () P. Le approssimazioni di F, come noto, formano una catena, il cui limite x F n () = f ix(F) P per linclusivit (3.22) di P.

Esempio 4.3 (Esempio) [Applicazione induzione computazionale 1] C while b do c = = while b do c, Dobbiamo dimostrare che ( con = B b (C c ), Deniamo allora questa propriet del funzionale P() = .( = = while b do c, ) Cio allapprossimazione anche loperazionale va da . Se il limite n appartiene ancora a questa propriet, la dimostrazione fatta. Per farlo vogliamo usare linduzione computazionale e quindi dobbiamo avere un CPO, che il , dove sono denite le . una funzione monotona continua : ( . ) ( ) linsieme P in cui vale la nostra propriet deve essere inclusivo Mostriamo lultimo punto, linclusivit di P i i = = while b do c, ) = ( =
? def

n ) = = while b do c,

i ) = = while b do c,

Assumiamo le premesse globali, e assumiamo la premessa della seconda parte. Rimane da dimostrare while b do c, Nel nostro ordimanento, se ( ) = , allora esiste un particolare k tale che, k = , cio la propriet vale da quel k in poi, ma abbiamo assunto che i e quindi P inclusivo. Possiamo quindi possiamo utilizzare nalmente linduzione computazionale. Dimostriamo che tutte le premessa sono vericate i = = while b do c
?

4.3 Dimostrare propriet con la semantica denotazionale

61

P cio P() Deve essere

= = while b do c, = Ma non pu essere uguale a , quindi la propriet rispettata. d D.d P = F(d) P cio P() = P() = Riscriviamola ancora come , Assumiamo la premessa P() = = = while b do c , Caso false B b = false Caso true B b = true La stella si pu buttare. (C c ) =
?

B b (C c ), = = while b do c, =

(C c ) =

quelle che resta = e abbiamo c, while b do c, s B b = true allora while b do c, ====PEER REVIEW========= Esempio 4.4 (Applicazione induzione computazionale 2) C while x Abbiamo che: C w = f ix()
def

0 do x := x 1 = = x 0 = [0 / x ] = x 0 [x1 / x ],

Sappiamo che un CPO e che monotona, continua. Riscriviamo la propriet: P() = .( = = x = [0 / x ]) Dobbiamo dimostrare linclusivit di i. i = = x 0 = [0 / x ] = = = . ( =
i i )

= = x 0 = [0 / x ] =

62

Semantica denotazionale di IMP

Assumiamo le due premesse e dimostriamo x 0 e = [0 / x ]. Abbiamo che i. i = = x 0 = [0 / x ] i =

Allora visto che vale al limite, vale anche a partire da un certo k k.k = e quindi le due implicazioni valgono da quel k no al limite. Possiamo utilizzare linduzione computazionale P()
?

ovvio, =

P() = P() = Assumiamo .( = = x 0 ; = [0 / x ]) = P() Dimostriamo Assumiamo x Primo caso: x = 0 visto che x = 0 allora x 0 Secondo caso: x 0 [x1 / x ] =

= = x ? 0 = [0 / x ] 0 [x1 / x ], = x 0 = [0 / x ]

ho assunto P() Abbiamo allora

, assumiamola in particolare per [x1 / x ]x 0 x 1 0 = [


x1 0 0

x 1

/ x ][ / x ] = [ / x ]

Visto che P vale anche per il limite allora vale anche per la semantica del while.

Parte II.

Il linguaggio HOFL

5. Sintassi e semantica operazionale di HOFL


5.1. -calcolo
Introduciamo il -calcolo non tipato, un formalismo introdotto da Alonzo Church negli anni 30 come linguaggio formale per la denizione e applicazione di funzioni con ricorsione. Il -calcolo possiede unespressivit equivalente a quella delle macchine di Turing.

5.1.1. -calcolo non tipato


Diamo per prima cosa la grammatica del termine t, unica categoria sintattica del linguaggio. t ::= x | x.t | t1 t2 | c | t0 t1 , t2

In questa denizione viene descritto il termine come unione di variabili x astrazione di una funione t con parametro formale x applicazione della funzione restituita da un termine t1 su un argomento restituito dal termine t2 costante c comando condizionale che valuta t0 e se vero esegue t1 se falso esegue t2 Diamo alcune denizioni utili. Denizione 5.1 (Variabili libere) Deniamo insieme delle variabili libere in un termine linsieme cos costituito: fv (x) = {x} fv (x.t) = fv (t) \ {x} fv (t1 t2 ) = fv (t1 ) fv (t2 ) Linsieme delle variabili libere linsieme delle variabili che compaiono allinterno di unespressione senza essere legate da un . Passiamo alloperazione di sostituzione. Denizione 5.2 (Sostituzione) Loperazione di sostituzione cos denita:
costante c t / x = c variabile x t / x = t applicazione (t1 t2 ) t / x = t1 t / x t2 t / x astrazione (x.t)
t1 / y

se c

= x.t

t1 /

se e solo se y

xex

fv (t1 )

66

Sintassi e semantica operazionale di HOFL

Per non incappare nelle condizioni della quarta regola, possiamo utilizzare loperazione di -conversione, che permette sostanzialmente di cambiare il nome di una variabile. Vediamola formalmente. Denizione 5.3 (-conversione) x.t = y.t [y / x ] se y fv (t)

Se y non una variabile libera allinterno di un termine t possiamo sostituire y a tutte le occorrenze di x. In questo caso y viene detta una variabile fresh e partiamo dal presupposto che esistano innite variabili e quindi sempre possibile sceglierne una fresh. Proprio per la natura intuitiva di questa operazione, in generale due termini vengono considerati uguali a meno di -conversione. Loperazione di -conversione invece unoperazione che corrisponde al passaggio di parametri: allapplicazione di una funzione su un argomento, sostituisce allinterno del corpo della funzione tutte le occorrenze del parametro formale con il valore dellargomento. Denizione 5.4 (-conversione (copy-rule o -reduction)) (x.t1 ) t2 = t1 [t2 / x ]

5.1.2. -calcolo semplicemente tipato


Il -calcolo semplicemente tipato unestensione del -calcolo non tipato, visto precedentemente, a cui viene aggiunto un semplice sistema di tipi: partendo da una base di tipi B (nel caso di HOFL B = {int}) e dal tipo funzione ogni termine ha un tipo =|T conT B

Questo tipaggio viene detto semplice perch ogni termine ha esattamente un tipo mentre esistono tipaggi che prevedono tipi polimor o tipi dipendenti. Il -calcolo semplicemente tipato ha la propriet di essere strongly normalizing e cio termini ben tipati si riducono sempre ad un valore (o forma normale). Questo si verica perch la ricorsione non ammessa dal sistema di tipi. In particolare non possibile tipare il looping term I = x. x x loperatore di punto sso, una funzione che calcola il punto sso di un altra funzione. Questo implica che un calcolo termina sempre e quindi il formalismo non Turing equivalente.

Esempio 5.5 (looping term) Il seguente termine viene detto looping term perch se applicato a se stesso cicla innitamente: I = x. II = (x. x x x x x) = II

x)(x.

per questo termine la semplicazione per -conversione non termina. Nel -calcolo semplicemente tipato la tipizzazione di questo termine fallisce con occur-check, per tiparlo correttamente infatti necessario che un termine acquisti due tipi dierenti contemporaneamente, cosa possibile solo in un sistema di tipi polimorfo.

5.2 HOFL

67

Questo un esempio articioso per mostrare che il -calcolo non tipato permette computazioni innite. Vediamone uno pi signicativo.

Esempio 5.6 (Y combinator) Un x point combinator o Y combinator una funzione di ordine superiore che pu calcolare il punto sso di una funzione, vediamo quello proposto da Haskell Curry per il -calcolo non tipato: Y = f. (x. f (x x))(x. f (x x)) Questo termine non tipabile nel -calcolo semplicemente tipato per le stessi ragioni del precedente.

5.2. HOFL
HOFL (High Order Functional Language) un linguaggio funzionale di ordine superiore, lazy, call-by-name, ed sostanzialmente una variante del -calcolo semplicemente tipato, con alcune operazioni sugli interi e la possibilit di denire funzioni ricorsive. In IMP si potevano interpretare come tipi le 3 categorie sintattiche: A exp, Bexp, C om. In HOFL al contrario abbiamo una sola categoria sintattica, il termine, che pu essere tipato in diversi modi: abbiamo dei costruttori di tipo che deniscono un dominio come: Prodotto Cartesiano di 2 domini D E Funzioni tra 2 domini D E Come vedremo nella sezione 6.1, questo porter alla necessit di estendere la nostra teoria dei domini in modo da farle costruire un dominio adatto al nostro tipo qualunque esso sia, e questo dovuto al fatto che possiamo generare inniti tipi dierenti.

5.2.1. Sintassi
Vediamo la sintassi del nostro linguaggio HOFL. Abbiamo due categorie: quella dei tipi e quella del linguaggio. La categoria dei tipi indica come costruire un qualunque tipo. := int | 1 2 | 1 2

Abbiamo che un tipo pu essere un intero, un prodotto di due tipi o una funzione da tipo a tipo. Esempi di tipo validi possono essere int > int, (int int) (int int), int ((int int) int) e via dicendo. Passiamo invece al linguaggio vero e proprio. Diamo qua una cosiddetta pre-sintassi: pu denire anche strutture non valide in quanto contenenti errori di tipo. Vedremo a breve cosa questo signichi. t :: x | n | t1 + t2 | t1 t2 | t1 t2 | if t then t1 else t2 | (t1 , t2 ) | fst(t) | snd(t) | x.t | (t1 t2 ) | rec x.t variabile costante operazioni aritmetiche condizionale operazioni su coppie denizione e applicazione di funzione funzioni ricorsive

Nel costrutto if il test ha successo con 0. In HOFL una variabile di tipo che corrisponde ad uno e un solo tipo ben preciso, mentre in altri linguaggi possibile utilizzare tipi polimor.

68

Sintassi e semantica operazionale di HOFL

5.2.2. Regole di inferenza di tipi


Le regole di inferenza dei tipi servono a vericare che un termine sintatticamente corretto, abbia eettivamente senso, e permettono quindi di evitare espressioni erronee come 3 + x. 3 che infatti risulta non tipabile. Le variabili x del linguaggio sono tipate e il tipo dato dalla funzione type.
Variabili

x : type(x) = x

Operazioni

n : int

t1 : int

t2 : int

t0 : int

t1 : t2 :

t1 op t2 : int

if t0 then t1 else t2 :

con op = +, -, x

Prodotti

t1 : 1

t 2 : 2

t : 1 2 fst(t) : 1

t : 1 2 snd(t) : 2

(t1 , t2 ) : (1 2 )
Funzioni

x : 1

t : 2

t1 : 1 2 (t1 t2 ) : 2

t 2 : 1

x.t : 1 2
Rec

x: t: rec x.t :

5.2.3. Problema della tipizzazione


5.2.3.1. Tipizzazione alla Church

Per ogni variabile necessario indicare il corrispondente tipo. I tipi vengono dedotti per ricorsione strutturale, perch dato il tipo dei sottotermini, esiste una e una sola regola per derivare il tipo di un termine. Vediamo ad esempio il fattoriale: fact(x) = if x=0 then 1 else x X fact(x-1)

Esempio 5.7 (Programma tipabile (Church)) Sia x intero, f funzione da intero ad intero. Allora deduciamo i tipi fact = rec
def

f
intint

. x . if x then 1 else x ( f ( x 1 ))
int int int intint int int int intint int

: int int

5.2 HOFL
5.2.3.2. Tipizzazione alla Curry

69

Viene utilizzata nei linguaggi funzionali. Inferisce il tipo di termini non tipati, il programmatore in generale sollevato dal problema ma pu intervenire. x : : pu essere di qualunque tipo (x y) invece non so il tipo preciso ma so che ( x y ) : 2

1 2 2

Esempio 5.8 (Programma non tipabile (Curry)) fact(x) = f ( f, x)


def

where

f (g, x) = if x = 0 then 1 else x g(g, x 1)

def

Questa denizione del fattoriale non ricorsiva! Pu essere scritta in un linguaggio come Algol, mentre non tipabile in HOFL: Riscriviamola in HOFL def fact = x.( f ( f, x)) f = y. if snd(y) then 1 else snd(y) (fst(y) (fst(y), snd( y ) 1 )
t1 :1 t0 :0 t2 :2 t4 :4 t5 :5 t6 :6 t3 :3 def

Abbiamo tipato solo la parte nale perch quella problematica. 1 : 3 y : 0 fst(y) : 1 snd(y) : 2 snd(y) 1 : 4 (fst(y), snd(y) 1) : 5 (fst(y)(fst(y), snd(y) 1)) : 6 Ricaviamo un sistema di equazioni Problema di unicazione. 1) Se ho x = x con x varaibile, sempre vera e la posso cancellare. 2) f (t1 , . . . , tn ) = f (t1 , . . . , tm ) Se f f , non mai possibile unicarle, quindi posso non guardare i termini ti . Se f = f allora m = n perch un costruttore ha una sola arit, e allora bisogna avere 1 = 1 , 2 = 2 , . . . , n = n 0 0 2 3 4 5 1 = 1 7 = 8 2 = int = int = int = 1 4 = 5 6 3 : int 0 0 4 5 1 = 1 7 = 8 2 = int; 2 = int; 3 = int = 1 4 = 5 6

70

Sintassi e semantica operazionale di HOFL 3) x = t si sostituisce ogni occorrenza di x con t. Cosa succede se x = t(x)? Non possibile unicare. Perch quando sostituisco invece di eliminare la variabile, la ritrovo in un termine pi complesso, e questo processo non ha soluzione.

Riassumendo nellalgoritmo di unicazione 1) eliminare x = x 2) ridurre f (x) = f (y) x = y 3) sostituire x = f (y) x FV(y) in tutte le altre occorrenze

Lordine col quale si risolvono le equazioni non cambia il risultato, ma pu rendere il calcolo lineare con la dimensione del sistema. Ma 1 = (1 int) 6 non pu essere risolta, in quanto si ricade nel 3o caso (self-dependency): 1 argomento di se stessa. Laltezza dellalbero generato innita. 0 0 2 3 4 5 1 0 8 7 1 5 = 1 7 = 8 2 0 = 1 7 0 = 1 7 = int = int int = 0 8 1 7 = int 8 1 = 5 6 1 = 5 6 = int = int = int 5 1 5 1 = 1 4 = 5 6 = 1 7 0 = 1 int 0 = 1 int = 1 = int 1 = 5 6 1 = (1 int) 6 = int = int = 5 6 5 1 5 1 = 1 int

Esempio 5.9 (Programma non tipabile) Un altro esempio interessante di termine non tipabile, la lista innita dei numeri pari (t, 0) con t = rec P.x.(x(P(x + 2))) = t In realt si tratta di una lista di liste (0, (2, (4, (6 . . . TODO scrivere bene passaggi da appunti montanari.

5.2.4. Sostituzione
Deniamo la sostituzione per ricorsione strutturale su tutti i costrutti.

5.3 Semantica operazionale di HOFL

71

x[t / x ] = t y[t / x ] = y n[ / x ] = n
t

y idem per , , if then else, fst, snd si usa la prima con tale propriet

(t1 + t2 )[t / x ] = t1 [t / x ] + [t / x ] (x.t)[t /y ] =

(x t) x ricavabile z.t[z / x ][t /y ] z FV(x.t), FV(t )

TODO: sistemare il rec, non si capisce che intende con ricavabile. Gli unici casi complessi sono e rec (binders), dove bisogna prima fare -conversione con una variabile z fresh e poi applicare la sostituzione. Come interagiscono sostituzione e typing? Teorema 5.10 (La sostituzione rispetta i tipi) t : x, y : = t[ x /y ] :

Il tipo del termine non cambia: (si dimostra per ricorsione strutturale). TODO: dimostrazione sulle dispense. Alla luce di questo teorema possiamo ora denire la regola di conversione. Denizione 5.11 (-conversione tipata) x.t y.t[y / x ] se y FV(t) type(x)=type(y)

5.3. Semantica operazionale di HOFL


Andiamo ora a denire la semantica operazionale di HOFL. Prima cosa da notare che la nostra semantica operazionale tratta solamente termini chiusi, cio termini t in cui FV(t) = . Infatti non presente una regola per le variabili. Questo signica che la semantica operazionale completamente indipendente dallambiente . Le formule ben formate della nostra semantica operazionale saranno della forma t c, ed indicheranno che il termine t si riduce alla forma canonica c. Deniamo gli insiemi delle variabili libere e delle variabili legate in HOFL. Denizione 5.12 (Variabili libere in un termine HOFL) Linsieme delle variabili libere in un termine in HOFL cos ricorsivamente denito: FV(n) = FV(x) = {x} FV(t1 op t2 ) = FV(t1 ) FV(t2 ) FV(if t0 then t1 else t2 ) = FV(t0 ) FV(t1 ) FV(t2 ) FV(fst(t)) = FV(snd(t)) = FV(t) FV(x.t) = FV(t)\{x} FV((t1 t2 )) = FV(t1 ) FV(t2 ) FV(rec x.t) = FV(t)\{x}

72

Sintassi e semantica operazionale di HOFL

Denizione 5.13 (Variabili legate in un termine HOFL) Linsieme delle variabili legate in un termine HOFL cos ricorsivamente denito: BV(n) = BV(x) = BV(t1 op t2 ) = BV(t1 ) BV(t2 ) BV(if t0 then t1 else t2 ) = BV(t1 ) BV(t2 ) BV(t3 ) BV(fst(t)) = BV(snd(t)) = BV(t) BV(x.t) = BV(t) {x} BV((t1 t2 )) = BV(t1 ) BV(t2 ) BV(rec x.t) = BV(t) {x}

5.3.1. Forme Canoniche


Abbiamo detto che vogliamo ridurre i nostri termini a forme canoniche c. Ma quali sono queste forme canoniche? Vediamole. Denizione 5.14 (Forme canoniche) Le forme canoniche sono i termini che appartengono allinsieme C. Lappartenenza a tale insieme denita dalle seguenti regole di inferenza:

n Cint t 1 : 1 t 2 : 2 t1 , t2 : closed

(t1 , t2 ) C1 2 x.t : 1 2 x.t closed

x.t C1 2

Si tratta dunque di tutti i termini che sono interi coppie di termini chiusi funzioni chiuse Notare che la scelta delle coppie come forme canoniche puramente arbitraria, potremmo entrare nelle coppie e cercare di procedere ulteriormente. Al contrario per quanto riguarda le funzioni non abbiamo scelta, infatti cercare di portare una funzione in forma canonica, signica mostrare che due programmi dierenti calcolano la stessa funzione. Noi usiamo una ricorsione innita numerabile mentre i programmi non lo sono quindi fare la prova impossibile! TODO: vericare ed elaborare

5.3.2. Regole di inferenza


Vediamo adesso le regole di inferenza di HOFL. La prima regola un assioma: aerma che una qualunque forma canonica si riduce a se stessa.

5.3 Semantica operazionale di HOFL

73

cc una regola abbastanza ovvia. Passando a regole un po pi complesse, vediamo le tre regole delle operazioni. t1 n1 t2 n2

t0 0

t1 c1

t0 n

0 t2 c 2

t1 op t2 n1 opn2

if t0 then t1 else t2 c1

if t0 then t1 else t2 c2

La prima regola tutte le operazioni binarie, ed praticamente analoga a quella denita per IMP. Anche il comando condizionale analogo, tranne per il fatto che qua non esistono valori booleani e viene considerato 0 come true e qualunque altro valore come false. Le regole che governano le coppie di elementi sono le seguenti. t (t1 , t2 ) t1 c1 t (t1 , t2 ) t1 c1

fst(t) c1

snd(t) c2

La coppia semplice di elementi forma canonica per assioma. Esistono anche le due operazioni che estraggono un elemento dalla coppia: le operazioni di rst e second. La loro semantica qua sopra. Passiamo alla valutazione di funzione. Esistono due varianti di questa regola: vediamole ed analizziamone le dierenze. La prima regola detta lazy ed quella che utilizzeremo sempre: t1 x.t1 (t1 t1 [t2 / x ] c t2 ) c

Questa regola sostituisce lintero termine t2 allinterno di t1 . Vediamo la regola cosiddetta eager t1 x.t1 t2 c2 (t1 t1 [c2 / x ] c

t2 ) c

Questa regola prima porta t2 in forma canonica e poi lo sostituisce allinterno di t1 . Capiremo bene la dierenza fra le due regole nellesempio 5.16, dove vedremo che la valutazione lazy generalmente pi macchinosa della valutazione eager la valutazione eager porta a non calcolare pi volte la stessa derivazione ma a volte pu non terminare. Inne per la regola per la regola ricorsiva facciamo un calcolo di punto sso, il quale, se esiste, la forma canonica. Va notato tuttavia che questo non in generale il minimo punto sso, mentre vedremo che lo sar nella semantica denotazionale. TODO: elaborare Il funzionamento semplicissimo: prende il corpo della funzione ricorsiva e lo sostituisce al posto della variabile sulla quale ricorriamo, in pratica facciamo lunfolding della ricorsione. t[rec x.t / x ] c rec x.t c

74

Sintassi e semantica operazionale di HOFL

Esempio 5.15 fact = rec f.x. if x then 1 else x ( f (x 1)) (fact 2) c = fact x.t t[2 / x ] c = = x. if x then 1 else x(fact(x 1)) x.t =
t=if x then 1 else xfact(x1))

t[2 / x ] c

== = = = = = = = = = if 2 then 1 else 2 (fact(2 1)) c = = = = = = = = = == = 2 (fact(2 1)) c = = = = 2 c1 = == == fact x.t ==


c1 =2 c=c1 c2

(fact(2 1)) c2 t[21 / x ] c2


21 non viene valutato (lazy)

= if(2 1) then 1 else(2 1) (fact((2 1) 1)) c2 = = 2 1 n n 0 (2 1) fact((2 1) 1) c2 = = = = = = = = = = = = = = = = = = = = 2 1 c3 fact((2 1) 1) c4 = = = = = = = = = = = = = = = = = == = if 2 1 then 1 else(2 1) ( f act((2 1) 1)) c4 = = = = = = = = = = (2 1) 1 0 ======== == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ==
c4 =1 c3 =1 c2 =c3 c4 =1 c=c1 c2 1=2 c3 =1 ...altri passaggi n=n1 +n2 2n1 1n2 n=21=1 c2 =c3 c4

1 c4

Esempio 5.16 (Esempio di valutazione eager e lazy) Valutazione lazy La lazy porta il termine sempre in forma canonica, la eager no. La lazy valuta lespressione solamente se strettamente necessario valutarla. Ha lo svantaggio di ripetere pi volte la valutazione. In questo esempio tutto ha tipo int. ((x : int.3) rec y : int.y) : int = x : int.3 x.t t[rec y.y /t ] c = == 3[rec y.y / x ] c = = = = Valutazione eager Valuta subito, correndo il rischio di non terminare lesecuzione del programma. Lo stesso programma potrebbe terminare con luso della valutazione lazy. ((x : int.3) rec y : int.y) : int = x : int.3 x.t rec y.y c1 = == rec y.y c1 =
y=rec y.y +=3 +=3 c=3

t[c1 / x ] c

3[c1 / x ] c 3[c1 / x ] c

== == rec y.y c1 === == == . . . === La valutazione quindi in questo caso non termina.
y=rec y.y

Nel corso verra sempre utilizzata a valutazione lazy.

Teorema 5.17 i) Se t c e t c allora c = c

5.3 Semantica operazionale di HOFL ii) Se t c e t : allora c : TODO: Dimostrazione per induzione sulle regole negli appunti.

75

6. Complementi di teoria dei domini e semantica denotazionale di HOFL


Passiamo ad introdurre la semantica denotazionale di HOFL. Prima di farlo per abbiamo bisogno di fare alcune considerazioni. In qualunque linguaggio Turing-equivalente avremo bisogno di calcolare qualche punto sso per dare la semantica denotazionale. Nel teorema di Kleene (3.45 a pagina 44) abbiamo dato un metodo per calcolare tale punto sso: questo metodo si basa sul fatto che il dominio semantico deve essere un CPO e che le funzioni che vi calcoliamo sopra devono essere continue. Se questo ci veniva gratuito in IMP, dove conoscevamo i domini semantici ed eravamo sicuri della loro natura di CPO , non possiamo dire la stessa cosa di HOFL: adesso abbiamo inniti domini visto che ne abbiamo uno per ogni tipo ed i tipi, essendo costruiti ricorsivamente con la regola int | 1 2 | 1 2

sono inniti. Per ovviare a questo problema possiamo fare due cose: innanzitutto dare una costruzione dei domini semantici in modo da poter provare per induzione strutturale che formano un CPO , grazie anche ad unoperazione detta di lifting. Inoltre cercheremo di costruirci delle regole con le quali sviscerare le funzioni che andremo a calcolare su tali CPO e vedere facilmente che sono continue. Nella prima parte ci occuperemo dunque di teoria dei domini, quindi andremo a vedere in dettaglio la semantica denotazionale.

6.1. Teoria dei domini


Una funzione di denotazione, come abbiamo visto nei capitoli scorsi, associa ad un valore in un dominio sintattico un altro valore allinterno di un dominio semantico. Nella semantica denotazionale di IMP abbiamo denito dunque tre funzioni, una per ogni dominio sintattico del linguaggio: la funzione A associava elementi del dominio sintattico Aexpr a funzioni che prendevano uno stato e restituivano numeri naturali la funzione B associava elementi del dominio Bexpr a funzioni che prendevano uno stato e restituivano valori boolean la funzione C associava comandi a funzioni che prendevano uno stato e restituivano uno stato modicato Questo non possiamo farlo nel caso di HOFL. In HOFL abbiamo inniti domini sintattici, essendoci inniti tipi. Infatti, essi sono deniti dalla produzione int| |

che genera inniti risultati. Avremo bisogno dunque di denire una costruzione ricorsiva per costruirci di volta in volta il tipo di cui abbiamo bisogno. Per farlo dovremo denire, per ogni produzione che genera un tipo , il CPO relativo a tale tipo.

78

Complementi di teoria dei domini e semantica denotazionale di HOFL

6.1.1. CPO per il tipo int


Abbiamo gi denito un CPO per int: un CPO tale che ogni numero non in relazione con gli altri numeri (importante non confondersi con lordinamento classico sui naturali!) esiste un elemento minore di tutti i numeri esiste un elemento maggiore di tutti i numeri

Si tratta ovviamente di un CPO: qualunque catena ha un LUB (e questo LUB sar logicamente ), ed esiste un .

6.1.2. CPO per il tipo 1 2


6.1.2.1. Costruzione del CPO

Passiamo al caso in cui un tipo costruito come prodotto di due tipi. Questi due tipi saranno costruiti come D = (D, E = (E, In questo caso, posso denire il nuovo tipo D E = (D E, nel quale linsieme quello delle coppie formate da un elemento di D ed uno di E lordinamento tale che (d1 , e1 )
DE DE ) D) E)

(d2 , e2 ) d1

d2 e1

e2

esiste un elemento DE = (D , E ) Lambiente risultante ovviamente un CPO : banale dimostrare che la relazione DE riessiva, transitiva ed antisimmetrica ed abbiamo denito un che ovviamente bottom della relazione. Rimane da mostrare che anche completo. Teorema 6.1 (Completezza del CPO per Vale ) di ,
i i

(di , ei ) =

ei

Dimostrazione. ovvio che i di , i ei un maggiorante per la catena (di , ei ): dobbiamo dimostrare che il minimo. Supponiamo che non sia minimo: dovrebbe esistere (dk , ek ) in cui i di dk oppure i ei ek , il che per denizione impossibile.

6.1.2.2. Loperatore

Sul dominio denito nel paragrafo precedente deniamo loperatore di proiezione, che ci permetter di passare da una coppia alle sue singole componenti.

6.1 Teoria dei domini

79

Figura 6.1.: Una catena di funzioni

Denizione 6.2 (Operatore di proiezione) Data una coppia (d, e) D E, denisco 1 ((d, e)) = d 2 ((d, e)) = e

Vediamo la continuit di questo operatore, che ci permetter di spostare a piacere il simbolo di limite al suo interno o viceversa. Teorema 6.3 (Continuit di ) Loperatore di proiezione continuo

Dimostrazione.

= (di , ei ) 1

di ,

ei =

di =
i i

1 ((di , ei ))

6.1.3. CPO per il tipo 1 2


Vediamo inne il caso in cui il nostro tipo funzionale: dati due tipi D = (D, E = (E, posso denire il nuovo CPO come [D E ] = [D E] , dove [D E] = { f | f : D E, f continua} (insieme di tutte le funzioni continue da D ad E) f
[DE] [DE]

D) E)

g d D. f (d)

g(d)

[DE] (d) = E Vediamo un primo teorema che interessa tale dominio, che ci servir per dimostrarne la continuit.

80

Complementi di teoria dei domini e semantica denotazionale di HOFL

Lemma 6.4 ( n f n (d) n ( f n(d))) Vale n fn (d) n ( fn (d)): il limite di una catena di funzioni applicata ad un argomento d uguale al limite dela catena dei risultati delle funzioni della catena applicate a d

Dimostrazione. Prendiamo la catena di funzioni nella gura 6.1. Secondo lordinamento che abbiamo delineato, ogni funzione nella catena applicata allo stesso elemento di D generer un elemento di E maggiore della funzione precedente. dunque vero che i risultati della catena di funzioni applicate allo stesso elemento sono a loro volta una catena, indicata con le frecce grige in gura 6.1. anche gracamente ovvio che la funzione limite della catena di funzioni applicata a d, qualunque esso sia, uguale al limite della catena dei risultati in E .

Visto questo lemma, passiamo a dimostrare il teorema Teorema 6.5 (Completezza dello spazio funzionale) Vale d = fn m
n m

fn (dm )

cio che la funzione applicata al limite della catena funzione applicata alla catena dm .

m dm

uguale al limite della catena dei risultati della

Dimostrazione. Al solito, si dimostra con una serie di uguaglianze che per il lemma visto sopra n fn m dm = perch prendo solamente funzioni continue n fn m dm = come vedremo in seguito n m ( fn (dm )) = per il lemma visto sopra m n ( fn (dm )) = m n fn (dm )

Rimane un dubbio: se una funzione prende come parametro o restituisce una coppia di valori, come ci dobbiamo comportare riguardo alla continuit? Vediamo nelle prossime sezioni due tecniche per ridurre questi casi a normali valutazioni di continuit.
6.1.3.1. Continuit in funzioni del tipo 1 (2 3 )

Possiamo immaginare una funzione ritorna come risultato una coppia, come il pairing di due funzioni ( f, g) : S D E tale che, date le funzioni f : S D e g : S E, vale ( f, g)(s) = ( f (s), g(s)) Teorema 6.6 (Continuit di (f,g)) Date due funzioni continue f : S D e g : S E, la funzione composta ( f, g) : S D E continua.

Dimostrazione. Si dimostra facilmente che s = f s , g s = ( f, g) i i i


i

f (si ),
i i

come volevasi dimostrare.

g(si ) =

( f (si ), g(si )) =
i i

( f, g)(si )

6.1 Teoria dei domini

81

Dunque, per dimostrare la continuit di una funzione che restituisce una coppia di valori basta dimostrare la continuit delle funzioni che restituiscono uno dei due valori separato dallaltro. Deniamo anche la propriet opposta. Teorema 6.7 (Continuit delle singole funzioni di una coppia) Data una funzione composta continua ( f, g) : S D E, le funzioni f : S D e g : S E sono continue.
Dimostrazione. Prendiamo una funzione h : S D E. Questa pu essere scomposta in due funzioni f : S D = h; 1 g : S E = h; 2 dove (h; 1 )(x) = 1 (h(x)) Sappiamo che sia h che 1 sono continue. Dimostriamo che loperatore di concatenazione ; preserva la continuit. s = g f s = g ( f ; g) f (si ) = g( f (si )) = ( f ; g)(si ) i i
i

come volevasi dimostrare.

Abbiamo dunque visto che, in presenza di una funzione che restituisce una coppia di elementi, possiamo dividerla ed unirla a piacimento preservando la continuit. Notare che non esistono funzioni con pi di due argomenti: una funzione con tre argomenti viene considerata con una funzione che prende un argomento ed una coppia di argomenti. Le propriet appena viste dunque sono sucienti per decomporre tale funzione a funzioni singole, e considerarle separatamente per quel che riguarda la continuit. Per quanto riguarda la notazione ; una simbologia del tutto equivalente alla composizione di funzioni matematiche ma lordine di applicazione va da sinistra a destra invece che da destra a sinistra. Questo risulta comodo in ambito informatico per rappresentare lapplicazione di comandi nellordine in cui vengono letti. f g(x) = f (g(x)) f ; g(x) = g( f (x))
6.1.3.2. Continuit in funzioni del tipo D E S

Trattiamo adesso il caso in cui abbiamo una funzione che prende una coppia di argomenti. Per trattare questo caso, dobbiamo fare una premessa: dobbiamo vedere bene il funzionamento di un CPO sulle coppie. Avendo due ordinamenti separati che si incroceranno, come possiamo vedere nella tabella sottostante d00 d10 d20 . . . d01 d11 d21 . . . d02 d12 d22 . . . .. .

In orizzontale ci muoviamo sul primo ordinamento, in verticale sul secondo. Prendiamo linsieme {dnm }, e chiediamoci se tale insieme possiede un LUB. Siamo sul bottom, che sar d00 : la presenza di tale bottom ci assicurata dal fatto che i due ordinamenti sui quali ci siamo basati hanno entrambi bottom. Muoviamoci sulla prima riga in alto: otterremo una catena che di fatto equivalente ad una catena sul primo ordinamento. Questa catena avr dunque un LUB: chiamiamolo d0k . importante

82

Complementi di teoria dei domini e semantica denotazionale di HOFL

capire che questo LUB cadr nella stessa colonna per tutte le righe: infatti, prendendo la generica catena {dink }k abbiamo che questa equivalente alla catena {nk }k , e che vale k nk = nk k dink = nik . Importante che questo vale per qualunque i: dunque, se prendiamo la sequenza {dhk }h questa sar ancora una catena equivalente questa volta ad una catena del secondo ordinamento. Troveremo dunque un h tale che nm {dnm } = dhk . Abbiamo dunque visto che possiamo separare le operazioni di limite sulle due componenti della coppia. Ma c di pi! dimostrabile che nm dnm = n = dn , cio che basta prendere il limite degli elementi sulla diagonale. Vediamo la dimostrazione. Lemma 6.8 (Limite di una catena su una matrice) Vale dnm =
nm n

= dn

Dimostrazione. Dimostriamo nei due sensi. facile vedere che nm dnm k = dk , in quanto basta prendere n = m = k. Vediamo adesso che nm dnm n = dn . Supponiamo che d sia il limite di n , e che dunque dkk che valga dnm d per qualunque n ed m. Ma prendendo k = max{n, m} abbiamo che dnm dkk d.

d, e vogliamo

Notare che la relazione n m dnm = m n dnm il passo mancante che ci mancava per dimostrare il teorema 6.5. Siamo adesso pronti ad enunciare nalmente la regola per vericare la continuit nel caso che vogliamo. Teorema 6.9 (Continuit di una funzione con una coppia come argomento) Sia f : D1 D2 E. Essa continua se e solo se d1 , d2 . fd1 : D2 E = d. f (d1 , d) continua fd2 : D1 E = d. f (d, d2 ) continua

Dimostrazione. Dimostriamo solamente la sucienza. (x , y ) = f x , = f ym f xn , n n n


n n m n

ym =

f (xn , ym ) =
n m k

(xk , yk )

il primo passaggio semplicemente distribuzione allinterno della coppia, quindi si utilizzano le ipotesi per portare fuori i limiti considerando parametrici prima y_m poi x_n, quindi si utilizza il lemma 6.8 per unicare lindice.

6.1.4. Dimostrazioni di continuit


Vediamo alcuni esempi di funzioni interessanti in HOFL, e dimostriamone la continuit. Esempio 6.10 (Continuit della funzione apply) La funzione apply di HOFL una funzione apply : [D E] D E che ha la seguente semantica: apply( f, d) = f (d)

6.1 Teoria dei domini

83

Vediamo che continua (e che dunque apply : [[D E] D E]), utilizzando il teorema 6.9: dobbiamo dimostrare che continua sui due argomenti. Prendendo d come parametro abbiamo, assumendo che le fn siano continue, = apply fn , d fn (d) = ( fn (d)) = apply( fn , d)
n n n n

Prendendo invece f come parametro, ed assumendo la continuit di dm ho f, = f d = apply dm ( f (dm )) = apply( f, dm ) m


m m m m

Per il teorema 6.9 posso dunque dire che la funzione apply continua.

Esempio 6.11 (Funzioni Curry ed Uncurry) La funzione curry una funzione con tipo curry :
def

= (D F E) (D (F E))

tale che curry g d f = g(d, f ). Tipiamo questo termine per comprendere meglio le grandezze in gioco. curry

g
DFE

d
D

f =
F

def

g
DFE

(
E

d, f )
DF

DFE FE E

TODO: aggiungere denizione x e prova continuit

6.1.5. Lifting
Abbiamo visto nora come costruire una gerarchia di categorie sintattiche a partire dalla categoria di base degli interi. Ogni combinazione di interi, funzioni e coppie ha un proprio CPO, costruito ricorsivamente a partire dal suo tipo di base. Tuttavia, questo non ci baster. Vedremo che a volte per dimostrare lequivalenza fra la semantica denotazionale e quella operazionale ci servir unulteriore passo: laggiunta di un particolare per ogni categoria sintattica. un operazione che viene detta di lifting. Vediamo di capire cosa questo comporti. Mettiamo di aver costruito un tipo come composizione di altri due tipi. Ci ritroviamo con il nostro CPO D = (D, D ). Costruiamo su di esso un nuovo CPO D = (D , D ) tale che D = {1} D d1
D

{0} {}
D

d2

(1, d1 )

(1, d2 ) e d D . D

dove D = (0, )

Pu sembrare una inutile complicazione ma vedremo che sar necessario per provare lequivalenza tra semantica operazionale e denotazionale 7.2. Daltra parte, avevamo gi fatto una cosa simile con la trasformazione dellinsieme nellinsieme per gestire i comandi che non terminavano.

84

Complementi di teoria dei domini e semantica denotazionale di HOFL

Denizione 6.12 (Operatore di lifting) un operatore : D D tale che d = (1, d) Al solito, dunque, deniremo per ogni funzione f : D E una nuova funzione f : D E tale che : D E f (d ) = case d D E d f (d)

La stellina controlla largomento della funzione, se bottom ritorna bottom altrimenti lo de-lifta e lo passa alla funzione reale. Inne deniamo loperatore che useremo direttamente nella nostra semantica denotazionale, che fa da abbreviazione per loperatore stellina nel caso in cui vogliamo sostituire lespressione da valutare in unaltra. Denizione 6.13 (Operatore let) case d D E let x d . e = (x. e) (d ) = d e[d / x ] DE
D E E

Possiamo vederlo in due modi equivalenti: il let estende il tipo della funzione da applicare tramite il lifting () il let valuta largomento e se dierente da D , opera un de-lifting e passa largomento alla funzione.

6.2. Semantica denotazionale di HOFL


Dopo questa lunga premessa, siamo nalmente in grado di dare la semantica denotazionale di HOFL. Avremo ununica funzione di valutazione semantica, avendo ununica categoria sintattica (quella dei termini): t : : Env (V ) Ovviamente, anche se i termini sono di una sola categoria sintattica potremo avere innite categorie semantiche in uscita: per questo, il codominio della funzione sar parametrizzato in base al tipo del termine che stiamo valutando. Deniamo dunque, per un qualunque dominio , un dominio semantico (V ) = V che contiene tutti i valori che pu assumere il tipo pi il solito valore bottom. Avremo anche qua bisogno di un ambiente Env: il nostro ambiente sar : Var (V ) , cio una funzione da nomi di variabili ad un elemento di qualunque dominio semantico esistente. Come abbiamo visto nella sezione sulla teoria dei domini, possiamo denire tali domini semantici nella seguente maniera (Vint ) = N (V1 2 ) = (V1 ) (V2 ) (V1 2 ) = (V1 ) (V2 )

6.2 Semantica denotazionale di HOFL

85

Questi domini semantici continuano ad essere dei CPO, condizione fondamentale per poi calcolarci il punto sso. Vediamo adesso in dettaglio la semantica denotazionale per ogni categoria sintattica. Inoltre controlleremo una cosa importante: tutte le funzioni di base che utilizzeremo dovranno essere rigorosamente continue. In caso contrario, non potremmo calcolarne il punto sso che ci servir per gestire correttamente la ricorsione.

6.2.1. Costanti
Deniamo la semantica denotazionale delle costanti come n = n
Tipi

Tipiamo le due espressioni eguagliate. La prima n


int (Vint )

Valutare unespressione n : int porta ad avere un risultato nellinsieme (Vint ) . Passando alla seconda met dellespressione n
int (Vint )

semplicemente prendiamo n, di tipo int, e lo liftiamo facendolo diventare di tipo N , che come abbiamo visto precedentemente uguale a (Vint ) .

6.2.2. Variabili
Deniamo la semantica denotazionale delle costanti come x = x
Tipi

Tipiamo le due espressioni eguagliate. La prima x


(V )

Questa volta valutiamo un argomento di un tipo qualunque: chiamiamolo . Valutandolo otteniamo mediante la funzione di valutazione semantica applicata allambiente un elemento in (V ) . Dallaltra parte invece x
(V )

applichiamo la funzione ad x ed otteniamo un elemento in (V ) come dallaltro lato.

6.2.3. Operazioni binarie


Passiamo a denire la semantica denotazionale delle operazioni binarie. Le cose si fanno leggermente pi complesse. t1 op t2 = t1 op t2

dove x opx2 op (x1 , x2 ) = 1 N se x1 N x2 altrimenti N

86
Tipi

Complementi di teoria dei domini e semantica denotazionale di HOFL

Il tipaggio ovviamente si fa pi complesso, ma rimane comunque comprensibile. Nella parte sinistra abbiamo t1 op t2
(Vint ) =N

Semplicemente la valutazione di unoperazione binaria op che restituisce un intero: il tipo restituito dalla valutazione semantica dunque (Vint ) . Nella parte destra invece abbiamo t1
(Vint ) =N

op

t2
(Vint ) =N

N N N N

Valutando t1 e t2 otteniamo due oggetti di tipo (Vint ) . La funzione op una funzione che va da coppie di elementi di (Vint ) ad elementi dello stesso insieme, quindi anche tutta la parte destra ha tipo (Vint ) .
Continuit

Trattandosi di una funzione di due termini, dobbiamo dimostrare per ricorsione strutturale che se i due termini ai quali la applichiamo sono continui anche la funzione rimane continua.

Teorema 6.14 (Continuit di op) Loperatore op continuo se sono continui i suoi argomenti.

Dimostrazione. Lavoriamo su due elementi di partenza nel CPO degli interi, che come abbiamo visto numerose volte un CPO piatto. Questo signica che tutte le catene che posso costruire sulle sue coppie hanno lunghezza massima 3 prima di appiattirsi sul limite. Ci basta dunque dimostrarne la monotonia. (x1 , x2 ) (x1 , x2 ) x1 opx2 x1 opx2

Essendo una funzione a due argomenti possiamo applicare il teorema 6.9 che ci permette di poter considerare i due parametri in maniera separata. Poniamo dunque x2 = x2 = x e vediamo la monotonia solamente in base a x1 ed x1 . C innanzitutto da notare che se prendiamo x = N la conseguenza dellimplicazione immediatamente vera in quanto, per qualunque scelta possiamo fare di x1 ed x1 , avremo sempre e comunque che una tautologia. Prendendo invece x = n, avremo che (x1 , n) (x1 , n) x1 x1 nei rispettivi ordinamenti. Quindi pu succedere che x1 = x1 = , il che porterebbe alleguaglianza x1 = e x1 = m, il che porterebbe a

n + m che sicuramente vera per qualunque scelta di n ed m n+m

x1 = x1 = m, il che porterebbe alleguaglianza n + m

A costo di essere ripetitivi, ribadiamo che lordinamento degli interi non contempla confronti fra interi diversi.

6.2.4. Condizionale
La semantica denotazionale del comando if if t0 then t1 else t2 = Cond ( t0 , t1 , t2 ) dove z1 Cond (z0 , z1 , z2 ) = z2 (V ) se z0 = 0 se z0 = n n se z0 = N

6.2 Semantica denotazionale di HOFL


Tipi

87

Vediamo il tipaggio della parte sinistra. Abbiamo che if t0 then t1 else t2


int (V )

Il comando if ha un intero come guardia e due elementi dello stesso tipo come rami then ed else. Il comando restituisce un elemento di tipo , quindi la sua semantica denotazionale restituisce un elemento del tipo (V ) . Vediamo invece la parte destra. Cond( t0 t1 t2 )
(Vint ) (V ) (V ) (V )

molto semplice: si tratta di applicare il comando Cond, il quale restituisce elementi del tipo del suo secondo e terzo argomento.
Continuit

Anche qua dobbiamo dimostrare che la funzione Cond continua.

Teorema 6.15 (Continuit di Cond) La funzione Cond continua

Dimostrazione. Per il teorema 6.9 possiamo ancora analizzare la continuit della funzione analizzandone un argomento alla volta. Prendendo due parametri a e b, analizziamo il comportamento di Condb,c (z0 ) = Cond(z0 , a, b) una funzione che varia su un parametro intero, quindi il dominio piatto e possiamo permetterci di dimostrare solamente la monotonia: questa implicher automaticamente la continuit. facile vedere che la continuit viene preservata: Conda,b () restituisce sempre , che sar sempre minore o uguale rispetto a qualunque altro risultato. Prendendo invece Conda,c (z1 ) = Cond(a, z1 , c) studiamo il comportamento della funzione al variare di un elemento denito su un CPO con catene potenzialmente innite: dovremo dimostrare la continuit dunque. Per nostra fortuna facile farlo. Facciamo variare il primo parametro: se a = , la nostra funzione restituir sempre . Questo signica che la funzione si riduce ad una funzione costante che, ovviamente, sar continua. se a = 0 , otteniamo la funzione identit, anche lei ovviamente continua se a = n , otteniamo unaltra funzione costante che restituisce c per ogni z1 . La funzione dunque continua per qualunque valore di z1 . Il ragionamento facendo variare solo z2 assolutamente analogo.

6.2.5. Coppie
Diamo la semantica delle coppie. (t1 , t2 ) = ( t1 , t2 )

88
Tipi

Complementi di teoria dei domini e semantica denotazionale di HOFL Il tipaggio semplice. A sinistra abbiamo (t1 , t2 )
1 2 1 2 (V1 2 )

Si commenta da sola. La parte destra leggermente pi complessa ma anche essa autoesplicativa. ( t1 , t2 )


(V1 ) (V2 ) (V1 ) (V2 ) ((V1 ) (V2 ) )

Luguaglianza fra tipi vale, contando che per denizione (V1 2 ) = ((V1 ) (V2 ) )
Continuit

La continuit ci viene assicurata dalla denizione delloperazione di coppia nella sezione

6.1.2.1.

6.2.6. Selezionatori di coppia


La semantica dei selezionatori di coppia f st(t) = let v t . snd(t) = let v t . 1 v 2 v

Notare che grazie al let lespressione t viene valutata, de-liftata e sostituita nellespressione v, naturalmente se la valutazione di t fallisce, viene restituito il relativo bottom.
Tipi

Essendo le due espressioni analoghe, tipiamo solo la prima delle due. A sinistra abbiamo semplicef st( t )
1 2 1 (V1 )

mente

mentre a destra abbiamo unespressione vagamente pi complessa. let v


(V1 ) (V2 )

t .
(V1 2 )

1
(V1 ) (V2 ) (V1 ) (V1 )

A v viene associata una coppia di tipo (V1 ) (V2 ) che il de-liftato di ((V1 ) (V2 ) ) che per denizione uguale a (V1 2 ) , proprio il tipo di ottenuto dalla valutazione di t. Alla coppia viene poi applicato loperatore 1 che la proietta sul primo argomento.
Continuit

Anche qua la continuit ci viene gratuita, in quanto gli operatori la preservano, come visto nel paragrafo 6.1.2.2. Per il resto, si tratta di applicare tale operatore ad una forma canonica.

6.2.7. Lambda function


Il discorso si fa decisamente pi complesso per le lambda functions, non tanto per la semantica o il tipaggio, quanto per la dimostrazione della continuit. Vediamo intanto che x.t = d. t [d / x ]

6.2 Semantica denotazionale di HOFL


Tipi

89

Vediamo la parte sinistra, che semplicemente x. t


1 2 1 2 (V1 2 )

Si costruisce il tipo 1 2 della funzione, quindi se ne valuta la semantica che di tipo (V1 2 ) . Facilissimo! Pi rognosa la valutazione del tipo della seconda parte. d . t [d / x ]
(V1 ) (V2 ) [(V1 ) (V2 ) ] [(V1 ) (V2 ) ]

Si tratta del lifting di una funzione che va dal dominio semantico di un valore d, il quale verr passato per parametro in caso di applicazione di funzione, alla valutazione di un termine in una memoria modicata da tale d. Questa funzione restituisce ci che restituirebbe t. Il risultato un liftato perch non ritorna mai Dimostrare la continuit di questa funzione non banale, in quanto non dipende da sottotermini del termine di cui vogliamo dimostrare la continuit ma da un termine valutato in una memoria che non quella di partenza. Serve una dimostrazione decisamente pi robusta1 .
Continuit

Teorema 6.16 (Continuit della semantica della lambda expression) La funzione d. t [d / x ] di tipo (V ) (V ) dove d : e t : continua.

Dimostrazione. La dimostrazione data per induzione strutturale su t: si pu vedere che, in qualunque maniera costruiamo questo termine, questa funzione sempre continua.
Costante La funzione d. n [d / x ] = d.n semplicemente la funzione costante: ovviamente continua. Variabile La funzione d. x [d / x ] = d.d semplicemente la funzione identit: ovviamente continua. Operazione binaria La funzione d. t1 opt2 [d / x ] = d. t1 [d / x ]op

continue, ed quindi ovviamente continua.


Condizionale Continuo per lo stesso motivo delloperazione binaria.

t2 [d / x ] una composizione di funzioni

Operazioni sulle coppie Continue per lo stesso motivo delloperazione binaria. Lambda function La funzione d. x.t [d /y ] continua?

Se x=y ovviamente continua Altrimenti dobbiamo procedere per induzione. Sappiamo per ipotesi induttiva che d, d . t [d / x ,d /y ] continua. Ma allora per composizione di funzioni lo anche curry(d, d . t [d / x ,d /y ]) = d.d . t [d /y ][d / x ] = d. x.t [d /y ], come volevasi dimostrare.
Ricorsione Il caso della ricorsione analogo a quello della lambda function, applicando anche le funzioni x ed

apply. Abbiamo dunque visto che, qualunque sia la natura di t, la funzione vista sopra continua.

NB: questa dimostrazione non stata spiegata a lezione, quindi non necessario studiarla per lesame

90

Complementi di teoria dei domini e semantica denotazionale di HOFL

6.2.8. Applicazione di funzione


Vediamone la semantica. (t1 t2 ) = let t1 .( t2 )
Tipi

Il tipaggio abbastanza semplice. ( t1 t2 )

1 2 1 (V2 )

La prima met unapplicazione di una funzione da 1 a 2 ad un argomento di tipo 1 , il cui risultato viene liftato. Nella seconda met a abbiamo let
[(V1 ) (V2 ) ]

t1 . ( t2 )
(V1 2 ) (V1 ) (V2 )

La funzione ottenuta valutando t1 , quindi del tipo del dominio semantico corrispondente al suo tipo ((V1 2 ) ). Essa viene applicata ad un valore di tipo (V1 ) per ottenere un elemento di tipo (V2 ) , che era quello che volevamo. Lesecuzione della semantica denotazionale dellapplicazione di funzione analoga allesecuzione di una funzione apply, vista nellesempio 6.10. Visto che apply continua, lo anche la nostra semantica.
Continuit

6.2.9. Ricorsione
La semantica della ricorsione rec x.t = x d. t [d / x ]
Tipi

Tipiamo la parte sinistra. Abbiamo rec x . t


(V )

Tutte le componenti del comando rec hanno tipo , dunque il risultante di tipo (V ) . Nella parte destra invece f ix d . t [d / x ]
[(V ) (V ) ](V ) (V ) (V ) [(V ) (V ) ] (V )

Notare che punto sso trovato il minimo punto sso (forse sarebbe pi corretto usare l f p invece di f ix), al contrario di quanto detto per la semantica operazionale, qui otteniamo sempre il minimo.

6.3. La semantica denotazionale composizionale


Possiamo dimostrare il seguente lemma Teorema 6.17 (Lemma di sostituzione) Vale t[t / x ] = t [
t

/x ]

6.3 La semantica denotazionale composizionale

91

Limportanza di questo teorema che ci permette di dire che la nostra semantica denotazionale composizionale: se c una variabile allinterno di un certo contesto, di ci che metto allinterno del buco posso guardare anche solamente la semantica denotazionale per avere tutte le informazioni che mi interessano. t1 = t2 t[t1 / x ] = t[t2 / x ] In questo caso sostituisco t1 con t2 senza sapere come sotto fatti dentro, tanto sono garantito che hanno la stessa semantica denotazionale e questo suciente.

7. Equivalenza fra le semantiche di HOFL


La dimostrazione dellequivalenza fra la semantica operazionale e la semantica denotazionale di HOFL una dimostrazione molto complessa. Se nel caso di IMP siamo riusciti a dimostrare la completa equivalenza fra le due semantiche (cio che se una delle due terminava, anche laltra terminava esattamente con lo stesso risultato) qua non potremo fare la stessa cosa e ci dovremo accontentare di un risultato parziale. Vedremo innanzitutto le basi dalle quali partiremo per la prova, quindi proveremo ad eseguire la stessa prova che abbiamo eettuato nel caso di IMP e capiremo perch le conclusioni alle quali arriviamo sono meno strette.

7.1. Basi del confronto


Vogliamo confrontare due cose decisamente diverse. Da una parte abbiamo la semantica operazionale, che consiste in un insieme di formule ben formate della forma t c, in cui t un termine del linguaggio e c una cosiddetta forma canonica, assieme ad un sistema di transizione utilizzato per prendere il sottoinsieme di tali regole che sono teoremi di tale sistema. Questo sistema opera su termini chiusi, in quanto una valutazione di esecuzione e non possono mancare dati necessari anch questa esecuzione vada a buon ne. Dallaltra parte abbiamo la semantica denotazionale, che ci fornisce una funzione da un ambiente ad un elemento di un insieme (V ) . La semantica denotazionale opera anche su termini aperti, in quanto alcuni dati possono essere introdotti attraverso la memoria sulla quale la semantica viene valutata. Cominciamo ad introdurre un po di notazione. Indicheremo il fatto che la valutazione operazionale di un termine t termina con il simbolo t (il che sar vero se e solo se c.t c), mentre la stessa cosa per la semantica denotazionale verr indicata con t (il che sar vero se e solo se t (V ) ). Il confronto verr eettuato solamente sui termini sui quali entrambe le semantiche lavorano, cio i termini chiusi. La memoria sar dunque presente ma non utilizzata allinterno delle dimostrazioni. Riusciremo a dimostrare che t t , ma non riusciremo a dimostrare che tc t c t = t c=c

In pratica, possibile che due termini con stessa semantica denotazionale restituiscano due forme canoniche dierenti, a meno che non siano di tipo int. Torneremo su questo aspetto nella sezione 7.5.

7.2. Uso del lifting


Come abbiamo visto nel capito sulla teoria dei domini di HOFL 6.1.5, ogni dominio sul quale lavoriamo un CPO , che si tratti del dominio piatto dei naturali o del frutto di varie operazioni di composizione funzionale e prodotto cartesiano. In seguito, nonostante ci fosse gi sempre un elemento bottom, abbiamo introdotto con il lifting un nuovo bottom ottenedo quindi sia V che (V ) , a che scopo? Il problema che la semantica operazionale non sempre termina restituendo una forma canonica mentre la denotazionale, essendo denita per induzione strutturale, termina sempre e questo invaliderebbe il risultato, che dimostreremo fra poco, che la terminazione operazionale implica la terminazione denotazionale e viceversa. Tuttavia il problema si risolve semplicemente dato che quando non c forma canonica il risultato della denotazionale un , esattamete come in IMP. Putroppo per esistono esistono dei termini, come ad esempio x. rec y. y

94

Equivalenza fra le semantiche di HOFL

che hanno forma canonica ma in denotazionale ritornano V . In questi casi per distinguere i due tipi di , quelli con forma canonica e quelli senza, entra in gioco il lifting: ogni volta che la semantica denotazionale ritorna un V , questo viene liftato in V in modo da diventare un normale valore d del dominio, diverso da (V ) , perfettamente in accordo con la denizione di .

Esempio 7.1 (Distinzione dei ) Vediamo la semantica denotazionale dei due sequenti termini di cui il primo una forma canonica mentre il secondo no. x : int. recy : int. y recx : int int. x = [N N ] = [N N ] = [N N ]

In questo caso il dominio delle funzioni da int a int possiede il suo bottom x. e il bottom aggiunto con il lifting. Se non utilizzassimo il lifting i due termini risulterebbero identici per la semantica denotazionale ma dierenti per loperazionale.

7.3. La terminazione operazionale implica la terminazione denotazionale


Come primo passo, dimostriamo che t c t = c . Al solito lo dimostreremo per induzione sulle regole. La proposizione che vogliamo dimostrare P(t c) = t = c
def

7.3.1. Forma canonica


La prima regola di ho lunico assioma del linguaggio

cc immediato vedere che P(c c) = c = c ovviamente vericata.


def

7.3.2. Operazioni binarie


Prendiamo la regola t1 n1 t2 n2

t1 op t2 n1 opn2 Dobbiamo dimostrare P(t1 op t2 n1 opn2 ) = t1 op t2 = n1 opn2 sotto lipotesi di aver gi provato che P(t1 n1 ) = t1 = n1 e P(t2 n2 ) = t2 = n2 .
def def def

7.3 La terminazione operazionale implica la terminazione denotazionale Facilmente vediamo che t1 op t2 = t1 op t2 = n1 op n2 = n1 op n2 = n1 opn2 = n1 opn2 per denizione per ipotesi induttiva per denizione per denizione delloperatore per denizione

95

7.3.3. Condizionale
Prendiamo la regola del condizionale nel caso in cui si segue il ramo then. t0 0 t1 c 1 if t0 then t1 else t2 c1 Dobbiamo dimostrare P(if t0 then t1 else t2 c1 ) = if t0 then t1 else t2 c1 = c1 sotto lipotesi di aver gi provato che P(t0 0) = t0 = 0 e P(t1 c1 ) = t1 = c1 . Altrettanto facilmente vediamo che if t0 then t1 else t2 = Cond( t0 , t1 , t2 ) = Cond( 0 , c1 , t2 ) = Cond( 0 , c1 , t2 ) = c1 per denizione per ipotesi induttiva per denizione per denizione di Cond
def def def

Il caso in cui viene eseguito il caso else assolutamente analogo.

7.3.4. Selettore da coppia


Prendiamo la regola del rst t (t1 , t2 ) t1 c1

fst(t) c1 Dobbiamo dimostrare P(fst(t) c1 ) =


def def def

f st(t) = c1 sotto lipotesi di aver gi provato P(t1

c1 ) = t1 = c1 e P(t (t1 , t2 )) = t = (t1 , t2 ) . La questione ancora facilmente risolvibile: infatti f st(t) = let v t .1 v = let v (t1 , t2 ) .1 v = let v ( t1 , t2 ) .1 v = 1 ( t1 , t2 ) = t1 = c 1 per denizione per ipotesi induttiva per denizione per denizione del let per denizione di 1

La dimostrazione per la produzione di snd(t) assolutamente identica.

96

Equivalenza fra le semantiche di HOFL

7.3.5. Applicazione di funzione


Prendiamo la regola dellapplicazione (lazy). t1 x.t1 (t1 t1 [t2 / x ] c t2 ) c t2 ) c) = (t1
def def

Dobbiamo dimostrare P((t1 t2 ) = c


def

sotto lipotesi di aver gi provato P(t1 x.t1 ) = t1 = x.t1 e P(t1 [t2 / x ] c) = t1 [t2 / x ] = c Per farlo useremo il teorema 6.17. (t1 t2 ) = let t1 .( t2 ) = let x.t1 .( t2 ) = let d. t1 [d / x ] .( t2 ) = (d. t1 [d / x ])( t2 ) t1 [ t2 / x ] t1 [t2 / x ] = c per denizione per ipotesi induttiva per denizone per denizione di let applicando la funzione per il teorema sopra citato per ipotesi induttiva

7.3.6. Ricorsione
Prendiamo la regola della ricorsione t[rec x.t / x ] c rec x.t c Dobbiamo dimostrare P(rec x.t c) = rec x.t = c sotto lipotesi di aver gi dimostrato P(t[rec x.t / x ] c) = t[rec x.t / x ] = c . Utilizzeremo ancora il teorema 6.17. rec x.t = f ix(d. t [d / x ]) = (d. t [d / x ])( f ix(d. t [d / x ])) = d t [ f ix(d. t [ /x ]) / x ] = t [ rec x.t / x ] = t[rec x.t / x ] = c per la denizione della semantica denotazionale di rec per denizione di punto sso applicando la funzione per denizione della semantica denotazionale di rec per il teorema sopra citato per ipotesi induttiva
def def

7.3.7. Conclusione
Abbiamo dunque dimostrato per casi che vale t, c.P(t c) = t = c . Questo ci pu bastare per aermare che t t ? Certamente, come ci dice il teorema seguente.
def

Teorema 7.2 (Se t converge operazionalmente allora converge anche denotazionalmente) t t

7.4 La terminazione denotazionale implica la terminazione operazionale

97

Dimostrazione. facilissimo vederlo notando che se la semantica operazionale termina, abbiamo che la semantica denotazionale da un risultato uguale alla semantica denotazionale di una forma canonica. Visto che la semantica denotazionale di una forma canonica non da mai , questa terminer sempre.

7.4. La terminazione denotazionale implica la terminazione operazionale


Siamo alla seconda parte della dimostrazione. Vogliamo dimostrare che la terminazione denotazionale implica la terminazione operazionale: il modo naturale di farlo quello di seguire la procedura utilizzata a suo tempo per IMP, cio dimostrare il fatto per induzione strutturale. P(t) = t t c Questa dimostrazione funziona tranquillamente per quasi tutti i casi, con le modalit di dimostrazione viste precedentemente. Per la dimostrazione non riesce per lapplicazione funzionale. Proviamo a convincercene. Vogliamo dimostrare P((t1 t2 )) = (t1 t2 ) (t1 t2 ) c Sviluppiamo la semantica denotazionale. Abbiamo che (t1 t2 ) let t1 .( t2 )
def def

Questo signica in primo luogo che t1 non e dunque la sua valutazione denotazionale termina. Questo signica ovviamnente che anche la sua valutazione operazionale termina e restituisce una forma canonica: abbiamo visto dunque che t1 x.t , prima premessa della regola operazionale dellapplicazione. Per il teorema visto nella sezione precedente, questo signica che t1 = x.t = d. t [d / x ] . Sostituendo nel let precedentemente visto questa espressione al posto di , abbiamo d. t [d / x ] ( t2 ) = t
t2

/x = t

t2

/x

grazie al teorema 6.17. Siamo dunque arrivati a dover assumere la nostra propriet su un termine che non sottotermine di quello originario, cosa che ovviamente non possiamo fare. La nostra unica possibilit quella di dimostrare questa propriet con una particolare induzione combinata. La dimostrazione particolarmente lunga e noiosa, dunque la saltiamo a pi pari.

7.5. Conclusioni
Siamo arrivati dunque a concludere che, se t1 = t2 e t1 c1 , t2 c2 allora possiamo aermare che c1 = c2 . Sarebbe bello poter aermare che c1 = c2 , ma questo in generale non possibile. Lunico caso nel quale riusciamo a dimostrarlo il caso in cui il tipo delle due espressioni int.

Teorema 7.3 (Uguaglianza fra semantiche per termini di tipo int) Se valgono t1 : int = t2 : int t1 c1 t2 c2 allora vale anche c1 = c2

98

Equivalenza fra le semantiche di HOFL

Dimostrazione. Sappiamo che sotto le ipotesi sopra citate vale c1 = c2 . Ma se t1 e t2 sono di tipo int la loro forma canonica sar un valore naturale: abbiamo dunque c1 = n1 c2 = n2 n1 = n2

Il problema arriva con i tipi composti: dimostrabile che luguaglianza fra le forme canoniche non vale per nessun tipo composto (ovvero: esiste sempre un controesempio). Teorema 7.4 (Divergenza fra semantiche per termini di tipo composto) Il predicato t1 = t2 (t1 t2 ) (t1 c t2 c) vero solo se t1 : int e t2 : int.
Dimostrazione. Dobbiamo far vedere che per i tipi diversi da int la propriet non vale: visto che quanticata universalmente dovremo riuscire a trovare un controesempio per ciascun tipo. Il problema come al solito che i tipi sono inniti. Dovremo utilizzare un metodo induttivo. Deniamo per prima cosa una relazione ben fondata sullinsieme dei tipi tale che < < Per questa relazione avremo bisogno di un caso di base, un : visto che questo non pu essere int, per il quale la propriet vale come abbiamo appena visto, utilizzeremo i due tipi appena superiori rispetto allordinamento appena visto. Prenderemo dunque i due generici tipi int e int. Lidea di trovare un controesempio per i casi di base int e int dato un controesempio per , trovare un controesempio per e .

Caso base int


Prendiamo le due forme (c, 0) (c, 0 + 0) Entrambe sono forme canoniche di tipo int. La semantica denotazionale di entrambe le forme (c, 0), in quanto c avr stessa semantica essendo uguale e la semantica di 0+0 uguale a quella di 0. Operazionalmente parlando per si riducono a se stesse: la semantica operazionale della coppia la coppia stessa! Quindi hanno uguale forma denotazionale e diversa semantica operazionale: il controesempio che cercavamo.

Caso base int


Prendiamo similmente le due forme x.0 x.0 + 0 Anche qua denotazionalmente ci riduciamo alla stessa forma, ma operazionalmente si tratta di una forma canonica che non viene semplicata. Ancora la semantica denotazionale uguale e la semantica operazionale dierente: abbiamo trovato il nostro secondo controesempio. Abbiamo nito i due casi di base, vediamo adesso i casi induttivi.

Caso induttivo dato un controesempio per


Lavoriamo sotto lipotesi che per abbiamo due termini t1 , t2 che ci forniscono un controesempio. Allora ovviamente le espressioni (c, t1 ) e (c, t2 ) saranno denotazionalmente uguali, in quanto la semantica denotazionale di c non cambia e t1 = t2 , ma saranno operazionalmente diverse essendo le semantiche operazionali diverse a loro volta.

7.5 Conclusioni
Caso induttivo dato un controesempio per
Similmente al caso appena visto, possiamo prendere le forme x.t1 e x.t2 se t1 e t2 sono controesempi per .

99

Viene da chiedersi perch HOFL ha questo comportamento cos diverso da quello di IMP. Il motivo nel fatto che gestiamo tipi di dato funzionali: facile dire quando un intero uguale ad un altro, mentre al contrario il problema di determinare se una funzione uguale ad un altra computazionalmente indecidibile per il teorema di Rice.1 Nessuno ci pu dunque salvare da questo inconveniente in caso di funzioni di tipo composto, in quanto il problema impossibile da risolvere. Unaltra soluzione sarebbe quella di togliere i aggiuntivi per ogni tipo composto, ma in questo caso non potremmo dimostrare lequivalenza fra le semantiche. La scelta fra luna o laltra semantica denotazionale non assoluta: dipende dallutilizzo che vogliamo farne. Se abbiamo bisogno dellequivalenza fra semantiche utilizzeremo la versione con i bottom aggiunti, altrimenti utilizzeremo la versione nella quale non sicura la terminazione ma quando terminano assieme sicuro che diano la stessa forma canonica.

Il teorema di Rice aerma che tutti i problemi che hanno come soluzione un insieme di algoritmi che non sia vuoto o non comprenda tutti gli algoritmi indecidibile: in questo caso linsieme delle formule con la stessa semantica sicuramente non vuoto n comprende tutti gli algoritmi!

Parte III.

Calcoli di processo

8. Il linguaggio CCS
TODO-para: citare i seguenti argomenti: Guarded Command Language (GCL) Edsger Dijkstra, Hoare CSP occam Passiamo alla terza parte del corso, nella quale introduciamo le cosiddette algebre di processo, dette anche Calcoli di Processo. Sono teorie per modellare il comportamento, in generale non-deterministico, di processi (o agenti) indipendenti tra loro che possano anche compiere delle computazioni innite. Dentro queste algebre di processo esistono molti aspetti di nondeterminismo. Ad esempio, uno di tali aspetti legato la problema di determinare chi tra due processi terminer prima (race-conditions), mentre altri sono dovuti alla situazione di altri processi nello stesso momento. Alcuni approcci al problema, come ad esempio il -calcolo, rappresentano il tempo esplicitamente nel modello. Con un modello temporizzato potremmo, ad esempio, concludere che un processo arriver sempre prima di un altro perch pi veloce, tuttavia questo non porterebbe grossi vantaggi: elimineremmo solamente una fonte di nondeterminismo. il non determinismo dipende da vari fattori oltre alla velocit di esecuzione ed insito nel paradigma di programmazione delle algebre di processo che studieremo. Una cosa che faremo sar introdurre le computazioni innte nel nostro paradigma. Tecnicamente erano incluse anche in IMP ed HOFL: programmi come rec x.x oppure while true do skip non terminano ma avevano una semantica. Tuttavia la loro semantica era sempre pari a : non ci interessavano le computazioni innite, dunque davamo a tutte una semantica che signicava errore. Qua invece, come vedremo, le computazioni innite non solo avranno semantica che le distingue ma saranno anche centrali nel nostro modello di calcolo. Le due componenti di non-determinismo e computazioni innite rendono i domini molto pi complessi e la riceca di una semantica denotazionale ha portato allo sviluppo di strumenti matematici adeguati nel tempo. Noi daremo piuttosto una semantica astratta basata sulla nozione di bisimularit, secondo la quale due sistemi si equivalgono quando, visti dallesterno, hanno uno stesso comportamento (cio hanno lo stesso comportamento osservabile. Vediamo adesso con un esempio come potrebbe essere un possibile programma stile CCS. Esempio 8.1 (Algebre di processo) In gura 8.1 possiamo vedere la forma di una cella (che rappresenta un processo) in una possibile algebra di processo. Il calcolo consister in una composizione di tali celle. Ognuna di queste celle ha quattro canali di comunicazione, che possiamo vedere come siti nei quali scambiare informazioni. Possiamo eseguire due possibili azioni su ciascun canale: inviare dati: questa azione indicata con il nome del canale, ad esempio , sovrastato da una linea orizzontale e seguito dal dato che vogliamo inviare ((x)). ricevere dati: questa azione indicata dal nome del canale seguito dal dato che vogliamo inviare ( Diamo un nome ai quattro canali: li chiamiamo semplicemente , , , . Non denito a priori quali saranno di input e quali di output: nel nostro esempio utilizzeremo e per linput e gli altri due per loutput, ma in generale possono anche essere utilizzati in maniera bidirezionale. La nostra cella pu alternativamente trovarsi in 4 possibili stati, ognuno con un numero variabile di parametri. Vediamo questi stati: CELL1 (y) = x.CELL2 (x, y) + y.CELL0 In questo stato, chiamato CELL1 , abbiamo la presenza di un argomento y. Loperatore + determina il comportamento non deterministico: pu infatti eseguire indierentemente lespressione a sinistra o

104

Il linguaggio CCS

Figura 8.1.: Una cella in unalgebra di processo come CCS

a destra. Nel primo caso riceve in input il valore x sul canale e si sposta nello stato CELL2 con 2 parametri, nel secondo manda in output, sul canale il valore y e si sposta nello stato CELL0 con 0 parametri. importante notare che questa scelta completamente nondeterministica: non esiste nessun motivo per cui a priori si possa capire quale strada prender lagente. La decisione verr presa a runtime, e dipender tipicamente da quel che far chi sar dallaltra parte del canale o anche semplicemente dal caso. CELL2 (x, y) = y.CELL1 (x) Qui il comportamento deterministico: un agente in questo stato pu solamente mandare uno dei suoi vecchi elementi, in particolare y, sul canale . Lo stato risultante CELL1 con il parametro rimanente. CELL0 = x. if x = $ then ENDCELL else CELL1 (x) Aspetta un input su : se si tratta di un valore qualunque transisce in CELL1 mantenendo tale valore, mentre se invece il valore speciale $ transisce nello stato ENDCELL, che vedremo tra poco Lidea di usare tante celle collegate tra loro a formare uno stack di dimensione variabile nel quale tutte le celle sono nello stato CELL1 e contengono un valore, eccetto lultima ENDCELL.

Quando viene aggiunto un nuovo valore la cella testa, a sinistra nel disegno, va in CELL2 e propaga il valore lungo lo stack facendo passare le celle in CELL2 no a raggiungere ENDCELL che genera una nuova cella e si ritorna nello stato di partenza ma con una cella, e quindi un valore, in pi. Rimane da vedere lo stato ENDCELL, che rappresenta lo stato nel quale una cella attende di essere riempita o si spegne per inattivit. ENDCELL = (x.CELL1 (x) ENDCELL) + $. NIL lo stato della cella pi a destra: se
cresce decresce

riceve un valore va nello stato CELL1 e crea una nuova cella nello stato ENDCELL, allungando la sequenza, altrimenti se riceve $ termina la propria esecuzione. Notare che la cella creata pu comunicare solo con la sua creatrice: in seguito vedremo qual il signicato di questi canali privati.

8.1 Denizione del linguaggio

105

Un altro importante aspetto della comunicazione in CCS che rappresenta il solo istante di sincronizzione tra i processi, che altrimenti sono completamente asincroni tra loro; essendo le comunicazioni possibili solo tra 2 agenti questo mostra inoltre che esistono esclusivamente sincronizzazioni a due. Come vedremo, abbiamo utilizzato una versione di CCS non pura. Nel CCS classico non esister la comunicazione di valori: i canali ci serviranno solo per la sincronizzazione fra processi.

8.1. Denizione del linguaggio


Deniamo adesso la sintassi del linguaggio CCS, denito da Robin Milner nel 1980. Prima cosa da vedere sono le generiche azioni da compiere: la loro sintassi cos denita. , , , Azioni: generico nome | Azioni visibili Azione invisibile Come abbiamo visto, i canali di comunicazione hanno nomi , , e . In genere unazione pu essere di input, indicata dal solo nome del canale, o di output, indicata dal nome del canale sovrastato da una riga: per indicare una generica azione visibile utilizzeremo la lettera . Esiste una particolare azione, detta azione invisibile. Questa azione il risultato di una sincronizzazione fra due processi, che non deve essere visibile dallesterno. Con la semantica operazionale daremo una denizione pi chiara. Indicheremo una generica azione, visibile o non visibile, con la lettera greca .

8.1.1. Sintassi di CCS


Vediamo la sintassi del linguaggio. p x | nil | .p | p\ | p[] | p+ p | p|p | rec x.p

Cerchiamo innanzitutto di vedere cosa questi simboli signichino ad alto livello, per dare una semantica precisa a breve.
x un generico nome. Lo utilizzeremo principalmente per la ricorsione. nil il processo vuoto o terminato

.p un presso, composto da unazione e da un processo


p \ una restrizione: p non pu eseguire mosse sul canale . Notare che le mosse di sincronizzazione

saranno indicate con e dunque saranno permesse da questo costrutto. Vedremo a breve la semantica operazionale che ci chiarir le idee.
p[ ] sostituzione di nomi allinterno di p p + p costrutto per il nondeterminismo: con questo costrutto si indica che p pu seguire indierentemente

luna o laltra strada.


p|p costrutto parallelo: i due processi sono eseguiti contemporaneamente (in realt faranno un passo

ciascuno, il parallelismo solo concettuale)


recx.p Costrutto ricorsivo. Sostituisce se stesso in tutte le occorrenze della variabile x in p.

Gli agenti CCS sono termini chiusi.

106

Il linguaggio CCS

8.1.2. Semantica Operazionale


La semantica operazionale del CCS denita da un sistema di transizioni etichettato (LCS - Labeled Transition System), i cui nodi sono stati del calcolo (a tutti gli eetti processi CCS) e i cui archi sono etichettati con azioni, che siano o . Le regole di transizione partiranno da un processo e cercheranno di determinare gli archi uscenti da tale processo. Una peculiarit di CCS quello di avere un unico sistema di transizione per tutti i processi che compongono il sistema: questo ci permetter di modellare in maniera molto pi precisa le sincronizzazioni e le interazioni fra i processi. Le formule ben formate del nostro sistema saranno triple composte da uno stato, una transizione ed uno stato di arrivo. Il formato sar p1 p2 ed indicher che il processo p1 sar capace di eseguire unazione e diventare p2 .

(Act)

.p p

Lunico assioma della semantica quello che regola il presso: transendo con lazione si va nel processo p. pq p\ q\ Se abbiamo una restrizione, dobbiamo semplicemente evitare di compiere azioni che coinvolgano la sua variabile. Per il resto transiamo normalmente. pq (Rel) p[] q[] Questa regola pu sembrare complessa, ma ha signicato molto semplice: se p transisce con in q, p[] transisce con () in q[]. La sostituzione una semplice ridenominazione dei canali. pp p+q p
()

(Res)

(Sum)

qq p+qq

Ecco la regola che muove il nondeterminismo. Semplicemente possiamo scegliere uno qualunque dei due rami dimenticando completamente laltro: tutte le informazioni contenute nellaltro lato sono perse. pp p|q p |q

(Com)

qq p|q p|q

Il parallelo pu invece muovere luno o laltro processo separatamente, portandosi dietro la controparte. Il parallelismo dunque unesecuzione a turni dei due processi.

p1 p2

q1 q2

p1 |q1 p2 |q2 Ecco la regola della sincronizzazione. Il primo processo esegue una generica mossa , mentre laltro processo esegue una mossa sullo stesso canale e di segno contrario. I due processi a questo punto si sincronizzano: la loro composizione parallela esegue una mossa .

8.1 Denizione del linguaggio

107

Notare che un processo composto da due processi paralleli ristretto su un canale pu eseguire la sincronizzazione su in quanto questa ha come risultato una mossa . p[rec x.p/x] q rec x.p q Il comando ricorsivo esattamente analogo a quello di HOFL: a tutte le occorrenze del nome x sostituiamo il testo completo della ricorsione. Esempio 8.2 (Esempio di derivazione) Prendiamo il processo CCS cos denito. (((rec x.x + x)|(rec x.x + x))| rec x.x)\ Proviamo innanzitutto a capire come si muoverebbe il terzo processo parallelo se fosse solo e non esistesse la restrizione su . rec x.x q rec x.x q Nella prima mossa sviluppiamo il rec x.x riscrivendo se stesso allinterno del processo. Dunque mediante lassioma muoviamo su ritornando nello stato iniziale. Possiamo esprimere questa situazione con un grafo cos fatto
= q=rec x.x

(Rec)

In pratica questo agente continua a ciclare sulla stessa azione allinnito. Tuttavia, questa azione non possibile per lagente completo: la restrizione su ci impedisce di muovere un processo singolo su tale mossa. Per muovere su il terzo processo dovr trovare qualcuno che si sincronizzi su tale canale, in modo che allesterno si veda una mossa . Nel processo completo dunque dovremo muoverci per sincronizzazioni: il terzo processo funzioner come una sorta di arbitro che decider quale degli altri due processi muovere. (((rec x.x + x)|(rec x.x. + x))| rec x)\ q
= q=q \

((rec x.x + x)|(rec x.x + x))| rec x.x q (rec x.x + x)| rec x.x + x q1 rec x.x + x q3

q =q1 |q2

rec x.x q2 rec x.x q2


q1 =(rec x.x+x) | q3

rec x.x q2
q3 =rec x.x+x

(rec x.x + x) + (rec x.x + x) q3 (rec x.x + x) q3


(rec x.x) q2 q2 = rec x.x q3 = rec x.x + x q1 = (rec x.x + x)|q3 = (rec x.x + x)| rec x.x + x q = q1 |q2 = ((rec x.x + x)|(rec x.x + x))| rec x.x q = q \ = (((rec x.x + x)|(rec x.x + x))| rec x.x)\ =

q2 =rec x.x

rec x.x q2

108

Il linguaggio CCS

NOTA-paracetamolo: lesempio fatto a lezione diverso perch alla terza riga a fatto una scelta diversa credo, e poi usa sempre nelle transizioni invece che : CONTROLLARE!!!

Denizione 8.3 (Collegamento di due agenti) Loperazione di collegamento di due agenti, consiste nel rinominare i canali da connettere e renderli non visibili dallesterno: TODO aggiungere immaginette p q = (P[ / , / ] | Q[ / , / ])\\

I nuovi canali e vengono anche detti -convertibili, locali o segreti.

8.1.3. Semantica astratta del CCS


Dora in poi lavoreremo solo con particolare agenti detti guarded, per motivi che illustreremo in seguito. Denizione 8.4 (Agenti Guarded) Un agente detto guarded se nelloperatore rec x.p ogni occorrenza libera di x in p in un sottotermine di p del tipo .q. Intuitivamente ogni occerrenza di x deve essere preceduta da unazione , altrimenti si ottengono innite azioni identiche fra loro e questo, in seguito, dar problemi di continuit nella funzione . Lemma 8.5 Se p un agente guarded allora {q | p q} nito.

Esempio 8.6 (Agente non guardato) Lagente pu fare solo 2 mosse, svolgiamole entrambe rec x.x| nil

(rec x.x| nil)| nil (rec x.x| nil)| nil | nil in generale pu fare N mosse (rec x.x| nil)| nil | nil | nil | . . .
N

La semantica del CCS pu essere vista sistema di transizioni etichettato, di cui un particolare agente forma un sottoinsieme, gli stati che pu raggiungere. In generale questo sottoinsieme pu essere innito dato che il CCS touring equivalente, tuttavia nel caso sia nito (anche se vastissimo) possibile stabilirne alcune propriet (model checking).

8.2 Relazioni di equivalenza

109

8.2. Relazioni di equivalenza


La semantica che abbiamo visto ora per CCS molto pi particolareggiata di quelle gi studiate per IMP o HOFL, cerchiamo allora un metodo di astrazione per poter stabilire equivalenze tra agenti.

8.2.1. Isomorsmo dei gra


Come primo passo di astrazione scegliamo di trascurare i nomi dei nodi, e consideriamo solo le transizioni: 2 agenti isomor sono considerati equivalenti. Esempio 8.7 (Agenti isomor) nil | nil
nil | nil nil | nil nil|nil nil | nil nil + nil nil nil nil

nil + nil

I due agenti sono isomor, fanno le stesse mosse.

NOTE: Abbiamo fornito una semantica interleaving: possibile osservare solo una mossa per volta.

8.2.2. Stringhe o Trace equivalence


Dato che rappresentiamo i nostri agenti con sistemi di transizioni etichettati (possibilemente con stati inniti), la teoria degli automi ci suggerisce che potremmo basare lequivalenza sullinsieme delle stringhe riconosciute.

Esempio 8.8 (Gra dierenti, stringhe uguali, comportamento uguale) Prendiamo 2 agenti rec x.x rec x.x
rec x. x

rec x. x

rec x. x

Il primo fa una mossa e ritorna nello stesso stato. rec x.x q rec x.x q . . . Il secondo fa una mossa va in uno stato intermedio rec x.x e ritorna allo stato iniziale.

In questo caso i gra non sono isomor e quindi il nostro principio considera i due automi dierenti anche se in realt questi hanno un comportamento praticamente identico. Infatti se vediamo il loro sviluppo

110

Il linguaggio CCS

(unfolding) entrambi generano le stesse stringhe di , solo che uno le arrotola in due passi, facile trovare altri inniti agenti che svolgano la stessa cosa in 3,4,. . . passi.

Esempio 8.9 nil + nil Il grafo identico. nil

Tuttavia esistono casi in cui ne le stringhe generate ne lisomorsmo ci aiutano a caratterizzare il comportamento di un automa. Esempio 8.10 (Gra dierenti, stringhe uguali, comportamento dierente) Vediamo ora un esempio interessante ( nil + nil)
(nil + nil) nil + nil nil nil + nil nil nil nil

nil + nil

I gra non sono isomor, ma se andiamo a guardare le stringhe di azioni, gli insiemi sono uguali, ossia {, } Tuttavia logicamente hanno un comportamento diverso perch il primo decide se fare o dopo aver fatto il secondo invece deve scegliere dallinizio quale dei due fare se poi vuole fare o .

Da questi esempi vediamo come sia luguaglianza a stringhe, sia lomomorsmo dei gra non rispecchino la nostra idea intuitiva di due agenti equivalenti.

8.3. Bisimilarit
Vediamo ora la relazione detta Bisimilarit che dimostreremo corrispondere al nostro concetto intuitivo di uguaglianza di agenti e vedremo avere una serie di buone propriet. Innanzitutto cerchiamo una relazione che sia di equivalenza e che quindi rispetti le tre seguenti propriet. Denizione 8.11 (Relazione di equivalenza) Una relazione di equivalenza una relazione con le seguenti propriet: xx riessivit x y y z x z transitivit xyyz simmetria e permette di suddividere un insieme in sottoinsiemi disgiunti detti classi di equivalenza allinterno delle quali ogni elemento equivalente.

8.3 Bisimilarit

111

Inoltre cerchiamo una relazione che ci dica quando due agenti sono equivalenti, quindi una relazione su agenti P P. Deniamo inoltre il concetto di contesto e congruenza: Denizione 8.12 (Contesto) Un contesto unespressione algebrica con un buco, che indicheremo con C[ ] Un esempio di contesto b + [ ] dove al posto di [ ] possiamo sostituire una qualsiasi espressione della nostra algebra. Denizione 8.13 (Congruenza) Una relazione C una congruenza se: C[ ] P C Q C[P] C C[Q]

Diamo un esempio tramite la teoria dei giochi di come deve comportarsi la nostra relazione. Immaginiamo di avere due agenti, p e q, e due giocatori, Alice e Bob. Lo scopo di Alice dimostrare che p e q sono dierenti e possiede una algoritmo che le permette di fare la mossa migliore per raggiungere il suo scopo. Bob viceversa vuole mostrare che i due agenti sono uguali. Alice gioca per prima facendo una mossa con uno qualunque dei due agenti, poniamo p, p p e Bob deve rispondere facendo la stessa mossa con laltro agente q, q q .

Esempio 8.14 (Teoria dei giochi per lesempio 8.10) Nellesempio precedente Alice sceglierebbe e Bob sarebbe costretto a scegliere una particolare , poniamo quella a sinistra, a questo punto Alice sapendo che Bob potrebbe solo fare sceglierebbe . Il discorso speculare se Bob scegliesse di passare a destra e quindi concludiamo che i due agenti sono dierenti.

Deniamo pi formalmente quanto espresso dallesempio di Alice e Bob: Denizione 8.15 (Strong bisimulation) Una relazione binaria R sullinsieme di stati di un agente una bisimulazione se s1 R s2 se s1 s1 se s2 s2

allora esiste una transizione allora esiste una transizione

s2 s2 tale che s1 R s2 s1 s1 tale che s1 R s2

Denizione 8.16 (Strong bisimilarity ) Due stati s e s sono bisimilari, scritto s s , se e solo se sono legati da una bisimulazione forte. La relazione detta bisimilarit forte ed lunione di tutte le bisimulazioni
def

R
R (R)

112

Il linguaggio CCS

Visto che rapprensentiamo i nostri processi CCS con dei sistemi di transizione etichettati (LTS) i cui stati sono a loro volta processi CCS, questa nozione di bisimulazione si applica tanto ai processi quanto ai loro stati. Inoltre va notato che la bisimulazione un concetto generale legato solo ai LTS e quindi di conseguenza al CCS. Inne si pu dimostrare che rispetta le propriet di riessivit, simmetria e transitivit.

Teorema 8.17 La relazione di bisimilarit una relazione di equivalenza.

Esempio 8.18 (Stati bisimili) Vogliamo mostrare che s Deniamo allora R come t, per farlo dobbiamo trovare una bisimulazione (forte) R tale che (s, t) R. R = {(s, t), (s1 , t1 ), (s2 , t1 )} Ovviamente abbiamo che (s, t) R, ora rimane da dimostrare che R sia eettivamente una bisimulazione. Per farlo per ogni coppia di stati di R dobbiamo analizzare ogni possibile transizione di uno stato e vericare se possono corrispondere a transizioni dellaltro stato, naturalmente le due transizioni devo avere la stessa etichetta. Questo pu essere vericato per ispezione. Alternativamente se volessimo provare che s1 s2 potremmo usare la seguente

R = {(s1 , s2 ), (s2 , s2 )} e vericare ancora che si tratta di una bisimulazione.

8.3.1. Punto sso


La relazione di bisimilarit pu essere espressa anche come calcolo di punto sso di un operatore, il che ci fornisce un metodo pi operativo per calcolarla eettivamente.

8.3.1.1. Il CPO dei processi

Deniamo quindi (P(P P), ) come il CPO sul quale lavoriamo e nel quale rappresentiamo le relazioni come insiemi di coppie. Abbiamo in particolare che P P rappresenta la relazione che considera tutti i processi equivalenti e quindi non distingue nulla,

8.3 Bisimilarit la relazione per cui un processo non uguale a nessun altro, addirittura nemmeno a se stesso (in realt sarebbe pu corretto usare gli inniti insiemi di coppie del tipo {(a, a)}, {(b, b)}, . . .). Tuttavia in questo caso conveniente considerare il CPO al contrario, cio useremo la relazione =. In questo modo partiremo da P P come bottom ed andremo via via ranando.

113

8.3.1.2. Loperatore

Loperazione di cui vogliamo fare il punto sso che se applicata ad un insieme R, cio una relazione con una certa capacit di discernere tra agenti, ne ritorna una migliore, pi selettiva.

p (R) q =

def

p p = q . q q q q = p . p p

and and

p Rq p Rq

Come facile vedere questa denizione si sposa perfettamente con la denizione di bisimulazione 8.15 e infatti abbiamo che le bisimulazioni sono proprio i punti ssi di questo operatore. Teorema 8.19 (Bisimulazione come punto sso) B = (B) dove B una bisimulazione

Inoltre la bisimilarit pu essere ottenuta come massimo punto sso delloperatore partendo dal punto P P e via via ranado. Notare che il limite nel powerset veniva fatto con lunione, nel nostro dominio rovesciato va fatto con lintersezione. Teorema 8.20 (Bisimilarit come massimo punto sso) =
n

n (P P)

Esempio 8.21 (Bisimilarit come massimo punto sso) Completiamo lesempio 8.18 calcolando la bisimilarit come calcolo di un punto sso R0 = {{s, t, s1 , s2 , t1 }} R1 = {{s, t}, {s1 s2 , t1 }} R2 = {{s, t}, {s1 s2 , t1 }} = f ix Abbiamo ottenuto le classi di equivalenza della nostra relazione di equivalenza. Allinterno di ogni classe ogni coppia di elementi quindi in relazione di equivalenza = {(s, t), (s1 , s2 ), (s1 , t1 ), (s2 , t1 )} facile vedere come le due bisimulazioni calcolare precedentemente siano comprese nella nostra bisimilarit, che infatti lunione di tutte le possibile bisimulazioni.

114 Ricapitolando quanto visto: le bisimulazioni sono punti ssi delloperatore R (R)

Il linguaggio CCS

la bisimilarit massimo punto sso delloperatore e pu essere ottenuta come unione di tutti i punti ssi di varPhi in accordo al teorema di Tarski
def

R
R (R)

come calcolo di massimo punto sso di varPhi in accordo al teorema di Kleene =


n

n (P P)

R cio R deve essere un pre-punto sso.

(R) R una bisimulazione

Perch ci occupiamo anche delle bisimulazioni se abbiamo un modo per calcolare direttamente la bisimilarit, che le contiene tutte ed la pi generale possibile? La ragione che le bisimulazioni sono pi semplici da costruire mentre la bisimilarit, non nemmeno ricorsivamente numerabile dato che va calcolata per tutti gli stati raggiungibili (che ricodiamo possono essere inniti). Notare che se il sottoinsime degli stati raggiungibili nito TODOnon mi ricordo ;(TODO. Naturalmente per poter calcolare punti ssi abbiamo bisogno di sapere se monotonia continua. Teorema 8.22 (Monotonia di ) R1 R2 (R1 ) (R2 )

Dimostrazione. Se R1 pi permissiva di R2 , cio p R1 q p R2 q allora p(R1 )q p(R2 )q.

Lemma 8.23 Se p un agente guarded allora q | p q nito.

Teorema 8.24 Continuit: (Ri ) = (


i i

Ri )

8.3 Bisimilarit

115

Il fatto che loperatore sia continuo non ovvio e noi non lo dimostriamo. Comunuque la propriet vale se il nostro sistema di transizione nite branching e per questo abbiamo posto la condizione sugli agenti guarded 8.4.

Esempio 8.25 (Calcolo Bisimilarit) Rivediamo lesempio 8.10 tramite la bisimilarit: p = ( nil + nil)
p = ( nil + nil) p = nil + nil nil q = nil q = nil

q = nil + nil

Rappresentiamo tutti gli stati raggiungibili dai due automi.

q = nil + nil

Allinizio della prova tutti gli elementi sono equivalenti. R0 = {p, p , nil, q, q , q } Applichiamo : R1 = (R0 ) = {{p, q}, {p }, {q }, {q }, {nil}} R2 = (R1 ) = {{p}, {q}, {p }, {q }, {q }, {nil}} Questa una catena discendente nellinsieme, che rana sempre di pi ( monotona). Ne concludiamo che non ci sono stati equivalenti, proprio come nella nostra intuizione iniziale dei due atomi.

Esempio 8.26 (Punto sso alla prima iterazione) p = rec x.x q = rec x.x R0 = {{{p, q, p }} R1 = R0 Sono equivalenti perch tutti fanno solo . p = rec x.x

116

Il linguaggio CCS

8.4. Congruenza e bisimilarit


Una propriet fondamentale dei nostri sistemi la composizionalit, cio la possibilit di comporre agenti semplici in agenti pi complessi o di sostuire parti di un agente. In particolare per poter sostituire un agente con un altro, necessario non soltanto che questi siano bisimili P Q = C[P] C[Q] ma che la bisimilarit risulti una congruenza rispetto alle operazioni del linguaggio.

Esempio 8.27 (Equivalenza a stringhe non congruenza) Prendiamo un contesto con un buco C[_] = (_ | . nil)\\ sostituiamo ora due agenti che risultavano equivalenti a stringhe: C[p] = (( | . nil +. nil) | . nil)\\ C[q] = ((. nil +. nil) | . nil)\\ inseriti in un contesto, due agenti equivalenti a stringhe hanno un comportamento diverso, infatti C[p] si pu bloccare mentre C[q] no, questa infatti la conferma che lequivalenza a stringhe non una congruenza. Dimostriamo quindi che la bisimilarit una congruenza: x y = F(X) F(Y) Questa propriet nella semantica denotazionale era garantita per costruzione, avevamo infatti la propriet di composizionalit. t1 p = t2 = t[t1 / x ] = t[t2 / x ] Dobbiamo quindi mostrare per tutte le regole del nostro linguaggio che la bisimilarit una congruenza, noi mostreremo in dettaglio solo la regola pi complessa: il parallelo.

8.4.0.3. Bisimilarit una congruenza per il parallelo

Vogliamo dimostrare che: p1 q1 p2 p1 R1 q1 p2 R2 q2 q2 = = R1 R2


?

p1 | p2 q1 | q2 bisimulazione bisimulazione

Abbiamo sicuramente le seguenti bisimulazioni:

Per dimostrare la conseguenza ci basta trovare un bisimulazione in cui la propriet vericata: costruiamone una ad-hoc. R = {(p1 |q1 , p2 |q2 ) t.c. p1 R1 p2 q1 R2 q2 } In questa relazione la nostra propriet sicuramente valida per costruzione, rimane da dimostrare che sia davvero una bisimulazione. P(p1 |q1 p1 |q1 ) = p1 |q1 R p2 |q2 = p2 .p2 |q2 p2 |q2 p1 |q1 R p2 |q2 la propriet si dimostra per induzione sulle regole, cio per le tre regole del parallelo.
def

8.4 Congruenza e bisimilarit


Prima regola

117

pp p|q p |q Per questa regola possiamo muovere uno solo dei due agenti alla volta P(p1 |q p1 |q) = p1 |q R p2 |q = p2 . p2 |q p2 |q p1 |q R p2 |q Dalle premesse della regola otteniamo che p1 p1 e per ipotesi induttiva abbiamo che P(p1 p1 ) = p1 R p2 = p2 . p2 p2 p1 R p2 Da cui, se assumiamo la premessa della propriet, otteniamo che questo p2 eettivamente esiste e possiamo usarlo nella regola del parallelo, ottenendo p2 |q p2 |q
def def

prima conseguenza

mentre per come abbiamo costruito la relazione, vale ancora p1 |q R p2 |q seconda conseguenza

come volevamo dimostrare. La dimostrazione per la seconda regola del parallelo simmetrica alla precedente, vediamo la terza.

Terza regola

p1 p1 La propriet da dimostrare

p1 |q1 p1 |q1

q1 q1

P(p1 |q1 p1 |q1 ) = p1 |q1 R p2 |q2 = p2 , q2 . p2 |q2 p2 |q2 p1 |q1 R p2 |q2 Assumiamo la premessa, e sfruttiamo lipotesi induttiva p1 R1 p2 q1 R2 q2 p2 p2 q2 q2

def

p1 R1 p2 q1 R2 q2

Da cui usando le prime conseguenze, otteniamo dalla regola del parallelo p2 |q2 p2 |q2 e dalle seconde conseguenza sappiamo che vale ancora p1 |q1 R p2 |q2 come volevamo dimostrare.

118
8.4.0.4. Accenno di dimostrazione di bisimilarit per regola del presso

Il linguaggio CCS

Per ipotesi abbiamo una bisimilarit R, ne dobbiamo trovare unaltra R1 pRq R = R {(.p, .q)}

quindi abbiamo la stessa relazione di prima con in pi proprio la coppia di cui avevamo bisogno. Si potrebbe pensare che la bisimilarit sia una relazione di equivalenza arbitraria, e che in alcuni casi possa distinguere troppo o troppo poco, introduciamo un formalismo che ci permetter di dimostrare che la corretta nozione di equivalenza.

8.5. Logica di Hennessy - Milner


Nel 1980 Hennessy e Milner introdussero una logica modale (cio una logica che permette i concetti di possibile o necessario) usata per dimostrare propriet di un sistema di transizione etichettato (e quindi sulla semantica operazionale del CCS). F F | iI Fi |

Il primo il noto operatore di negazione, il secondo un AND di vari F, per il quale vale in particolare iI Fi = true. Il terzo un operatore modale: se esiste almeno una transizione etichettata nel cui stato di arrivo vale F allora nello stato di partenza vale F. Denizione 8.28 (Satisfaction relation) La satisfaction relation una relazione che fornisce tutte le formule soddisfatte da un certo agente |= P L con P gli agenti e L linsieme delle formule. denita come segue: P |= F sse non P |= F P |= iI Fi sse P |= Fi i I P |=
F

sse p . p p

p |= F

Deniamo inoltre: f alse = true iI Ii = iI Fi


F

in particolare lultima implica che per ogni possibile mossa (pu non essercene nessuna), si va in uno stato in cui vale F.

Esempio 8.29 (Agenti non bisimilari tramite formule logiche) Dimostrare che i seguenti agente non sono bisimilari fornendo una formula della logica di Hennessy-Milner che distingua P da Q.

8.6 -calcolo

119

P2 F=

Q2
( true

true)

Informalmente: esiste una transizione , dove per tutti gli , abbiamo sia che ? La formula vale per Q2 ma non per P2 : Q2 |= F P2 |= F

Per dimostrare che vale una formula, si usa linduzione strutturale. Partendo dalle foglie, che sono sempre true, si procede verso lalto, raggiunta la radice abbiamo gli stati che soddisfano la formula.

Denizione 8.30 (Profondit di una formula) D(F) = D(F) D(iI Fi ) = smp(D(Fi ) | i I) D( F) = D(F) + 1

Quindi linsieme delle formule lunghe k viene denotato come Lk = {F | D(F) = k} Teorema 8.31 Due agenti sono bisimilari se e solo se soddisfano gli stessi insiemi di formule p k q sse F Lk (P |= F) (Q |= F) p q sse F(P |= F) (Q |= F) con k la bisimilarit alliterazione k. Dati due agenti bisimilari, questa teorema permette di trovare una propriet dellagente pi complesso, dimostrandola sullagente pi semplice; non solo, usando la bisimilarit possiamo trovare un agente equivalente minimo e tralasciare lagente complesso, tanto le formule soddisfatte sono le stesse. Inne la seconda parte del teorema ci assicura che se due agenti non sono bisimilari potremo sempre trovare un controesempio.

8.6. -calcolo
Le formule di Hannessy-Milner hanno profondit nita e le visitiamo un passo alla volta, sarebbe utile disporre di operatori di punto sso per lavorare con formule innite. Il -calcolo introduce la ricorsione e risulta quindi pi potente del CCS conservandone tuttavia le stesse equivalenze. .F(X)

120 D .F(X) QUESTO ESEMPIO NON HA ALCUN SENSO

Il linguaggio CCS

Esempio 8.32 Q |= Se uno nega la formula Q |= (


f alse f alse) ( )true

true

8.7. Weak Observational equivalence


Il sistema CCS, che permette di osservare le azioni invisibili, non un modello sucientemente astratto: in generale vogliamo poter osservare solo le azioni di interesse. Per nascondere le azioni invisibili estendiamo il sistema di transizioni: Weak Observational Equivalence p = q = p = q =

sse sse

p ... q o p p q = q = =

p=q

Le transizioni sono etichettate solo da stringhe di azioni visibili o dalla stringa vuota. Utiliziamo la stessa nozione di bisimulazione/bisimilarit: p(R)q sse sse p = p = p = p =

implica implica

q = q = q = q =

p Rq

e p Rq e viceversa = R weak bisimilarity

R (R)

weak observational equivalencies (i punti ssi)

Purtroppo questa nozione di bisimilarit non una congruenza, in particolare crea dei problemi per loperatore +, come si vede dallesempio seguente. Esempio 8.33 (weak bisimilarity non congruenza) Mostriamo come due agenti weakly bisimilar se inseriti nello stesso contesto perdono questa propriet. Da notare che in questo esempio si sfrutti il fatto che Alice e Bob possano intervenire indistintamente su tutti e due gli agenti. nil nil weak bisimilar Sono weakly bisimilar perch se Alice fa Bob pu stare fermo, mentre inseriti nel contesto: nil + nil Mosse di Alice e Bob: nil + nil nil nil + nil
Bob: Alice:

nil + nil

not weak bisimilar


Alice:

Bob:?

= = nil + nil nil = =

8.8 Weak Observational Congruence

121

Lesempio precedente ci mostra che non una congruenza, il motivo profondo di questo risultato sta nel fatto che dei allinterno di un operatore + permettono allagente di fare delle scelte invisibili. In altri termini, quando analiziamo un sistema in questo modo, come una black box, questo oltre che delle mosse interne (invisibili) pu anche compiere delle scelte interne e questo va al di l dellastrazione che cercavamo. Nellesempio precedente il primo agente fa una scelta interna mentre il secondo per compiere la stessa scelta dovrebbe fare una mossa visibile.

8.8. Weak Observational Congruence


Sia c la pi generica congruenza, pi piccola della Weak Observational Equivalence. Deniamola rispetto alluso degli agenti nel contesto delloperatore +. p c sse pq e r. p + r q + r

La relazione risultante pu essere denita direttamente come p c q sse sse p p p p


implica implica

q = q = q = q =

p q

e p q e viceversa

In questo modo si elimina la possibili di stare fermi in risposta da un , ma solo per la prima volta. Questa la relazione pi usata, tuttavia una congruenza ma non una bisimulazione rispetto , cio c (c ) Infatti basta vedere il seguente controesempio

Esempio 8.34 (Weak Congruence non bisimulazione) wc applichiamo , facendo la mossa abbiamo
wc

che non sono pi nella relazione, infatti il primo pu fare mentre il socondo no.

I termini sono nella Weak Observational Congruence, ma non sono bisimili, quindi abbiamo la congruenza che ci serviva ma abbiamo perso la bisimulazione. Inoltre loperatore c pu essere completamente assiomatizzato dalla legge di Milner. p + p = p (p + q) = (p + q) + q p = p

122
Digressione

Il linguaggio CCS Se invece ad ogni interna corrisponde almeno un p p implies q = q = p ()q i p p implies q = q =

and and

p q p q

In questo caso i due agenti dellesempio non risulterebbero weakly bisimilar dal principio. Un altra soluzione potrebbe sembrare quella di introdurre le scelte che abbiamo chiamato interne direttamente nel sistema di transizioni, con una regola del tipo p+q p ma questo andrebbe in conitto con le sincronizzazioni, come mostra lesempio seguente. Esempio 8.35 ( nil + nil) | ( nil + nil)\\ utilizzando il vecchio +, essendo i canali ristretti, gli agenti possono solo muoversi insieme, mentre con il nuovo il primo potrebbe comunque fare , il secondo e nire in deadlock, come se le restrizioni non ci fossero.

8.9. Dynamic congruence


La dynamic congruence la pi generale (cio la migliore) relazione che sia una congruenza che una -bisimulazione. Pu essere denita direttamente come la pi generale relazione D che soddis p D q implica C. C[p] (D ) C[q]

e cio necessario chiudere con i contesti C[_] ad ogni passo. Oppure semplicemente: p (R) q sse sse p p p p D =

implies q = q = implies q = q = dynamic bisimilarity R (R)

and

p D q

and p D q e viceversa

Rivediamo il controesempio precedente con questa relazione. Esempio 8.36 (Esempio 8.34 con dynamic) I due agenti del precedente controesempio non sono nella dynamic congruence dallinizio e quindi lesempio risulta corretto. d
d

d pu essere assiomatizzato omettendo la terza legge di Milner: p + p = p (p + q) = (p + q) + q

8.10 Caratterizzazione assiomatica della bisimulazione

123

8.10. Caratterizzazione assiomatica della bisimulazione


I calcoli di processo vengono detti anche algebre di processo perch come tutte le algebre sono insiemi con operazioni, ma soprattutto perch la relazione strong pu essere completamente assiomizzata. In prima battuta questo sembrerebbe assurdo perch lassiomatizzazione ricorsivamente numerabile, mentre un linguaggio touring equivalente non pu esserlo, ed infatti lassiomatizzazione si limita al caso senza ricorsione.

8.10.1. Teorema di Espansione


Dividiamo il processo in due passi elimiamo ogni operatore eccetto +, il presso e nil tramite gli assiomi di riduzione verichiamo la bisimilarit tramite gli assiomi di bisimilarit strong

8.10.2. Assiomi di riduzione


E1 |E1 = E1 E2 + E2 E1 + E1 E2 con E a signicare che E viene mantenuto fermo. Rompere un parallelo con unassioma in tre parti. .E1 E2 = .(E1 |E2 ) Gli operatori e distribuiscono rispetto al +. (E1 + E2 ) E = E1 E + E2 E (E1 + E1 ) (E2 + E2 ) = E1 E2 + E1 E2 + E1 E2 + E1 E2 Restrizione: (.E)\ = .(E\) nil se , se = , 1 E1 2 E2 = nil se E1 E2 = .(E1 |E2 ) 1 2

(E1 + E2 )\ = E1 \ + E2 \ (.E)[] = ().E[] (E1 + E2 )[] = E1 [] + E2 [] In questo modo gli operatori + e . vanno verso lalto mentre gli altri verso il basso.

8.10.3. Assiomi bisimilarit strong


E + nil E1 + E2 E1 + (E2 + E3 ) E+E =E = E2 + E1 = (E1 + E2 ) + E3 =E

vengono anche detti ACI+nil (Associativity Commutativity Identity). Lultimo assioma pu sembrare ovvio ma nei sistemi con probabilit ad esempio E + E E TODO-para negli appunti del professore ci sono due esempi di conversione, non credo siano utili.

9. Il -calcolo
Un grosso limite del linguaggio appena visto il fatto che il sistema che ne risulta decisamente statico. Avremmo bisogno di un sistema che sia mobile, cio nel quale possiamo spostare sicamente un agente senza dover modicare pesantemente il codice dinamico, cio nel quale possiamo variare durante lesecuzione la conformazione dei canali open-ended, cio nel quale possiamo attaccarci ad altri sistemi mediante i canali Il -calcolo permette di ottenere questi obiettivi: ci fornisce un ambiente dalla struttura dinamica, nel quale agenti e canali nascono e muoiono di continuo e che permette la mobilit. Come nel caso di CCS, buona idea cominciare con un esempio.

Esempio 9.1 (Telefoni mobili) Consideriamo una struttura come quella visualizzata nellesempio 9.1: abbiamo unautomobile con un telefono a bordo che pu essere associata a diverse basi che ne gestiranno le telefonate. Le basi sono tutte collegate ad un centro che gestisce le associazioni fra le basi e le automobili. In alcuni casi il centro pu decidere di modicare la morfologia della rete, spostando il controllo dellautomobile da un centro allaltro. Vediamo le speciche delle varie parti del sistema. CAR(talk1 , switch1 ) = talk.CAR(talk1 , switch1 ) + switch(talk , switch ).CAR(talk , switch ) Questa la descrizione della macchina: pu dialogare su un canale talk (qua per semplicit assumiamo che possa solamente mandare messaggi) oppure ricevere dal canale switch una coppia di canali nuovi. Notare che il comando porta ad un nuovo stato dove i canali sono stati modicati: lo stesso canale switch adesso ha un nuovo valore.
def

Figura 9.1.: Esempio di struttura nel -calcolo

126

Il -calcolo

BAS Ei = BAS E(talki , switchi , givei , alerti ) =

def

def

talki .BAS Ei + givei (talki , switchi ).switch(talki , switchi ).IDLEBAS Ei Una base attiva ha quattro canali, due dei quali verso la macchina e due verso il centro. Pu alternativamente ricevere una comunicazione dalla macchina sul canale talk o ricevere una richiesta di cambio sul canale talki da ritrasmettere alla macchina sul canale switch. In questo secondo caso, lo stato cambia e la BASE diventa una IDLEBASE. IDLEBAS Ei = IDLEBAS E(talki , switchi , givei , alerti ) = alerti .BAS Ei La IDLEBASE si limita a rimanere in ascolto sul canale alert per sapere quando risvegliarsi. Vediamo il centro operativo: pu essere alternativamente in due stati. CENT RE1 = CENT RE1 (give1 , alert1 , give2 , alert2 ) = give1 (talk2 , switch2 ).alert2 .CENT RE2 CENT RE2 = CENT RE2 (give1 , alert1 , give2 , alert2 ) = give2 (talk1 , switch1 ).alert1 .CENT RE1 I due stati del centro sono perfettamente simmetrici: possono a discrezione dare e togliere il controllo della macchina alle due basi eettuando le giuste comunicazioni. Inne la composizione del sistema data da S YS T EM = (givei )(alerti )(talki )(switchi )i = 1, 2(CAR(talk1 , switch1 )|BAS E1 |IDLEBAS E2 |CENT RE1 ) dove (givei )(alerti )(talki )(switchi )i = 1, 2 la sintassi che verr usata per restringere i canali.
def def def def

9.1. Sintassi di -calcolo


9.1.1. Sintassi e potenzialit
Vediamo la sintassi del -calcolo. Assumiamo di avere un insieme N innito di nomi, ed utilizziamo i caratteri x, y, z, w, v, u e simili come una sorta di meta-variabili su tali nomi. Presentiamo adesso la sintassi del linguaggio. P | | | | | | | x(y) | xy | x (y) nil .p [x = y]p p+ p p|p (y)p !p internal action input output bound output

9.1.2. Free names e bound names


Dobbiamo capire bene qual il signicato di free name e bound name. Vediamo una denizione che ci aiuter a capire questi due concetti.

9.1 Sintassi di -calcolo

127

Figura 9.2.: Canali free e bound

Denizione 9.2 (Binding occourrence nel -calcolo) In un agente della forma x(y).p o (y)p, loccorrenza di y allinterno delle parentesi detta binding occourrence. Lo scope di tale occorrenza p.

Siamo pronti a denire i concetti che vogliamo.

Denizione 9.3 (Free name) Un nome x detto free se non nello scope di una binding occourrence per x.

Denizione 9.4 (Bound name) Ogni nome che non free detto bound

Esistono due maniere dunque per rendere un nome bound: possiamo avere unoperazione di input o una restrizione. Tuttavia, il signicato pratico di queste due maniere per bindare il nome dierente. Nel caso dellinput si tratta semplicemente di dare un nome ad un canale che non abbiamo ancora identicato: una specie di puntatore a canale. Non ci capiter mai di maneggiare direttamente un canale il cui nome bound a causa di unoperazione di input, in quanto loperazione viene digerita prima di eseguire il corpo e dunque il nome viene istanziato immediatamente. Il binding per restrizione completamente diverso: lutilizzo di questa tecnica pi simile a quello di una variabile di canale che ha una visibilit limitata. Cerchiamo di capire meglio. Prendiamo limmagine in gura 9.2, che rappresenta il programma in -calcolo con un grafo nel quale i nodi sono processi e gli archi canali di comunicazione. In questa immagine abbiamo a sinistra tre processi paralleli P Q ed R che comunicano attraverso due canali di comunicazione non bound a e b: non esiste nessun operatore di restrizione, e questo signica che tali canali sono free. Se il processo Q utilizzasse al suo interno un canale a, questo sarebbe lo stesso canale che connette i processi P e R: il canale pubblico e tutti possono scriverci o leggerci. Tecnicamente, scrivendo i tre processi come P = a(5).P Q = a 5.Q P | Q | R

P e Q possono sincronizzarsi: il nome a non ristretto, dunque pu essere utilizzato nelle comunicazioni. Prendiamo invece la situazione di destra: il nome a bound, e rappresentiamo gracamente questo fatto con

128

Il -calcolo

unarea grigia che rappresenta lo scope della restrizione (cio i processi per i quali il nome bound) e con il fatto che il nome del canale scritto allinterno del cerchietto del processo. Scriviamo questa situazione come P = a(5).P Q = a 5.Q (a) (P | R) | Q

Come possiamo vedere, loperatore di restrizione lega i processi P e R ma non Q. Questo signica che i due processi non possono sincronizzarsi normalmente: loperatore di restrizione impedisce che allesterno si veda la mossa di P. Servir un meccanismo pi complesso che permetta di allargare lo scope del canale a Q. Ovviamente, se esistesse un processo S al di fuori della restrizione che invia dati su un canale x non bound questo potrebbe tranquillamente sincronizzarsi su Q.

9.2. Semantica operazionale del -calcolo


Formalizziamo quanto visto nello scorso paragrafo, vedendo le regole di transizione per CCS. Come per questultimo, le formule ben formate sono triple, in cui ci sono due processi p,q ed unazione tali che p q. Dividiamo le regole in paragra, in modo da trattarle in maniera pi ordinata.

9.2.1. Messaggi
Vediamo innanzitutto le regole per le transizioni

p p

x y.p p Queste due regole sono sostanzialmente invariate rispetto a CCS: semplicemente in caso di una transizione (che continua ad indicare un passo di computazione interno) o di output ci si limita a consumarla e passare nello stato consecutivo. Il signicato di queste transizioni rispettivamente quello di eseguire una transizione silenziosa, ovvero senza uninterazione con lambiente, o di output, cio inviando su un canale un certo dato. Cambia invece qualcosa per quanto riguarda linput. w
w

xy

x(y).p p[ /y ] Innanzitutto abbiamo il fatto che viene trasmessa unistanziazione di y, che chiameremo w. Il nome w, e questo il cambiamento importante, non deve essere fra i nomi liberi in (y)p. Ad esempio, una situazione del genere non va aatto bene. Esempio 9.5 (Violazione della regola dei nomi in input) Mettiamo di avere un agente x(y).z w.nil Eettuiamo la transizione x(y).z w.nil (z w.nil)[z /y ]: questa non pu essere eettuata in quanto z un nome libero del termine, e questo potrebbe portare a legare una variabile che non dovrebbe essere legata nel caso in cui il z ricevuto fosse allinterno di un operatore di restrizione. Vedremo cosa questo signichi nel paragrafo 9.2.5. Notare che questa situazione pu essere facilmente risolta con l-conversione: in questo caso, basterebbe cambiare il nome del canale z nel processo di destra per non incappare in conitti. Tuttavia non ci occuperemo di questo, e richiederemo sempre che non ci siano conitti.
x(z)

x(w)

f n((y)p)

9.2 Semantica operazionale del -calcolo

129

9.2.2. Nondeterminismo
p p p+q p

q q p+q q

Il comportamento del nondeterminismo identico a quanto visto per CCS: si sceglie una delle due strade e si abbandona completamente laltra.

9.2.3. Matching
Passiamo al matching. p p [x = x]p p Quando troviamo un match, lunica possibilit che abbiamo di andare avanti il caso in cui i due termini ai lati delluguaglianza sono identici. In altro caso, non troviamo prova. Questo comando cosiddetto zucchero sintattico: in pratica sarebbe evitabile, ma quando ci si trova ad utilizzarlo decisamente pi comodo. In particolare, comodo in casi come quello dellesempio successivo. Esempio 9.6 (Utilizzo del comando di matching) Mettiamo di voler scrivere un programma nel quale un processo pu svolgere pi attivit. Un altro processo vuole mandargli un messaggio sul canale c nel quale invoca una di queste attivit e gli passa conseguentemente i parametri, ancora sul canale c. Mettiamo che il processo possa prendere due argomenti x ed y ed eseguire il processo P prendere un argomento z ed eseguire il processo Q eseguire il processo R senza argomenti Possiamo modellare questa situazione facendo accettare al nostro processo un parametro w che indichi quale processo eseguire, dunque utilizzare nondeterminismo ed operatore di matching per selezionare quale operazione eseguire. c(w). ([w = p]c(x).c(y).P | [w = q]c(z).Q | [w = r]R)

Il programma ricever w sul canale c ed in base al suo valore (p, q o r) eseguir luna o laltra azione.

9.2.4. Parallelismo
Passiamo al discorso sul parallelismo. Abbiamo innanzitutto due regole quasi identiche a quelle di CCS per far andare avanti una delle due parti del parallelismo. p p p|q p |q

bn() f n(q) =

q q p|q p|q

bn() f n(p) =

La dierenza sta ancora, come nel caso della ricezione di dati da un canale, nel fatto che possiamo far confusione con i nomi.

130
xz x(y)

Il -calcolo

p p

q q

p|q p |(q [z /y ]) Introduciamo inne la regola per la sincronizzazione. Linvio di un dato y sul canale x si lega alla ricezione del dato sullo stesso canale eettuata da un altro processo parallelo e si risolve con la sostituzione del nome della variabile in ingresso con il valore passato dal primo processo. Vediamo un esempio di come la restrizione sui nomi nella regola sullavanzamento di una delle due met del parallelismo sia necessaria. Esempio 9.7 (Violazione della regola sui nomi nel parallelo) Mettiamo di avere la regola sullavanzamento unilaterale vista in CCS. P P P|Q P |Q Immaginiamo che = x(z): con questa regola z verr scritta in tutto il processo P. Il problema arriva quando z contenuta anche nel processo Q: una successiva sostituzione di tale variabile potrebbe creare scompigli non indierenti! Per vederlo inseriamo P e Q in un contesto pi grande (x(z).P | Q) | x y.R Utilizzando le regole di sincronizzazione, input e la regola sullavanzamento unilaterale vista in CCS (senza dunque vincoli sui nomi) potremmo derivare (x(z).P | Q) | x y.R (P | Q)[y /z ]|R (x(z).P | Q) (P | Q)[y /z ]
x(z)

x y.R R

xy

Come possiamo vedere, la sostituzione di z interessa anche il processo Q, in cui z era una variabile libera qualunque. Anche qua potremmo risolvere il tutto mediante l-conversione, ma non tratteremo questo caso.

9.2.5. Restrizioni, apertura e chiusura


Arriviamo dunque al momento pi dicoltoso del -calcolo, in quanto momento che pi si discosta dalla visione di mondo di CCS. Vediamo innanzitutto la regola che gestisce la restrizione base. p p (y)p (y)p

n()

La regola della restrizione vieta lutilizzo di y in qualunque modo allinterno di qualunque azione , sia come free name che come bound name. Questo comportamento ancora simile a quello di CCS. Il problema arriva quando dobbiamo allargare il club dei processi che utilizzano una certa variabile privata. Innanzitutto viene naturale chiedersi perch comunicare un nome bound e perch questo non avvenisse in CCS. La risposta semplice: in CCS non potevamo comunicare canali, dunque non cera necessit di gestire la situazione nella quale allargavamo lo scope di un canale privato. Andiamo a descrivere come questa operazione viene eettuata. Serviranno due regole separate per gestire prima lapertura del vincolo di restrizione e dunque la chiusura dello stesso con il nuovo processo allinterno. p p (y)p p [ /y ]
w x(w) xy

f n((y)p)

9.2 Semantica operazionale del -calcolo

131

La prima regola che vediamo quella di apertura, che apre il vincolo di restrizione: parliamo delloperazione di estrusione. Si tratta in pratica della trasformazione delloperazione di output libero in unoperazione di output legato: trattasi di un particolare tipo di operazione di output, non direttamente esprimibile nel linguaggio, che indica che il nome che sto trasmettendo sul canale un nome legato da una restrizione. Questo operatore elimina loperatore di restrizione dal processo: questo perch stiamo letteralmente aprendo la restrizione per far entrare un altro processo. p p
x (w)

q q

x(w)

p|q (w)(p |q ) Loperazione di chiusura la complementare delloperazione di apertura: richiede che i due processi in parallelo eseguano due operazioni complementari, una di lettura e laltra di scrittura bound (e lunica speranza di generare questa scrittura con la regola di estrusione), e genera un processo nuovo nel quale la variabile legata da un operatore di restrizione. Vediamo un esempio chiaricatore. Esempio 9.8 (Estrusione di variabile) Prendiamo il programma (x)(y x.P | R) | y(z).Q Il processo pi a sinistra vuole comunicare al processo a destra la variabile x, che ristretta. Vogliamo arrivare in una situazione (x)(P |R|Q [ x /z ]) nella quale lo scope di x sia stato allargato. Vediamo innanzitutto come mai la sincronizzazione normale fallisce e non produce nessuno stato in uscita. (x)(y x.P | R) | y(z).Q q1 (x)(y x.P | R) q2
yx q1 =q2 |q3 [ x /z ] yx

y(z).Q Q

y(z)

Guardiamo la clausola (x)(y x.P | R) q2 : richiederebbe di inviare il nome x a partire da un processo per il quale x ristretta, cosa ovviamente impossibile. Lunica maniera nella quale possiamo procedere dunque la regola di chiusura, che infatti prende due processi paralleli e li racchiude in una restrizione. (x)(y x.P |R)|y(z).Q (x)(P |R|Q [ x /z ]) (x)(y x.P |R) (P |R)
y(x)

y(z).Q Q
yx yx

y(z)

y x.P |R P |R y x.P P

Al primo passo abbiamo applicato la regola di chiusura, trasformando la sincronizzazione in una coppia di operazioni gemelle di invio e ricezione bound. Lunica maniera per derivare un invio bound con la regola di apertura, che stata dunque utilizzata nella terza riga (loperazione di ricezione stata banalmente digerita dopo il controllo sui nomi). A questo punto si procede con la regola del parallelo per trovare loperazione di output e consumarla.

9.2.6. Replicazione
p|!p p !p p

132

Il -calcolo

Per ultimo abbiamo loperatore di replicazione, che ci fornisce un numero illimitato di copie di p. Vediamo un paio di esempi. Esempio 9.9 (Derivazione nel -calcolo (1)) Prendiamo lagente del -calcolo (((y)x y.p) | q) | x(z).r Abbiamo una situazione nella quale il processo (y)x y.p vuole sincronizzarsi col processo x(z).r stabilendo un canale privato senza che q riesca a sincronizzarsi a sua volta. Vediamo come si evolve la situazione. (((y)x y.p) | q) | x(z).r q1 ((y)x y.p) | q q2 (y)x y.p q4
x(w) x(w) q1 =(w)q2 |q3 q2 =q4 |q =

f n(q)
xw

x y.p q5

x(z).r q3 q4 =q5 [w /y ] x(w) x(z).r q3 q3 =r[w /z ] q5 =p x(w) x(z).r q3

x(w)

Ricostruiamo dunque allindietro lo stato q1 nel quale transisco. q5 = p q4 = q5


w

/y = p q3 = r
w

/y /z

q2 = q4 | q = p q1 = (w)q2 | q3 = (w) p In denitiva, possiamo aermare che (((y)x y.p) | q) | x(z).r (w) p
w w

/y | q
w

/y | q | r

/z

/y | q | r

/z

Esempio 9.10 (Derivazione nel -calcolo (2)) # DA FARE!!!!

9.3. Semantica astratta di -calcolo


9.3.1. Nozioni di equivalenza
Diamo per prima cosa alcune nozioni di equivalenza fra processi. Valgono le seguenti propriet: p + nil p p | nil p (x) nil nil [x = x] p p p |!p !p (x)(p | q) p | (x)q se x p+qq+ p (p + q) + r p + (q + r) p|qq|p (p | q) | r p | (q | r) (y)(x)p (x)(y)p x = y nil nil f n(p)

Lultima regola particolarmente importante. NOTA: vale anche la regola (x)(p + q) p + (x)q sex nellintroduzione al pi-calcolo di Parrow pg. 10.

f n(p)???

9.3 Semantica astratta di -calcolo

133

9.3.2. Semantica astratta


Vediamo adesso la semantica astratta del -calcolo. Come per CCS ci baseremo sulla nozione di bisimilarit, ed anche qua avremo la possibilit di denire una bisimilarit strong ed una weak. Ci concentreremo solamente su bisimulazioni strong, in quanto come vedremo avremo problemi di congruenza gi con queste. Vedremo prima le versioni ground, che ci daranno problemi di congruenza, e quindi passeremo ad una loro evoluzione che risolver questi problemi.
9.3.2.1. Bisimularit ground

Siamo pronti a vedere la bisimularit di tipo ground per il -calcolo. Per quanto riguarda le operazioni e di output, la bisimularit identica al caso visto in CCS pS q p p

x(y)

bn()

f n(q)

q q

p Sq

e viceversa

Per quanto riguarda le operazioni di input la storia cambia. Dobbiamo assicurare luguaglianza per qualunque valore passiamo sul canale: per assicurare questa propriet possiamo seguire due strade. La prima, che ci dar una semantica cosiddetta early, richiede che per ogni possibile nome in ingresso si trovi uno stato q che soddis luguaglianza. pS q p p
x(y)

f n(q)

w.q .q q

x(y)

p [w /y ]S q [w /y ] e viceversa

La bisimilarit early si indica con il simbolo E . La seconda, che ci dar una semantica cosiddetta late, richiede che esista un unico stato q che verica luguaglianza per qualunque nome in ingresso sul canale. pS q p p
x(y)

f n(q)

q .w.q q

x(y)

p [w /y ]S q [w /y ] e viceversa

La bisimilarit late si indica con il simbolo L . Notare che entrambe le bisimilarit hanno la regola per e output in comune. In generale la bisimularit early tender a distinguere meno rispetto a quella late, in quanto per nomi diversi in ingresso possiamo scegliere stati diversi. Vediamo un esempio in cui questo porta a valutare dierentemente un caso. Esempio 9.11 (Bisimularit early e late) Prendiamo i due processi p = x(y).. nil +x(y). nil q = p + x(y).[y = z].. nil Vediamo perch i processi p e q risultano equivalenti per la bisimulazione early e non quella late: Nel caso early dobbiamo vericare che per ogni nome in ingresso, esista uno stato q tale che simuli p e viceversa. se q transisce in x(y).[y = z]..nil dobbiamo trovare uno stato in p tale per cui, nel caso u = z, si comporti come .nil: in questo caso va benissimo x(y).. nil. per valori diversi da z dobbiamo andare in stallo, a questo punto sceglieremo x(y). nil che fa esattamente quello che chiedevamo Nel caso della late invece dobbiamo trovare (almeno) uno stato che emuli perfettamente il comporamento di x(y).[y = z].. nil, ma questo non possibile. In sostanza i due processi risultano equivalenti per E ma non per la L , infatti se scegliamo come q = x(y).[y = z]..nil e poi usiamo un y z abbiamo un deadlock che in p non si presenta.

134
9.3.2.2. Bisimilarit non ground

Il -calcolo

La bisimilarit ground troppo sempliciotta, ed infatti non una congruenza rispetto al presso di input. Vediamo un controesempio Esempio 9.12 (La bisimilarit ground non una congruenza) possibile dimostrare che gli agenti p = x x.nil | x (y).nil q = x x.x (y).nil + x (y).x x.nil

sono bisimilari. In particolare, nessuno dei due capace di eseguire una sincronizzazione e dunque di transire con . Proviamo ad inserirli in un contesto z(x )(. . .). I due agenti risultanti non sono bisimilari: il motivo che allesterno mettiamo qualcosa che lega una variabile precedentemente libera, il che pu portare a risultati scorretti. p = z(x )(x x.nil | x (y).nil) q = z(x )(x x.x (y).nil + x (y).x x.nil)

se come x inviamo proprio x, in questo caso, il primo agente pu eseguire una mossa z(x) andando nello stato x x.nil | x(y).nil, per poi fare una sincronizzazione sul canale x, mentre laltro non lo pu fare. Il problema quello dellaliasing: inserire un agente valido allinterno di un contesto pu legare nomi che precedentemente erano liberi. Per evitare che questo crei problemi con le congruenze, abbiamo bisogno di una bisimilarit pi stretta. Deniamo prima formalmente il concetto di sostituzione in CCS e di applicazione di sostituzione. Denizione 9.13 (Sostituzione) Una sostituzione una funzione : N N , dove N linsieme dei nomi, che quasi ovunque lidentit (ovvero che diversa dallidentit in un numero nito di casi). Indichiamo lapplicazione ad una variabile con xi . Se abbiamo una sostituzione tale che xi = yi con 1 i n (e x = x per tutti gli altri nomi) possiamo scrivere [y1 / x1 , . . . ,yn / xn ]. Abbiamo gi usato la sostituzione in alcune regole in precedenza. Vediamo come la sostituzione si applica Denizione 9.14 (Applicazione di sostituzione) Indichiamo con P lagente P al quale stata applicata una sostituzione . Questa sostituzione ottenuta sostituendo simultaneamente z ad ogni variabile libera z in P, cambiando i nomi delle variabili legate per evitare problemi. Deniamo dunque la bisimilarit non ground. Denizione 9.15 (Bisimilarit early non ground) Dati due agenti p e q, ho p E q .p E q

Denizione 9.16 (Bisimilarit late non ground) Dati due agenti p e q, ho p L q .p L q

9.4 Estensioni del -calcolo

135

9.4. Estensioni del -calcolo


Nel tempo sono nate alcune estensioni che miravano ad estendere, o restringere, il Pi- calcolo. interessante vedere che queste estensioni non aumentano n diminuiscono il potere espressivo.

9.4.1. -calcolo asincrono


Il -calcolo asincrono una restrizione del -calcolo che richiede che le comunicazioni siano asincrone. Dopo aver eettuato unoperazione di output, un agente pu avere solamente nil come azione. possibile simulare il -calcolo normale nella seguente maniera: data una generica sincronizzazione x y.P | x(y).Q la sostituisco con (z)x z.nil | z y.nil | z(z).P | x(z).z(y).(z z | Q)
1 2 3 4

f n(P, Q)

per prima cosa il partner 1 spedisce il nome privato z sul canale x. Questo viene catturato dal partner 4, e questa sincronizzazione sblocca luso del canale z: viene quindi eseguita la sincronizzazione con 2, e viene dunque mandato il nome z sul canale z che viene raccolto da 3 che pu nalmente cominciare lesecuzione di P. In parallelo viene eseguito Q, come previsto.

9.4.2. HOPI: High-order -calculus


Pi sorprendente il risultato che viene tentando di estendere il -calcolo con funzioni di ordine superiore al primo. Possiamo trasmettere adesso interi processi attraverso un canale! Pu sembrare un cambiamento epocale, eppure ci rendiamo conto che il potere espressivo lo stesso del -calcolo classico. Infatti una transizione xR.P | x(Y).Y pu essere simulata con (z)x z.(z(z).R | P) | x(z).z z.nil Al posto del processo viene mandato un puntatore ad un trigger che avvia il processo stesso.

Parte IV.

Calcoli di processo probabilistici

10. Teoria della misura e catene di Markov


Passiamo adesso a vedere lultima classe di linguaggi del corso: i linguaggi per lo studio di modelli probabilistici. Sono linguaggi basati su CCS, opportunamente esteso con costrutti probabilistici. Questo porter ad un grafo di esecuzione rappresentabile da una catena di Markov. Prima di addentrarci nella trattazione del linguaggio dobbiamo avere qualche base matematica: rivedremo alcuni aspetti della teoria della misura per poi confrontarci con le catene di Markov e, nel prossimo capitolo, capire come utilizzarle per denire un linguaggio che ci aiuti a far quello di cui abbiamo bisogno.

10.1. La teoria della misura


10.1.1. I Sigma-eld
La teoria della misura, che riguarda la probabilit, il primo passo da fare verso le catene di Markov. Partiamo dal primo tassello di questa teoria: il concetto di sigma-eld, o sigma-algebra. Denizione 10.1 (Sigma Field (-algebra)) Un sigma eld formato da un insieme di oggetti un insieme F 2 di sottoinsiemi di , tale che F F IFF I F (F chiuso rispetto al complemento) I1 , I2 F I1 I2 F, I1 I2 F (chiuso rispetto ad unione ed intersezione numerabile) La coppia , F detta spazio misurabile. Questa rappresenta linsieme di oggetti sui quali costruiremo la nostra funzione di probabilit, che deniremo a breve. Esempio 10.2 Se = a, b, c, d, un possibile insieme F per formare un sigma eld potrebbe essere F 2 = {, {a, b}, {c, d}, {a, b, c, d}} Sopra i sigma eld appena descritti deniamo le misure, cio metodi sistematici per assegnare ad ogni sottoinsieme una specie di punteggio, rappresentato da un numero reale tra 0 e . Denizione 10.3 (Misura su (, F)) Una misura su (, F) una funzione del tipo : F R {}

140

Teoria della misura e catene di Markov

tale che () = 0 (
i

Xi ) = i (Xi )

se Xi disgiunti

()

Vediamo due particolari misure che ci interesseranno particolarmente. Denizione 10.4 (Sub-probability) Una sub-probability una misura tale che () 1

Denizione 10.5 (Probability) Una sub-probability una misura tale che () = 1

10.1.2. Costruire un sigma-eld


Una maniera se vogliamo classica di costruire un sigma-eld quella di denirlo a partire da una famiglia di sottoinsiemi che chiuderemo rispetto a unione, intersezione e complemento. Tuttavia, le cose sono leggemente pi complesse a seconda della cardinalit di : se questi ha una cardinalit nita o numerabile non ci sono problemi, mentre se ha una cardinalit del continuo linsieme F potrebbe avere la cardinalit 2 delle funzioni, che sarebbe un insieme troppo grande per denirvi sopra una misura. In caso di insiemi con la cardinalit del continuo dovremo dunque scegliere un sottoinsieme della stessa cardinalit di sottoinsiemi di lavoro. Vediamo un esempio nel quale questo concetto trova applicazione: abbiamo un insieme troppo grande e dobbiamo ridurlo prima di denirvi una misura di probabilit. Esempio 10.6 (Cammini niti) Immaginiamo di avere a disposizione una moneta non truccata. Vogliamo rappresentare tutte le sequenze di lanci possibili. Viene naturale denire il nostro insieme come chiusura rispetto al prodotto cartesiano dellinsieme = {h, t} Tuttavia, questo insieme ha la cardinalit del continuo: i suoi sottoinsiemi sono inniti. Lo stratagemma che utilizzeremo consiste nel prendere tutti i sottoinsiemi di cammini niti di . I cammini niti sono stringhe in un alfabeto di due caratteri, e sono un insieme numerabile che ci va benissimo. Per non perdere informazione, consideriamo anche che un cammino nito individui un particolare albero innito di cammini che hanno tale cammino come presso [] = {| } Laltro metodo per risolvere il problema quello di utilizzare una topologia. Vediamo cos. Denizione 10.7 (Topologia) Sia X un insieme e sia una famiglia di sottoinsiemi di X. Allora una topologia su X sse X e 2X sono open sets, cio insiemi tali che

10.1 La teoria della misura

141

Figura 10.1.: Densit della distribuzione esponenziale

X, chiuso per unione: cio lunione di un numero arbitrario di elementi di X ancora un elemento di X chiuso per intersezione nita: cio lintersezione di un numero arbitrario di elementi di X ancora un elemento di X

Intuitivamente un insieme U aperto se ogni suo punto pu essere mosso in una qualsiasi direzione ed essere ancora in U. possibile chiudere una topologia ottenendo un sigma eld. Se una topologia su X allora la coppia (X, ) detto uno spazio topologico.

Denizione 10.8 (Topologia euclidea) Intervalli aperti ]a, b[

{x R | a < x < b}

Se chiudiamo la topologia euclidea otteniamo il Sigma eld di Borel.

Ci interesseranno i casi discreti. Se abbiamo il caso continuo, dobbiamo considerare i casi aperti e i cammini lungo un sistema di transizione.

10.1.3. Distribuzione probabilistca esponenziale


La distribuzione probabilistica esponenziale ci servir per descrivere il comportamento delle nostre catene di Markov. Rivediamone i concetti principali. una distribuzione denita sui valori positivi, che ha funzione di ripartizione F(x) = 1 ex e densit d(x) = ex : il graco riportato in gura 10.1. una distribuzione senza memoria: vediamo cosa questo signichi.

Esempio 10.9 (Distribuzione senza memoria) Abbiamo un sistema in uno stato S 1 , che pu decadere e passare in uno stato S 2 . Un valido esempio pu essere un atomo radioattivo. S1 S2 Vogliamo modellare la probabilit di questo evento, considerando che completamente slegato dal tempo: la probabilit che latomo decada in un tempo t0 + t sapendo che al tempo t0 non decaduto la stessa per qualunque tempo t0 .

142

Teoria della misura e catene di Markov

Dimostriamo le due propriet che ci interessano. La prima quella pi importante: la distribuzione esponenziale senza memoria. Teorema 10.10 (La distribuzione esponenziale senza memoria) Sia d una variabile casuale continua che indica il tempo al quale avviene un certo avvenimento. Se tale variabile segue una legge esponenziale di parametro , vale Prob{d t0 + t | delay > t0 } = Prob{d t}
Dimostrazione. La variabile d segue una distribuzione esponenziale: utilizziamo la sua funzione di ripartizione ottenendo
t0 +t et t0 et t0

=
0

et

Vale

b a

et = et

b a

= et : quindi abbiamo a sinistra


b

t0 +t et t0 et t0

et

t0

t0 +t t t0 e

et0 et0 et et0 (1 et ) = = 1 et et0 et0

e a destra
t

et = et

0 t

= 1 et

La seconda propriet riguarda la situazione in cui ci troviamo in uno stato dal quale ci sono due o pi possibili transizioni in uscita e vogliamo sapere la probabilit di aver seguito una qualunque transizione prima di un certo tempo t. Teorema 10.11 (Transizioni multiple) Dati due eventi, siano d1 e d2 due variabili che contengono listante di tempo nel quale questi due eventi accadono. Se tali variabili seguono una legge esponenziale di parametro rispettivamente 1 e 2 , vale Prob{min{d1 , d2 } t} = 1 e(1 +2 )t
Dimostrazione. Si vede semplicemente che Prob{delay1 t} + Prob{delay2 t} Prob{delay1 t delay2 t} = (1 e1 t ) + (1 e2 t ) (1 e1 t )(1 e2 t ) = 1 e1 t e2 t = 1 e(1 +2 )t

La terza propriet serve a confrontare due eventi. Teorema 10.12 (Confronto di due eventi) Dati due eventi, siano d1 e d2 due variabili che contengono listante di tempo nel quale questi due eventi accadono. Se tali variabili seguono una legge esponenziale di parametro rispettivamente 1 e 2 , vale Prob{delay1 < delay2 } =
?

1 1 + 2

10.2 Processi Stocastici Markoviani


Dimostrazione. Anche qua si dimostra semplicemente nella seguente maniera
0

143

1 e1 t1
0 0 0

t1

2 e2 t dt2 dt1
t1

= = = = =

1 e1 t1 e2 t2 dt1 1 e1 t1 e2 t1 ) 1 e(1 +2 )t1 dt1

0 1 (1 +2 )t 1 +2 e 1 1 +2

10.2. Processi Stocastici Markoviani


10.2.1. Le catene di Markov
Introduciamo adesso i processi stocastici, che rappresenteremo con delle catene di Markov. Cosa sono queste catene? Vediamo di arrivarci. Immaginiamo di avere una linea del tempo, nella quale prendiamo un insieme di istanti di tempo t1 , . . . , tn . Ad ognuno di questi istanti associamo una variabile casuale Xti : S R: S sar ovviamente un sigma-eld, e completamente indipendente da chi sono i punti ti . Il signicato della variabile casuale Xti quello di esprimere la probabilit di trovarsi in un dato stato nellistante ti . Un sistema del genere detto processo stocastico. Denizione 10.13 (Catena di Markov) Una catena di Markov, o processo stocastico Markoviano, un processo stocastico per il quale vale la Propriet di Markov Prob{Xtn+1 } A | Xtn = Pn , . . . , Xt0 = P0 } = Prob{Xtn+1 A | Xtn = Pn }

In pratica, in un processo Markoviano la probabilit che Xtn+1 goda di una certa propriet dipende solo dallo stato Xtn e non da tutti gli altri precedenti. Le propriet che possiamo misurare su tali stati sono numerose: ad esempio, possiamo vedere se in quel momento ci troviamo in un particolare insieme di stati o simili. In generale vogliamo che tutta la storia passata sia riassunta nel solo immediatamente stato precedente: se questo non accade si parla di processo non Markoviano. In quel caso, per poter trattare il processo stocastico come se fosse una catena di Markov dobbiamo immagazzinare allinterno dello stato uninformazione sulla sua storia. Esistono alcune particolari catene di Markov che possono essere trattate in maniera decisamente pi semplice perdendo un po di essibilit. Vediamole. Denizione 10.14 (Catena di Markov omogenea) Una catena di Markov detta omogenea se vale Prob{Xt (t > t) A|Xt = P} = Prob{Xt t A|X0 P} Questo signica che qualunque t pu essere translato su t t, e pi in generale possibile traslare lasse dei tempi a piacimento. Questa propriet ci permette di essere indipendenti dal tempo e immaginare di partire sempre dallistante zero ad esempio.

144

Teoria della misura e catene di Markov

10.2.2. Catene di Markov a tempo discreto e continuo


Nei prossimi paragra vedremo due insiemi di catene di Markov: quelle con a tempo discreto e quelle a tempo continuo. Cerchiamo di capire quale sia la dierenza fra queste catene e quale sia meglio usare per modellare una situazione. Cominciamo con il denire le catene di Markov a tempo discreto Denizione 10.15 (Discrete-time Markov Chain (DTMC)) Una DTMC una catena di Markov nella quale linsieme degli istanti di tempo numerabile.

Questo ci permette di avere il concetto di istante precedente nella nostra catena di Markov: possiamo dunque calcolare una propriet in un istante considerando comera il sistema nello stato precedente. Prob{Xn+1 A|Xn = Pn } Vedremo cosa questo signichi nella sezione 10.3. Se invece linsieme degli istanti di tempo continuo abbiamo una Continuous Time Markov Chain. Denizione 10.16 (Continuous-time Markov Chain (CTMC)) Una DTMC una catena di Markov nella quale linsieme degli istanti di tempo continuo.

Questo ci porter a dire che la probabilit che ad un certo istante t valga una certa propriet t sar proporzionale allintervallo di tempo t. Approfondiremo nella sezione 10.4.

10.3. DTMC - Discrete-time Markov Chain


10.3.1. Relazioni con CCS
Le catene di Markov discrete sono un sistema di transizioni molto simile al CCS: abbiamo un insieme di stati (possibilmente innito) e delle transizioni. La dierenza fondamentale che le transizioni non sono etichettate da azioni, ma da probabilit. Rivediamo due espressioni equivalenti della funzione di transizione di CCS. : S P(L S ) : P(S L S )

Possiamo vedere come una funzione che dato lo stato di partenza ritorna le coppie contenenti letichetta e lo stato di arrivo, o equivalentemente come un insieme di triple che contengono le stesse informazioni. : (S L) P(S ) : S L P(S )

Alternativametne possiamo vederla come una funzione che prende uno stato di partenza ed una etichetta come input e ritorna linsieme degli stati di arrivo (notare che sono insiemi perch il sistema non deterministico). Scopriremo a breve che queste espressioni, che per CCS sono assolutamente equivalenti, portano a qualche cambiamento nelle nostre catene di Markov.

10.3.2. Denizioni
Vediamo come funziona la funzione di transizione nel caso delle catene di Markov discrete. : S (D(S ) + 1) Unione disgiunta con singleton

10.3 DTMC - Discrete-time Markov Chain

145

Figura 10.2.: Un esempio di Discrete-time Markov Chain Abbiamo una funzione che, dato uno stato s, restituisce una distribuzione di probabilit che ci dice, se al tempo t mi trovo in s, con quale probabilit mi trover in un certo stato s al tempo t+1. Alternativamente, posso segnalare uno stato di deadlock dal quale non ho transizioni in uscita. questo il ruolo del +1 nel codominio della funzione. Per ogni nodo deve valere che la somma degli archi uscenti faccia uno. (s)(si ) = 1
i

con (s) D(S )

Vediamo un esempio.

Esempio 10.17 (DTMC) Prendiamo la DTMC in gura 10.2, che rappresentiamo con un grafo diretto e pesato. La stessa situazione pu essere espressa in forma matriciale nella seguente maniera. 0.8 0 1 0.2 1/3 0 0 2/3 0 Vogliamo calcolare la probabilit di trovarci in un certo stato al tempo t1 assumendo di non sapere in quale stato siamo precedentemente. Supponiamo di avere 1 di probabilit di trovarci in un particolare 3 stato: dobbiamo eseguire una moltiplicazione di matrice, come vediamo qua sotto. 1/3 0.8 0 1 5.4/9 1/3 0.2 1/3 0 = 4.5/9 1/3 0 2/3 0 2/9 In questo esempio, il vettore di partenza pone di partire da uno qualunque degli stati in modo del tutto equiprobabile, mentre il risultato del calcolo mostra le probabilit di trovarsi in uno stato dopo una mossa dellagente. Se moltiplicassimo il vettore risultante ancora per la matrice, otterremmo le probabilit al passo ancora successivo e cos via.

Vediamo unaltra dierenza rispetto a CCS. In CCS era perfettamente logico avere due transizioni dierenti che collegassero gli stessi stati: ad esempio lagente .P + .P ha due transizioni sintatticamente diverse fra se stesso e lo stato P. Nelle catene di Markov questo non ha aatto senso: qua due azioni che collegano gli stessi nodi con probabilit rispettivamente a e b possono essere unite in una transizione unica, come vediamo in gura 10.3. Vediamo adesso una denizione che ci indica come si calcola la probabilit di seguire un certo cammino allinterno del nostro sistema.

146

Teoria della misura e catene di Markov

(a)

(b)

Figura 10.3.: Due DTMC equivalenti: la seconda ricavata sommando i coecienti della prima

Denizione 10.18 (Probabilit di un cammino) Deniamo la probabilit di un cammino come Prob(s1 . . . sn ) = n1 si si+1 i=1

Vediamo un esempio Esempio 10.19 (Probabilit di un cammino) Ad esempio, prendendo la matrice dellesempio 10.17, abbiamo Prob(1 2 3 1) = 0.2 2 2 1= 3 15 Prob(1 1 3 1) = 0.8 0 1 = 0

In caso di cammini inniti ci possiamo comportare come abbiamo visto nellesempio 10.6. Esempio 10.20 (Random walk) Immaginiamo di avere un asse come lo spazio per il nostro cammino e che il camminatore parta dallo zero per spostarsi a destra o sinistra di ununit, con uguale probabilit. P(0) = 1 m m 1 m m + 1 Il numero di possibili cammini che il camminatore pu eettuare innito, cos come la lunghezza di alcuni di tali cammini. Rappresentiamo i cammini con i loro pressi niti, in modo da non incappare in problemi di cardinalit. Notare che, per la legge dei grandi numeri, immaginando di prendere linsieme dei cammini che da un certo punto in poi non toccano pi lo zero la probabilit di questo tutto questo insieme zero.
1/2 1/2

10.3.3. Limite di una catena: catene ergodiche


Viene da chiedersi: se partiamo da uno stato qualsiasi e continuiamo ad applicare la matrice, possibile che ad un certo punto si arrivi ad un punto stabile? Scopriamo che questo accade per le catene di Markov Ergodiche. Denizione 10.21 (Catene ergodiche) Una catena di Markov detta ergodica quando

10.4 CTMC - Continuous-time Markov Chain

147

i) irriducibile: per ogni coppia di stati deve esistere un cammino che li colleghi. ii) aperiordica: il MCD della lunghezza dei cammini che collegano uno stato a se stesso deve essere 1.

Abbiamo che i) implica che non ci siano deadlock mentre ii) che non ci siano cammini periodici, ad esempio se togliessimo i self-loop dallesempio refexm:dtmc avremmo un sistema periodico. Questo limite sar della forma S M=S
si

=1

Con una catena di Markov ergodica abbiamo una ed una sola soluzione detta spazio stazionario.

Esempio 10.22 (Punto di stabilizzazione) Nellesempio 10.17 il punto nel quale le probabilit si stabilizzano S 1 = 2/3 Infatti 2/3 0.8 0 1 2/3 1/5 0.2 1/3 0 = 1/5 2/15 0 2/3 0 2/15

S 2 = 1/5

S 3 = 2/15.

10.4. CTMC - Continuous-time Markov Chain


Vediamo adesso il funzionamento di una CTMC. Adesso abbiamo un tempo continuo: non possiamo pi dunque calcolare la probabilit di essere in uno stato rispetto allo stato precedente in quanto non esiste pi neppure il concetto di istante di tempo precedente. Le transizioni uscenti saranno dunque etichettate con rate della distribuzione esponenziale che ci da la probabilit che in un certo tempo avvenga un cambiamento di stato lungo quella transizione.

10.4.1. Denizioni
Vediamo la funzione di transizione per CTMC: pu essere espressa alternativamente in una di queste forme : S P(R S ) : (S S ) R Abbiamo ancora un grafo che etichettato con i rate della distribuzione esponenziale. Per capire come lo stato varia, dobbiamo utilizzare le relazioni viste nella sottosezione 10.1.3. Anche nelle CTMC vero che due transizioni fra gli stessi stati con rate rispettivamente 1 e 2 sono equivalenti ad una transizione sola con rate 1 + 2 . inoltre vero che le transizioni che collegano uno stato a se stesso sono trascurabili: nelle DTMC rappresentavano il fatto che a due istanti di tempo successivi potevamo trovarci nello stesso stato, mentre qua perdono anche questo senso diventando di fatto inutili. Possiamo sempre trasformare una CTMC in una DTMC, pur perdendo informazione su quanto tempo si rimane in un certo stato c (S 1 S 2 ) D (S 1 )(S 2 ) = S S c (S 1 S 2 ) Normalizzazione

148

Teoria della misura e catene di Markov

Figura 10.4.: Due Continuous-time Markov Chain bisimilari

10.4.2. Bisimilarit nelle CTMC


A partire dalla bisimilarit per CCS possiamo denire facilmente una nozione analoga di bisimilarit per le CTMC. Per arrivarci, vediamo la bisimilarit in CCS da un altro punto di vista. Deniamo una funzione : S Act 2S {true, false} che, presi uno stato, unazione ed un insieme di stati di arrivo, restituisce true se e solo se esiste uno stato fra quelli di arrivo per il quale esiste la transizione data dallo stato di partenza. (p, , I) = q I. p q Se dato un agente p ne indichiamo la classe di equivalenza con la notazione [p], abbiamo che p(R)q [p](R) = [q](R) = , I R. (p, , I) (q, , I) In pratica, due agenti sono bisimilari se e solo se entrambi sono nella stessa classe di equivalenza, il che implica che per qualunque classe di equivalenza I e mossa la funzione restituisce lo stesso valore. Passando alle CTMC, deniamo la funzione M : S 2S R, che somma i rate delle mosse dallo stato di partenza allinsieme degli stati di arrivo. M (s, I) = (s)(I) =
s I

(s)(s )

Notare come questa denizione oltre ad essere qualitativa come quella data per CCS anche quantitativa perch ritorna un valore ben preciso. Possiamo introdurre a questo punto una nozione di bisimilarit analoga alla precedente basata sulla denizione di M . s1 (R)s2 = I R. M (s1 , I) = M (s2 , I) =
R=(R)

CTMC bisimilarity

Avendo un risultato numerico, deve valere luguaglianza matematica fra i due valori restituiti. Vediamo un esempio. Esempio 10.23 Prendiamo la situazione della gura 10.4, e proviamo che le classi di equivalenza sono le seguenti. R = {a1 , a2 }, {b1 , b2 , b3 }, {c1 , c2 }, {d1 , d2 } Vogliamo dunque dimostrare che R una bisimulazione. Per farlo, controlliamo che la propriet vista sopra vera.

10.4 CTMC - Continuous-time Markov Chain

149

M (a1 , {b1 , b2 , b2 }) = M (a2 , {b1 , b2 , b3 }) = 0.4 M (b1 , {c1 , c2 }) = M (a2 , {c1 , c2 }) = 2 M (c1 , {d1 , d2 }) = M (c2 , {d1 ,2 }) = 0.8 La relazione eettivamente vale (in tutti i casi non elencati abbiamo che M restituisce zero, non essendoci cammini.

Potremmo fare un discorso simile anche per le DTMC, ma in quel caso avremmo un risultato poco interessante: essendo in ogni nodo la somma dei pesi della stella uscente pari a 1, tutti gli stati risulterebbero bisimilari.

11. Estensioni delle catene di Markov e PEPA


11.1. Azioni e nondeterminismo nelle catene di Markov
Con questo ultimo capitolo vogliamo esplorare le catene di Markov per comprendere come aggiungervi informazioni e renderle pi espressive. Per farlo, vogliamo aggiungere due elementi: le azioni con cui etichettare gli archi della catena il nondeterminismo a livello di distribuzione: a seconda di quale etichetta scegliamo possamo avere pi distribuzioni probabilistiche in uscita. Nei prossimi paragra esploreremo cosa questo signichi.

11.1.1. CTMC con azioni


Laggiunta di informazioni riguardanti le azioni da intraprendere inuenza la nostra funzione di transizione di stato. Partiamo ancora una volta da CCS: abbiamo detto che in CCS potevamo scrivere la come S L P(S ) oppure S P(L S ). Da queste due espressioni equivalenti possiamo generare due versioni delle CTMC con azioni che dieriscono leggermente. R : S L (D(S ) + 1) reactive probabilistic transition system G : S (D(L S ) + 1) generative probabilistic transition system In un sistema reattivo scelgo prima letichetta da seguire, poi trovo una distribuzione di probabilit che mi dice dove posso nire. In un sistema generativo ho la probabilit che mi lega pi strettamente: non ho eettivo contollo sul sistema in quanto non posso scegliere letichetta da seguire, al contrario di quanto succede nei sistemi reattivi. In un sistema reattivo dovr valere s R s l s = 1, mentre in un sistema generativo facciamo la somma anche sulle etichette: (l,s ) G s (l, s ) = 1. Approfondiremo solamente i sistemi reattivi.
11.1.1.1. Reactive CTMC

Vediamo un esempio. Esempio 11.1 (Reactive probabilistic transition system) Vediamo in gura 11.1 un Reactive Probabilistic Transition System. In questo RPTS dallo stato iniziale (in alto) abbiamo due transizioni, una etichettata 1 d ed una etichettata 2 d, che conducono a due distribuzioni probabilistiche che suddividono fra due stati, uno dei quali ci riporta allo stato iniziale con una transizione coee e laltro con la transizione cappuccino.

Figura 11.1.: Un automa per un reactive probabilistic transition system

152

Estensioni delle catene di Markov e PEPA

Possiamo denire un concetto di bisimulazione analogo a quello visto per le CTMC, con ovviamente laggiunta delle etichette. s1 (R) s2 = (s1 ) (l) (I) = (s2 ) (l) (I)
11.1.1.2. Logica di Larsen-Skou

per ogni classe di equivalenza I di R

Introduciamo ora una logica che una generalizzazione di quella di Hennessy-Milner gi vista per il CCS che ci permetter di denire in maniera alternativa la bisimulazione. Queste formule hanno una sintassi true | 1 2 | | a q

Vediamo di dare la semantica di queste formule. Abbiamo che s |= true sempre vera s |= 1 2 s |= 1 and s |= 2 s |= s |= s |= l q sl q dove = {s S |s |= } Lunico operatore dierente il modale, notare che Hennessy-Milner era un caso particolare di questo operatore in cui q era sempre zero.

Esempio 11.2 (Logica di Larsen-Skou) Vediamo una formula applicata al caso visto nellimmagine 11.1. vero che s1 |= 1d co f f ee true? Intatto cerchiamo di capire cosa signichi. Vogliamo sapere se vero che, partendo da s1 e muovendosi lungo la transizione 1d, abbiamo pi di 1/2 di probabilit di arrivare in uno stato nel quale transitiamo di sicuro per un ramo coee? Arriviamoci. Vogliamo, per denizione, che valga s1 1d I1 1/2. Per saperlo, dobbiamo sapere come fatto I1 , che denito dalla formula co f f ee true. Da questa formula ricaviamo che I1 = {s S |s coee I2 1}: per calcolare questo insieme dobbiamo ricavare linsieme I2 = {s S |s |= true}. Avremo dunque che I2 sar costituito da tutti gli stati del RPTS, I1 che conterr gli stati con le quali transisco con etichetta coee e probabilit maggiore o uguale ad 1 in uno stato in I2 . Quindi abbiamo I1 = {s2 }. La nostra formula dunque vera: da s1 possiamo transire in s2 mediante letichetta 1d con una probabilit maggiore di 2/3.

Vale anche qua il risultato visto nel caso di CCS.

Teorema 11.3 (Bisimilarit e formule di Larsen-Skou) Due stati sono bisimilari se e solo se soddisfano le stesse formule di Larsen-Skou.

11.1.2. CTMC con nondeterminismo


Il passo successivo aggiungere allinterno dei nostri automi il concetto di nondeterminismo. Attenzione: non va confuso il nondeterminismo con la probabilit, in quanto come vedremo gli automi che presenteremo in questa sezione associeranno alla stessa etichetta diverse distribuzioni di probabilit che verranno scelte in maniera nondeterministica. Presenteremo due tipi di automi: gli automi di Segala e la loro versione semplicata.

11.1 Azioni e nondeterminismo nelle catene di Markov

153

Figura 11.2.: Un Segala automaton

Figura 11.3.: Un Simple-Segala automaton


11.1.2.1. Segala Automaton - Roberto Segala

Un automa di Segala ha una funzione di transizione di questo tipo s : S P(D(L S )) una funzione che, dato uno stato, restituisce un insieme di distribuzioni probabilistiche sulle coppie composte da unetichetta ed uno stato di arrivo. Non c pi il caso +1 perch nellinsime delle parti c linsieme vuoto. Vediamo un esempio.

Esempio 11.4 (Segala automaton) Vediamo un esempio di automa di Segala in gura 11.2. Notiamo che dallo stato a ci sono due dierenti distribuzioni di probabilit per letichetta ip. Vediamo come fatta S . S (a) = {d1 , d2 } dove d1 ( f lip, b) = d2 ( f lip, b) =
1 2 2 3

d1 ( f lip, c) = d2 ( f lip, c) =

1 2 1 3

S (b) = {d3 } dove d3 (beep, d) = 1 S (c) = {d4 } dove d3 (buzz, e) = 1 S (d) = S (e) =

11.1.2.2. Simple Segala Automaton

Esiste una semplicazione degli automi di Segala che, similmente ai reactive probabilistic transition systems, tira fuori la scelta delletichetta da seguire dalla distribuzione di probabilit. Vediamo la funzione di transizione ed un esempio. S S : S P(L D(S ))

154

Estensioni delle catene di Markov e PEPA

Esempio 11.5 (Simple Segala Automaton) Vediamo un esempio di Simple Segala Automaton in gura 11.3. Vediamone la funzione .
1 d1 (b) = d1 (c) = 2 S S (a) = {(a, d1 ), (c, d2 ), (a, d3 )} dove d2 (d) = 2 d2 (e) = 1 3 3 d3 (a) = d3 ( f ) = 1

S S (b) = S S (c) = S S (d) = S S (e) = S S ( f ) =

11.1.2.3. Altre combinazioni

In letteratura sono state analizzate le possibilit pi disparate di combinare queste informazioni: ne riportiamo un paio senza andarle ad analizzare. Il modello alternating prevede due tipi di transizione: la funzione pu alternativamente restituire una distribuzione sugli stati di arrivo oppure un insieme nondeterministico di coppie etichetta-stato, in modo da poter esprimere alternativamente sia la probabilit che il nondeterminismo. Il modello bundle invece restituisce una distribuzione probabilistica di sottoinsiemi delle coppie etichettastato: possibile dunque avere situazioni nelle quali abbiamo una certa probabilit di avere a disposizione certe scelte. I modelli sono tanti, e la scelta di quale possa servirci dipende fortemente dalluso che ne vogliamo fare. Vedremo comunque nella prossima sezione che alcuni modelli sono pi generali di altri, avendo dunque una maggiore espressivit.

11.1.3. Segala come modello pi generale


possibile dimostrare che, fra i modelli presentati, Segala il pi generale. In altre parole, sar sempre possibile esprimere ad esempio un automa reactive con un automa di Segala mentre non sar in generale possibile il contrario.

11.1.3.1. Segala vs Generative

Teorema 11.6 (Segala pi espressivo di Generative) semplice vedere che possibile riscrivere ogni situazione del generative con Segala. Infatti Se G (s) = , cio lo stato s di deadlock, possiamo scrivere lespressione equivalente S (s) = . Se G (s)(l1 , s1 ) = x, cio G (s) ci restituisce una distribuzione di probabilit nella quale alla coppia (l1 , s1 ) associato il valore x, facciamo corrispondere una transizione di Segala nella quale S (s) ci restituisce un singleton con dentro proprio la distribuzione G (s). Non possibile invece esprimere con Generative la situazione in cui S (s) ci restituisce pi distribuzioni di probabilit.

11.1.3.2. Generative Segala

g (s) = s (s) =

g (s1 )(l, s2 ) = x s (s1 ) = {d} d(l, s1 ) = x

11.2 PEPA - Performance Evaluation Process Algebra


11.1.3.3. Reactive Segala

155

r (s1 )(l)(s2 ) = x dl s (s1 )


11.1.3.4. Simple Segala Segala

dl (l, s2 ) = x

dl (l , s) = 0 l

(l, d) ss (s1 ) d(s2 ) = x d(l,d) s (s1 ) d(l,d) (l, s2 ) = x d(l,d) (l , s) = 0 l l

11.1.3.5. Simple Segala vs Generative

11.2. PEPA - Performance Evaluation Process Algebra


Introduciamo unalgebra per descrivere i nostri sistemi di transizione probabilistici, etichettati e non deterministici.

11.2.1. Sintassi di PEPA


P (, ).P | P + P | P P | P/L | A L = Insieme delle etichette/azioni R = rate PEPA un derivato del CSP di Tony Hoare piuttosto che del CCS di Milner come il -calcolo, e quindi va notato che le azioni hanno un signicato dierente: in CCS avevamo e e questo ci serviva per fare le sincronizzazioni a due, mentre in CSP possibile fare sincronizzazioni a n agenti e quindi tutti usano la stessa azione . (, r).P operatore di presso: lagente pu fare una mossa etichettata con probabilit r + stesso signicato del CCS, scelta non deterministica
L

operatore per la sincronizzazione tramite le L

P/L operatore di hiding: ogni L diventa una A denizione ricorsiva in cui A = P ed in P possibile usare A
def

11.2.2. Semantica operazionale di PEPA


E E (, r).E E E E
(,r) (,r) (,r) (,r)

e simmetrica

E + F E L E E
(,r) (,r)

(,r)

E/L E /L E E E
(,r) L (,r)

E/L E /L E E E
L (,r1 )

L
L

e simmetrica F E E
(,r) (,r)

F F F E
(,r) L

(,r2 )

L F

F E

A = E

def

A E

Parte V.

Appendici

A. Tabelle riassuntive di sintassi e semantica


A.1. IMP
A.1.1. Sintassi
Espressioni aritmetiche (Aexpr) a :: n|x|a0 + a1 |a0 a1 |a0 a1 dove n un naturale, x una locazione,

a0 , a1 espressioni aritmetiche.

Espressioni booleane (Bexpr) b :: v|a0 = a1 |a0 a1 |b|b0 b1 |b0 b1 Comandi (Com) c :: skip |x := a|c0 ; c1 | if b then c0 else c1 | while b do c

A.1.2. Semantica operazionale


A.1.2.1. Regole per Aexpr < a, > n N

n, n a0 , n0 a1 , n1

num

x, (x) a1 , n1 n1

ide

a0 + a1 , n0 n1

sum

a0 , n0

a0 a1 , n0

minus

a0 , n0

a1 , n1

a0 a1 , n0 n1

mul

A.1.2.2. Regole per Bexpr < b, > v {true, false}

v, v b0 , n0 b1 , n1 n1

bool

v, v v, not v b1 , n1 n1

not

b0 b1 , n0

and

b0 , n0

b0 b1 , n0

or

b0 , n0

b1 , n1

b0 = b1 , n0 n1

sum

A.1.2.3. Regole per Com < c, >

skip,

skip

a, m x := a, [m / x ] c0 ,

assign

c0 ,

c1 ,

c0 ; c1 , c1 ,

concat

b, true

if b then c0 else c1 , b, true c,

i f tt

b, false

if b then c0 else c1 ,

if f f

while b do c,

b, false while tt while b do c,

while b do c,

while f f

160

Tabelle riassuntive di sintassi e semantica

A.1.3. Semantica denotazionale


A.1.3.1. A : Aexpr N

A n =n

A x = x A a1

A a0 + a1 = A a0 A a1 A a0 a1 = A a0 A a0 a1 = A a0 A a1
A.1.3.2. B : Bexpr B

B v =v

B v = not v B b1 B b1

B b0 = b1 = B b0 B b1 B b0 b1 = B b0 B b0 b1 = B b0
A.1.3.3. C : Com

C skip = C x := a = C c1 ; c2 = C c2
A a

/x

(C c1 )

C if b then c1 else c2 = B b C c1 , C c2 C while b do c = x , dove = ..B b (C c ),

A.2 HOFL

161

A.2. HOFL
A.2.1. Sintassi
Tipi := Termini

int

1 2

| 1 2

t ::

x | n | t1 + t2 | t1 t2 | t1 t2 | if t then t1 else t2 | (t1 , t2 ) | fst(t) | snd(t) | x.t | (t1 t2 ) | rec x.t

variabile costante operazioni aritmetiche condizionale operazioni su coppie denizione e applicazione di funzione funzioni ricorsive

A.2.2. Regole di inferenza dei tipi


Variabili

x : type(x) = x

Operazioni

n : int
Prodotti

t1 : int

t2 : int

t0 : int

t1 : t2 :

t1 op t2 : int

if t0 then t1 else t2 :

con op = +, -, x

t 1 : 1

t 2 : 2

t : 1 2 fst(t) : 1

t : 1 2 snd(t) : 2

(t1 , t2 ) : (1 2 )
Funzioni

x : 1

t : 2

t 1 : 1 2 (t1 t2 ) : 2

t 2 : 1

x.t : 1 2
Rec

x: t: rec x.t :

162

Tabelle riassuntive di sintassi e semantica

A.2.3. Semantica operazionale


A.2.3.1. Forme canoniche

t1 : 1 n Cint
A.2.3.2. Regole di inferenza

t2 : 2

t1 , t2 : closed

x.t : 1 2

x.t closed

(t1 , t2 ) C1 2

x.t C1 2

cc t1 n1 t2 n2

t0 0

t1 c1

t0 n

0 t2 c 2

t1 op t2 n1 opn2

if t0 then t1 else t2 c1 t1 c1 t (t1 , t2 )

if t0 then t1 else t2 c2 t1 c1

t (t1 , t2 )

fst(t) c1 t1 x.t1 (t1 t1 [t2 / x ] c t2 ) c t1 x.t1

snd(t) c2 t2 c2 (t1 t[rec x.t / x ] c rec x.t c t1 [c2 / x ] c

(LAZY)

t2 ) c

(EAGER)

A.2.4. Semantica denotazionale


Date x opx2 op (x1 , x2 ) = 1 N ho n = n x = x t1 op t2 = t1 op

se x1 N x2 altrimenti

z1 Cond (z0 , z1 , z2 ) = z2

se z0 = 0 se z0 = 0 z se z0 = N

t2

if t0 then t1 else t2 = Cond ( t0 , t1 , t2 ) (t1 , t2 ) = ( t1 , t2 ) f st(t) = let v t . snd(t) = let v t . x.t = d. t [d / x ] (t1 t2 ) = let t1 .( t2 ) recx.t = x d. t [d / x ] 1 v 2 v

A.3 CCS

163

A.3. CCS
A.3.1. Sintassi
, , , Azioni: generico nome | Azioni visibili: generico nome Azione invisibile {} generico nome p x | nil | .p | p\
p ristretto a

p[]
permutazione di

p+ p |

p|p

rec x.p

A.3.2. Semantica operazionale

(Act)

.p p

(Res)

pq p\ q\

(A.1)

pq (Rel) p[] q[] pq p|r q|r


()

(Sum)

pq p+r q

pq r+pq

(A.2)

(Com)

pq r|p r|q

p1 q1

p2 q2

(A.3)

p1 |p2 q1 |q2

(Rec)

p[rec x.p/x] q rec x.p q

(A.4)

A.3.3. Strong Bisimilarity


p p = q . q q q q = p . p p

and and

p p

q q

A.3.4. Weak Observational equivalence


p = q = p = q = pq sse sse

sse sse

p ... q o p p q = q = = implica implica q = q = q = q =


p=q

p = p = p = p =

p q

e p q e viceversa

A.3.5. Weak Observational Congruence


p c q sse sse p p p p

implica implica

q = q = q = q =

p q

e p q e viceversa

164

Tabelle riassuntive di sintassi e semantica

A.3.6. Dynamic congruence


p D q sse sse p p p p

implies q = q = implies q = q =

and

p D q

and p D q e viceversa

A.4. -calcolo
A.4.1. Sintassi
P nil | .p | [x = y]p | p + p | p | p | (y)p | !p | x(y) | x y

A.5. Semantica operazionale

p p p p p+q p p p p|q p |q

x y.p p q q p+q q q q

xy

x(y).p p[ /y ]
w

x(w)

f n((y)p)

p p [x = x]p p

p|!p p !p p p p
xz

bn() f n(q) =

p|q p|q p p
xy

bn() f n(p) =

q q

x(y)

p|q p |(q [z /y ])
x (w) x(w)

p p (y)p (y)p

n()

f n((y)p)

p p

q q

(y)p p [w /y ]

x(w)

p|q (w)(p |q )

A.5.0.1. Bisimilarit ground

pqp p
x(y)

x(y) y y

f n(q) f n(q)

bn()

f n(q)

q q
x(y)

p q

e viceversa

p E q p p p L q p p
x(y)

w.q .q q q .w.q q
x(y)

p [w /y ] E q [w /y ] e viceversa p [w /y ] L q [w /y ] e viceversa

A.5.0.2. Bisimilarit non ground

p E q .p E q p L q .p L q

A.6. Modelli probabilistici


A.6.1. DTMC
: S (D(S ) + 1)
i

Unione disgiunta con singleton con (s) D(S )

(s)(si ) = 1

A.7 PEPA

165

A.6.2. CTMC
: S P(R S ) : (S S ) R M (s, I) = (s)(I) =
s I

(s)(s )

s1 (R)s2 = I R. M (s1 , I) = M (s2 , I)

A.6.3. Reactive
R : S L (D(S ) + 1)
s

reactive probabilistic transition system R s l s = 1

A.6.4. Generative
G : S (D(L S ) + 1)
(l,s )

generative probabilistic transition system G s (l, s ) = 1

s1 (R) s2 = (s1 ) (l) (I) = (s2 ) (l) (I)

per ogni classe di equivalenza I di R

A.6.5. Segala
s : S P(D(L S ))

A.6.6. Simple Segala


S S : S P(L D(S ))

A.7. PEPA
E E (, r).E E
(,r) (,r)

e simmetrica

E + F E L E E
(,r) (,r)

(,r)

E E
(,r)

(,r)

E/L E /L
(,r)

E/L E /L
(,r1 ) (,r2 )

E E E
(,r) L

L
L

e simmetrica F
(,r)

E E E A = E
def L

F F F E
(,r) L

L F

F E

E E
(,r)

A E

B. Esercizi
B.0.1. Esercizi prima parte
Esercizio 1

Si denisca per ricorsione ben fondata la funzione Vars : Com PLoc

che, dato un comando, restituisce linsieme delle locazioni che appaiono alla sinistra di qualche assegnamento. Si dimostri che c Com, , c, implica x Vars(c).(x) = (x)

Svolgimento Ricorsione Stutturale Le varabili che non sono in c non vengono cambiate c, = x Analizziamo tutti i comandi: Vars(skip) = Vars(x := a) = {x} Vars(c0 ; c1 ) = Vars(if b then c0 else c1 ) = Vars(c0 ) Vars(c1 ) Vars(while b do c) = Vars(c) Induzione sulle regole: P( c, ) = x
def

Vars(c).(x) = (x)

Vars(c). (x) = (x)

Prima regola di inferenza

skip, P( skip, ) = x
Seconda regola di inferenza
def

. (x) = (x)

a, n x := a, [n / x ] P( x := a, [n / x ]) = y
def

x. (y) = [n / x ](y)

168
Terza regola di inferenza

Esercizi

c0 , P( c0 , ) = x P( c1 , Dobbiamo dimostrare P( c0 ; c1 , ) = x Posso assumere x Vars(c0 ; c1 ) x A questo punto posso dire (x) = (x) che era la cosa che dovevamo dimostrare.
Quarta regola di inferenza
def def

c1 , Vars(c0 ). (x) = (x) Vars(c1 ). (x) = (x) Vars(c0 ; c1 ). (x) = (x) Vars(c0 ) Vars(c1 ) x Vars(c1 ) (x) = (x)
?

c0 ; c1 ,
def

) = x

Per la propriet dellunione abbiamo Vars(c0 )

(x) = (x)

b, true

c0 ,

if b then c0 else c1 , Assumiamo P( c0 , ) = x Dimostriamo


def

Vars(c0 ). (x) = (x)

P( if b then c0 else c1 , ) = x Assumo che x Vars(if b then c0 else c1 ) = x

def

Vars(c0 ) Vars(c1 )

Vars(c0 ) Vars(c1 )

Dato che: x Vars(c0 ) per ipotesi induttiva ho che (x) = (x) Il caso false analogo
While

b, false while b do c, P( while b do c ) = x b, true Assumo


def

Vars(while b do c). (x) = (x) w,

c0 , w,

P( c0 , ) = x P( w, ) = x Dimostro x Vars(w) = x P( w, ) = x
def def

def

Vars(c). (x) = (x) Vars(w). (x) = (x) Vars(w). (x) = (x)

Vars(c) che vero per ipotesi = posso usare lipotesi vedo che (x) = (x)

169
Esercizio 2

Si indichi con w il comando del linguaggio IMP while x 0 do(x := x 1; y = y + 1)

Si provi per induzione sulle regole che, dati comunque gli stati e , w, = (x) 0 = [(x)+(y) /y,0/x ]
Svolgimento Prima Regola

0, false w,

allora (x) = 0 Il primo pezzettino del and soddisfatto [0+(y) /y ,0 / x ] =


Seconda Regola

0, true

x := x 1; y := y + 1; , w,

w,

Assumiamo lipotesi induttiva, otteniamo quindi: w, Bisogna dimostrare (x) 0 = [(x)+(y) /y,0/x ] Dimostriamo 1 (y) = (y) + 1 (x) = (x) 1 (x) = (x)
0 per ip. ind.

= (x) 0 = [

(x)+ (y)

/y,0/x ]

+1 0

Dimostriamo 2 Sostituiamo = [(x)1 / x,(y)+1/y ] = [ (x)+ (y) /y,0/x ] = [(x)1 / x,(y)+1/y ][ = [(x)1 / x,(y)+1/y ] [(x)1+(y)+1 /y,0/x ] = [(x)1+(y)+1 /y,0/x ] = [(x)+(y) /y,0/x ]
sovrascrittura (x)+ (y) / y,0/x ]

170
Terzo esercizio

Esercizi

Sia R una relazione su un insieme A, ovvero R A A. Si consideri la relazione R+ , detta chiusura transitiva di R, denita dalle seguenti regole: R+ = si dimostri che per ogni x e y xR+ y k > 0. z0 , , zk . .x = z0 z0 Rz1 zk1 Rzk zk = y xRy xR+ y xR+ y yR+ z

xR+ z

(Suggerimento: si dimostri limplicazione per induzione sulle regole e limplicazione per induzione sulla lunghezza k della catena). Quali regole deniscono una relazione R che soddis invece xR y
Dimostrazione primo punto Dimostrazione =

k .z0 , , zk .x = z0 z0 Rz1 zk1 Rzk = y

xRy(k = 1)ho trovato due z che.. allora x = y

Seconda parte sulla struttura k > 0 k > 0 Concateno: k = k + k


Dimostrazione =

z0 , .., x k z0 , .., x k

x = x0 x = x0

z0 Rz1 ...zk1 Rzk z0 Rz1 ...zk1 Rzk

zk = y zk = z

non so cosa valga k. k > 0(z0 ...zk x = z0 Rz1 ...zn1 Rzn = y = xR+ y)

Assomiglia allinduzioni sui naturali ma non esattamente Caso k = 1 Deve succedere che xRy = xR+ y OK(lo dice la regola di inferenza) Vediamo per k z0 , ..., zk+1 Rompo: z0 ...zk x = z0 Rz1 ...zk1 Rzk Questa suppioniamo che per ipotesi induttiva che da : xR+ zk zk Rzk+1 = y questa per il caso k = 1 gia dimostrato da zk Ry. Allora xk Ry xR+ zk xk R+ y xR+ y x = z0 Rz1 ...zk1 Rz..... = xR+ y?

171 Invece di avere k > 0 immaginiamo di avere k 0 Qual la relazione che soddisfa? x e y devono essere riessive. Se aggiungiamo xR y OK. Bisogna fare unaltra provetta.
Dimostrazione secondo punto Esercizio 4 Esercizio 5

Se non c while si usa indizione struttura e si fa vedere che esiste sempre .

(n, m) k (n, m) m Dimostrare (m, n) (m, n) k

(m < n)

(m n, n) k (n, m) k

(m < n)

k il MCD di m e n

Assiumiamo k mcd di m n, m = k MCD di m e n Dimostriamo unaltra propriet: k divisore di m n, n k divisore di m e n = k h1 = m n Otteniamo k(k1 + k2 ) = m k h2 = n

= k h1 = m Otteniamo k(h1 h2 ) = m n k h2 = n k 1 > k2

B.0.2. Esercizi 23 Marzo 2010


Esercizio 1 TODO: Da rivedere

Si introduca il comando reapeat n times c

con n naturale, al posto del comando while in IMP La semantica denotazionale di tale comando C repeat n times c = (C c n ) con (C c )0 = (C c )n+1 = ((C c )n ) (C c )

a) Si denisca la semantica operazionale del nuovo comando; b) Si modichi la prova di equivalenza fra semantica operazionale e denotazionale per tener conto del nuovo comando; c) si dimostri che lesecuzione di ciascun comando nel linguaggio modicato termina.

172
Svolgimento

Esercizi

Sostituire il costrutto while con repeat impoverisce sicuramente il linguaggio [TODO??? cerano delle considerazioni sulla touring-equivalenza etc chiedere a qualcuno che ha fatto CC]. a) Semantica operazionale repeat 0 times c, n>0 repeat n times c, b) Dimostriamo lequivalenza delle due semantiche, mostrando la loro implicazione nei due versi. b.1) Dimostriamo per induzione sulle regole che loperazionale denita equivalente alla denotazionale data. P( c, ) = C c = Prima regola repeat 0 times c, C repeat 0 times c =
? def

c,

repeat n 1 times c,

questa dimostrazione si deriva immediatamente dalla denizione di (C c )0 . Seconda regola c, repeat n 1 times c, n>0
?

repeat n times c,
def

P( repeat n times c, ) = C repeat n times c = (C c


n1

) (C c ) =

Per ipotesi induttiva sulle regole sappiamo che c, e quindi che C c = Quindi la stella non serve C c
n1 ?

Linduzione inoltre ci permette di ipotizzare che la propriet che vogliamo dimostrare valga per le premesse, ossia: P( repeat n 1 times c, Possiamo quindi aermare che: C c
n1

) = C repeat n 1 times c = =

def

b.2) Dimostriamo che la semantica denotazionale implica loperazionale. Essendoci un solo costrutto, bisogna mostrare la propriet per ogni n quindi utilizziamo linduzione matematica P(repeat n times c) = C repeat n times c = = repeat n times c, Caso n = 0 P(repeat 0 times c) = C repeat 0 times c = = repeat 0 times c,
def def

173 vera per la denizione della semantica denotazionale. Caso n n + 1 P(repeat n + 1 times c) = C repeat n + 1 times c = = repeat n + 1 times c, Assumiamo la premessa (C c )n )(C c ) = Dato che il comando termina in , possiamo eliminare la stella e sappiamo che C c ) = da cui c, . Inoltre da (C c )n ) = abbiamo repeat n times c, Ora abbiamo le due ipotesi induttive induttive della regola operazionale repeat n + 1 times c, che risulta dunque vericata. c) PEER REVIEW Le prove per tutti gli altri costrutti si risolvono semplicemente assumendo che le premesse teminino e mostrando che facendo un passo in pi termina anche il teorema. Stesso vale per repeat, le premesse ci dicono che il comando c termina e che repeat n termina in , da cui deduciamo che repeat n+1 termina. PEER REVIEW
def ?

Esercizio 2

Una lista di interi denita dalla seguente sintassi L ::= (n, 0)|(n, L)

Ad esempio, la lista con gli interi 3 e 5 rappresentata dal termine (3, (5, 0)). Si denisca un termine HOFL t (chiuso e tipabile) tale che lapplicazione (t L) ad una lista L di 3 elementi ritorni lultimo elemento della lista. possibile dare un termine HOFL (chiuso e tipabile) che calcoli lultimo elemento di una generica lista di interi?
Svolgimento

(3, (5, 0)) (t(n1 (n2 (n3 , 0)))) = n3 Dobbiamo vedere che t sia ben tipato. lista = int (int (int int)) snd(l) = int (int int) snd(snd(l) = int int fst(snd(snd(l))) = int Non possibile per questione dei tipi generare lultimo elemento dei tipi. Una generica lista ha un tipo qualunque mentre i nostri termini hanno un tipo pressato. Una soluzione ipotetica la seguente rec f. x
(int)

t = (l. fst(snd(snd(l)))

. if snd(x) then fst(x) else( f snd( x ))


int int int

174 Ma questa cosa non tipabile. if snd(x) deve essere intero. x: fst(x) : x : f : if snd(x) then fst(x) else( f snd(x)) : x. if snd(x) then fst(x) else( f snd(x)) : rec f e devono avere lo stesso tipo, otteniamo quindi int = int Non possibile unicare, fallimento.
Esercizio 3

Esercizi

int int int ( int)

int = int

Dati due termini t1 x.y.x + 3 t2 z. fst(z) + 3

Se ne calcolino i tipi Si veriche se, data la forma canonica c : , i due termini ((t1 1)c) si riducono alla stessa forma canonica.
Svolgimento

(t2 (1, c))

t1 = x . y . x +3
int int int

intint

t2 = z. fst( z ) +3
int int int (int)int

Bisogna dimostrare ((t1 1)c) c C c Prima riduzione: si parte dallesterno. (((x.y.x + 3) 1) c) c == = ((x.y.x + 3)1) x.t = ==
inf. lazy inf. lazy

n1 ?

(t2 (1, c)) c

t[c / x ] c

(x a sinistra e a destra sono diversi) (Calcolo forma canonica perch 1 canonico) (x e y sono unicabili)

== = (y.x + 3)[1 / x ] x.t t[c / x ] c = == = (y .1 + 3) x .t t[c / x ] c (1 + 3)[c / x ] c = 1 + 3 c == = = 1 c = = == 3c = c = 1 c = 3


c =c +c

x a sinistra e a destra sono diversi: il signicato stiamo cercando un qualcosa che abbia forma di un astrazione (vedi regola valutazione lazy).

175

Seconda riduzione ((z. f st(z) + 3)(1, c)) c = (z. f st(z) + 3) x.t t[(1,c) / x ] c = ( f st(z) + 3)[(1,c) /z ] c = ( f st(1, c) + 3) c == = = f st(1, c) c = = == = = f st(1, c) c == = = 1 c ==
c =1 c =3 c =c +c

3c 3c

3c

B.0.3. 2 Febbraio 2000


Esercizio 1

Si aggiunga a IMP il comando do c undoif b

con il seguente signicato informale: esegui il comando c, se dopo lesecuzione di c lespressione booleana b risulta soddisfatta allora ripristina lo stato precedente allesecuzione di c. 1. Si denisca la semantica operazionale del nuovo comando 2. Si denisca la semantica denotazionale del nuovo comando 3. Si modichi la prova di equivalenza fra semantica operazionale e denotazionale per tener conto del nuovo comando
Svolgimento Punto a

c,

b, false

c,

b, true

do c undo if b,
Punto b

do c undo if b,

C do c undo if b = B b (C c ) , C c
true false

Punto c

Dobbiamo dimostrare i due sensi come al solito

Dimostriamo da denotazionale a operazionale Utilizziamo linduzione strutturale. Dobbiamo dimostrare: P(do c undo if b) = C do c undo if b = = do c undo if b, = Anche qui possiamo sempre assumere le premesse, in questo caso sulle strutture gi dimostrate. Abbiamo due casi possibili, true e false. B b = false Per ipotesi induttiva sulle strutture sappiamo che P(b) = B b = false = b, false
?

176 Inoltre, sempre per induzione strutturale. P(c) = C c = = c,

Esercizi

Abbiamo ottenuto le premesse del nostro comando nella semantica operazionale di IMP, quindi OK. B b = true Simmetrico al precedente. Dimostriamo da operazionale a denotazionale Utilizziamo induzione sulle regole. 2 Regole da dimostrare: c, b, false c, b, true

do c undo if b, Prima regola

do c undo if b,

P( do c undo if b, ) = C do c undo if b = Supponiamo che P valga per le premesse. Sappiamo quindi, per ipotesi induttiva, che: C c = B b = false

def

Questo ci garantisce che il comando termina, possiamo togliere la stellina. Inoltre, siamo nel caso false, quindi: C do c undo if b = B b (C c ) C c =
false

Seconda regola P( do c undo if b, ) = C do c undo if b = Premesse: C c = B b = true Questo ci garantisce che il comando termina, possiamo togliere la stellina. Allora C do c undo if b = B b (C c ) =
true def ?

Esercizio 2

Si deniscano concretamente tre funzioni fi : Di Di con Di cpo, per i {1, 2, 3} tali che

f1 continua, ha punti ssi, ma non ha minimo punto sso; f2 continua, e non ha punti ssi; f3 monotona ma non continua. TODO

B.0.4. 20 Gennaio 2005


Esercizio 1

Si dimostri che, per ogni , , se while x 0y 0 do x := x 1; y := y 1,

allora (x) = (y) = [0 / x ,0 /y ]

177
Svolgimento

La dimostrazione si esegue per induzione sulle regole. P( w, ) = (x) = (y) 0 = [0 / x ,0 /y ]


def

Prima regola del while x 0y

0, false

w, Assumiamo la premmessa (x) 0 (y) 0 = false, cio (x) = 0 e (y) = 0 def ? ? Dobbiamo dimostrare P( w, ) = (x) = (y) 0 e = [0 / x ,0 /y ]. Ovvio Seconda regola del while x 0y 0, true x := x 1; y := y 1, w, Assumiamo x P( w, sostituendo (x) 1 = (y) 1 0 dobbiamo dimostrare P( w, ) = (x) = (y) 0 = [0 / x ,0 /y ] ovvio.
Esercizio 2
def

w,

0y
def

= [(x)1 / x ,(y)1 /y ]

) = (x) = (y) 0 = [0 / x ,0 /y ] (x) = (y) 1

= [(x)1 / x ,(y)1 /y ][0 / x ,0 /y ] = [0 / x ,0 /y ]

Sia ( {}, ) il cpo con bottom costituito dai naturali pi innito con lordinario ordinamento, per invertito. Inoltre sia (P f ( {}), ) lordinamento parziale dai sottoinsiemi niti di {} ordinati per inclusione. 1. Si dimostri con un controesempio che (P f ( {}), ) non completo 2. Si dimostri che lordinamento parziale (P f ( {}) { {}}, ) completo 3. Si dimostri che la funzione min : (P f ( {}) { {}}, ) ( {}, ) che calcola in valore minimo di un insieme (con min() = ) monotona, ma si faccia vedere con un controesempio che non continua
Svolgimento

Come sappiamo un ordinamento parziale detto completo se ogni sua catena ha lub. Prendiamo come catena la seguente:
Punto 1

{0} {0, 2} {0, 2, 4} . . . ossia {S i }i con S i = {n 2i, n pari} P f ( {}) Questa catena non ha maggioranti in P f ( {}). Non troveremo mai un maggiorante. Il motivo per cui non troveremo mai un maggiorante che i sottoinsiemi sono richiesti niti, quindi troveremo sempre un elemento pi grande un candidato ad essere maggiorante.

178
Punto 2

Esercizi Data una qualunque catena nita {S i }i il suo lub S w con S w = S n+k , k = 0, 1, . . .. Data una qualunque catena innita {S i }i questa ha un solo un maggiorante in (P f ( {}) { {}}, ), ossia { {}}
Punto 3

Monotonia

S 1 S 2 = min(S 1 ) min(S 2 ) = Ovvio: S 2 = S 1 S , min(S 2 ) = min(min(S 1 ), min(S )) min(S 1 ) Continuit. Data la catena {S i }i , S i = {n}, abbiamo che min(S 0 ) = e min(S i ) = 1 i = 1, 2, . . . Quindi i min(S i ) = 1. Invece S i = (Linsieme innito). Ma allora min( S i ) = min = 0.
Esercizio 3

Si verichi se il seguente termine HOFL tipabile, ed eventualmente se ne fornisca il tipo. rec f.. if snd(x) then 1 else 1 + ( f snd(x))

Svolgimento

s nd(x) : x: 1 + ( f snd(x)) : if snd(x) then 1 else 1 + ( f snd(x)) : . if snd(x) then 1 else 1 + ( f snd(x)) : int int = int int int = int Assurdo!

int int int int int

B.0.5. Prova scritta del 6 aprile 2005


Esercizio 1

Si considerino i comandi: w = while y < n do(x := x + 2y + 1; y := y + 1) e c = x := 0; y := 0; w

Si dimostri che, per ogni , con w, , se (x) = (y)2 , 0 (y) n allora = [n / x ,n /y ]. Si dimostri quindi che se 0 n allora c, [n / x ,n /y ].
Svolgimento
2 2

Dimostrazione per induzione sulle prove P( w, ) = (x) = (y)2 , 0 (y) n = = [n / x ,n /y ]


def
2

Prima regola del while

Usiamo la regola in cui la valutazione della guardia ha valore false. Dovr essere P( w, ) = (x) = (y)2 , 0 (y) n = = [n / x ,n /y ] =
def ?
2

quindi

(y) n

w, ma la propriet ovvia in quanto

(y) n (y) n

(y) = n

179
Seconda regola del while

Dovremo avere x := x + 2y + 1; y = y + 1, w, w,

(y) < n assumiamo (y) < n

(x) = (y)2 , 0 (y) n = = [n / x ,n /y ] dobbiamo dimostrare assumiamo le premesse: (x) = (y)2 , 0 (y) n 2 ? da dimostrare la conseguenza: = [n / x ,n /y ]
?
2

ipotesi induttiva

(x) = (y)2 , 0 (y) n = = [n / x ,n /y ] =

(x) = (x) + 2(y) + 1 (y) = (y) + 1 2 = (y)2 + 2(y) + 1 = (x) + 2(y) + 1 = (x) (y) 0 (y) n (y) < n quindi 0 (y) < n 0 < (y) + 1 n
2

0 < (y) n

Abiamo quindi dimostrato le premesse dellipotesi induttiva = [n / x , x /y ]. Abbiamo quindi la 2 conseguenza: = [n / x ,n /y ] cio = [(x)+2(y)+1 / x ,(y)+1 /y ][n / x ,n /y ] = [n / x ,n /y ]
2 2

Per la seconda parte, assumiamo 0 n e usiamo la regola del ; x := 0; y := 0; , c, dimostriamo che w, [0 / x ,0 /y ] = [n /y ,0 / x ] = Infatti vale senzaltro [0 / x ,0 /y ](x) = [0 / x ,0 /y ](y)2
2

w,

= [0 / x ,0 /y ]

0 [0 / x ,0 /y ](y) n

quindi, in base alla dimostrazione precedente, = [n / x ,n /y ] 2 avendo dimostrato la premessa, vale la conseguenza del ;, ossia c, [n / x ,n /y ].

B.0.6. Prova scritta del 21 luglio 2005


Esercizio 1

Si consideri il comando: w = while n m do if n < m then m := m n else n := n m

Si dimostri che, per ogni , con w, , (n), (m) > 0 e per ogni d > 0: d|(n), d|(m) (n) = (m) > 0, d| (n)

dove i| j signica che i un divisore di j, cio k. j = ki. Si dimostri inne che (n) = MCD((n), (m)) dove k = MCD(i, j), con k, i, j naturali, il massimo comun divisore di i e j, cio k|i e k| j se e solo se k|MCD(i, j).
Svolgimento

Per induzione sulle regole


def

P( w, ) = : (n), (m) > 0.d > 0.d|(n), d|(m) (n) = (m) > 0 d| (n)

180
Prima regola del while

Esercizi

m, F w,

(n) = (m)

per le premesse

P( w, ) = : (n), (m) > 0.d > 0.d|(n), d|(m) (n) = (m) > 0 d|(n) ovvio per le premesse

def

Seconda regola del while

n m, T (n) = (m)

if n < m then m := m n else n := n m, w,

w,

= (n) < (m) [(m)(n) /m ], [(n)(m) /n ] P( w, ) = : (n), (m) > 0 = d|(n), d|(m) (n) = (m) > 0 = se riusciamo a dimostrare le premesse del while, Caso (n) < (m) = [(m)(n) /m ] (n) > 0 (m) > 0 (n) = (n) (m) = (m) (n) siamo a posto
def ?

d| (n)

assumiamo le premesse della tesi (n), (m) > 0 dimostriamo la premessa dellipotesi ovvio essendo (n) = (n) ovvio essendo (n) < (m) e (m) = (m) = (n)

Dallipotesi induttiva abbiamo quindi d| (n), d| (m) (n) = (m) > 0, d| (n) Pertanto basta dimostrare: Cio kn .(n) = kn d, se e solo se? kn .(n) = hn d, Infatti basta porre hn = kn e hm = kn + km . Caso (n) (m) La prova analoga. La dimostrazione completa. Possiamo concludere che prendendo (n), (m), e d come naturali, abbiamo che tutti e soli i divisori comuni di (n) e (m) sono anche divisori di (n) che quindi il MCD, essendo un naturale. km .(n) = hm d km .(m) = (n) = km d d| (n), d| (m) d|(n), d|(m)
? ?

B.0.7. Prova scritta del 3 Aprile 2007


Si condiseri il linguaggio IMP senza comandi di assegnamento Si dimostri per induzione strutturale sui comandi c che per ogni c, :
Esercizio 1

c,

oppure

c,

Dimostrare esplicitamente il caso di non terminazione utilizzando la regola di inferenza vista a lezione

181
Svolgimento

P(c) = . c, c, Come al solito andiamo per casi P(skip) = . skip, skip, Ovvio essendo skip,
def ? ? def

def

P(c0 ; c1 ) = . c0 ; c1 , c0 ; c1 ,
? ?

per ipotesi induttiva abbiamo P(ci ) = . ci , ci , dobbiamo andare per casi


def

A Caso

A Caso

ci , Allora anche c0 ; c1 , = =

dato che la regola richiede c0 , e c1 ,

, con

c0 , e c1 , Allora c0 ; c1 , per la regola.


def

P(if b then c0 else c1 ) = . if b then c0 else c1 , if b then c0 else c1 , se b = true allora la tesi dimostrata dalla regola v, true c0 ,
? ?

if b then c0 else c1 , essendo c0 , if b then c0 else c1 , c0 , Sicuramente OK per b = false P(while b do c) = . while b do c, while b do c,
def

if b then c0 else c1 ,

A Caso A Caso

b, false

b, false while b do c,

ovvio

b, true prendiamo in considerazione la regola di non terminazione S . c, S w, S . b, true

prendiamo S = {} c, = per lipotesi induttiva ci sono due possibilit = c, : vero essendo la premessa falsa. c, : vero essendo = . b, true: vero nel caso in questione.
?

182
Esercizio 2

Esercizi

Si consideri lisieme D contenente tutti gli insiemi di numeri naturali composti solamente da numeri dispari. Si dimostri che (D, ) un ordinamento parziale completo con bottom. Si dica inoltre quali insiemi S D di naturali possono essere il limite di quache catena innita. (D, ) po dato che D un sottoinsieme di P() che un po e lordinamento lo stesso. Ha bottom: S , S D def completo: Sia S i una catena abbiamo che i S i = {n|k.n S k } ma se S k contiene solo numeri dispari, anche i S i contiene solo numeri dispari. I limiti delle catene innite sono tutti e soli gli insieme inniti di numeri dispari. Sia S 0 S 1 S 2 . . . una catena con {S i } innito, allora non pu essere | i S i | = N perch i sottoinsiemi di un insieme nito sono in numero nito, mentre deve essere i.S i i S i . Dato S innito la catena
Svolgimento

S S {0} S {0, 1} S {0, 1, 2} . . . una catena innita con


Esercizio 3
i S i

= S.

Dato il comando del linguaggio IMP while x 0 do(x := x 1; y := y + 1)

si dimostri usando linduzione computazionale di Scott che, dati comunque gli stati e , C w = x 0 = [x+y / x ,0 / x ] TODO: identico ad un esempio dellinduzione computazionale visto a lezione, quindi si pu anche non copiare.

B.0.8. Prova scritta del 31/05/06


Esercizio 1

C do c0 if diverge c1 = (C c0 ) C c0 , C c1 TODO manca il tipaggio dellespressione. Il dominio T ottenuto liftando {true, f alse} e il condizionale esteso denito come estensione naturale sul primo argomento if true then x else y = x if false then x else y = y if T then x else y = T La funzione x.x anchessa unestensione naturale x =case x T : true : T c0 , do c0 if diverge c1 ,

183

B.0.9. Prova scritta del 30/04/04


Esercizio 1

I numeri di Fibonacci F(n), n sono calcolati dalla seguente funzione ricorsiva: F(0) = 0, F(1) = 1, F(n + 2) = F(n) + F(n + 1)

Questa denizione pu essere vista come una denizione ben fondata? E per quale relazione ben fondata? Si consideri ora il comando: w = while z < n do v := y; y := x + y; x := v : z := z + 1. Si dimostri che, per ogni , con w, se (x) = F((z)), (y) = F((z) + 1), 0 (z) (n) allora (x) = F(n), (y) = F(n + 1). Si osservi quindi che x := 0; y := 1; z := 0; w, con n 0 implica (x) = F(n)
Svolgimento

La denizione per ricorsione matematica nella versione completa, cio la relazione ben nm n, m

fondata Quindi F(n) pu essere denita in termini di tutte le F(k) con k < n. Nel caso specico bastano F(n 1) e F(n 2), n 2. La propriet viene dimostrata per induzione sulle regole del while: P( w, ) = (x) = F((z)) (y) = F((z) + 1)
Prima regola del while
def

0 (z) = (x) = F(n)

(y) = F(n + 1)

Per la regola z < n, false w, cio con (z) n

va dimostrato P( w, ) = (x) = F((z))


def

(y) = F((z) + 1)

0 (z) = (x) = F(n) (y) = F(n + 1)

ma questo ovvio, essendo (z) = n ( da (z) n e (z) n).


Seconda regola del while

z < n, true assumendo (z) < n per il test P( w,

v := y; y := x + y; x := v : z := z + 1, w,

w,

) = (x) = F( (z)) (y) = F( (z)+1)

def

0 (z) = (x) = F(n)

(y) = F(n+1)

cio, considerando la denizione di CHECK (x) = (y) = F((z) + 1) (y) = (x) + (y) = F((z) + 2) = (x) = F(n) (y) = F(n + 1)

Possiamo quindi assumere le premesse della tesi (x) = F((z)) (y) = F((z) + 1) 0 (z) n

184 con questa possiamo dimostrare le premesse dellipotesi (y) = F((z) + 1) diretto (x) + (y) = F((z) + 2) da F((z) + 2) = F((z)) + F((z) + 1) 1 (z) n + 1 da 0 (z) e (z) < n per il test questo ci permette di assumere le conseguenze dellipotesi (x) = F(n) (y) = F(n + 1) che direttamente la conseguenza della tesi. Inne abbiamo, con n 0 x := 0; y := 1; z := 0; w, w, [0 / x ,1 /y ,0 /z ] Ma = [0 / x ,1 /y ,0 /z ] soddisfa la premessa.

Esercizi

Si consideri linsieme PI delle funzioni parziali iniettive da a , con lordinamento visto a lezione (inclusione degli insiemi di coppie cio f g se e solo se Gr( f ) Gr(g), con Gr( f ) = { x, y | f (x) = y}). Se identichiamo una funzione f con il suo grafo Gr( f ), abbiamo che f parziale iniettiva signica che x, y , x, y f y = y e x, y , x , y f x = x iniettiva. Si dimostri quindi che (PI, ) un ordinamento parziale completo. Si dimostri inne che la funzione F : PI PI con F( f ) = { 2x, y | x, y f } monotona continua. (Cenno: si condisderi F come calcolata dallopratore R delle conseguenze immediate con R costituito dalla sola regola x, y / 2x, y )
Esercizio 2 Svolgimento

Come al solito, per dimostrare che stiamo lavorando su un ordinamento parziale vanno dimostrate le seguenti proriet: riessivit, antisimmetria, transivit.

Propriet riessiva: f

f , ovvio essendo f f g, g
?

Propriet antisimmetrica: f Propriet transitiva: f


Completezza

f , ovvio essendo f g e g f = g = f

g, g

h =, ovvio essendo f g e g g = f g =

Data una catena f0 f1 . . . fi . . .

con x, y , x, y fi = y = y e con x, y , x , y fi = y = y Bisogna dimostrare che anche il lub parziale iniettivo x, y , x, y


i

fi = y = y

e x, y , x , y
i

fi = x = x

Ma ci vero. Infatti se x, y , x, y i allora esiste un k con x, y , x, y fk . Quindi y = y essendo fk parziale. Vale banalmente il caso simmetrico.
Monotonia della funzione

La funzione continua in quanto il numero delle premesse nito (vedi

teorema di R).

185

B.0.10. Prova scritta del 23/07/07


Esercizio 1

Un contesto C del linguaggio IMP denito dalla seguente sintassi: C ::= _; C; c|c; C| if v then C else c| if b then c else C

Sia assuma C c1 = C c2 e si dimostri che C c1 = C c2 e si dimostri che C C[c1 /_] = C C[c2 /_] per induzione strutturale su C. Si esamino soli i casi relativi a _, C; c e while b do c. Si concluda quindi che la relazione con c1 c2 C c1 = C c2 di equivalenza denotazionale una congruenza rispetto alle operazioni dei comandi di IMP.
Svolgimento

Assumiamo C c1 = C c2 . Dimostriamo P(C) = C C[c1 /_ ] = C C[c2 /_ ]


def

P(_) = C c1 = C c2 ovvio dalle premesse P(C; c) = C C[c1 /_ ]; c = C C[c2 /_ ]; c Per ipotesi induttiva C C[c1 /_ ] = C C[c2 /_ ] . Da dimostrare .C c (C C[c1 /_ ] ) = .C c Ma ovvio per lipotesi induttiva.
def ? def

def

(C C[c2 /_ ] )

P(while b do C) = C while b do C[c1 /_ ] = C while b do C[c2 /_ ] Per ipotesi induttiva C C[c1 /_ ] = C C[c2 /_ ] . Da dimostrare che f ix1 = f ix2 con 1 = B b (C C[c1 /_ ), 2 = B b (C C[c2 /_ ), Ma anche qui la propriet ovvia per le premesse. La relazione una congruenza se per tutte le operazioni f vale c1 c2 = f (c1 ) f (c2 ). I contesti _; c e if b then _ else c e if b then c else _ e while b do _ rappresentano tutte le operazioni.
Esercizio 2
?

Data una segnatura , si condiseri la relazione = < tra termini t T in che la chiusura riessiva e transitiva della relazione < termine - sottotermine denita come ti < f (t1 , . . . , tn ), 1 i n. Si dimostri che un ordinamento parziale. Si faccia vedere quindi, al variare di , quando tale ordinamento completo e/o con bottom. Essendo = < la propriet riessiva e simmetrica valgono per costruzione. La propriet antissimetrica vale in quanto < una relazione aciclica (addirittura ben fondata) e loperazione di chiusura non introduce cicli.
Svolgimento

Caso c 0 e f n In tal caso T un insieme innito. La catena t0 = c t1 = f (t0 , . . . , t0 ) t2 = f (t1 , . . . , t1 ) ...

non ha nessun maggiorante in T . Caso 0 = In tal caso T vuoto. Quindi completo e senza bottom. Caso n = , n 0 Allora un ordinamento discreto (t1 quindi completo. t2 = t1 = t2 ) quindi con catene nite ( di un solo elemento),

186 Caso 0 = {c} singleton Lordinamento (T , ) ha c come bottom

Esercizi

Caso 0 non singleton (T , ) non ha minimo: vuoto se 0 = 0 e pi di un elemento minimale se 0 ha due o pi elementi. Si ricordi che T generato dalla seguente regola di inferenza: ti T t = 1, . . . , n f (t1 , . . . , tn ) T

B.0.11. Prova scritta del 9 aprile 2010


Esercizio 1

Si estenda IMP con : (i) la nuova categoria sintatattica S (con variabili s) delle espressioni con eetti laterali, brevemente elat, avente s, ( , n) come formule ben formate per la semantica operazionale e dominio semantico ( N) ; e (ii) le nuove produzioni s ::= c; a c ::= x := s

con la seguente semantica infromale : per la prima produzione, quella di ritornare come stato modicato della elat s lo stato prodotto dal comando c e come risultato di s la valutazione dellespressione aritmetica a in tale stato; per la seconda produzione quella di vaulutare prima lelat s e poi eettuare lassegnamento utilizzando come memoria lo stato modicato da s, e come valore da assegnare ad x il risultato di s. La semantica denotazionale la seguente: S c; a = ( .(A a ; )) (C c ) case S s of : N : C x := s = ( , n) : [n / x ] Si fornisca la semantica operazionale dei nuovi costrutti e si valuti il comando x := (x := 3; 5) sia secondo la semantica operazionale sia secondo quella denotazionale. Si dimostri quindi lequivalenza operazionaledenotazionale dei due nuovi costrutti e si faccia vedere (utilizzando a piacere la semantica operazionale oppure quella denotazionale) che x := (c; a) equivalente a c; x := a.
Svolgimento

Semantica operazionale c, a, n s, ( , n) x := s, [n / x ]

c; a, ( , n)
Valutazione valutiamo x := (x := 3; 5) Semantica operazionale

x := (x := 3; 5), = = = = x := 3; 5, ( , n) = = == = x := 3, = = [n / x ] = [3 / x ][5 / x ] = [5 / x ] Semantica denotazionale case ( .( , A 5 ) C x := 3 of : N : C x := (x := 3; 5) = ( , n) : [n / x ] 5, n = = = = ===


;;=[3 / x = [n / x ]

187

= let ( , n) = ( ( , 5))[3 / x ] in [n / x ] = let ( , n) = ([3 / x ], 5) in [n / x ] = [3 / x ][5 / x ] = [5 / x ]

Vediamo i due passi Operazionale denotazionale


Equivalenza semantiche

c,

a, n

c; a, ( , n) ? S c; a, = ( , n) ? ( .(, A a )) (C c ) = ( , n) ? Si sa per ipotesi induttiva che C c ) = ( , n). Quindi ? .( (, A a , ) = ( , n) ? ( , A a ) = , n Vero, essendo A a = n per lipotesi induttiva. s, ( , n)
n

x := s, [ x ] / case S s of : N : C x := s = ( , n) : [n / x ]

C x := s = [n / x ]

[n / x ]
?

Ma S s = ( , n) per lipotesi induttiva, quindi ( , n) = ( , m), cio = e n = m [m / x ] = [n / x ] Denotazionale Operazionale P(c; a) = S c; a = = c; a, S c; a = ( , n) c; a, ( , n) = ( .( , A a )) (C c ) = ( , n)


? def

c,

( .( .A a )) = ( , n) ( .( .A a )) = ( , n) ( , A a ) = ( , n) = A a = n Quindi c, a, n da cui c; a, per la regola operazionale def P(x := s) = C x := s = = x := s, C x := s = x := s, case S s of : N : ( , n) : [n / x ] = let S s = ( , n) x := s, [n / x ] Ovvio per la regola operazionale.
? ?

Equivalenza comandi

x := (c; a) c, x := a

Operazionale

188

Esercizi

x := (c; a), c; a, ( , n) c, a, n c; x := a, c, x : a, c, Stessi sottogoal Denotazionale


= [m / x ] = [n / x ]

a,

case( .( , A a )) (C c ) of : N : C x := (c; a) = ( , n) : [n / x ] = C c; x := a = ( . [A a / x ]) C c Sono uguali: se C c = entrambi sono altrimenti altrimenti diventano (C c )[A

a (C c ) /

c]

Si consideri la grammatica libera (pi precisamente lineare destra) S ::= S |, dove lalfabeto dei simboli terminali V = {a, b} e , V . Si scriva il sistema di regola di inferenza R corrispondente a tale grammatica e si dimostri (in entrambi i sensi) che linsieme dei teoremi IR ne il minimo punto sso. Si dica inne se e quali altri punti ssi esistono per particolari valori di e .
Esercizio 2 Svolgimento

xS x S Le formule ben formate sono {x S |x {a, b} }

P( S ) = ( S ) {n S |n ) = n. = n P( S ) ovvio per n = 0 def ? P(x S ) = n.x = n def Sappiamo per P(x S ) = m.x = m quindi n.x = n vale con n = m + 1 Viceversa per induzione matematica n.(n S ) IR P(O) : S IR P(n) : n S IR ipotesi induttiva P(n + 1) : n S IR ovvio data la regola dinferenza R(X) = { S } {x|x X} R({n S |n }) = { S } {n+1 S |n } = {n S |n }} Se = stringa vuota, X = R(X) soddisfatto da ogni X { S }.
Esercizio 3

def

def

I coecienti binomiali

n con n, k e 0 k n, sono deniti da k n+1 n n = + k+1 k k+1

n n = =1 0 n

189 Si dimostri che tale denizione data per ricorsione ben fondata, fornendo la relazione ben fondata e la corrispondente F(b, h). Si consideri quindi il programma HOFL: t = rec .n.k. if k then 1 else if n k then 1 else(( f n 1) h) + (( f n 1) k 1) se ne calcoli il tipo e si valuti a forma canonica il termine ((t 2) 1).
Svolgimento

Linsieme B quello delle coppie (n, k) n , 0 k n. La relazione semplicemente (n, k) < (n , k ) se n = n + 1 C=

La funzione F((n, k), h) denita per casi su (n, k). Se k = 0 oppure k = n, F non guarda h e vale F((n, 0), h) = F((n, n), h) = 1. Se k 0, n, allora h : {(n 1, k )|0 k n 1} C. Per F((n, k), h) guarda solo due valori di h, valutati su (n 1, k 1) e (n 1, k). Si ricordi che k < n quindi k n 1. Ne conseguono le 3 denizioni date. t = rec f
intintint

. n . k . if k then 1 else if n k then 1 else(( f n 1) k) + (( f


int int int

n 1) k 1)
int int

=int =int int

((t 2) 1) m = k. if k then 1 else if n k then 1 else(( f n 1) k) + (( f n 1) k 1)[2 /n ] m = if k then 1 else if 2 k then 1 else(( f 2 1) k) + (( f 2 1) k 1)[1 /k ] m = if 1 then 1 else if 2 1 then 1 else(( f 2 1) 1) + (( f 2 1) 1 1) m = ((t 2 1) 1) + ((t 2 1) 1 1) m = (if 1 then 1 else if(2 1) 1 then 1 else(( f (2 1) 1) 1) + (( f (2 1) 1) 1 1))+ if 1 1 then 1 else if(2 1) (1 1) then 1 else(( f (2 1) 1) 1 1) + (( f (2 1) 1) (1 1) 1) m == = = (2 1) 1 0 = = ==
m1 =1 m2 =1 m=m1 +m2

1 m1

110

1 m2

== = = == m = m1 + m2 = 1 + 1 = 2 =====

B.0.12. Correzione esercizi 23/03/2010


B.0.12.1. Esercizio 1

Si consideri il CPO con bottom (P(), ) costituito di numeri naturali S , ordinati per inclusione. Le funzioni f, g : P() P() cos denite: f = S .S X g = .(/S ) X dove X

Sono monotone? Sono continue? La risposta dipende da X?


Svologimento

Verichiamo la monotonicit di f . Ci chiediamo: S 1 S 2 = S 1 X S 2 X =


?

Supponiamo per ipotesi S1 S2 La propriet dimostrata se n N n S 1 X = n S 2 X Come al solito, supponiamo sia vera la premessa, dimostriamo la conseguenza. Assumiamo che n S 1 X. Quandi n S 1 n X ma, visto che S 1 S 2 , allora n S 2 X

190

Esercizi

Dimostriamo la continuit di f . Ci chiediamo n i (S i x) = n (i S i ) X =


?

n i (S i X)

i.n (S i X)

n Si n X n X n i S i

i, n.n S i n X n (S i ) X

n X i.n S i

Queste tipo di dimostrazioni funzionano bene con lappartenenza. Verichiamo la monotonicit nel caso della funzione g La cosa dipende da X: Se prendo X = , ottengo S i , , quindi monotona continua. Se X , Non potr essere monotona, basta prendere un controesempio S1 S2 S1 S2 g(S 2 ) X

g(S 1 )
B.0.12.2. Esercizio 3

1. Si denisca un ordinamento parziale D = (D, ) che non sia completo. 2. Lordinamento inverso non riessivo D = (D, ben fondata? ) con x y se e solo se y xex y, una relazione

3. In generale, possibile che D sia ben fondato per qualche D?


Svolgimento : da sistemare Prendiamo D = (, ) come esempio, per avere unintuizione. La catena dei numeri primi 2 5 7 . . . non ha maggioranti.

D = (,

xx

Se togliessi lipotesi x y lordinamento non sarebbe sicuramente una relazione ben fondata (loop). Escludo uguaglianze tra x e y. 2 5 7 . . . diventata una catena discendente innita. Questo succede per sempre? Si, succede sempre! Un ordine parziale non completo non ha minimo dei maggioranti. Anch non sia completo, bisogna che una catena non sia nita, trovo sempre una catena innita nellordinamento D. In questa sequenza posso usare la relazione x x. Vogliamo vedere se, avendo questa catena innita, riusciamo a costruire unaltra catena innita senza ripetizioni (perch ho inniti elementi diversi, non si stabilizza mai). Quando faccio la catena discendente innita, non devo avere ripetizioni. Lelemento x non in relazione con se stesso. Prendiamo d0 d1 d2 . . . catena innita senza lub. Immagginiamo sia innita. In questa catena posso eliminare gli elementi uguali ed ottenere una catena innita, applicando la seguente funzione: f (i + 1) = min{ j|d j d j1 , f (i) < j} f (0) = 0 Cancelliamo gli elementi ripetuti, sar ancora innita. d f (0) d f (1) d f (2) . . .

Questa catena non ha elementi ripetuti. Rovesciando diventa decrescente. Il fatto che non ci sono elementi ripetuti ci mette apposto. Abbiamo quindi costriuto una catena discendente innita senza ripetizioni, cio dimostra che la relazione non ben fondata.

191

B.0.13. Esercizio 4
Si studi linsieme V V delle stringhe nite (V ) e innite V sullalfabeto V = {a, b, c}, con lordinamento , dove in la giustapposizione indica la concatenazioen tra stringhe e = se innita
Svolgimento

V V

V = {a, b, c} V = V = a0 a1 a2 (1) = a1 ...

(0) = a0 Ordinamento:

V = Vn =

Estesione ai numeri naturale. Invece di una sola operazione di successore, ne abbiamo tante. Questo CPO? dobbiamo vericare le seguenti propriet: 1. Properiet riessiva. Se prendo = , otteniamo 2. Propriet antisimmetrica. Assumiamo le premesse: = allora = Se V , non ce nessun problema, otteniamo subito = == La concatenazione col fondo non cambia la stringa Se V = = = 3. Propriet transitiva = =
?

. Se prendiamo quindi , la stringa vuota, siamo a posto. == =


?

= = =

= Dimostriamo che completo. Ci chiediamo se esista maggiorante della catena 0 1

Catena nita: ho sicuramente miniimo dei maggioranti che lelemento sui cui la catena si stabilizza. Naturalmente, in questo caso, comprendo quello in cui ad un certo punto, entra una strin ga g V Catena innita: questo il caso di catene innite formate sono da stringhe V , allora se prendiamo n grande a piacere k.|k | n? Certo, altrimenti sarebbe nita. Ma se io voglio vedere lennesimo elemento della stringa innita, posso usare una approssimazione lunga k ma io so che questo valore ennesimo non sar mai modicato. ( i )(n) = kn |n Magia nera.

192
Esercizio 5

Esercizi Vericare che i comandi x := 0; if x = 0 then c1 else c2 e x := 0; c1

sono semanticamente equivalenti. Si svolga la prova usando sia la operazionale che la semantica denotazionale.
Svolgimento

x := 0; if x = 0 then c1 else c2 den x := 0; c1 Dobbiamo far vedere che: C x := 0; if x = 0 then c1 else c2 den C x := 0; c1

C x := 0; if x = 0 then c1 else c2 = C if x = 0 then c1 else c2 (C x := 0 ) = C if x = 0 then c1 else c2 [0/x] = ( .B x = 0 C c1 , C c2 )[0/x] = B x = 0 [0/x] C c1 [0/x], C c2 [0/x] = C c1 [0/x] C x := 0; c1 = C c1 (C x := 0 ) = C c1 [0/x]

B.0.13.1. Esercizio 6

Si verichi lequivalenza dei comandi while b do c


Svolgimento

while b do if b then c else skip

while b do c den while b do if b then c else skip C c1 = f ix C c2 = f ix = B b (C c ),

= B b (B b C c , ), =

Allora il corrispondente punto sso deve essere uguale. Come si fa a vedere che i punti ssi sono uguali? B b = true = (C [c]) = (C c )

B b = false
B.0.13.2. Esercizio 7

= =

Si dimostri la seguenze uguaglianza C while true do skip = C while true do x := x + 1

193
Svolgimento

I programmi non terminano mai, mi aspetto che abbiano la stessa semantica. C c1 = f ix = B true ([skip]), cio = .

Butto via la stella = Funzione identit. Minimo punto sso. Costruzione del punto sso 0 = . 1 = 0 = . Abbiamo gi trovato il punto sso. Vediamo con laltro comando. C c2 = f ix = B true (C x = x + 1 ), = [x+1 / x ] = .[x+1 / x ] Butto via la stellina. 0 = . 1 = (. . [x+1 / x ])(. ) = (. )[x+1 / x ] = .
( )( )

Parte VI.

Elenchi

Elenco delle denizioni


1.1. Sistema di regole di inferenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 theo.1.1 theo.1.2 1.3. Derivazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 theo.1.3 1.4. Teorema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 theo.1.4 1.5. Insieme dei teoremi in R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 theo.1.5 theo.1.6 theo.1.7 theo.1.8 theo.1.9 theo.1.10 theo.1.11 theo.1.12 theo.1.13 theo.1.14 theo.1.15 theo.1.16 2.1. Relazione su un insieme A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 theo.2.1 2.2. Catena discendente innita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 theo.2.2 2.3. Relazione ben fondata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 theo.2.3 2.4. Chiusura transitiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 theo.2.4 theo.2.5 theo.2.6 theo.2.7 theo.2.8 theo.2.9 theo.2.10 theo.2.11 theo.2.12 theo.2.13 theo.2.14 theo.2.15 2.16. Termini su una segnatura tipata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 theo.2.16 2.17. Induzione strutturale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 theo.2.17 theo.2.18 theo.2.19 2.20. Sottoderivazione immediata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 theo.2.20 theo.2.21 theo.2.22 theo.2.23 theo.2.24 2.25. Insieme dei predecessori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 theo.2.25 theo.2.26 theo.2.27 theo.2.28 theo.2.29 3.1. Ordinamento Parziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 theo.3.1 theo.3.2 theo.3.3 3.4. Ordinamento totale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 theo.3.4 theo.3.5 theo.3.6 theo.3.7 3.8. Diagramma di Hasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 theo.3.8 theo.3.9 3.10. Chiusura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 theo.3.10 3.11. Minimo di un insieme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 theo.3.11 theo.3.12 proof.1 3.13. Elemento Minimale di un insieme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 theo.3.13 3.14. Maggiorante (upper bound) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 theo.3.14 3.15. Minimo dei maggioranti (LUB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 theo.3.15 3.16. Catena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 theo.3.16 theo.3.17 3.18. Limite di una catena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 theo.3.18

198

Esercizi

3.19. Altezza di un insieme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 theo.3.19 theo.3.20 3.21. Sottoinsieme diretto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 theo.3.21 3.22. Insieme inclusivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 theo.3.22 theo.3.23 theo.3.24 3.25. Ordinamento parziale completo (CPO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 theo.3.25 3.26. Ordinamento parziale completo con bottom . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 theo.3.26 theo.3.27 theo.3.28 theo.3.29 theo.3.30 theo.3.31 3.32. Reticolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 theo.3.32 theo.3.33 3.34. Reticolo completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 theo.3.34 theo.3.35 notaz.1 3.36. Monotonia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 theo.3.36 theo.3.37 3.38. Continuit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 theo.3.38 theo.3.39 theo.3.40 theo.3.41 3.42. Punto sso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 theo.3.42 3.43. Punto presso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 theo.3.43 theo.3.44 theo.3.45 theo.3.46 theo.3.47 theo.3.48 3.49. Operatore delle conseguenze immediate (R) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 theo.3.49 theo.3.50 theo.3.51 theo.3.52 theo.3.53 theo.3.54 theo.3.55 notaz.2 theo.4.1 4.2. Induzione computazionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 theo.4.2 theo.4.3 theo.4.4 5.1. Variabili libere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 theo.5.1 5.2. Sostituzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 theo.5.2 5.3. -conversione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 theo.5.3 5.4. -conversione (copy-rule o -reduction) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 theo.5.4 theo.5.5 theo.5.6 theo.5.7 theo.5.8 theo.5.9 theo.5.10 5.11. -conversione tipata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 theo.5.11 5.12. Variabili libere in un termine HOFL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 theo.5.12 5.13. Variabili legate in un termine HOFL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 theo.5.13 5.14. Forme canoniche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 theo.5.14 theo.5.15 theo.5.16 theo.5.17 theo.6.1 6.2. Operatore di proiezione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 theo.6.2 theo.6.3 theo.6.4 theo.6.5 theo.6.6 theo.6.7 theo.6.8 theo.6.9 theo.6.10 theo.6.11 6.12. Operatore di lifting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 theo.6.12 6.13. Operatore let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 theo.6.13 theo.6.14 theo.6.15 theo.6.16 theo.6.17 theo.7.1 theo.7.2 theo.7.3 theo.7.4 theo.8.1 theo.8.2 8.3. Collegamento di due agenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 theo.8.3 8.4. Agenti Guarded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 theo.8.4 theo.8.5 theo.8.6 theo.8.7 theo.8.8 theo.8.9 theo.8.10

199 8.11. Relazione di equivalenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.11 8.12. Contesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.12 8.13. Congruenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.13 theo.8.14 8.15. Strong bisimulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.15 8.16. Strong bisimilarity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.16 theo.8.17 theo.8.18 theo.8.19 theo.8.20 theo.8.21 theo.8.22 theo.8.23 theo.8.26 theo.8.27 8.28. Satisfaction relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.28 theo.8.29 8.30. Profondit di una formula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.30 theo.8.31 theo.8.32 theo.8.33 theo.8.34 theo.8.35 theo.8.36 theo.9.1 9.2. Binding occourrence nel -calcolo . . . . . . . . . . . . . . . . . . . . . . . . theo.9.2 9.3. Free name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.3 9.4. Bound name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.4 theo.9.5 theo.9.6 theo.9.7 theo.9.8 theo.9.9 theo.9.10 theo.9.11 theo.9.12 9.13. Sostituzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.13 9.14. Applicazione di sostituzione . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.14 9.15. Bisimilarit early non ground . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.15 9.16. Bisimilarit late non ground . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.16 10.1. Sigma Field (-algebra) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.1 theo.10.2 10.3. Misura su (, F) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.3 10.4. Sub-probability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.4 10.5. Probability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.5 theo.10.6 10.7. Topologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.7 10.8. Topologia euclidea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.8 theo.10.9 theo.10.10 theo.10.11 theo.10.12 10.13. atena di Markov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C theo.10.13 10.14. atena di Markov omogenea . . . . . . . . . . . . . . . . . . . . . . . . . . . C theo.10.14 10.15. iscrete-time Markov Chain (DTMC) . . . . . . . . . . . . . . . . . . . . . . D theo.10.15 10.16. ontinuous-time Markov Chain (CTMC) . . . . . . . . . . . . . . . . . . . . C theo.10.16 theo.10.17 10.18. robabilit di un cammino . . . . . . . . . . . . . . . . . . . . . . . . . . . . P theo.10.18 theo.10.19 theo.10.20 10.21. atene ergodiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C . . . . . . . . . 110 . . . . . . . . . 111 . . . . . . . . . 111 . . . . . . . . . 111 . . . . . . . . . 111 theo.8.24 theo.8.25 . . . . . . . . . 118 . . . . . . . . . 119 . . . . . . . . . 127 . . . . . . . . . 127 . . . . . . . . . 127 . . . . . . . . . 134 . . . . . . . . . 134 . . . . . . . . . 134 . . . . . . . . . 134 . . . . . . . . . 139 . . . . . . . . . 139 . . . . . . . . . 140 . . . . . . . . . 140 . . . . . . . . . 140 . . . . . . . . . 141 . . . . . . . . . 143 . . . . . . . . . 143 . . . . . . . . . 144 . . . . . . . . . 144 . . . . . . . . . 146 . . . . . . . . . 146

200 theo.10.21 theo.10.22 theo.10.23 theo.11.1 theo.11.2 theo.11.3 theo.11.4 theo.11.5 theo.11.6

Esercizi

Elenco dei teoremi


theo.1.1 theo.1.2 theo.1.3 theo.1.4 theo.1.5 theo.1.6 theo.1.7 theo.1.8 theo.1.9 theo.1.10 theo.1.11 theo.1.12 theo.1.13 theo.1.14 theo.1.15 theo.1.16 theo.2.1 theo.2.2 theo.2.3 theo.2.4 2.5. Propriet delle relazioni ben fondate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 theo.2.5 2.6. Relazione ben fondata su insiemi niti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 theo.2.6 theo.2.7 theo.2.8 theo.2.9 theo.2.10 theo.2.11 2.12. Fondatezza della chiusura transitiva di . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 theo.2.12 2.13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 theo.2.13 2.14. Induzione matematica debole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 theo.2.14 2.15. Induzione matematica forte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 theo.2.15 theo.2.16 theo.2.17 theo.2.18 theo.2.19 theo.2.20 theo.2.21 theo.2.22 theo.2.23 theo.2.24 theo.2.25 2.26. Ricorsione ben fondata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 theo.2.26 theo.2.27 theo.2.28 theo.2.29 theo.3.1 theo.3.2 theo.3.3 theo.3.4 theo.3.5 theo.3.6 3.7. Sottoinsiemi di un insieme totalmente ordinato . . . . . . . . . . . . . . . . . . . . . . . . . . 33 theo.3.7 theo.3.8 3.9. Equivalenza fra relazione e chiusura di Hasse . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 theo.3.9 theo.3.10 theo.3.11 3.12. Unicit del minimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 theo.3.12 proof.1 theo.3.13 theo.3.14 theo.3.15 theo.3.16 3.17. Catene di un insieme nito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 theo.3.17 theo.3.18 theo.3.19 theo.3.20 theo.3.21 theo.3.22 theo.3.23 3.24. Catene di insiemi parzialmente ordinati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 theo.3.24 theo.3.25 theo.3.26 theo.3.27 theo.3.28 theo.3.29 theo.3.30 theo.3.31 theo.3.32 theo.3.33 theo.3.34 theo.3.35 notaz.1 theo.3.36 theo.3.37 theo.3.38 theo.3.39 3.40. Relazione fra monotonia e continuit (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 theo.3.40 3.41. Relazione fra monotonia e continuit (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 theo.3.41 theo.3.42 theo.3.43 theo.3.44 3.45. Teorema del punto sso (o teorema di Kleene) . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 theo.3.45 theo.3.46 theo.3.47 3.48. Teorema di Tarski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 theo.3.48 theo.3.49 3.50. Catena di applicazioni R() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 theo.3.50 3.51. Monotonia di R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 theo.3.51 3.52. Continuit di R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 theo.3.52 3.53. Punto sso di R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 theo.3.53 theo.3.54 theo.3.55 notaz.2 theo.4.1 theo.4.2 theo.4.3 theo.4.4 theo.5.1 theo.5.2 theo.5.3 theo.5.4 theo.5.5 theo.5.6 theo.5.7 theo.5.8 theo.5.9 5.10. La sostituzione rispetta i tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

202

Esercizi

theo.5.10 theo.5.11 theo.5.12 theo.5.13 theo.5.14 theo.5.15 theo.5.16 5.17. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 theo.5.17 6.1. Completezza del CPO per . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 theo.6.1 theo.6.2 6.3. Continuit di . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 theo.6.3 theo.6.4 6.5. Completezza dello spazio funzionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 theo.6.5 6.6. Continuit di (f,g) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 theo.6.6 6.7. Continuit delle singole funzioni di una coppia . . . . . . . . . . . . . . . . . . . . . . . . . . 81 theo.6.7 theo.6.8 6.9. Continuit di una funzione con una coppia come argomento . . . . . . . . . . . . . . . . . . . . 82 theo.6.9 theo.6.10 theo.6.11 theo.6.12 theo.6.13 6.14. Continuit di op . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 theo.6.14 6.15. Continuit di Cond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 theo.6.15 6.16. Continuit della semantica della lambda expression . . . . . . . . . . . . . . . . . . . . . . . . 89 theo.6.16 6.17. Lemma di sostituzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 theo.6.17 theo.7.1 7.2. Se t converge operazionalmente allora converge anche denotazionalmente . . . . . . . . . . . . 96 theo.7.2 7.3. Uguaglianza fra semantiche per termini di tipo int . . . . . . . . . . . . . . . . . . . . . . . . . 97 theo.7.3 7.4. Divergenza fra semantiche per termini di tipo composto . . . . . . . . . . . . . . . . . . . . . . 98 theo.7.4 theo.8.1 theo.8.2 theo.8.3 theo.8.4 theo.8.5 theo.8.6 theo.8.7 theo.8.8 theo.8.9 theo.8.10 theo.8.11 theo.8.12 theo.8.13 theo.8.14 theo.8.15 theo.8.16 8.17. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 theo.8.17 theo.8.18 8.19. Bisimulazione come punto sso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 theo.8.19 8.20. Bisimilarit come massimo punto sso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 theo.8.20 theo.8.21 8.22. Monotonia di . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 theo.8.22 theo.8.23 8.24. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 theo.8.24 theo.8.25 theo.8.26 theo.8.27 theo.8.28 theo.8.29 theo.8.30 8.31. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 theo.8.31 theo.8.32 theo.8.33 theo.8.34 theo.8.35 theo.8.36 theo.9.1 theo.9.2 theo.9.3 theo.9.4 theo.9.5 theo.9.6 theo.9.7 theo.9.8 theo.9.9 theo.9.10 theo.9.11 theo.9.12 theo.9.13 theo.9.14 theo.9.15 theo.9.16 theo.10.1 theo.10.2 theo.10.3 theo.10.4 theo.10.5 theo.10.6 theo.10.7 theo.10.8 theo.10.9 10.10. a distribuzione esponenziale senza memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 142 L theo.10.10 10.11. ransizioni multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 T theo.10.11 10.12. onfronto di due eventi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 C theo.10.12 theo.10.13 theo.10.14 theo.10.15 theo.10.16 theo.10.17 theo.10.18 theo.10.19 theo.10.20 theo.10.21 theo.10.22 theo.10.23 theo.11.1 theo.11.2 11.3. Bisimilarit e formule di Larsen-Skou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

203 theo.11.3 theo.11.4 theo.11.5 11.6. Segala pi espressivo di Generative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 theo.11.6

Elenco degli esempi


theo.1.1 1.2. Regola di inferenza . . . . . . . . . . . . . . . . . . . . . . . . . theo.1.2 theo.1.3 theo.1.4 theo.1.5 1.6. Grammatiche viste come sistemi di regole . . . . . . . . . . . . . theo.1.6 1.7. Formule valide e non . . . . . . . . . . . . . . . . . . . . . . . . theo.1.7 1.8. Dimostrazione di appartenenza ad IMP . . . . . . . . . . . . . . . theo.1.8 1.9. Valutazione di un comando tramite la semantica operazionale . . . theo.1.9 1.10. Uguaglianza fra comandi (1) . . . . . . . . . . . . . . . . . . . . theo.1.10 1.11. Uguaglianza fra comandi (2) . . . . . . . . . . . . . . . . . . . . theo.1.11 1.12. Dimostrazioni parametriche (1) . . . . . . . . . . . . . . . . . . . theo.1.12 1.13. Dimostrazioni parametriche (2) . . . . . . . . . . . . . . . . . . . theo.1.13 1.14. Dimostrazioni di nonterminazione . . . . . . . . . . . . . . . . theo.1.14 1.15. Dimostrazioni di nonuguaglianza . . . . . . . . . . . . . . . . . theo.1.15 1.16. Estensione della grammatica di Aexpr . . . . . . . . . . . . . . . theo.1.16 theo.2.1 theo.2.2 theo.2.3 theo.2.4 theo.2.5 theo.2.6 theo.2.7 2.8. Numeri Naturali . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.2.8 2.9. Termini e sottotermini . . . . . . . . . . . . . . . . . . . . . . . . theo.2.9 2.10. Ordinamento Lessicograco . . . . . . . . . . . . . . . . . . . . theo.2.10 2.11. Numeri interi . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.2.11 theo.2.12 theo.2.13 theo.2.14 theo.2.15 theo.2.16 theo.2.17 2.18. Segnatura in IMP . . . . . . . . . . . . . . . . . . . . . . . . . . theo.2.18 2.19. Induzione strutturale . . . . . . . . . . . . . . . . . . . . . . . . theo.2.19 theo.2.20 2.21. Sottoderivazione immediata . . . . . . . . . . . . . . . . . . . . . theo.2.21 2.22. Sottoderivazione propria . . . . . . . . . . . . . . . . . . . . . . theo.2.22 2.23. Dimostrazione mediante induzione sulle derivazioni . . . . . . . . theo.2.23 2.24. Ricorsione ben fondata . . . . . . . . . . . . . . . . . . . . . . . theo.2.24 theo.2.25 theo.2.26 2.27. Formalizzazione della ricorsione ben fondata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 7 7

. . . . . . . . . . . . . . . . 10 . . . . . . . . . . . . . . . . 11 . . . . . . . . . . . . . . . . 12 . . . . . . . . . . . . . . . . 13 . . . . . . . . . . . . . . . . 14 . . . . . . . . . . . . . . . . 14 . . . . . . . . . . . . . . . . 16 . . . . . . . . . . . . . . . . 17 . . . . . . . . . . . . . . . . 21 . . . . . . . . . . . . . . . . 21 . . . . . . . . . . . . . . . . 21 . . . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . . . 24 . . . . . . . . . . . . . . . . 24 . . . . . . . . . . . . . . . . 25 . . . . . . . . . . . . . . . . 25 . . . . . . . . . . . . . . . . 25 . . . . . . . . . . . . . . . . 27 . . . . . . . . . . . . . . . . 28

206

Esercizi

theo.2.27 2.28. Ricorsione ben fondata per una visita di albero in Lisp . . . . . . . . . . . . . . . . . . . . . . 28 theo.2.28 2.29. Funzione di Ackermann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 theo.2.29 theo.3.1 3.2. Ordinamento parziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 theo.3.2 3.3. Ordinamento non parziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 theo.3.3 theo.3.4 3.5. Ordinamento discreto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 theo.3.5 3.6. Ordinamento piatto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 theo.3.6 theo.3.7 theo.3.8 theo.3.9 theo.3.10 theo.3.11 theo.3.12 proof.1 theo.3.13 theo.3.14 theo.3.15 theo.3.16 theo.3.17 theo.3.18 theo.3.19 3.20. Insieme innito con catene nite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 theo.3.20 theo.3.21 theo.3.22 3.23. Fairness, insieme non inclusivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 theo.3.23 theo.3.24 theo.3.25 theo.3.26 3.27. Ordinamento parziale non completo (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 theo.3.27 3.28. Ordinamento parziale completo (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 theo.3.28 3.29. Powerset con inclusione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 theo.3.29 3.30. Funzioni parziali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 theo.3.30 3.31. Sequenza di funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 theo.3.31 theo.3.32 3.33. Reticolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 theo.3.33 theo.3.34 3.35. Reticolo non completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 theo.3.35 notaz.1 theo.3.36 3.37. Funzione non monotona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 theo.3.37 theo.3.38 3.39. Funzione monotona non continua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 theo.3.39 theo.3.40 theo.3.41 theo.3.42 theo.3.43 theo.3.44 theo.3.45 3.46. necessario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 theo.3.46 3.47. Continuit necessaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 theo.3.47 theo.3.48 theo.3.49 theo.3.50 theo.3.51 theo.3.52 theo.3.53 3.54. Insieme di regole con R non continuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 theo.3.54 3.55. Stringhe di una grammatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 theo.3.55 notaz.2 4.1. Semantica denotazionale di un comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 theo.4.1 theo.4.2 4.3. Esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 theo.4.3 4.4. Applicazione induzione computazionale 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 theo.4.4 theo.5.1 theo.5.2 theo.5.3 theo.5.4 5.5. looping term . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 theo.5.5

207 5.6. Y combinator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.6 5.7. Programma tipabile (Church) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.7 5.8. Programma non tipabile (Curry) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.8 5.9. Programma non tipabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.9 theo.5.10 theo.5.11 theo.5.12 theo.5.13 theo.5.14 5.15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.15 5.16. Esempio di valutazione eager e lazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.5.16 theo.5.17 theo.6.1 theo.6.2 theo.6.3 theo.6.4 theo.6.5 theo.6.6 theo.6.7 theo.6.8 theo.6.9 6.10. Continuit della funzione apply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.6.10 6.11. Funzioni Curry ed Uncurry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.6.11 theo.6.12 theo.6.13 theo.6.14 theo.6.15 theo.6.16 theo.6.17 7.1. Distinzione dei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.7.1 theo.7.2 theo.7.3 theo.7.4 8.1. Algebre di processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.1 8.2. Esempio di derivazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.2 theo.8.3 theo.8.4 theo.8.5 8.6. Agente non guardato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.6 8.7. Agenti isomor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.7 8.8. Gra dierenti, stringhe uguali, comportamento uguale . . . . . . . . . . . . . . . . . . . . . theo.8.8 8.9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.9 8.10. Gra dierenti, stringhe uguali, comportamento dierente . . . . . . . . . . . . . . . . . . . theo.8.10 theo.8.11 theo.8.12 theo.8.13 8.14. Teoria dei giochi per lesempio 8.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.14 theo.8.15 theo.8.16 theo.8.17 8.18. Stati bisimili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.18 theo.8.19 theo.8.20 8.21. Bisimilarit come massimo punto sso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.21 theo.8.22 theo.8.23 theo.8.24 8.25. Calcolo Bisimilarit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.25 8.26. Punto sso alla prima iterazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.26 8.27. Equivalenza a stringhe non congruenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.27 theo.8.28 8.29. Agenti non bisimilari tramite formule logiche . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.29 theo.8.30 theo.8.31 8.32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.32 8.33. weak bisimilarity non congruenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.33 8.34. Weak Congruence non bisimulazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.34 . 67 . 68 . 69 . 70 . 74 . 74 . 82 . 83 . 94 . 103 . 107 . 108 . 109 . 109 . 110 . 110 . 111 . 112 . 113 . 115 . 115 . 116 . 118 . 120 . 120 . 121

208 8.35. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.35 8.36. Esempio 8.34 con dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.8.36 9.1. Telefoni mobili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.1 theo.9.2 theo.9.3 theo.9.4 9.5. Violazione della regola dei nomi in input . . . . . . . . . . . . . . . . . . . . . . . . theo.9.5 9.6. Utilizzo del comando di matching . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.6 9.7. Violazione della regola sui nomi nel parallelo . . . . . . . . . . . . . . . . . . . . . theo.9.7 9.8. Estrusione di variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.8 9.9. Derivazione nel -calcolo (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.9 9.10. Derivazione nel -calcolo (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.10 9.11. Bisimularit early e late . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.9.11 9.12. La bisimilarit ground non una congruenza . . . . . . . . . . . . . . . . . . . . . . theo.9.12 theo.9.13 theo.9.14 theo.9.15 theo.9.16 theo.10.1 10.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.2 theo.10.3 theo.10.4 theo.10.5 10.6. Cammini niti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.6 theo.10.7 theo.10.8 10.9. Distribuzione senza memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.9 theo.10.10 theo.10.11 theo.10.12 theo.10.13 theo.10.14 theo.10.15 theo.10.16 10.17. TMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D theo.10.17 theo.10.18 10.19. robabilit di un cammino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P theo.10.19 10.20. andom walk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . R theo.10.20 theo.10.21 10.22. unto di stabilizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P theo.10.22 10.23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.10.23 11.1. Reactive probabilistic transition system . . . . . . . . . . . . . . . . . . . . . . . . theo.11.1 11.2. Logica di Larsen-Skou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.11.2 theo.11.3 11.4. Segala automaton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.11.4 11.5. Simple Segala Automaton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . theo.11.5 theo.11.6

Esercizi . . . . . . 122 . . . . . . 122 . . . . . . 125 . . . . . . 128 . . . . . . 129 . . . . . . 130 . . . . . . 131 . . . . . . 132 . . . . . . 132 . . . . . . 133 . . . . . . 134 . . . . . . 139 . . . . . . 140 . . . . . . 141 . . . . . . 145 . . . . . . 146 . . . . . . 146 . . . . . . 147 . . . . . . 148 . . . . . . 151 . . . . . . 152 . . . . . . 153 . . . . . . 154