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:

Dimostreremo un altro risultato importante: negare una formula equivale a negare gli atomi della sua dualizzazione. Ad esempio,

  ¬(A ∨ (B ∧ C)) ≡ ¬A ∧ (¬B ∨ ¬C)

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:

dove la notazione v1 ≃ v2 (ottenibile col comando \simeq) è sinonimo di ∀n.min (v1 n) 1 = min (v2 n).

Avrete anche a disposizione il lemma

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.

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

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

    ∀F:Formula.∀v:ℕ→ℕ.[[ dualize F ]]_ (invert v) ≡ [[ FNot F ]]_ v.
    
  4. lemma not_dualize_eq_negate, conseguenza dei precedenti e di sem_invariance

    ∀F : Formula.FNot (dualize F) ≡ negate_atoms F
    
  5. lemma not_inj, conseguenza di sem_1_1

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

Una volta dimostrati tali lemmi, la prova del primo risultato importante, ∀F.FNot F ≡ negate_atoms (dualize F) è immediata. La prova del teorema di dualità procede come di seguito:

  1. Assume l'ipotesi

    F1 ≡ F2
    
  2. Utilizza negate_fun per ottenere

    negate_atoms F1 ≡ negate_atoms F2
    
  3. Utilizzando i lemmi not_dualize_eq_negate, equiv_rewrite e equiv_sym si 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