Did some exercises

This commit is contained in:
pingu 2025-01-30 18:37:49 +01:00
parent 7b64c3cf47
commit ea9436dfbc

View File

@ -1,4 +1,159 @@
import Aesop
variable (p q r : Prop)
def main : IO Unit :=
IO.println "Cirno's Perfect Arithmetics Class has begun!"
-- commutativity of ∧ and
example : p ∧ q ↔ q ∧ p := by
apply Iff.intro
· intro pandq
apply And.intro
· apply And.right pandq
· apply And.left pandq
· intro qandp
apply And.intro
· apply And.right qandp
· apply And.left qandp
example : p q ↔ q p := by
apply Iff.intro
· intro porq
cases porq with
| inl p => exact Or.inr p
| inr q => exact Or.inl q
· intro qorp
cases qorp with
| inl q => exact Or.inr q
| inr p => exact Or.inl p
-- associativity of ∧ and
example : (p ∧ q) ∧ r ↔ p ∧ (q ∧ r) := by
apply Iff.intro
· intro pqandr
apply And.intro
· exact And.left (And.left pqandr)
· apply And.intro
· exact And.right (And.left pqandr)
· exact And.right pqandr
· intro pandqr
apply And.intro
· apply And.intro
· exact And.left pandqr
· exact And.left (And.right pandqr)
· exact And.right (And.right pandqr)
example : (p q) r ↔ p (q r) := by
apply Iff.intro
· intro pqorr
cases pqorr with
| inr r => apply Or.inr (Or.inr r)
| inl porq => cases porq with
| inl p => apply Or.inl p
| inr q => apply Or.inr (Or.inl q)
· intro porqr
cases porqr with
| inl p => apply Or.inl (Or.inl p)
| inr qorr => cases qorr with
| inr r => apply Or.inr r
| inl q => apply Or.inl (Or.inr q)
-- distributivity
example : p ∧ (q r) ↔ (p ∧ q) (p ∧ r) := by
apply Iff.intro
· intro pandqorr
cases pandqorr with
| intro p qor => cases qor with
| inl q => apply Or.inl (And.intro p q)
| inr r => apply Or.inr (And.intro p r)
· intro pandqorpandr
cases pandqorpandr with
| inl pandq => apply And.intro (And.left pandq) (Or.inl (And.right pandq))
| inr pandr => apply And.intro (And.left pandr) (Or.inr (And.right pandr))
example : p (q ∧ r) ↔ (p q) ∧ (p r) := by
apply Iff.intro
· intro porqandr
cases porqandr with
| inl p => apply And.intro (Or.inl p) (Or.inl p)
| inr qandr => apply And.intro (Or.inr (And.left qandr)) (Or.inr (And.right qandr))
· intro porqandporr
cases And.left porqandporr with
| inl p => apply Or.inl p
| inr q => cases And.right porqandporr with
| inl p => apply Or.inl p
| inr r => apply Or.inr (And.intro q r)
-- other properties
example : (p → (q → r)) ↔ (p ∧ q → r) := by
apply Iff.intro
· intro ptoqtor
intro pandq
exact ptoqtor (And.left pandq) (And.right pandq)
· intro pandqtor
intro p
intro q
exact pandqtor (And.intro p q)
example : ((p q) → r) ↔ (p → r) ∧ (q → r) := by
apply Iff.intro
· intro porqtor
apply And.intro
· intro p
exact porqtor (Or.inl p)
· intro q
exact porqtor (Or.inr q)
· intro ptorandqtor
intro porq
cases porq with
| inl p => exact (And.left ptorandqtor) p
| inr q => exact (And.right ptorandqtor) q
example : ¬(p q) ↔ ¬p ∧ ¬q := by
apply Iff.intro
· intro nporq
apply And.intro
· intro p
exact nporq (Or.inl p)
· intro q
exact nporq (Or.inr q)
· intro npandnq
intro porq
cases porq with
| inl p => exact (And.left npandnq) p
| inr q => exact (And.right npandnq) q
example : ¬p ¬q → ¬(p ∧ q) := by
intro npornq
cases npornq with
| inl np => intro pandq; exact np (And.left pandq)
| inr nq => intro pandq; exact nq (And.right pandq)
example : ¬(p ∧ ¬p) := by
intro pandnp
exact (And.right pandnp) (And.left pandnp)
example : p ∧ ¬q → ¬(p → q) :=
λ ⟨p,nq⟩ ptoq => nq (ptoq p)
example : ¬p → (p → q) :=
λ np p => absurd p np
example : (¬p q) → (p → q)
| (Or.inl np), p => absurd p np
| (Or.inr q), _ => q
example : p False ↔ p := by
apply Iff.intro
· intro porf
apply Or.elim porf id False.elim
· intro p
apply Or.inl p
example : p ∧ False ↔ False := by
apply Iff.intro
· intro ⟨p,f⟩
exact f
· intro f
apply False.elim f
example : (p → q) → (¬q → ¬p) :=
λ ptoq nq p => absurd (ptoq p) nq