Il teorema di dualità

Il teorema di dualizzazione dice che date due formule F1 ed F2, se le due formule sono equivalenti (F1 ≡ F2) allora anche le loro dualizzate lo sono (dualize F1 ≡ dualize F2).

L'ingrediente principale è la funzione di dualizzazione di una formula F:

Per dimostrare il teorema di dualizzazione in modo agevole è necessario definire altre nozioni:

La libreria di Matita

Gli strumenti per la dimostrazione assistita sono corredati da librerie di teoremi già dimostrati. Per portare a termine l'esercitazione sono necessari i seguenti lemmi:

Il linguaggio di dimostrazione di Matita

Per dimostrare il lemma negate_invert in modo agevole è necessario utilizzare il seguente comando:

La prova del teorema di dualità

Il teorema di dualità accennato a lezione dice che se due formule F1 ed F2 sono equivalenti, allora anche le formule duali lo sono.

∀F1,F2:Formula. F1 ≡ F2 → dualize F1 ≡ dualize F2.

Per dimostrare tale teorema è bene suddividere la prova in lemmi intermedi

  1. lemma negate_invert, dimostrato per induzione su F, utilizzando min_bool

    ∀F:Formula.∀v:ℕ→ℕ.[[ negate F ]]v=[[ F ]](invert v).
    
  2. lemma negate_fun, conseguenza di negate_invert

    ∀F,G:Formula. F ≡ G → negate F ≡ negate G.
    
  3. lemma not_dualize_eq_negate, dimostrato per induzione su F, utilizzando max_min e min_max

    ∀F:Formula. negate F ≡ FNot (dualize F)
    
  4. lemma not_inj, conseguenza di sem_bool

    ∀F,G:Formula. FNot F ≡ FNot G → F ≡ G
    

Una volta dimostrati tali lemmi la prova del teorema di dualità procede come di seguito:

  1. Assume l'ipotesi

    F1 ≡ F2
    
  2. Utilizza negate_fun per ottenere

    negate F1 ≡ negate F2
    
  3. Utilizzando due volte il lemma not_dualize_eq_negate e il lemma equiv_rewrite ottiene

    FNot (dualize F1) ≡ FNot (dualize F2)
    
  4. Conclude utilizzando il lemma not_inj per ottenere la tesi

    dualize F1 ≡ dualize F2
    

Note generali

Si ricorda che:

  1. Ogni volta che nella finestra di destra compare un simbolo oppure un simbolo è opportuno usare il comando assume oppure suppose oppure (se si è in un caso di una dimostrazione per induzione) il comando by induction hypothesis we know (che vengono nuovamente spiegati in seguito).

  2. Ogni caso (o sotto caso) della dimostrazione:

    1. Inizia con una sequenza di comandi assume o suppose oppure by induction hypothesis we know. Tale sequenza di comandi può anche essere vuota.

    2. Continua poi con almeno un comando the thesis becomes.

    3. Eventualmente seguono vari comandi by ... we proved per utilizzare i teoremi già disponibili per generare nuove ipotesi.

    4. Eventualmente uno o più comandi we proceed by cases on (...) to prove (...).

    5. Se necessario un comando conclude seguito da un numero anche molto lungo di passi = (...) by ... . per rendere la parte sinistra della vostra tesi uguale alla parte destra.

    6. Ogni caso termina con done.

  3. Ogni caso corrispondente a un nodo con sottoformule (FAnd/For/FNot) avrà tante ipotesi induttive quante sono le sue sottoformule e tali ipotesi sono necessarie per portare a termine la dimostrazione.

I comandi da utilizzare