Reasoning, Proof, and Formalization with Lean 4
Lezione 3 - Dalla deduzione naturale alle dimostrazioni in Lean
Stefano M. Nicoletti
20 luglio 2026
Struttura della lezione
- Tipi e abitazione.
- Deduzione naturale.
- Per ogni regola: forma simbolica, lettura in linguaggio naturale, esempio concreto e dimostrazione Lean.
Recap: dal type checking alla dimostrazione
Lean usa lo stesso linguaggio di tipi e termini per programmare e dimostrare.
A : Prop:Aè una proposizione.hA : A:hAè una dimostrazione diA.- Il kernel accetta la dimostrazione quando il termine costruito ha tipo
A. - Non basta dichiarare che
Aè vera: quando dimostriamo, dobbiamo fornire un abitante del tipoA.
Abitazione di un tipo
Un tipo è abitato quando esiste almeno un termine di quel tipo.
3 : Nat: il tipoNatè abitato dal termine3.hA : A: la proposizioneA, vista come tipo, è abitata da una dimostrazione.- Costruire una dimostrazione significa risolvere un problema di abitazione: trovare (costruttivamente) un termine del tipo richiesto.
Un esempio dal mondo reale
Pensiamo al tipo LunaDiGiove: questo tipo è abitato perché esiste almeno un oggetto che soddisfa questa descrizione.
Io : LunaDiGiove: Io è un abitante del tipo «luna di Giove».- L'esistenza di Io basta a mostrare che questo tipo non è vuoto.
- Anche Europa, Ganimede e Callisto sarebbero altri abitanti dello stesso tipo.
- (In Lean dovremmo prima definire formalmente
LunaDiGiovee rappresentare Io come un termine di quel tipo.)
La corrispondenza di Curry-Howard
La corrispondenza di Curry-Howard identifica due modi di descrivere la stessa struttura: una dimostrazione logica e un programma ben tipato.
- Una proposizione specifica che cosa deve essere costruito; un tipo specifica quali termini possono abitarlo.
- Dimostrare una proposizione significa costruire un termine del tipo corrispondente.
- Verificare una dimostrazione significa controllare che quel termine abbia il tipo dichiarato.
- Le regole logiche corrispondono alle operazioni con cui costruiamo e usiamo termini.
Curry-Howard: le corrispondenze
Il parallelismo diventa concreto, e.g., nei connettivi e nelle operazioni di dimostrazione.
| Logica | Teoria dei tipi |
|---|---|
| proposizione | tipo |
| dimostrazione | termine |
| A → B | funzione da dimostrazioni di A a dimostrazioni di B |
| introduzione di → | astrazione: costruire una funzione |
| eliminazione di → | applicazione di funzione |
Una derivazione certifica che una proposizione è dimostrabile: infatti costruisce un termine che abita il tipo corrispondente.
Che cos'è la deduzione naturale
La deduzione naturale presenta una dimostrazione come una sequenza di passi locali governati da regole.
- Ogni regola dice come ottenere una conclusione da alcune premesse.
- Le regole di introduzione dicono come costruire un connettivo nel goal.
- Le regole di eliminazione dicono come usare un connettivo presente nelle assunzioni.
- Alcune dimostrazioni procedono traimte assunzioni temporanee, scaricandole quando la regola lo consente.
La forma di un giudizio
Scriviamo Γ ⊢ A e leggiamo: «dalle assunzioni in Γ possiamo derivare A».
Γè il contesto: le assunzioni attualmente disponibili.Aè la conclusione da dimostrare.- La linea orizzontale di una regola separa le premesse, sopra, dalla conclusione, sotto.
- Nel proof state di Lean, il contesto appare sopra
⊢e il goal appare dopo⊢.
Implicazione: introduzione →I
Regola:
Schema naturale: per dimostrare A → B, introduciamo l'assunzione A; arriviamo a una dimostrazione di B; usiamo esattamente questa dimostrazione.
Esempio: vogliamo dimostrare che, se piove e fa freddo, allora piove. Introduciamo l'assunzione che piova e faccia freddo; abbiamo che piove prendendo la parte sinistra dell'assunzione; usiamo esattamente questo fatto.
Implicazione: eliminazione →E
Regola:
Schema naturale: abbiamo A → B e abbiamo A; applichiamo la prima (funzione) alla seconda (dimostrazione); abbiamo B e usiamo esattamente questo fatto.
Esempio: vogliamo dimostrare che prendo l'ombrello, date le assunzioni che, se piove prendo l'ombrello e che piove. Applichiamo la prima assunzione alla seconda; abbiamo che prendo l'ombrello e usiamo esattamente questo fatto.
Congiunzione: introduzione ∧I
Regola:
Schema naturale: applichiamo il costruttore della congiunzione; abbiamo il caso in cui dobbiamo dimostrare A e usiamo esattamente la sua dimostrazione; abbiamo poi il caso B e usiamo esattamente la sua dimostrazione.
Esempio: vogliamo dimostrare che piove e fa freddo, date le assunzioni che piove e che fa freddo. Applichiamo il costruttore di «piove e fa freddo»; abbiamo il caso «piove» e usiamo esattamente la prima assunzione; abbiamo il caso «fa freddo» e usiamo esattamente la seconda.
Congiunzione: eliminazione sinistra ∧Eₗ
Regola:
Schema naturale: abbiamo A ∧ B; abbiamo A prendendo la parte sinistra della congiunzione; usiamo esattamente questo fatto.
Esempio: vogliamo dimostrare che piove, data l'assunzione che piove e fa freddo. Abbiamo che piove prendendo la parte sinistra dell'assunzione; usiamo esattamente questo fatto.
Congiunzione: eliminazione destra ∧Eᵣ
Regola:
Schema naturale: abbiamo A ∧ B; abbiamo B prendendo la parte destra della congiunzione; usiamo esattamente questo fatto.
Esempio: vogliamo dimostrare che fa freddo, data l'assunzione che piove e fa freddo. Abbiamo che fa freddo prendendo la parte destra dell'assunzione; usiamo esattamente questo fatto.
Disgiunzione: introduzione sinistra ∨Iₗ
Regola:
Schema naturale: applichiamo il costruttore sinistro della disgiunzione; il goal diventa A; usiamo esattamente la dimostrazione di A.
Esempio: vogliamo dimostrare che piove oppure nevica, data l'assunzione che piove. Applichiamo il costruttore sinistro di «piove oppure nevica»; il goal diventa «piove»; usiamo esattamente l'assunzione che piove.
Disgiunzione: introduzione destra ∨Iᵣ
Regola:
Schema naturale: applichiamo il costruttore destro della disgiunzione; il goal diventa B; usiamo esattamente la dimostrazione di B.
Esempio: vogliamo dimostrare che piove oppure nevica, data l'assunzione che nevica. Applichiamo il costruttore destro di «piove oppure nevica»; il goal diventa «nevica»; usiamo esattamente l'assunzione che nevica.
Disgiunzione: eliminazione ∨E
Regola:
Schema naturale: abbiamo A ∨ B e procediamo per casi; abbiamo il caso A, applichiamo A → C e abbiamo C; abbiamo il caso B, applichiamo B → C e abbiamo ancora C; in ciascun caso usiamo esattamente il fatto ottenuto.
Esempio: vogliamo dimostrare che prendo l'ombrello, date le assunzioni che piove oppure nevica, che se piove prendo l'ombrello e che se nevica prendo l'ombrello. Procediamo per casi sulla prima assunzione; abbiamo il caso che piove, applichiamo la seconda assunzione e abbiamo che prendo l'ombrello; abbiamo il caso che nevica, applichiamo la terza assunzione e abbiamo ancora che prendo l'ombrello; usiamo esattamente il fatto ottenuto in ciascun caso.
Negazione: che cosa significa
In Lean, ¬A è definita come A → False.
- Una dimostrazione di
¬Aè una funzione che trasforma ogni ipotetica dimostrazione diAin una contraddizione. - Per questo l'introduzione della negazione ha la stessa struttura dell'introduzione dell'implicazione.
- Usare insieme
Ae¬Aproduce un termine di tipoFalse.
Negazione: introduzione ¬I
Regola:
Schema naturale: introduciamo l'assunzione A; applichiamo le assunzioni disponibili e abbiamo una contraddizione; usiamo esattamente questa contraddizione per dimostrare ¬A.
Esempio: vogliamo dimostrare che non ho bevuto caffè, date le assunzioni che, se bevo caffè, resto sveglio e che non resto sveglio. Introduciamo l'assunzione che io abbia bevuto caffè; applichiamo la prima assunzione e abbiamo che resto sveglio; applichiamo la seconda assunzione e abbiamo una contraddizione; usiamo esattamente questa contraddizione.
Negazione: eliminazione ¬E
Regola:
Schema naturale: abbiamo ¬A e abbiamo A; applichiamo la prima dimostrazione alla seconda e abbiamo una contraddizione; usiamo esattamente questa contraddizione.
Esempio: vogliamo dimostrare una contraddizione, date le assunzioni che il laboratorio non è aperto e che è aperto. Applichiamo la prima assunzione alla seconda e abbiamo una contraddizione; usiamo esattamente questa contraddizione.
Verità: introduzione ⊤I
Regola:
Schema naturale: abbiamo il costruttore canonico di True; usiamo esattamente questo costruttore senza applicare alcuna assunzione.
Esempio: vogliamo dimostrare la proposizione sempre vera. Abbiamo il suo costruttore canonico; usiamo esattamente questo costruttore.
Falsità: eliminazione ⊥E
Regola:
Schema naturale: applichiamo l'eliminazione di False; il goal diventa False; usiamo esattamente la contraddizione disponibile.
Esempio: vogliamo dimostrare che piove, data l'assunzione di una contraddizione. Applichiamo l'eliminazione di False; il goal diventa una contraddizione; usiamo esattamente quella disponibile.
Bicondizionale: introduzione ↔I
Regola:
Schema naturale: applichiamo il costruttore del bicondizionale; abbiamo il caso A → B, introduciamo l'assunzione A e dimostriamo B; abbiamo il caso B → A, introduciamo l'assunzione B e dimostriamo A.
Esempio: vogliamo dimostrare che «piove e fa freddo» equivale a «fa freddo e piove». Applichiamo il costruttore dell'equivalenza: dobbiamo dimostrare le due direzioni. Abbiamo il primo caso: supponiamo che piova e faccia freddo e vogliamo dimostrare che fa freddo e piove. Introduciamo questa assunzione; applichiamo il costruttore della congiunzione; usiamo esattamente prima il fatto che fa freddo e poi il fatto che piove. Abbiamo il secondo caso: supponiamo che faccia freddo e piova e vogliamo dimostrare che piove e fa freddo. Introduciamo questa assunzione; applichiamo il costruttore della congiunzione; usiamo esattamente prima il fatto che piove e poi il fatto che fa freddo.
Bicondizionale: eliminazione ↔Eₗ
Regola:
Schema naturale: abbiamo A → B applicando l'eliminazione sinistra-destra al bicondizionale; applichiamo questa direzione ad A; abbiamo B e usiamo esattamente questo fatto.
Esempio: vogliamo dimostrare che un numero è divisibile per due, date le assunzioni che essere pari equivale a essere divisibile per due e che il numero è pari. Abbiamo la direzione verso «divisibile per due»; la applichiamo alla seconda assunzione; abbiamo che il numero è divisibile per due e usiamo esattamente questo fatto.
Bicondizionale: eliminazione ↔Eᵣ
Regola:
Schema naturale: abbiamo B → A applicando l'eliminazione destra-sinistra al bicondizionale; applichiamo questa direzione a B; abbiamo A e usiamo esattamente questo fatto.
Esempio: vogliamo dimostrare che un numero è pari, date le assunzioni che essere pari equivale a essere divisibile per due e che il numero è divisibile per due. Abbiamo la direzione verso «pari»; la applichiamo alla seconda assunzione; abbiamo che il numero è pari e usiamo esattamente questo fatto.
Come leggere una dimostrazione Lean, con la deduzione naturale
intro: introduciamo un'assunzione richiesta da una regola di introduzione.exact: usiamo esattamente il termine che abita il goal.h.lefteh.right: eliminiamo una congiunzione selezionando una componente.Or.inl,Or.inr,cases: introduciamo o eliminiamo una disgiunzione.- Applicando
hAB hAeliminiamo un'implicazione, cioè usiamo il modus ponens.
Strategia operativa
Quando guardiamo il proof state, poniamo alcune domande.
- Qual è il connettivo principale del goal? Questo suggerisce una regola di introduzione.
- Quali assunzioni composte sono nel contesto? Queste suggeriscono regole di eliminazione.
- Quali assunzioni temporanee devo adottare?
- Quale termine devo infine utilizzare per chiudere il goal?
Fonti
Jeremy Avigad, Robert Y. Lewis, Floris van Doorn, Logic and Proof: Natural Deduction Rules
Philip Wadler, Propositions as Types, Communications of the ACM 58(12), 2015