Reasoning, Proof, and Formalization with Lean 4

Lezione 4 - Logica classica e quantificatori

Stefano M. Nicoletti

Postmortem for Kernel Soundness Bug \#14576

Postmortem di Leonardo de Moura sul bug di soundness del kernel di LeanApri la fonte

Proposta date

Struttura della lezione

Regole costruttive e regole classiche

Le regole viste fin qui hanno una lettura costruttiva diretta.

Theorem Proving in Lean 4, Classical Logic

Riduzione all'assurdo RAA

Regola:

Riduzione all'assurdo

Schema naturale: applichiamo la riduzione all'assurdo; introduciamo l'assunzione ¬A; applichiamo le assunzioni disponibili e abbiamo False; usiamo esattamente questa contraddizione.

Esempio: vogliamo dimostrare che piove, date due assunzioni: se non piove, non prendo l'ombrello; prendo l'ombrello. Applichiamo la riduzione all'assurdo: ora dobbiamo mostrare che supporre che non piova conduce a una contraddizione. Introduciamo quindi l'assunzione che non piova. Applichiamo la prima assunzione a questo fatto e abbiamo che non prendo l'ombrello. Ma abbiamo anche la seconda assunzione, secondo cui prendo l'ombrello. Applichiamo «non prendo l'ombrello» a «prendo l'ombrello» e abbiamo una contraddizione. Usiamo esattamente questa contraddizione per concludere la riduzione all'assurdo.

Un limite della logica proposizionale

Finora abbiamo trattato ogni enunciato come una proposizione completa.

In questo modo non vediamo che P e Q attribuiscono la stessa proprietà a due persone diverse. Non possiamo nemmeno esprimere direttamente «ogni filosofa è curiosa» o «esiste una filosofa curiosa».

Per rendere visibile questa struttura dobbiamo parlare degli oggetti e delle loro proprietà.

Prima scegliamo di che cosa parliamo

Ogni discorso ha un dominio: la collezione degli oggetti che stiamo considerando.

Logic and Proof, First Order Logic in Lean: Functions, Predicates, and Relations

Le proprietà

Consideriamo la proprietà «essere una filosofa».

Filosofa è una proprietà che possiamo applicare a persone diverse. Una proprietà di questo genere si chiama predicato.

Predicati: stessa proprietà, oggetti diversi

Un predicato rende esplicita la struttura comune di molti enunciati.

Linguaggio naturaleLean
Ipazia è curiosaCuriosa ipazia
Hannah Arendt è curiosaCuriosa hannah
Io è una luna di GioveLunaDiGiove io
Roma è piovosaPiove roma

Cambia l'oggetto a cui applichiamo il predicato, ma la proprietà rimane la stessa.

Funzioni: da un oggetto a un altro

Una funzione prende uno o più oggetti del dominio e restituisce un oggetto del dominio.

Nella logica del primo ordine una funzione è totale e restituisce un solo risultato per ogni argomento.

Costruire termini con le funzioni

Una funzione ci permette di costruire termini più complessi a partire da termini già disponibili.

TermineLettura
ipaziaIpazia
madreDi ipaziala madre di Ipazia
madreDi (madreDi ipazia)la madre della madre di Ipazia

Tutte e tre le espressioni hanno tipo Cosa. Possiamo quindi applicare un predicato al termine costruito, per esempio Curiosa (madreDi ipazia).

Relazioni tra oggetti

Possiamo descrivere anche un rapporto tra due oggetti.

Un predicato con un argomento esprime una proprietà; con due o più argomenti esprime una relazione.

Parametri locali in Lean

Per questi esempi assumiamo temporaneamente un dominio e un vocabolario con variable.

Che cosa assumiamoParametro Lean
il dominiovariable (Cosa : Type)
un oggetto nominatovariable (ipazia : Cosa)
una funzionevariable (madreDi : Cosa → Cosa)
un predicatovariable (Filosofa : Cosa → Prop)
una relazionevariable (Conosce : Cosa → Cosa → Prop)

Che cosa non stiamo assumendo

Dichiarare un parametro non significa affermare una proposizione.

Il vocabolario stabilisce quali enunciati possiamo formulare; le assunzioni ci danno dimostrazioni di alcuni enunciati.

Controllare le espressioni in Lean

Usiamo #check per chiedere a Lean quale tipo abbia un'espressione.

ComandoChe cosa controlliamo
#check ipaziaipazia : Cosa
#check madreDi ipaziamadreDi ipazia : Cosa
#check FilosofaFilosofa : Cosa → Prop
#check Filosofa ipaziaFilosofa ipazia : Prop
#check Conosce ipazia hannahConosce ipazia hannah : Prop

Variabili: l'oggetto non è specificato

Possiamo scrivere Filosofa x senza avere ancora scelto chi sia x.

Manca però ancora un'informazione: stiamo parlando di tutte le persone, di almeno una persona, oppure soltanto di una persona già scelta?

«Ogni» e «qualche»

I quantificatori specificano come deve essere scelta la variabile.

Linguaggio naturaleForma logica
Ogni persona è curiosa∀ x : Cosa, Persona x → Curiosa x
Qualche persona è curiosa∃ x : Cosa, Persona x ∧ Curiosa x
Ogni filosofa è curiosa∀ x : Cosa, Filosofa x → Curiosa x
Esiste una filosofa curiosa∃ x : Cosa, Filosofa x ∧ Curiosa x

si legge «per ogni»; si legge «esiste almeno un».

Scrivere i quantificatori in Lean

Il tipo del dominio può essere scritto nel quantificatore oppure ricavato dal predicato.

EnunciatoLean
ogni persona è curiosa#check ∀ x : Cosa, Persona x → Curiosa x
qualche persona è curiosa#check ∃ x : Cosa, Persona x ∧ Curiosa x
ogni filosofa è curiosa#check ∀ x : Cosa, Filosofa x → Curiosa x
esiste una filosofa curiosa#check ∃ x : Cosa, Filosofa x ∧ Curiosa x

All'inizio scriviamo esplicitamente x : Cosa: il quantificatore introduce la variabile x e ne dichiara il dominio. Più avanti potremo omettere il tipo quando Lean riesce a ricavarlo dai predicati.

Perché implicazione e congiunzione?

Confrontiamo due forme molto comuni.

Questi schemi permettono di tradurre molti enunciati ordinari.

Che cosa aggiunge la logica dei predicati

Ora possiamo distinguere cinque ingredienti.

Le regole che vedremo più tardi spiegano come dimostrare e come usare enunciati contenenti e .

Esercizio: dal linguaggio naturale a Lean

Usiamo Studentessa : Cosa → Prop, Legge : Cosa → Prop e Comprende : Cosa → Prop. Come formalizziamo questi enunciati?

Esercizio: controlliamo la formalizzazione

EnunciatoLean
Ogni studentessa legge∀ x : Cosa, Studentessa x → Legge x
Qualche studentessa legge∃ x : Cosa, Studentessa x ∧ Legge x
Ogni studentessa che legge comprende∀ x : Cosa, Studentessa x → Legge x → Comprende x
Esiste una studentessa che legge e comprende∃ x : Cosa, Studentessa x ∧ Legge x ∧ Comprende x

In Lean possiamo usare #check per verificare che ciascuna traduzione sia una proposizione ben formata. #check non la dimostra.