Skip to content

Instantly share code, notes, and snippets.

@Trebor-Huang
Created December 28, 2021 06:36
Show Gist options
  • Save Trebor-Huang/f797ed57e28389511031d942072c5118 to your computer and use it in GitHub Desktop.
Save Trebor-Huang/f797ed57e28389511031d942072c5118 to your computer and use it in GitHub Desktop.
How logic was formulated by Russel's type theory.
{-# 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