Lezione 5: Regole dei quantificatori
1. Scopo della lezione
Riprendiamo le formalizzazioni della Lezione 4 e introduciamo le regole di deduzione naturale per ∀ e ∃. Prima completiamo gli esempi con funzioni e quantificatori annidati. Poi studiamo come costruire e usare dimostrazioni universali ed esistenziali, comprese le condizioni che rendono valide le quattro regole. Infine combiniamo i quantificatori con i connettivi già noti.
Come ripasso, confrontiamo quattro forme ricorrenti:
variable (Cosa : Type)
variable (Studentessa Legge Comprende : Cosa → Prop)
#check ∀ x : Cosa, Studentessa x → Legge x
#check ∃ x : Cosa, Studentessa x ∧ Legge x
#check ∀ x : Cosa, Studentessa x → Legge x → Comprende x
#check ∃ x : Cosa, Studentessa x ∧ Legge x ∧ Comprende x
2. Funzioni dentro le formule
I termini costruiti mediante funzioni possono comparire dentro predicati, relazioni e quantificatori:
variable (Cosa : Type)
variable (ipazia : Cosa)
variable (Studentessa Legge Curiosa : Cosa → Prop)
variable (madreDi : Cosa → Cosa)
variable (Conosce : Cosa → Cosa → Prop)
#check Curiosa (madreDi ipazia)
#check ∀ x : Cosa,
Studentessa x → Conosce x (madreDi x)
#check ∃ x : Cosa,
Studentessa x ∧ Legge (madreDi x)
Le parentesi rendono visibile l'ordine della costruzione: prima formiamo il termine madreDi x, poi lo usiamo come argomento del predicato Legge o della relazione Conosce.
3. Quantificatori annidati
Una formula può contenere più quantificatori. Consideriamo la relazione Conosce : Cosa → Cosa → Prop:
variable (Cosa : Type)
variable (Persona : Cosa → Prop)
variable (Conosce : Cosa → Cosa → Prop)
-- Ogni persona conosce qualcuno.
#check ∀ x : Cosa, Persona x →
∃ y : Cosa, Persona y ∧ Conosce x y
-- Qualcuno conosce ogni persona.
#check ∃ x : Cosa, Persona x ∧
∀ y : Cosa, Persona y → Conosce x y
-- Nessuno conosce ogni persona.
#check ¬∃ x : Cosa, Persona x ∧
∀ y : Cosa, Persona y → Conosce x y
Le prime due proposizioni non sono equivalenti. In «ogni persona conosce qualcuno», il testimone y può cambiare al cambiare di x. In «qualcuno conosce ogni persona», dobbiamo invece trovare un unico x che soddisfi la condizione per tutte le persone y.
4. Introduzione del quantificatore universale, ∀I
Per dimostrare ∀ y : Cosa, A y, introduciamo una cosa arbitraria x. Il goal diventa A x. Dimostriamo A x senza usare proprietà particolari di x; possiamo allora concludere che A vale per ogni oggetto del dominio.
Nel seguente esempio soltanto il primo intro applica ∀I. I due intro successivi introducono le assunzioni delle implicazioni.
-- Introduzione del quantificatore universale, ∀I.
-- Il goal universale viene aperto introducendo una cosa nuova e arbitraria `x`.
-- Soltanto il primo `intro` applica ∀I; i due `intro` successivi introducono
-- separatamente le assunzioni delle implicazioni.
-- Esempio: ogni persona curiosa è curiosa.
theorem
(Cosa : Type)
(Persona Curiosa : Cosa → Prop) :
∀ y : Cosa, Persona y → Curiosa y → Curiosa y := Cosa:TypePersona:Cosa → PropCuriosa:Cosa → Prop⊢ ∀ (y : Cosa), Persona y → Curiosa y → Curiosa y
Cosa:TypePersona:Cosa → PropCuriosa:Cosa → Propx:Cosa⊢ Persona x → Curiosa x → Curiosa x
Cosa:TypePersona:Cosa → PropCuriosa:Cosa → Propx:CosahXPersona:Persona x⊢ Curiosa x → Curiosa x
Cosa:TypePersona:Cosa → PropCuriosa:Cosa → Propx:CosahXPersona:Persona xhXCuriosa:Curiosa x⊢ Curiosa x
All goals completed! 🐙Il primo passo introduce x : Cosa come oggetto arbitrario. Il goal diventa Persona x → Curiosa x → Curiosa x. Introduciamo quindi le due assunzioni e usiamo esattamente hXCuriosa.
La condizione di arbitrarietà
L'oggetto introdotto da ∀I non può essere una persona particolare scelta per una proprietà speciale. Da hIpaziaCuriosa : Curiosa ipazia, per esempio, non possiamo concludere ∀ y : Cosa, Curiosa y. Dopo intro x, il goal sarebbe Curiosa x, mentre l'assunzione dimostra soltanto Curiosa ipazia.
La condizione formale richiede che la variabile usata nella derivazione non compaia libera in alcuna assunzione ancora aperta. In Curiosa x, x è libera; in ∀ y : Cosa, Curiosa y, invece, y è legata dal quantificatore. Lean realizza questa condizione tramite lo scope: intro x crea una nuova variabile locale all'interno del goal universale.
Se riutilizziamo deliberatamente un nome già presente, Lean distingue comunque i due oggetti. Il tactic state può rinominare la vecchia variabile come x✝:
x✝ : Cosa
hXCuriosa : Curiosa x✝
x : Cosa
|- Curiosa x
Il simbolo ✝ segnala soltanto una rinomina automatica. I tipi Curiosa x✝ e Curiosa x restano distinti.
5. Eliminazione del quantificatore universale, ∀E
Se abbiamo ∀ x : Cosa, A x, possiamo scegliere un termine t del dominio e applicare la dimostrazione universale a t. Otteniamo così A t.
Vogliamo dimostrare che Marta legge, data l'assunzione che ogni studentessa legge e che Marta è una studentessa.
-- Perché `x` deve essere arbitraria?
-- Da una proprietà della sola Ipazia non possiamo concludere che la proprietà
-- valga per ogni cosa. Dopo `intro x`, il goal riguarda la nuova `x`, mentre
-- `hIpaziaCuriosa` riguarda soltanto `ipazia`.
-- Nel goal `∀ y : Cosa, Curiosa y`, `y` è legata dal quantificatore. Dopo
-- `intro x`, `x` è la nuova variabile locale usata al posto di `y`.
--
-- Lean respingerebbe questo tentativo:
--
-- example
-- (Cosa : Type)
-- (Curiosa : Cosa → Prop)
-- (ipazia : Cosa)
-- (hIpaziaCuriosa : Curiosa ipazia) :
-- ∀ y : Cosa, Curiosa y := by
-- intro x
-- exact hIpaziaCuriosa
-- Vediamo la stessa difficoltà riutilizzando deliberatamente il nome `x`.
-- Il primo `x` è un oggetto particolare dichiarato tra i parametri. Quando
-- `intro x` introduce la cosa arbitraria del quantificatore, Lean evita la
-- collisione mostrando il vecchio oggetto come `x✝` nel tactic state:
--
-- x✝ : Cosa
-- hXCuriosa : Curiosa x✝
-- x : Cosa
-- ⊢ Curiosa x
--
-- `hXCuriosa` riguarda quindi il vecchio `x✝`, non la nuova `x` arbitraria.
-- Lean respingerebbe anche questo tentativo:
--
-- example
-- (Cosa : Type)
-- (Curiosa : Cosa → Prop)
-- (x : Cosa)
-- (hXCuriosa : Curiosa x) :
-- ∀ y : Cosa, Curiosa y := by
-- intro x
-- exact hXCuriosa
-- Eliminazione del quantificatore universale, ∀E.
-- Applichiamo una regola universale a Marta e poi usiamo l'assunzione concreta.
-- Esempio: ogni studentessa legge; Marta è studentessa; dunque Marta legge.
theorem
(Cosa : Type)
(Studentessa Legge : Cosa → Prop)
(marta : Cosa)
(hOgniStudentessaLegge :
∀ x : Cosa, Studentessa x → Legge x)
(hMartaStudentessa : Studentessa marta) :
Legge marta := Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → Propmarta:CosahOgniStudentessaLegge:∀ (x : Cosa), Studentessa x → Legge xhMartaStudentessa:Studentessa marta⊢ Legge marta
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → Propmarta:CosahOgniStudentessaLegge:∀ (x : Cosa), Studentessa x → Legge xhMartaStudentessa:Studentessa martahSeMartaStudentessaAlloraLegge:Studentessa marta → Legge marta⊢ Legge marta
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → Propmarta:CosahOgniStudentessaLegge:∀ (x : Cosa), Studentessa x → Legge xhMartaStudentessa:Studentessa martahSeMartaStudentessaAlloraLegge:Studentessa marta → Legge martahMartaLegge:Legge marta⊢ Legge marta
All goals completed! 🐙Applicando l'assunzione universale a marta otteniamo Studentessa marta → Legge marta. Applichiamo poi questa implicazione all'assunzione hMartaStudentessa.
Il termine scelto non deve essere un nome semplice. Può anche essere costruito da una funzione. Se madreDi : Cosa → Cosa e hOgniCosaCuriosa : ∀ x : Cosa, Curiosa x, allora hOgniCosaCuriosa (madreDi ipazia) dimostra Curiosa (madreDi ipazia). Lean controlla il tipo del termine e gestisce le variabili legate senza catturarle accidentalmente.
6. Introduzione del quantificatore esistenziale, ∃I
Per dimostrare ∃ x : Cosa, A x dobbiamo scegliere un testimone t e dimostrare A t. In Lean usiamo il costruttore Exists.intro.
-- Introduzione del quantificatore esistenziale, ∃I.
-- `marta : Cosa` dice che Marta è un elemento del dominio.
-- Scegliamo Marta come testimone e usiamo l'assunzione che legge.
theorem
(Cosa : Type)
(Legge : Cosa → Prop)
(marta : Cosa)
(hMartaLegge : Legge marta) :
∃ x : Cosa, Legge x := Cosa:TypeLegge:Cosa → Propmarta:CosahMartaLegge:Legge marta⊢ ∃ x, Legge x
Cosa:TypeLegge:Cosa → Propmarta:CosahMartaLegge:Legge marta⊢ Legge marta
All goals completed! 🐙Scegliendo marta come testimone, il goal esistenziale diventa Legge marta. Questa proposizione è già disponibile come assunzione.
Anche il testimone può essere un termine costruito. Per dimostrare ∃ x : Cosa, Curiosa x, possiamo scegliere madreDi ipazia, purché abbiamo una dimostrazione di Curiosa (madreDi ipazia).
7. Eliminazione del quantificatore esistenziale, ∃E
Se abbiamo ∃ x : Cosa, A x, sappiamo che esiste un testimone, ma non possiamo presupporre quale sia. Per ottenere una conclusione B, introduciamo un testimone arbitrario y e l'assunzione A y; da questa assunzione dimostriamo B. La conclusione non deve dipendere dall'identità del testimone.
Qualcuno ha fatto una segnalazione. Ogni segnalazione avvia un'indagine. Vogliamo concludere che inizia un'indagine.
-- Eliminazione del quantificatore esistenziale, ∃E.
-- Apriamo l'esistenziale, usiamo il testimone senza presupporne l'identità
-- e dimostriamo una conclusione che non dipende dalla sua identità.
-- Esempio: qualcuno ha fatto una segnalazione; se qualcuno fa una
-- segnalazione, inizia un'indagine; dunque inizia un'indagine.
theorem
(Cosa : Type)
(HaFattoSegnalazione : Cosa → Prop)
(IniziaIndagine : Prop)
(hQualcunoHaFattoSegnalazione : ∃ x : Cosa, HaFattoSegnalazione x)
(hChiFaSegnalazioneAvviaIndagine :
(x : Cosa) → HaFattoSegnalazione x → IniziaIndagine) :
IniziaIndagine := Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndagine⊢ IniziaIndagine
Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndagine⊢ ∀ (a : Cosa), HaFattoSegnalazione a → IniziaIndagine
Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndaginey:Cosa⊢ HaFattoSegnalazione y → IniziaIndagine
Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndaginey:CosahYHaFattoSegnalazione:HaFattoSegnalazione y⊢ IniziaIndagine
Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndaginey:CosahYHaFattoSegnalazione:HaFattoSegnalazione yhSeYFaSegnalazioneAlloraIniziaIndagine:HaFattoSegnalazione y → IniziaIndagine⊢ IniziaIndagine
Cosa:TypeHaFattoSegnalazione:Cosa → PropIniziaIndagine:ProphQualcunoHaFattoSegnalazione:∃ x, HaFattoSegnalazione xhChiFaSegnalazioneAvviaIndagine:∀ (x : Cosa), HaFattoSegnalazione x → IniziaIndaginey:CosahYHaFattoSegnalazione:HaFattoSegnalazione yhSeYFaSegnalazioneAlloraIniziaIndagine:HaFattoSegnalazione y → IniziaIndaginehIniziaIndagine:IniziaIndagine⊢ IniziaIndagine
All goals completed! 🐙Exists.elim apre l'esistenziale. Introduciamo il testimone y e il fatto che y abbia fatto una segnalazione. La x nella seconda assunzione è un segnaposto legato; la applichiamo al testimone locale y. Otteniamo prima HaFattoSegnalazione y → IniziaIndagine e poi IniziaIndagine.
La conclusione è fissata prima dell'apertura dell'esistenziale e non contiene libera la variabile locale y. Lean impone questa indipendenza attraverso lo scope di y e il tipo di Exists.elim: il testimone non può uscire dalla derivazione, salvo essere nuovamente racchiuso in un esistenziale.
8. Combinare le regole
Le regole dei quantificatori vengono spesso usate insieme. Supponiamo che qualcuno abbia un ombrello e che chiunque abbia un ombrello resti asciutto. Vogliamo dimostrare che qualcuno resta asciutto.
theorem lecture05_exists_elim_combined
(Cosa : Type)
(HaOmbrello RestaAsciutta : Cosa → Prop)
(hQualcunaHaOmbrello : ∃ x : Cosa, HaOmbrello x)
(hChiHaOmbrelloRestaAsciutta :
∀ x : Cosa, HaOmbrello x → RestaAsciutta x) :
∃ x : Cosa, RestaAsciutta x := Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta x⊢ ∃ x, RestaAsciutta x
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta x⊢ ∀ (a : Cosa), HaOmbrello a → ∃ x, RestaAsciutta x
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta xy:Cosa⊢ HaOmbrello y → ∃ x, RestaAsciutta x
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta xy:CosahYHaOmbrello:HaOmbrello y⊢ ∃ x, RestaAsciutta x
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta xy:CosahYHaOmbrello:HaOmbrello y⊢ RestaAsciutta y
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta xy:CosahYHaOmbrello:HaOmbrello yhSeYHaOmbrelloAlloraRestaAsciutta:HaOmbrello y → RestaAsciutta y⊢ RestaAsciutta y
Cosa:TypeHaOmbrello:Cosa → PropRestaAsciutta:Cosa → ProphQualcunaHaOmbrello:∃ x, HaOmbrello xhChiHaOmbrelloRestaAsciutta:∀ (x : Cosa), HaOmbrello x → RestaAsciutta xy:CosahYHaOmbrello:HaOmbrello yhSeYHaOmbrelloAlloraRestaAsciutta:HaOmbrello y → RestaAsciutta yhYRestaAsciutta:RestaAsciutta y⊢ RestaAsciutta y
All goals completed! 🐙La dimostrazione combina tre passaggi:
1. Exists.elim elimina il primo esistenziale e rende disponibile un testimone y con HaOmbrello y; 2. l'applicazione di hChiHaOmbrelloRestaAsciutta a y usa ∀E; 3. Exists.intro y usa lo stesso oggetto come testimone del nuovo esistenziale.
Quantificatore universale e congiunzione
Ogni studentessa che legge prende appunti e comprende. Introduciamo una studentessa arbitraria, applichiamo le due assunzioni universali e costruiamo la congiunzione richiesta.
-- Combiniamo ∀I, →I, ∀E e ∧I.
-- Ogni studentessa che legge prende appunti; ogni studentessa che legge
-- comprende; dunque ogni studentessa che legge prende appunti e comprende.
theorem
(Cosa : Type)
(Studentessa Legge PrendeAppunti Comprende : Cosa → Prop)
(hChiLeggePrendeAppunti :
∀ x : Cosa, Studentessa x → Legge x → PrendeAppunti x)
(hChiLeggeComprende :
∀ x : Cosa, Studentessa x → Legge x → Comprende x) :
∀ x : Cosa,
Studentessa x → Legge x → PrendeAppunti x ∧ Comprende x := Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende x⊢ ∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti x ∧ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:Cosa⊢ Studentessa x → Legge x → PrendeAppunti x ∧ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa x⊢ Legge x → PrendeAppunti x ∧ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge x⊢ PrendeAppunti x ∧ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge x⊢ PrendeAppunti xCosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge x⊢ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge x⊢ PrendeAppunti x Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaAppunti:Studentessa x → Legge x → PrendeAppunti x⊢ PrendeAppunti x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaAppunti:Studentessa x → Legge x → PrendeAppunti xhSeXLeggeAlloraPrendeAppunti:Legge x → PrendeAppunti x⊢ PrendeAppunti x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaAppunti:Studentessa x → Legge x → PrendeAppunti xhSeXLeggeAlloraPrendeAppunti:Legge x → PrendeAppunti xhXPrendeAppunti:PrendeAppunti x⊢ PrendeAppunti x
All goals completed! 🐙
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge x⊢ Comprende x Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaComprende:Studentessa x → Legge x → Comprende x⊢ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaComprende:Studentessa x → Legge x → Comprende xhSeXLeggeAlloraComprende:Legge x → Comprende x⊢ Comprende x
Cosa:TypeStudentessa:Cosa → PropLegge:Cosa → PropPrendeAppunti:Cosa → PropComprende:Cosa → ProphChiLeggePrendeAppunti:∀ (x : Cosa), Studentessa x → Legge x → PrendeAppunti xhChiLeggeComprende:∀ (x : Cosa), Studentessa x → Legge x → Comprende xx:CosahXStudentessa:Studentessa xhXLegge:Legge xhSeXStudentessaAlloraLeggeImplicaComprende:Studentessa x → Legge x → Comprende xhSeXLeggeAlloraComprende:Legge x → Comprende xhXComprende:Comprende x⊢ Comprende x
All goals completed! 🐙Esistenziale e disgiunzione
Qualcuno visita Roma oppure Atene. Apriamo l'esistenziale e consideriamo i due casi della disgiunzione. In entrambi otteniamo un testimone che vede un museo.
-- Combiniamo ∃E, ∨E, ∀E e ∃I.
-- Qualcuno visita Roma oppure Atene; chi visita una delle due città vede un
-- museo; dunque qualcuno vede un museo.
theorem
(Cosa : Type)
(VisitaRoma VisitaAtene VedeMuseo : Cosa → Prop)
(hQualcunoVisitaUnaCitta :
∃ x : Cosa, VisitaRoma x ∨ VisitaAtene x)
(hChiVisitaRomaVedeMuseo :
∀ x : Cosa, VisitaRoma x → VedeMuseo x)
(hChiVisitaAteneVedeMuseo :
∀ x : Cosa, VisitaAtene x → VedeMuseo x) :
∃ x : Cosa, VedeMuseo x := Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo x⊢ ∃ x, VedeMuseo x
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo x⊢ ∀ (a : Cosa), VisitaRoma a ∨ VisitaAtene a → ∃ x, VedeMuseo x
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:Cosa⊢ VisitaRoma y ∨ VisitaAtene y → ∃ x, VedeMuseo x
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaRomaOVisitaAtene:VisitaRoma y ∨ VisitaAtene y⊢ ∃ x, VedeMuseo x
cases hYVisitaRomaOVisitaAtene with
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaRoma:VisitaRoma y⊢ ∃ x, VedeMuseo x
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaRoma:VisitaRoma y⊢ VedeMuseo y
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaRoma:VisitaRoma yhSeYVisitaRomaAlloraVedeMuseo:VisitaRoma y → VedeMuseo y⊢ VedeMuseo y
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaRoma:VisitaRoma yhSeYVisitaRomaAlloraVedeMuseo:VisitaRoma y → VedeMuseo yhYVedeMuseo:VedeMuseo y⊢ VedeMuseo y
All goals completed! 🐙
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaAtene:VisitaAtene y⊢ ∃ x, VedeMuseo x
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaAtene:VisitaAtene y⊢ VedeMuseo y
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaAtene:VisitaAtene yhSeYVisitaAteneAlloraVedeMuseo:VisitaAtene y → VedeMuseo y⊢ VedeMuseo y
Cosa:TypeVisitaRoma:Cosa → PropVisitaAtene:Cosa → PropVedeMuseo:Cosa → ProphQualcunoVisitaUnaCitta:∃ x, VisitaRoma x ∨ VisitaAtene xhChiVisitaRomaVedeMuseo:∀ (x : Cosa), VisitaRoma x → VedeMuseo xhChiVisitaAteneVedeMuseo:∀ (x : Cosa), VisitaAtene x → VedeMuseo xy:CosahYVisitaAtene:VisitaAtene yhSeYVisitaAteneAlloraVedeMuseo:VisitaAtene y → VedeMuseo yhYVedeMuseo:VedeMuseo y⊢ VedeMuseo y
All goals completed! 🐙Quantificatori annidati
Il testimone esistenziale può dipendere dalla persona introdotta dal quantificatore universale. Apriamo l'esistenziale soltanto dopo aver fissato quella persona.
-- Combiniamo quantificatori annidati, ∃E, ∃I e ∧I.
-- Ogni persona conosce almeno una persona; dunque, per ogni persona, esiste
-- qualcuno che essa conosce e che è una persona.
theorem
(Cosa : Type)
(Persona : Cosa → Prop)
(Conosce : Cosa → Cosa → Prop)
(hOgniPersonaConosceQualcuno :
∀ x : Cosa, Persona x →
∃ y : Cosa, Persona y ∧ Conosce x y) :
∀ x : Cosa, Persona x →
∃ y : Cosa, Conosce x y ∧ Persona y := Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x y⊢ ∀ (x : Cosa), Persona x → ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:Cosa⊢ Persona x → ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona x⊢ ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x y⊢ ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x y⊢ ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x y⊢ ∀ (a : Cosa), Persona a ∧ Conosce x a → ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:Cosa⊢ Persona y ∧ Conosce x y → ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ ∃ y, Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ Conosce x y ∧ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ Conosce x yCosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ Persona y
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ Conosce x y All goals completed! 🐙
Cosa:TypePersona:Cosa → PropConosce:Cosa → Cosa → ProphOgniPersonaConosceQualcuno:∀ (x : Cosa), Persona x → ∃ y, Persona y ∧ Conosce x yx:CosahXPersona:Persona xhSeXPersonaAlloraConosceQualcuno:Persona x → ∃ y, Persona y ∧ Conosce x yhXConosceQualcuno:∃ y, Persona y ∧ Conosce x yy:CosahYPersonaEXConosceY:Persona y ∧ Conosce x y⊢ Persona y All goals completed! 🐙Esistenziale e negazione
Un testimone ha consegnato ma non ha ricevuto conferma. La regola universale produce la conferma per lo stesso testimone, e la negazione produce False.
-- Combiniamo ∃E, ∧E, ∀E e ¬E.
-- Chiunque abbia consegnato riceve una conferma; ma qualcuno ha consegnato
-- senza ricevere una conferma; dunque le assunzioni sono contraddittorie.
theorem
(Cosa : Type)
(HaConsegnato HaRicevutoConferma : Cosa → Prop)
(hChiHaConsegnatoRiceveConferma :
∀ x : Cosa, HaConsegnato x → HaRicevutoConferma x)
(hControesempio :
∃ x : Cosa, HaConsegnato x ∧ ¬HaRicevutoConferma x) :
False := Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma x⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma x⊢ ∀ (a : Cosa), HaConsegnato a ∧ ¬HaRicevutoConferma a → False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:Cosa⊢ HaConsegnato y ∧ ¬HaRicevutoConferma y → False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma y⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma yhYHaConsegnato:HaConsegnato y⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma yhYHaConsegnato:HaConsegnato yhYNonHaRicevutoConferma:¬HaRicevutoConferma y⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma yhYHaConsegnato:HaConsegnato yhYNonHaRicevutoConferma:¬HaRicevutoConferma yhSeYHaConsegnatoAlloraRiceveConferma:HaConsegnato y → HaRicevutoConferma y⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma yhYHaConsegnato:HaConsegnato yhYNonHaRicevutoConferma:¬HaRicevutoConferma yhSeYHaConsegnatoAlloraRiceveConferma:HaConsegnato y → HaRicevutoConferma yhYHaRicevutoConferma:HaRicevutoConferma y⊢ False
Cosa:TypeHaConsegnato:Cosa → PropHaRicevutoConferma:Cosa → ProphChiHaConsegnatoRiceveConferma:∀ (x : Cosa), HaConsegnato x → HaRicevutoConferma xhControesempio:∃ x, HaConsegnato x ∧ ¬HaRicevutoConferma xy:CosahYHaConsegnatoENonHaRicevutoConferma:HaConsegnato y ∧ ¬HaRicevutoConferma yhYHaConsegnato:HaConsegnato yhYNonHaRicevutoConferma:¬HaRicevutoConferma yhSeYHaConsegnatoAlloraRiceveConferma:HaConsegnato y → HaRicevutoConferma yhYHaRicevutoConferma:HaRicevutoConferma yhContraddizione:False⊢ False
All goals completed! 🐙Esistenziale ed equivalenza
Apriamo l'esistenziale, istanziamo l'equivalenza sul testimone ed estraiamo la direzione necessaria con Iff.mp. Lo stesso oggetto testimonia la conclusione.
-- Combiniamo ∃E, ∀E, ↔E e ∃I.
-- Per ogni oggetto, essere un quadrato equivale ad avere quattro lati uguali;
-- esiste un quadrato; dunque esiste qualcosa con quattro lati uguali.
theorem
(Cosa : Type)
(Quadrato HaQuattroLatiUguali : Cosa → Prop)
(hEquivalenza :
∀ x : Cosa, Quadrato x ↔ HaQuattroLatiUguali x)
(hEsisteQuadrato : ∃ x : Cosa, Quadrato x) :
∃ x : Cosa, HaQuattroLatiUguali x := Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato x⊢ ∃ x, HaQuattroLatiUguali x
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato x⊢ ∀ (a : Cosa), Quadrato a → ∃ x, HaQuattroLatiUguali x
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:Cosa⊢ Quadrato y → ∃ x, HaQuattroLatiUguali x
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:CosahYQuadrato:Quadrato y⊢ ∃ x, HaQuattroLatiUguali x
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:CosahYQuadrato:Quadrato y⊢ HaQuattroLatiUguali y
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:CosahYQuadrato:Quadrato yhEquivalenzaPerY:Quadrato y ↔ HaQuattroLatiUguali y⊢ HaQuattroLatiUguali y
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:CosahYQuadrato:Quadrato yhEquivalenzaPerY:Quadrato y ↔ HaQuattroLatiUguali yhDirezione:Quadrato y → HaQuattroLatiUguali y⊢ HaQuattroLatiUguali y
Cosa:TypeQuadrato:Cosa → PropHaQuattroLatiUguali:Cosa → ProphEquivalenza:∀ (x : Cosa), Quadrato x ↔ HaQuattroLatiUguali xhEsisteQuadrato:∃ x, Quadrato xy:CosahYQuadrato:Quadrato yhEquivalenzaPerY:Quadrato y ↔ HaQuattroLatiUguali yhDirezione:Quadrato y → HaQuattroLatiUguali yhYHaQuattroLatiUguali:HaQuattroLatiUguali y⊢ HaQuattroLatiUguali y
All goals completed! 🐙In tutti gli esempi affrontiamo prima il costruttore esterno del goal, rendiamo espliciti i testimoni locali e poi applichiamo le regole dei connettivi.
9. Strategia operativa
Quando incontriamo una formula quantificata, possiamo porci alcune domande.
- Il goal comincia con
∀? Introduciamo un oggetto arbitrario conintro. - Abbiamo un'assunzione universale? Applichiamola a un termine del dominio.
- Il goal comincia con
∃? Scegliamo un testimone conExists.intro. - Abbiamo un'assunzione esistenziale? Apriamola con
Exists.elim, senza presupporre l'identità del testimone. - Sono presenti più quantificatori? Controlliamo attentamente il loro ordine e quali testimoni possono dipendere da quali variabili.
La strategia estende quella usata per i connettivi proposizionali. Guardiamo il costruttore principale del goal per scegliere una regola di introduzione e le assunzioni composte per scegliere una regola di eliminazione.
10. Fonti e approfondimenti
- Jeremy Avigad, Robert Y. Lewis e Floris van Doorn, Logic and Proof, «Natural Deduction Rules»: https://leanprover.github.io/logic_and_proof_lean3/nd_quickref.html.
- Lean developers, The Lean Language Reference, «Quantifiers»: https://lean-lang.org/doc/reference/latest/Basic-Propositions/Quantifiers/.
- Jeremy Avigad, Robert Y. Lewis e Floris van Doorn, Logic and Proof, «First Order Logic in Lean»: https://leanprover.github.io/logic_and_proof_lean3/first_order_logic_in_lean.html.
- Jeremy Avigad, Robert Y. Lewis e Floris van Doorn, Logic and Proof, «Natural Deduction for First Order Logic»: https://leanprover.github.io/logic_and_proof_lean3/natural_deduction_for_first_order_logic.html.
- Jeremy Avigad, Leonardo de Moura, Soonho Kong e Sebastian Ullrich, Theorem Proving in Lean 4, «Classical Logic»: https://lean-lang.org/theorem_proving_in_lean4/Propositions-and-Proofs/.