Created
December 28, 2021 06:36
-
-
Save Trebor-Huang/f797ed57e28389511031d942072c5118 to your computer and use it in GitHub Desktop.
How logic was formulated by Russel's type theory.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-# OPTIONS --prop #-} | |
| module Logic where | |
| id : β {β} {A : Set β} -> A -> A | |
| id x = x | |
| data π : Set where | |
| π©πΆπ : π | |
| π«πβ΄π : π | |
| _βΆ_ : π -> π -> π | |
| infixr 10 _βΆ_ | |
| data Ctx : Set where | |
| β : Ctx | |
| _β·_ : Ctx -> π -> Ctx | |
| infixl 7 _β·_ | |
| infix 5 _β_ | |
| data _β_ : Ctx -> π -> Set where | |
| π« : β {Ξ T} -> Ξ β· T β T | |
| π€_ : β {Ξ S T} -> Ξ β T -> Ξ β· S β T | |
| infixr 20 π€_ | |
| data Constant : π -> Set where | |
| -- No constants yet. | |
| infix 5 _β’_ | |
| infixl 15 _β_ | |
| infix 14 _==_ _!=_ | |
| infixl 6 Ζ_β_ Ξ΅_β_ | |
| data _β’_ : Ctx -> π -> Set where | |
| π§ : β {Ξ T} -> Ξ β T -> Ξ β’ T -- TODO a tactic for that | |
| π : β {Ξ T} -> Constant T -> Ξ β’ T | |
| _β_ : β {Ξ S T} -> Ξ β’ S βΆ T -> Ξ β’ S -> Ξ β’ T | |
| Ζ_β_ : β {Ξ T} S -> Ξ β· S β’ T -> Ξ β’ S βΆ T | |
| _==_ : β {Ξ T} -> Ξ β’ T -> Ξ β’ T -> Ξ β’ π«πβ΄π | |
| Ξ΅_β_ : β {Ξ} S -> Ξ β· S β’ π«πβ΄π -> Ξ β’ S | |
| βπ’π« : Ctx -> Ctx -> Set | |
| βπ’π« Ξ Ξ = β {T} -> Ξ β T -> Ξ β T | |
| ππ²π : Ctx -> Ctx -> Set | |
| ππ²π Ξ Ξ = β {T} -> Ξ β T -> Ξ β’ T | |
| ππ«π± : Ctx -> Ctx -> Set | |
| ππ«π± Ξ Ξ = β {T} -> Ξ β’ T -> Ξ β’ T | |
| private | |
| wr : β {Ξ Ξ T} -> βπ’π« Ξ Ξ -> βπ’π« (Ξ β· T) (Ξ β· T) | |
| wr Ο π« = π« | |
| wr Ο (π€ i) = π€ Ο i | |
| infixr 14 rβ¦_β§_ | |
| rβ¦_β§_ : β {Ξ Ξ} -> βπ’π« Ξ Ξ -> ππ«π± Ξ Ξ | |
| rβ¦ Ο β§ π§ x = π§ (Ο x) | |
| rβ¦ Ο β§ π x = π x | |
| rβ¦ Ο β§ s β t = (rβ¦ Ο β§ s) β (rβ¦ Ο β§ t) | |
| rβ¦ Ο β§ (Ζ S β s) = Ζ S β rβ¦ (wr Ο) β§ s | |
| rβ¦ Ο β§ (s == t) = (rβ¦ Ο β§ s) == (rβ¦ Ο β§ t) | |
| rβ¦ Ο β§ (Ξ΅ _ β s) = Ξ΅ _ β rβ¦ (wr Ο) β§ s | |
| ws : β {Ξ Ξ T} -> ππ²π Ξ Ξ -> ππ²π (Ξ β· T) (Ξ β· T) | |
| ws Ο π« = π§ π« | |
| ws Ο (π€ i) = rβ¦ π€_ β§ Ο i | |
| infixr 20 β¦_β§_ | |
| β¦_β§_ : β {Ξ Ξ} -> ππ²π Ξ Ξ -> ππ«π± Ξ Ξ | |
| β¦ Ο β§ π§ x = Ο x | |
| β¦ Ο β§ π c = π c | |
| β¦ Ο β§ (t β s) = β¦ Ο β§ t β β¦ Ο β§ s | |
| β¦ Ο β§ (Ζ S β t) = Ζ S β β¦ ws Ο β§ t | |
| β¦ Ο β§ (t == s) = β¦ Ο β§ t == β¦ Ο β§ s | |
| β¦ Ο β§ (Ξ΅ _ β t) = Ξ΅ _ β β¦ ws Ο β§ t | |
| infixr 20 π«/_ | |
| π«/_ : β {Ξ S} -> Ξ β’ S -> ππ²π (Ξ β· S) Ξ | |
| (π«/ t) π« = t | |
| (π«/ t) (π€ x) = π§ x | |
| infixr 20 β_ | |
| β_ : β {Ξ T} -> ππ«π± Ξ (Ξ β· T) | |
| β_ = rβ¦ π€_ β§_ | |
| private variable | |
| Ξ Ξ : Ctx | |
| S T : π | |
| -- Now some defined connectives | |
| ID : Ξ β’ π«πβ΄π βΆ π«πβ΄π | |
| ID = Ζ π«πβ΄π β π§ π« | |
| True : Ξ β’ π«πβ΄π | |
| True = ID == ID | |
| KT : Ξ β’ π«πβ΄π βΆ π«πβ΄π | |
| KT = Ζ π«πβ΄π β True | |
| False : Ξ β’ π«πβ΄π | |
| False = ID == KT | |
| infixr 20 Β¬_ | |
| Β¬_ : Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| Β¬ p = p == False | |
| _!=_ : Ξ β’ T -> Ξ β’ T -> Ξ β’ π«πβ΄π | |
| a != b = Β¬ (a == b) | |
| infixl 12 _β¨_ | |
| infixl 13 _β§_ | |
| infixr 12 _=>_ _<=>_ | |
| _β§_ : Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| p β§ q = (Ζ _ β π§ π« β True β True) | |
| == (Ζ _ βΆ _ βΆ π«πβ΄π β π§ π« β β p β β q) | |
| _β¨_ : Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| p β¨ q = Β¬ (Β¬ p β§ Β¬ q) | |
| _=>_ : Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| p => q = Β¬ (p β§ Β¬ q) | |
| _<=>_ : Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| _<=>_ = _==_ | |
| Forall : β T -> Ξ β· T β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| Forall T p = (Ζ T β p) == (Ζ T β True) | |
| Exists : β T -> Ξ β· T β’ π«πβ΄π -> Ξ β’ π«πβ΄π | |
| Exists T p = Β¬ (Forall T (Β¬ p)) | |
| syntax Forall T p = β[ T ] p | |
| syntax Exists T p = β[ T ] p | |
| infixr 6 Forall Exists | |
| β₯ : Ξ β’ T | |
| β₯ = Ξ΅ _ β π§ π« != π§ π« | |
| if_then_else_ : Ξ β’ π«πβ΄π -> Ξ β’ T -> Ξ β’ T -> Ξ β’ T | |
| if p then a else b = Ξ΅ _ β | |
| β p => π§ π« == β a β§ | |
| β Β¬ p => π§ π« == β a | |
| infix 4 _β«_ | |
| data _β«_ : β Ξ -> Ξ β’ π«πβ΄π -> Prop where | |
| Eq : β {a b} -> Ξ β« a == b | |
| -> (C : Ξ β’ S -> Ξ β’ π«πβ΄π ) -> Ξ β« C a -> Ξ β« C b | |
| Beta : {a : Ξ β· S β’ T} {b : Ξ β’ S} | |
| -> Ξ β« (Ζ S β a) β b == β¦ π«/ b β§ a | |
| Eta : Ξ β« β[ S βΆ T ] β[ S βΆ T ] | |
| π§ π« == π§ (π€ π«) <=> | |
| (β[ S ] π§ (π€ π«) β π§ π« == π§ (π€ π€ π«) β π§ π«) | |
| LEM : Ξ β« β[ π«πβ΄π βΆ π«πβ΄π ] | |
| (π§ π« β True β§ π§ π« β False) <=> (β[ π«πβ΄π ] π§ (π€ π«) β π§ π«) | |
| PropExt : Ξ β« β[ π«πβ΄π ] π§ π« <=> π§ π« == True | |
| Choice : β {a} | |
| -> Ξ β« (β[ S ] a) => β¦ π«/ (Ξ΅ _ β a) β§ a | |
| Undefined : β {a} | |
| -> Ξ β« Β¬ (β[ S ] a) => (Ξ΅ _ β a) == β₯ | |
| -- Next up, some theorems | |
| Transitivity : β {a b c : Ξ β’ S} -- Transitivity turns out to be easier to prove! | |
| -> Ξ β« a == b -> Ξ β« b == c -> Ξ β« a == c | |
| Transitivity ab bc = Eq bc _ ab | |
| infixl 10 _β―_ | |
| _β―_ = Transitivity | |
| Reflexivity : β (a : Ξ β’ S) -> Ξ β« a == a | |
| Reflexivity _ = lemma (Beta {a = π§ π«}) | |
| where | |
| lemma : β {a b : Ξ β’ S} -> Ξ β« a == b -> Ξ β« b == b | |
| lemma ab = Eq ab _ ab | |
| Symmetry : β {a b : Ξ β’ S} | |
| -> Ξ β« a == b -> Ξ β« b == a | |
| Symmetry {a = a} ab = Eq ab | |
| (\ x -> x == a) (Reflexivity a) | |
| Congruence : β {a b : Ξ β’ S} | |
| -> Ξ β« a == b | |
| -> (f : Ξ β’ S -> Ξ β’ T) | |
| -> Ξ β« f a == f b | |
| Congruence eq f = Eq eq (\ x -> _ == f x) (Reflexivity _) | |
| β«True : Ξ β« True | |
| β«True = Reflexivity ID | |
| Rewrite : β {p : Ξ β’ π«πβ΄π } | |
| -> Ξ β« p == True -> Ξ β« p | |
| Rewrite eq = Eq (Symmetry eq) id β«True | |
| βElim : β {p : Ξ β· S β’ π«πβ΄π } {a : Ξ β’ S} | |
| -> Ξ β« β[ S ] p -> Ξ β« β¦ π«/ a β§ p | |
| βElim {Ξ = Ξ} {S = S} {p = p} {a = a} pa = Rewrite ( | |
| -- β¦ π«/ a β§ p | |
| Symmetry Beta | |
| -- == (Ζ S β p) β a | |
| β― lemma | |
| -- == (Ζ S β True) β a | |
| β― Beta | |
| -- == True | |
| ) | |
| where | |
| lemma : Ξ β« (Ζ S β p) β a == (Ζ S β True) β a | |
| lemma = Congruence pa (_β a) | |
| ==True : β {p : Ξ β’ π«πβ΄π } | |
| -> Ξ β« p -> Ξ β« p == True | |
| ==True pp = Eq (βElim PropExt) id pp | |
| β¨_,_β© : β {p q : Ξ β’ π«πβ΄π } | |
| -> Ξ β« p -> Ξ β« q -> Ξ β« p β§ q | |
| β¨_,_β© {q = q} pp qq = Eq (Symmetry ( | |
| Congruence (==True pp) (\p -> π§ π« β β p β β q) | |
| β― Congruence (==True qq) (\q -> π§ π« β True β β q) | |
| )) (\u -> (Ζ _ β π§ π« β True β True) == | |
| (Ζ _ β u)) | |
| (Reflexivity (Ζ π«πβ΄π βΆ π«πβ΄π βΆ π«πβ΄π β π§ π« β True β True)) | |
| -- From here on we encounter coherence problems | |
| {- | |
| Οβ : β {p q : Ξ β’ π«πβ΄π } | |
| -> Ξ β« p β§ q -> Ξ β« p | |
| Οβ {p = p} {q = q} pq = Rewrite ( | |
| -- p | |
| Symmetry (Beta {a = β p} {b = q}) | |
| -- == (Ξ»q.p) q | |
| β― Congruence (Symmetry Beta) (_β q) | |
| -- == (Ξ»p.Ξ»q.p) p q | |
| β― Symmetry Beta | |
| -- == (Ξ»f.f p q) (Ξ»p.Ξ»q.p) | |
| β― Congruence pq (_β (Ζ π«πβ΄π β Ζ π«πβ΄π β π§ (π€ π«))) | |
| -- == (Ξ»f.f T T) (Ξ»p.Ξ»q.p) | |
| β― Beta | |
| -- == (Ξ»p.Ξ»q.p) T T | |
| β― Congruence Beta (_β True) | |
| -- == (Ξ»q.p) T | |
| β― Beta | |
| -- == True | |
| ) | |
| -- -} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment