Skip to content

Instantly share code, notes, and snippets.

@nicball
Last active May 24, 2022 08:19
Show Gist options
  • Save nicball/1d542828c7cf2c9bdfde4427dd5c3b06 to your computer and use it in GitHub Desktop.
Save nicball/1d542828c7cf2c9bdfde4427dd5c3b06 to your computer and use it in GitHub Desktop.
open import Data.Nat using (ℕ ; zero ; suc ; _≤_; z≤n ; s≤s ; _≤?_)
open import Relation.Nullary using (Dec ; yes ; no)
open import Relation.Nullary.Decidable using (True ; toWitness)
open import Function using (id ; _∘_)
open import Data.List using (List ; [] ; _∷_)
open import Relation.Binary.PropositionalEquality using (_≡_ ; refl)
infix 25 #ᵗ_
infix 25 #ᶠ_
infix 24 ¬_
infixl 23 _∧_
infixl 22 _∨_
infixr 21 _⇒_
infixl 20 _,_
infix 19 _∋_
infix 19 _#_
infix 18 _-→_
data Proposition : Set where
⊤ ⊥ : Proposition
_∧_ _∨_ _⇒_ : Proposition Proposition Proposition
¬_ : Proposition Proposition
pattern= []
pattern _,_ xs x = x ∷ xs
data _∋_ : List Proposition Proposition Set where
here : { xs x }
(xs , x) ∋ x
there : { xs x y }
xs ∋ x
(xs , y) ∋ x
length : List Proposition
length ∅ = 0
length (rest , _) = suc (length rest)
lookup : { xs i } suc i ≤ length xs Proposition
lookup {_ , p} {zero} (s≤s z≤n) = p
lookup {rest , _} {suc i} (s≤s i≤l) = lookup i≤l
scoped : { xs i } (p : suc i ≤ length xs) xs ∋ (lookup p)
scoped {_ , p} {zero} (s≤s z≤n) = here
scoped {rest , _} {suc _} (s≤s s≤l) = there (scoped s≤l)
mutual
data _,_⊢_true: List Proposition) (Γ : List Proposition) : Proposition Set where
trivial : Δ , Γ ⊢ ⊤ true
reference : { ϕ }
Δ ∋ ϕ
Δ , Γ ⊢ ϕ true
absurd : { ϕ }
Δ , (Γ , ϕ) ⊢#
Δ , Γ ⊢ ϕ true
∧-true : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₁ true
Δ , Γ ⊢ ϕ₂ true
Δ , Γ ⊢ ϕ₁ ∧ ϕ₂ true
∨-true₁ : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₁ true
Δ , Γ ⊢ ϕ₁ ∨ ϕ₂ true
∨-true₂ : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₂ true
Δ , Γ ⊢ ϕ₁ ∨ ϕ₂ true
¬-true : { ϕ }
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢ ¬ ϕ true
⇒-true : { ϕ₁ ϕ₂ }
(Δ , ϕ₁) , Γ ⊢ ϕ₂ true
Δ , Γ ⊢ ϕ₁ ⇒ ϕ₂ true
data _,_⊢_false: List Proposition) (Γ : List Proposition) : Proposition Set where
trivial : Δ , Γ ⊢ ⊥ false
reference : { ϕ }
Γ ∋ ϕ
Δ , Γ ⊢ ϕ false
absurd : { ϕ }
(Δ , ϕ) , Γ ⊢#
Δ , Γ ⊢ ϕ false
∧-false₁ : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₁ false
Δ , Γ ⊢ ϕ₁ ∧ ϕ₂ false
∧-false₂ : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₂ false
Δ , Γ ⊢ ϕ₁ ∧ ϕ₂ false
∨-false : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₁ false
Δ , Γ ⊢ ϕ₂ false
Δ , Γ ⊢ ϕ₁ ∨ ϕ₂ false
¬-false : { ϕ }
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢ ¬ ϕ false
⇒-false : { ϕ₁ ϕ₂ }
Δ , Γ ⊢ ϕ₁ true
Δ , Γ ⊢ ϕ₂ false
Δ , Γ ⊢ ϕ₁ ⇒ ϕ₂ false
data _,_⊢#: List Proposition) (Γ : List Proposition) : Set where
_#_ : { ϕ }
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢#
#ᵗ_ : { Δ Γ }
(i : ℕ)
{ p : True (suc i ≤? length Δ) }
Δ , Γ ⊢ (lookup (toWitness p)) true
#ᵗ_ i {p} = reference (scoped (toWitness p))
#ᶠ_ : { Δ Γ }
(i : ℕ)
{ p : True (suc i ≤? length Γ) }
Δ , Γ ⊢ (lookup (toWitness p)) false
#ᶠ_ i {p} = reference (scoped (toWitness p))
extension : { Δ Γ }
( { ϕ } Δ ∋ ϕ Γ ∋ ϕ)
( { ϕ ψ } Δ , ψ ∋ ϕ Γ , ψ ∋ ϕ)
extension ρ here = here
extension ρ (there n) = there (ρ n)
mutual
renameᵗ : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' ∋ ϕ)
( { ϕ } Γ ∋ ϕ Γ' ∋ ϕ)
( { ϕ } Δ , Γ ⊢ ϕ true Δ' , Γ' ⊢ ϕ true)
renameᵗ ρ σ trivial = trivial
renameᵗ ρ σ (reference i) = reference (ρ i)
renameᵗ ρ σ (absurd c) = absurd (rename-# ρ (extension σ) c)
renameᵗ ρ σ (∧-true l-true r-true) = ∧-true (renameᵗ ρ σ l-true) (renameᵗ ρ σ r-true)
renameᵗ ρ σ (∨-true₁ l-true) = ∨-true₁ (renameᵗ ρ σ l-true)
renameᵗ ρ σ (∨-true₂ r-true) = ∨-true₂ (renameᵗ ρ σ r-true)
renameᵗ ρ σ (¬-true a-false) = ¬-true (renameᶠ ρ σ a-false)
renameᵗ ρ σ (⇒-true a-true) = ⇒-true (renameᵗ (extension ρ) σ a-true)
renameᶠ : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' ∋ ϕ)
( { ϕ } Γ ∋ ϕ Γ' ∋ ϕ)
( { ϕ } Δ , Γ ⊢ ϕ false Δ' , Γ' ⊢ ϕ false)
renameᶠ ρ σ trivial = trivial
renameᶠ ρ σ (reference i) = reference (σ i)
renameᶠ ρ σ (absurd c) = absurd (rename-# (extension ρ) σ c)
renameᶠ ρ σ (∨-false l-false r-false) = ∨-false (renameᶠ ρ σ l-false) (renameᶠ ρ σ r-false)
renameᶠ ρ σ (∧-false₁ l-false) = ∧-false₁ (renameᶠ ρ σ l-false)
renameᶠ ρ σ (∧-false₂ r-false) = ∧-false₂ (renameᶠ ρ σ r-false)
renameᶠ ρ σ (¬-false a-true) = ¬-false (renameᵗ ρ σ a-true)
renameᶠ ρ σ (⇒-false a-true b-false) = ⇒-false (renameᵗ ρ σ a-true) (renameᶠ ρ σ b-false)
rename-# : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' ∋ ϕ)
( { ϕ } Γ ∋ ϕ Γ' ∋ ϕ)
(Δ , Γ ⊢# Δ' , Γ' ⊢#)
rename-# ρ σ (a-true # a-false) = renameᵗ ρ σ a-true # renameᶠ ρ σ a-false
extend_mapᵗ : { Δ Δ' Γ }
( { ϕ } Δ ∋ ϕ Δ' , Γ ⊢ ϕ true)
( { ϕ ψ } Δ , ψ ∋ ϕ (Δ' , ψ) , Γ ⊢ ϕ true)
extend_mapᵗ ρ here = reference here
extend_mapᵗ ρ (there n) = renameᵗ there id (ρ n)
extend_mapᶠ : { Δ Γ Γ' }
( { ϕ } Γ ∋ ϕ Δ , Γ' ⊢ ϕ false)
( { ϕ ψ } Γ , ψ ∋ ϕ Δ , (Γ' , ψ) ⊢ ϕ false)
extend_mapᶠ σ here = reference here
extend_mapᶠ σ (there n) = renameᶠ id there (σ n)
mutual
substituteᵗ : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' , Γ' ⊢ ϕ true)
( { ϕ } Γ ∋ ϕ Δ' , Γ' ⊢ ϕ false)
( { ϕ } Δ , Γ ⊢ ϕ true Δ' , Γ' ⊢ ϕ true)
substituteᵗ ρ σ trivial = trivial
substituteᵗ ρ σ (reference n) = ρ n
substituteᵗ ρ σ (absurd r) = absurd (substitute-# (renameᵗ id there ∘ ρ) (extend_mapᶠ σ) r)
substituteᵗ ρ σ (∧-true ϕ-true ψ-true) = ∧-true (substituteᵗ ρ σ ϕ-true) (substituteᵗ ρ σ ψ-true)
substituteᵗ ρ σ (∨-true₁ ϕ-true) = ∨-true₁ (substituteᵗ ρ σ ϕ-true)
substituteᵗ ρ σ (∨-true₂ ψ-true) = ∨-true₂ (substituteᵗ ρ σ ψ-true)
substituteᵗ ρ σ (¬-true ϕ-false) = ¬-true (substituteᶠ ρ σ ϕ-false)
substituteᵗ ρ σ (⇒-true ϕ-true) = ⇒-true (substituteᵗ (extend_mapᵗ ρ) (renameᶠ there id ∘ σ) ϕ-true)
substituteᶠ : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' , Γ' ⊢ ϕ true)
( { ϕ } Γ ∋ ϕ Δ' , Γ' ⊢ ϕ false)
( { ϕ } Δ , Γ ⊢ ϕ false Δ' , Γ' ⊢ ϕ false)
substituteᶠ ρ σ trivial = trivial
substituteᶠ ρ σ (reference n) = σ n
substituteᶠ ρ σ (absurd r) = absurd (substitute-# (extend_mapᵗ ρ) (renameᶠ there id ∘ σ) r)
substituteᶠ ρ σ (∧-false₁ ϕ-false) = ∧-false₁ (substituteᶠ ρ σ ϕ-false)
substituteᶠ ρ σ (∧-false₂ ψ-false) = ∧-false₂ (substituteᶠ ρ σ ψ-false)
substituteᶠ ρ σ (∨-false ϕ-false ψ-false) = ∨-false (substituteᶠ ρ σ ϕ-false) (substituteᶠ ρ σ ψ-false)
substituteᶠ ρ σ (¬-false ϕ-true) = ¬-false (substituteᵗ ρ σ ϕ-true)
substituteᶠ ρ σ (⇒-false ϕ-true ψ-false) = ⇒-false (substituteᵗ ρ σ ϕ-true) (substituteᶠ ρ σ ψ-false)
substitute-# : { Δ Δ' Γ Γ' }
( { ϕ } Δ ∋ ϕ Δ' , Γ' ⊢ ϕ true)
( { ϕ } Γ ∋ ϕ Δ' , Γ' ⊢ ϕ false)
(Δ , Γ ⊢# Δ' , Γ' ⊢#)
substitute-# ρ σ (ϕ-true # ϕ-false) = substituteᵗ ρ σ ϕ-true # substituteᶠ ρ σ ϕ-false
_[_ᵗ]# : { Δ Γ ϕ }
(Δ , ϕ) , Γ ⊢#
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢#
_[_ᵗ]# {Δ} {Γ} {ϕ} f x = substitute-# ρ reference f
where
ρ : { ψ } (Δ , ϕ) ∋ ψ Δ , Γ ⊢ ψ true
ρ here = x
ρ (there n) = reference n
_[_ᶠ]# : { Δ Γ ϕ }
Δ , (Γ , ϕ) ⊢#
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢#
_[_ᶠ]# {Δ} {Γ} {ϕ} f x = substitute-# reference σ f
where
σ : { ψ } (Γ , ϕ) ∋ ψ Δ , Γ ⊢ ψ false
σ here = x
σ (there n) = reference n
_[_ᵗ]ᵗ : { Δ Γ ϕ ψ }
(Δ , ϕ) , Γ ⊢ ψ true
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢ ψ true
_[_ᵗ]ᵗ {Δ} {Γ} {ϕ} f x = substituteᵗ ρ reference f
where
ρ : { ψ } (Δ , ϕ) ∋ ψ Δ , Γ ⊢ ψ true
ρ here = x
ρ (there n) = reference n
_[_ᶠ]ᵗ : { Δ Γ ϕ ψ }
Δ , (Γ , ϕ) ⊢ ψ true
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢ ψ true
_[_ᶠ]ᵗ {Δ} {Γ} {ϕ} f x = substituteᵗ reference σ f
where
σ : { ψ } (Γ , ϕ) ∋ ψ Δ , Γ ⊢ ψ false
σ here = x
σ (there n) = reference n
_[_ᵗ]ᶠ : { Δ Γ ϕ ψ }
(Δ , ϕ) , Γ ⊢ ψ false
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢ ψ false
_[_ᵗ]ᶠ {Δ} {Γ} {ϕ} f x = substituteᶠ ρ reference f
where
ρ : { ψ } (Δ , ϕ) ∋ ψ Δ , Γ ⊢ ψ true
ρ here = x
ρ (there n) = reference n
_[_ᶠ]ᶠ : { Δ Γ ϕ ψ }
Δ , (Γ , ϕ) ⊢ ψ false
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢ ψ false
_[_ᶠ]ᶠ {Δ} {Γ} {ϕ} f x = substituteᶠ reference σ f
where
σ : { ψ } (Γ , ϕ) ∋ ψ Δ , Γ ⊢ ψ false
σ here = x
σ (there n) = reference n
data _-→_ { Δ Γ } : Δ , Γ ⊢# Δ , Γ ⊢# Set where
∧-→1 : { ϕ ψ } { ϕ-true : Δ , Γ ⊢ ϕ true } { ψ-true : Δ , Γ ⊢ ψ true } { ϕ-false : Δ , Γ ⊢ ϕ false }
∧-true ϕ-true ψ-true # ∧-false₁ ϕ-false -→ ϕ-true # ϕ-false
∧-→2 : { ϕ ψ } { ϕ-true : Δ , Γ ⊢ ϕ true } { ψ-true : Δ , Γ ⊢ ψ true } { ψ-false : Δ , Γ ⊢ ψ false }
∧-true ϕ-true ψ-true # ∧-false₂ ψ-false -→ ψ-true # ψ-false
∨-→1 : { ϕ ψ } { ϕ-true : Δ , Γ ⊢ ϕ true } { ϕ-false : Δ , Γ ⊢ ϕ false } { ψ-false : Δ , Γ ⊢ ψ false }
∨-true₁ ϕ-true # ∨-false ϕ-false ψ-false -→ ϕ-true # ϕ-false
∨-→2 : { ϕ ψ } { ψ-true : Δ , Γ ⊢ ψ true } { ϕ-false : Δ , Γ ⊢ ϕ false } { ψ-false : Δ , Γ ⊢ ψ false }
∨-true₂ ψ-true # ∨-false ϕ-false ψ-false -→ ψ-true # ψ-false
¬-→ : { ϕ } { ϕ-true : Δ , Γ ⊢ ϕ true } { ϕ-false : Δ , Γ ⊢ ϕ false }
¬-true ϕ-false # ¬-false ϕ-true -→ ϕ-true # ϕ-false
⇒-→ : { ϕ ψ } { ϕ-true : Δ , Γ ⊢ ϕ true } { ψ-true : (Δ , ϕ) , Γ ⊢ ψ true } { ψ-false : Δ , Γ ⊢ ψ false }
⇒-true ψ-true # ⇒-false ϕ-true ψ-false -→ ψ-true [ ϕ-true ᵗ]ᵗ # ψ-false
absurdᵗ-→ : { ϕ ψ } { p : Δ , (Γ , ϕ) ⊢ ψ true } { k : Δ , (Γ , ϕ) ⊢ ψ false } { ϕ-false : Δ , Γ ⊢ ϕ false }
absurd (p # k) # ϕ-false -→ p [ ϕ-false ᶠ]ᵗ # k [ ϕ-false ᶠ]ᶠ
absurdᶠ-→ : { ϕ ψ } { p : (Δ , ϕ) , Γ ⊢ ψ true } { k : (Δ , ϕ) , Γ ⊢ ψ false } { ϕ-true : Δ , Γ ⊢ ϕ true }
ϕ-true # absurd (p # k) -→ p [ ϕ-true ᵗ]ᵗ # k [ ϕ-true ᵗ]ᶠ
data _isPrefixOf_ : List Proposition List Proposition Set where
refl : { Δ } Δ isPrefixOf Δ
weaken : { Δ Γ ϕ } Δ isPrefixOf Γ Δ isPrefixOf (Γ , ϕ)
∅-bottom : { Δ } ∅ isPrefixOf Δ
∅-bottom {∅} = refl
∅-bottom {Δ , _} = weaken ∅-bottom
_isPrefixOf?_ :: List Proposition) : List Proposition) Dec (Δ isPrefixOf Γ)
_isPrefixOf?_ ∅ _ = yes ∅-bottom
_isPrefixOf?_ (Δ , _) ∅ = no λ()
_isPrefixOf?_ (Δ , ϕ) (Γ , ψ) with (Δ , ϕ) isPrefixOf? Γ
... | yes p = yes (weaken p)
... | no _ = {!!}
wow-such-logic : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ false
Δ , Γ ⊢ ϕ ⇒ ψ true
wow-such-logic ϕ-false = ⇒-true (absurd (#ᵗ 0 # renameᶠ there there ϕ-false))
ap : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ true
Δ , Γ ⊢ ϕ ⇒ ψ true
Δ , Γ ⊢ ψ true
ap ϕ-true ϕ⇒ψ-true = absurd (renameᵗ id there ϕ⇒ψ-true # ⇒-false (renameᵗ id there ϕ-true) (#ᶠ 0))
∧-true-elim₁ : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ ∧ ψ true
Δ , Γ ⊢ ϕ true
∧-true-elim₁ ϕ∧ψ-true = absurd (renameᵗ id there ϕ∧ψ-true # ∧-false₁ (#ᶠ 0))
∨-false-elim₁ : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ ∨ ψ false
Δ , Γ ⊢ ϕ false
∨-false-elim₁ ϕ∨ψ-false = absurd (∨-true₁ (#ᵗ 0) # renameᶠ there id ϕ∨ψ-false)
∨-false-elim₂ : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ ∨ ψ false
Δ , Γ ⊢ ψ false
∨-false-elim₂ ϕ∨ψ-false = absurd (∨-true₂ (#ᵗ 0) # renameᶠ there id ϕ∨ψ-false)
refl-true : { Δ Γ ϕ }
(Δ , ϕ) , Γ ⊢ ϕ true
refl-true = #ᵗ 0
deMorgan : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ ∨ ψ false
Δ , Γ ⊢ (¬ ϕ) ∧ (¬ ψ) true
deMorgan ϕ∧ψ-false = ∧-true (¬-true (∨-false-elim₁ ϕ∧ψ-false)) ((¬-true (∨-false-elim₂ ϕ∧ψ-false)))
¬¬-elimᵗ : { Δ Γ ϕ }
Δ , Γ ⊢ ¬ (¬ ϕ) true
Δ , Γ ⊢ ϕ true
¬¬-elimᵗ ¬¬ϕ-true = absurd (renameᵗ id there ¬¬ϕ-true # ¬-false (¬-true (#ᶠ 0)))
¬¬-elimᶠ : { Δ Γ ϕ }
Δ , Γ ⊢ ¬ (¬ ϕ) false
Δ , Γ ⊢ ϕ false
¬¬-elimᶠ ¬¬ϕ-false = absurd (¬-true (¬-false (#ᵗ 0)) # renameᶠ there id ¬¬ϕ-false)
¬-elimᵗ : { Δ Γ ϕ }
Δ , Γ ⊢ ¬ ϕ false
Δ , Γ ⊢ ϕ true
¬-elimᵗ = ¬¬-elimᵗ ∘ ¬-true
¬-elimᶠ : { Δ Γ ϕ }
Δ , Γ ⊢ ¬ ϕ true
Δ , Γ ⊢ ϕ false
¬-elimᶠ = ¬¬-elimᶠ ∘ ¬-false
contraposition : { Δ Γ ϕ ψ }
Δ , Γ ⊢ ϕ ⇒ ψ true
Δ , Γ ⊢ (¬ ψ) ⇒ (¬ ϕ) true
contraposition ϕ⇒ψ-true = ⇒-true (absurd (ap (¬-elimᵗ (#ᶠ 0)) (renameᵗ there there ϕ⇒ψ-true) # ¬-elimᶠ (#ᵗ 0)))
decontraposition : { Δ Γ ϕ ψ }
Δ , Γ ⊢ (¬ ψ) ⇒ (¬ ϕ) true
Δ , Γ ⊢ ϕ ⇒ ψ true
decontraposition ¬ψ⇒¬ϕ = ⇒-true (¬¬-elimᵗ (ap (¬-true (¬-false (#ᵗ 0))) (renameᵗ there id (contraposition ¬ψ⇒¬ϕ))))
∨-true-elim : { Δ Γ ϕ ψ ω }
Δ , Γ ⊢ ϕ ∨ ψ true
(Δ , ϕ) , Γ ⊢ ω true
(Δ , ψ) , Γ ⊢ ω true
Δ , Γ ⊢ ω true
∨-true-elim ϕ∨ψ-true f g = absurd (renameᵗ id there ϕ∨ψ-true # ∨-false (absurd (ap (#ᵗ 0) (renameᵗ there there (⇒-true f))# (#ᶠ 0)))
(absurd (ap (#ᵗ 0) (renameᵗ there there (⇒-true g)) # (#ᶠ 0))))
∧-false-elim : { Δ Γ ϕ ψ ω }
Δ , Γ ⊢ ϕ ∧ ψ false
Δ , (Γ , ϕ) ⊢ ω false
Δ , (Γ , ψ) ⊢ ω false
Δ , Γ ⊢ ω false
∧-false-elim ϕ∧ψ-false f g = absurd (∧-true (absurd ((#ᵗ 0) # {!!})) {!!} # renameᶠ there id ϕ∧ψ-false)
_ : { Δ Γ ϕ ψ θ }
Δ , Γ ⊢ (ϕ ∧ (ψ ∧ θ)) ⇒ (ϕ ∧ θ) true
_ = ⇒-true (absurd ((#ᵗ 0) # ∧-false₂ (∧-false₂ (absurd ((#ᵗ 1) # ∧-false₁ (absurd (∧-true (#ᵗ 0) (#ᵗ 1) # (#ᶠ 0))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment