]> matita.cs.unibo.it Git - helm.git/blob - helm/software/matita/contribs/didactic/duality.ma
44b7880fa45fc1986121acf443e5b1c7b345b991
[helm.git] / helm / software / matita / contribs / didactic / duality.ma
1 (* Esercitazione di logica 29/10/2008. *)
2
3 (* Esercizio 0
4    ===========
5
6    Compilare i seguenti campi:
7
8    Nome1: ...
9    Cognome1: ...
10    Matricola1: ...
11    Account1: ...
12
13    Nome2: ...
14    Cognome2: ...
15    Matricola2: ...
16    Account2: ...
17
18    Prima di abbandonare la postazione:
19
20    * salvare il file (menu `File ▹ Save as ...`) nella directory (cartella)
21      /public/ con nome linguaggi_Account1.ma, ad esempio Mario Rossi, il cui
22      account è mrossi, deve salvare il file in /public/linguaggi_mrossi.ma
23
24    * mandatevi via email o stampate il file. Per stampare potete usare
25      usare l'editor gedit che offre la funzionalità di stampa
26 *)
27
28 (* ATTENZIONE
29    ==========
30    
31    Non modificare quanto segue 
32 *)
33 include "nat/minus.ma".
34 definition if_then_else ≝ λT:Type.λe,t,f.match e return λ_.T with [ true ⇒ t | false ⇒ f].
35 notation > "'if' term 19 e 'then' term 19 t 'else' term 90 f" non associative with precedence 19 for @{ 'if_then_else $e $t $f }.
36 notation < "'if' \nbsp term 19 e \nbsp 'then' \nbsp term 19 t \nbsp 'else' \nbsp term 90 f \nbsp" non associative with precedence 19 for @{ 'if_then_else $e $t $f }.
37 interpretation "Formula if_then_else" 'if_then_else e t f = (if_then_else _ e t f).
38 definition max ≝ λn,m. if eqb (n - m) 0 then m else n. 
39 definition min ≝ λn,m. if eqb (n - m) 0 then n else m. 
40
41 (* Ripasso
42    =======
43    
44    Il linguaggio delle formule, dove gli atomi sono
45    rapperesentati da un numero naturale
46 *)
47 inductive Formula : Type ≝
48 | FBot: Formula
49 | FTop: Formula
50 | FAtom: nat → Formula
51 | FAnd: Formula → Formula → Formula
52 | FOr: Formula → Formula → Formula
53 | FImpl: Formula → Formula → Formula
54 | FNot: Formula → Formula
55 .
56
57 (* Esercizio 1
58    ===========
59    
60    Modificare la funzione `sem` scritta nella precedente
61    esercitazione in modo che valga solo 0 oppure 1 nel caso degli
62    atomi, anche nel caso il mondo `v` restituisca un numero
63    maggiore di 1.
64 *) 
65 let rec sem (v: nat → nat) (F: Formula) on F ≝
66  match F with
67   [ FBot ⇒ 0
68   | FTop ⇒ 1
69   | FAtom n ⇒ (*BEGIN*)min (v n) 1(*END*)
70   | FAnd F1 F2 ⇒ min (sem v F1) (sem v F2)
71   | FOr F1 F2 ⇒ max (sem v F1) (sem v F2)
72   | FImpl F1 F2 ⇒ max (1 - sem v F1) (sem v F2)
73   | FNot F1 ⇒ 1 - (sem v F1)
74   ]
75 .
76
77 (* ATTENZIONE
78    ==========
79    
80    Non modificare quanto segue.
81 *)
82 notation < "[[ \nbsp term 19 a \nbsp ]] \nbsp \sub term 90 v" non associative with precedence 90 for @{ 'semantics $v $a }.
83 notation > "[[ term 19 a ]] \sub term 90 v" non associative with precedence 90 for @{ 'semantics $v $a }.
84 notation > "[[ term 19 a ]]_ term 90 v" non associative with precedence 90 for @{ sem $v $a }.
85 interpretation "Semantic of Formula" 'semantics v a = (sem v a).
86
87 definition v20 ≝ λx.
88        if eqb x 0 then 2
89   else if eqb x 1 then 1
90   else                 0.
91   
92 (* Test 1
93    ======
94    
95    La semantica della formula `(A ∨ C)` nel mondo `v20` in cui 
96    `A` vale `2` e `C` vale `0` deve valere `1`.
97    
98 *)    
99 eval normalize on [[For (FAtom 0) (FAtom 2)]]_v20. 
100
101
102 (* ATTENZIONE
103    ==========
104    
105    Non modificare quanto segue.
106 *)
107 lemma sem_bool : ∀F,v. [[ F ]]_v = 0 ∨ [[ F ]]_v = 1.
108 intros; elim F; simplify;
109 [left;reflexivity;
110 |right;reflexivity;
111 |cases (v n);[left;|cases n1;right;]reflexivity;
112 |4,5,6: cases H; cases H1; rewrite > H2; rewrite > H3; simplify;
113    first [ left;reflexivity | right; reflexivity ].
114 |cases H; rewrite > H1; simplify;[right|left]reflexivity;]
115 qed.
116 lemma min_bool : ∀n. min n 1 = 0 ∨ min n 1 = 1.
117 intros; cases n; [left;reflexivity] cases n1; right; reflexivity;
118 qed.  
119 lemma min_max : ∀F,G,v.
120   min (1 - [[F]]_v) (1 - [[G]]_v) = 1 - max [[F]]_v [[G]]_v.
121 intros; cases (sem_bool F v);cases (sem_bool G v); rewrite > H; rewrite >H1;
122 simplify; reflexivity;
123 qed.
124 lemma max_min : ∀F,G,v.
125   max (1 - [[F]]_v) (1 - [[G]]_v) = 1 - min [[F]]_v [[G]]_v.
126 intros; cases (sem_bool F v);cases (sem_bool G v); rewrite > H; rewrite >H1;
127 simplify; reflexivity;
128 qed.
129
130 (* Esercizio 2
131    ===========
132    
133    Definire per ricorsione strutturale la funzione `negate`
134    che presa una formula `F` ne nega gli atomi.
135    
136    Ad esempio la formula `(A ∨ (⊤ → B))` deve diventare
137    `¬A ∨ (⊤ → ¬B)`.
138 *)
139 let rec negate (F: Formula) on F ≝
140  match F with
141   [ FBot ⇒ FBot
142   | FTop ⇒ FTop
143   | FAtom n ⇒ FNot (FAtom n)
144   | FAnd F1 F2 ⇒ FAnd (negate F1) (negate F2)
145   | FOr F1 F2 ⇒ FOr (negate F1) (negate F2)
146   | FImpl F1 F2 ⇒ FImpl (negate F1) (negate F2)
147   | FNot F ⇒ FNot (negate F)
148   ].
149
150 (* Test 2
151    ======
152   
153    Testare la funzione `negate`. Il risultato atteso è:
154    
155        FOr (FNot (FAtom O)) (FImpl FTop (FNot (FAtom 1))) 
156 *)
157
158 eval normalize on (negate (FOr (FAtom 0) (FImpl FTop (FAtom 1)))).
159
160 (* ATTENZIONE
161    ==========
162    
163    Non modificare quanto segue
164 *)
165 definition equiv ≝ λF1,F2. ∀v.[[ F1 ]]_v = [[ F2 ]]_v.
166 notation "hvbox(a \nbsp break mstyle color #0000ff (≡) \nbsp b)"  non associative with precedence 45 for @{ 'equivF $a $b }.
167 notation > "a ≡ b" non associative with precedence 50 for @{ equiv $a $b }.
168 interpretation "equivalence for Formulas" 'equivF a b = (equiv a b).
169 lemma equiv_rewrite : ∀F1,F2,F3. F1 ≡ F2 → F1 ≡ F3 → F2 ≡ F3. intros; intro; autobatch. qed.
170
171 (* Esercizio 3
172    ===========
173    
174    Definire per ricorsione strutturale la funzione di
175    dualizzazione di una formula `F`. Tale funzione:
176    
177    * Sambia FTop con FBot e viceversa
178    
179    * Scambia il connettivo FAnd con FOr e viceversa
180    
181    * Sostituisce il connettivo FImpl con FAnd e nega la
182      prima sottoformula.
183    
184    Ad esempio la formula `A → (B ∧ ⊥)` viene dualizzata in
185    `¬A ∧ (B ∨ ⊤)`. 
186 *)  
187 let rec dualize (F : Formula) on F : Formula ≝
188   match F with
189   [ FBot ⇒ FTop
190   | FTop ⇒ FBot
191   | FAtom n ⇒ FAtom n
192   | FAnd F1 F2 ⇒ FOr (dualize F1) (dualize F2)
193   | FOr F1 F2 ⇒ FAnd (dualize F1) (dualize F2)
194   | FImpl F1 F2 ⇒ FAnd (FNot (dualize F1)) (dualize F2)
195   | FNot F ⇒ FNot (dualize F)
196   ].
197
198 (* Test 3
199    ======
200    
201    Testare la funzione `dualize`. Il risultato atteso è:
202    
203        FAnd (FNot (FAtom O)) (FOr (FAtom 1) FTop) 
204 *)
205
206 eval normalize on (dualize (FImpl (FAtom 0) (FAnd (FAtom 1) FBot))).
207
208 (* Spiegazione
209    ===========
210    
211    La funzione `invert` permette di invertire un mondo `v`.
212    Ovvero, per ogni indice di atomo `i`, se `v i` restituisce
213    `1` allora `(invert v) i` restituisce `0` e viceversa.
214 *)
215 definition invert ≝
216  λv:ℕ -> ℕ. λx. if eqb (min (v x) 1) 0 then 1 else 0.
217  
218 interpretation "Inversione del mondo" 'invert v = (invert v).
219  
220 (*DOCBEGIN
221
222 Il linguaggio di dimostrazione di Matita
223 ========================================
224
225 Per dimostrare il lemma `negate_invert` in modo agevole è necessario 
226 utilizzare il seguente comando:
227
228 * `symmetry` 
229
230   Quando la conclusuine è `a = b` permette di cambiarla in `b = a`.
231
232 DOCEND*)
233
234 (* Esercizio 4
235    ===========
236    
237    Dimostrare il lemma `negate_invert` che asserisce che
238    la semantica in un mondo `v` associato alla formula
239    negata di `F` e uguale alla semantica associata
240    a `F` in un mondo invertito.
241 *) 
242 lemma negate_invert:
243   ∀F:Formula.∀v:ℕ→ℕ.[[ negate F ]]_v=[[ F ]]_(invert v).
244 assume F:Formula.
245 assume v:(ℕ→ℕ).
246 we proceed by induction on F to prove ([[ negate F ]]_v=[[ F ]]_(invert v)).
247   case FBot .
248     the thesis becomes ([[ negate FBot ]]_v=[[ FBot ]]_(invert v)).
249   done.
250   case FTop .
251     the thesis becomes ([[ negate FTop ]]_v=[[ FTop ]]_(invert v)).
252   done.
253   case FAtom.
254     assume n : ℕ.
255     the thesis becomes ([[ negate (FAtom n) ]]_v=[[ FAtom n ]]_(invert v)).
256     the thesis becomes (1 - (min (v n) 1)= min (invert v n) 1).
257     the thesis becomes (1 - (min (v n) 1)= min (if eqb (min (v n) 1) 0 then 1 else 0) 1).
258     by min_bool we proved (min (v n) 1 = 0 ∨ min (v n) 1 = 1) (H1);
259     we proceed by cases on (H1) to prove (1 - (min (v n) 1)= min (if eqb (min (v n) 1) 0 then 1 else 0) 1).
260       case Left.
261         conclude 
262             (1 - (min (v n) 1)) 
263           = (1 - 0) by H.
264           = 1.
265         symmetry.
266         conclude 
267             (min (if eqb (min (v n) 1) O then 1 else O) 1)
268           = (min (if eqb 0 0 then 1 else O) 1) by H.
269           = (min 1 1).
270           = 1.
271       done.
272       case Right.
273         conclude 
274             (1 - (min (v n) 1)) 
275           = (1 - 1) by H.
276           = 0.
277         symmetry.
278         conclude 
279             (min (if eqb (min (v n) 1) O then 1 else O) 1)
280           = (min (if eqb 1 0 then 1 else O) 1) by H.
281           = (min 0 1).
282           = 0.
283       done.
284   case FAnd.
285     assume f : Formula.
286     by induction hypothesis we know
287       ([[ negate f ]]_v=[[ f ]]_(invert v)) (H).
288     assume f1 : Formula.
289     by induction hypothesis we know
290      ([[ negate f1 ]]_v=[[ f1 ]]_(invert v)) (H1).
291     the thesis becomes
292      ([[ negate (FAnd f f1) ]]_v=[[ FAnd f f1 ]]_(invert v)).
293     the thesis becomes
294      (min [[ negate f ]]_v [[ negate f1]]_v = [[ FAnd f f1 ]]_(invert v)).
295     conclude 
296         (min [[ negate f ]]_v [[ negate f1]]_v)
297       = (min [[ f ]]_(invert v) [[ negate f1]]_v) by H.
298       = (min [[ f ]]_(invert v) [[ f1]]_(invert v)) by H1.
299   done.
300   case FOr.
301     assume f : Formula.
302     by induction hypothesis we know
303       ([[ negate f ]]_v=[[ f ]]_(invert v)) (H).
304     assume f1 : Formula.
305     by induction hypothesis we know
306      ([[ negate f1 ]]_v=[[ f1 ]]_(invert v)) (H1).
307     the thesis becomes
308      ([[ negate (FOr f f1) ]]_v=[[ FOr f f1 ]]_(invert v)).
309     the thesis becomes
310      (max [[ negate f ]]_v [[ negate f1]]_v = [[ FOr f f1 ]]_(invert v)).
311     conclude 
312         (max [[ negate f ]]_v [[ negate f1]]_v)
313       = (max [[ f ]]_(invert v) [[ negate f1]]_v) by H.
314       = (max [[ f ]]_(invert v) [[ f1]]_(invert v)) by H1.
315   done.
316   case FImpl.
317     assume f : Formula.
318     by induction hypothesis we know
319       ([[ negate f ]]_v=[[ f ]]_(invert v)) (H).
320     assume f1 : Formula.
321     by induction hypothesis we know
322      ([[ negate f1 ]]_v=[[ f1 ]]_(invert v)) (H1).
323     the thesis becomes
324      ([[ negate (FImpl f f1) ]]_v=[[ FImpl f f1 ]]_(invert v)).
325     the thesis becomes
326      (max (1 - [[ negate f ]]_v) [[ negate f1]]_v = [[ FImpl f f1 ]]_(invert v)).
327     conclude 
328         (max (1 - [[ negate f ]]_v) [[ negate f1]]_v)
329       = (max (1 - [[ f ]]_(invert v)) [[ negate f1]]_v) by H.
330       = (max (1 - [[ f ]]_(invert v)) [[ f1]]_(invert v)) by H1.
331   done.
332   case FNot.
333     assume f : Formula.
334     by induction hypothesis we know
335       ([[ negate f ]]_v=[[ f ]]_(invert v)) (H).
336    the thesis becomes
337      ([[ negate (FNot f) ]]_v=[[ FNot f ]]_(invert v)).
338    the thesis becomes
339      (1 - [[ negate f ]]_v=[[ FNot f ]]_(invert v)).
340    conclude (1 - [[ negate f ]]_v) = (1 - [[f]]_(invert v)) by H.
341  done.  
342 qed.   
343
344 (* Esercizio 5
345    ===========
346    
347    Dimostrare che la funzione negate rispetta l'equivalenza.
348 *)
349 lemma negate_fun:
350  ∀F:Formula.∀G:Formula.F ≡ G→negate F ≡ negate G.
351  assume F:Formula.
352  assume G:Formula.
353  suppose (F ≡ G) (H).
354  the thesis becomes (negate F ≡ negate G).
355  the thesis becomes (∀v:ℕ→ℕ.[[ negate F ]]_v=[[ negate G ]]_v).
356  assume v:(ℕ→ℕ).
357  conclude 
358      [[ negate F ]]_v
359    = [[ F ]]_(invert v) by negate_invert.
360    = [[ G ]]_(invert v) by H.
361    = [[ negate G ]]_v by negate_invert.
362  done.  
363 qed.
364
365 (* Esercizio 6
366    ===========
367    
368    Dimostrare che per ogni formula `F`, `(negae F)` equivale a 
369    dualizzarla e negarla.
370 *)
371 lemma not_dualize_eq_negate:
372  ∀F:Formula.negate F ≡ FNot (dualize F).
373  assume F:Formula.
374  the thesis becomes (∀v:ℕ→ℕ.[[negate F]]_v=[[FNot (dualize F)]]_v).
375  assume v:(ℕ→ℕ).
376  we proceed by induction on F to prove ([[negate F]]_v=[[FNot (dualize F)]]_v).
377  case FBot .
378    the thesis becomes ([[ negate FBot ]]_v=[[ FNot (dualize FBot) ]]_v).
379  done.
380  case FTop .
381    the thesis becomes ([[ negate FTop ]]_v=[[ FNot (dualize FTop) ]]_v).
382  done.
383  case FAtom.
384    assume n : ℕ.
385    the thesis becomes ([[ negate (FAtom n) ]]_v=[[ FNot (dualize (FAtom n)) ]]_v).
386  done.
387  case FAnd.
388    assume f : Formula.
389    by induction hypothesis we know
390      ([[ negate f ]]_v=[[ FNot (dualize f) ]]_v) (H).
391    assume f1 : Formula.
392    by induction hypothesis we know
393     ([[ negate f1 ]]_v=[[ FNot (dualize f1) ]]_v) (H1).
394    the thesis becomes
395     ([[ negate (FAnd f f1) ]]_v=[[ FNot (dualize (FAnd f f1)) ]]_v).
396    the thesis becomes
397     (min [[ negate f ]]_v [[ negate f1 ]]_v=[[ FNot (dualize (FAnd f f1)) ]]_v).
398    conclude 
399        (min [[ negate f ]]_v [[ negate f1 ]]_v)
400      = (min [[ FNot (dualize f) ]]_v [[ negate f1 ]]_v) by H.    
401      = (min [[ FNot (dualize f) ]]_v [[ FNot (dualize f1) ]]_v) by H1.
402      = (min (1 - [[ dualize f ]]_v) (1 - [[ dualize f1 ]]_v)).
403      = (1 - (max [[ dualize f ]]_v [[ dualize f1 ]]_v)) by min_max.
404  done.
405  case FOr.
406    assume f : Formula.
407    by induction hypothesis we know
408      ([[ negate f ]]_v=[[ FNot (dualize f) ]]_v) (H).
409    assume f1 : Formula.
410    by induction hypothesis we know
411     ([[ negate f1 ]]_v=[[ FNot (dualize f1) ]]_v) (H1).
412    the thesis becomes
413     ([[ negate (FOr f f1) ]]_v=[[ FNot (dualize (FOr f f1)) ]]_v).
414    the thesis becomes
415     (max [[ negate f ]]_v [[ negate f1 ]]_v=[[ FNot (dualize (FOr f f1)) ]]_v).
416    conclude 
417        (max [[ negate f ]]_v [[ negate f1 ]]_v)
418      = (max [[ FNot (dualize f) ]]_v [[ negate f1 ]]_v) by H.    
419      = (max [[ FNot (dualize f) ]]_v [[ FNot (dualize f1) ]]_v) by H1.
420      = (max (1 - [[ dualize f ]]_v) (1 - [[ dualize f1 ]]_v)).
421      = (1 - (min [[ dualize f ]]_v [[ dualize f1 ]]_v)) by max_min.
422  done.
423  case FImpl.
424    assume f : Formula.
425    by induction hypothesis we know
426      ([[ negate f ]]_v=[[ FNot (dualize f) ]]_v) (H).
427    assume f1 : Formula.
428    by induction hypothesis we know
429     ([[ negate f1 ]]_v=[[ FNot (dualize f1) ]]_v) (H1).
430    the thesis becomes
431     ([[ negate (FImpl f f1) ]]_v=[[ FNot (dualize (FImpl f f1)) ]]_v).
432    the thesis becomes
433     (max (1 - [[ negate f ]]_v) [[ negate f1 ]]_v=[[ FNot (dualize (FImpl f f1)) ]]_v).
434    conclude 
435        (max (1-[[ negate f ]]_v) [[ negate f1 ]]_v)
436      = (max (1-[[ FNot (dualize f) ]]_v) [[ negate f1 ]]_v) by H.    
437      = (max (1-[[ FNot (dualize f) ]]_v) [[ FNot (dualize f1) ]]_v) by H1.
438      = (max (1 - [[ FNot (dualize f) ]]_v) (1 - [[ dualize f1 ]]_v)).
439      = (1 - (min [[ FNot (dualize f) ]]_v [[ dualize f1 ]]_v)) by max_min.
440  done.
441  case FNot. 
442    assume f : Formula.
443    by induction hypothesis we know
444      ([[ negate f ]]_v=[[ FNot (dualize f) ]]_v) (H).
445    the thesis becomes
446       ([[ negate (FNot f) ]]_v=[[ FNot (dualize (FNot f)) ]]_v).
447    the thesis becomes
448       (1 - [[ negate f ]]_v=[[ FNot (dualize (FNot f)) ]]_v).
449    conclude (1 - [[ negate f ]]_v) = (1 - [[ FNot (dualize f) ]]_v) by H.
450  done.
451 qed.
452
453 (* Esercizio 7
454    ===========
455    
456    Dimostrare che la negazione è iniettiva
457 *)
458 theorem not_inj:
459  ∀F:Formula.∀G:Formula.FNot F ≡ FNot G→F ≡ G.
460  assume F:Formula.
461  assume G:Formula.
462  suppose (FNot F ≡ FNot G) (H).
463  the thesis becomes (F ≡ G).
464  the thesis becomes (∀v:ℕ→ℕ.[[ F ]]_v=[[ G ]]_v).
465  assume v:(ℕ→ℕ).
466  by H we proved ([[ FNot F ]]_v=[[ FNot G ]]_v) (H1).
467  by sem_bool we proved ([[ F ]]_v=O∨[[ F ]]_v=1) (H2).
468  by sem_bool we proved ([[ G ]]_v=O∨[[ G ]]_v=1) (H3).
469  we proceed by cases on H2 to prove ([[ F ]]_v=[[ G ]]_v).
470  case Left.
471    we proceed by cases on H3 to prove ([[ F ]]_v=[[ G ]]_v).
472    case Left.
473    done.
474    case Right.
475      conclude 
476          ([[ F ]]_v)
477        = 0 by H4;
478        = (1 - 1).
479        = (1 - [[G]]_v) by H5.
480        = [[ FNot G ]]_v.
481        = [[ FNot F ]]_v by H1.
482        = (1 - [[F]]_v).
483        = (1 - 0) by H4.
484        = 1.
485      done.
486  case Right.
487    we proceed by cases on H3 to prove ([[ F ]]_v=[[ G ]]_v).
488    case Left.
489      conclude 
490          ([[ F ]]_v)
491        = 1 by H4;
492        = (1 - 0).
493        = (1 - [[G]]_v) by H5.
494        = [[ FNot G ]]_v.
495        = [[ FNot F ]]_v by H1.
496        = (1 - [[F]]_v).
497        = (1 - 1) by H4.
498        = 0.
499      done.
500    case Right.
501    done.
502 qed.
503
504 (* Esercizio 8
505    ===========
506    
507    Dimostrare il teorema di dualità
508 *)
509 theorem duality:
510  ∀F1:Formula.∀F2:Formula.F1 ≡ F2 → dualize F1 ≡ dualize F2.
511  assume F1:Formula.
512  assume F2:Formula.
513  suppose (F1 ≡ F2) (H).
514  the thesis becomes (dualize F1 ≡ dualize F2).
515  by negate_fun we proved (negate F1 ≡ negate F2) (H1).
516  by not_dualize_eq_negate, equiv_rewrite we proved (FNot (dualize F1) ≡ negate F2) (H2).
517  by not_dualize_eq_negate, equiv_rewrite we proved (FNot (dualize F1) ≡ FNot (dualize F2)) (H3).
518  by not_inj we proved (dualize F1 ≡ dualize F2) (H4).
519  done.
520 qed.