{-# OPTIONS --sized-types #-}
-- Basic intuitionistic modal logic S4, without ∨, ⊥, or ◇.
-- Kripke-style semantics with exploding abstract worlds, and glueing for □ only.
module A201607.WIP2.BasicIS4.Semantics.Sketch8 where
open import A201607.Common.Semantics public
open import A201607.BasicIS4.Syntax.Common public
-- Intuitionistic modal Kripke-CPS models, with exploding worlds.
record Model : Set₁ where
infix 3 _⊪ᵅ_ _[⊢]_ _[⊢ⁿᶠ]_
infix 5 _≤_
infixl 5 _[+]_
infix 3 _[∈]_
field
World : Set
-- TODO
[∅] : World
-- Intuitionistic accessibility; preorder.
_≤_ : World → World → Set
refl≤ : ∀ {w} → w ≤ w
trans≤ : ∀ {w w′ w″} → w ≤ w′ → w′ ≤ w″ → w ≤ w″
-- bot≤ : ∀ {w} → [∅] ≤ w
-- Modal accessibility; preorder.
-- _R_ : World → World → Set
-- reflR : ∀ {w} → w R w
-- transR : ∀ {w w′ w″} → w R w′ → w′ R w″ → w R w″
-- TODO
-- ⌊_⌋ : World → World
-- lem₁ : ∀ {w} → ⌊ w ⌋ ≤ w
-- lem₂ : ∀ {w} → ⌊ w ⌋ ≤ ⌊ ⌊ w ⌋ ⌋
-- ≤→⌊≤⌋ : ∀ {w w′} → w ≤ w′ → ⌊ w ⌋ ≤ ⌊ w′ ⌋
-- TODO
_[+]_ : World → Cx² Ty Ty → World
_[∈]_ : Cx² Ty Ty → World → Set
-- [top] : ∀ {A w} → A [∈] w [,] A
-- [mtop] : ∀ {A w} → A [m∈] w [m,] A
-- [pop] : ∀ {A B w} → A [∈] w → A [∈] w [,] B
-- [mpop] : ∀ {A B w} → A [m∈] w → A [m∈] w [m,] B
-- Gentzen-style syntax; monotonic.
_[⊢]_ : World → Ty → Set
mono[⊢] : ∀ {A w w′} → w ≤ w′ → w [⊢] A → w′ [⊢] A
[var] : ∀ {A w} → (∅ , A ⁏ ∅) [∈] w → w [⊢] A
[lam] : ∀ {A B w} → w [+] (∅ , A ⁏ ∅) [⊢] B → w [⊢] A ▻ B
[app] : ∀ {A B w} → w [⊢] A ▻ B → w [⊢] A → w [⊢] B
[mvar] : ∀ {A w} → (∅ ⁏ ∅ , A) [∈] w → w [⊢] A
[box] : ∀ {Γ Δ A} → [∅] [+] (∅ ⁏ Δ) [⊢] A → [∅] [+] (Γ ⁏ Δ) [⊢] □ A
[unbox] : ∀ {A C w} → w [⊢] □ A → w [+] (∅ ⁏ ∅ , A) [⊢] C → w [⊢] C
[pair] : ∀ {A B w} → w [⊢] A → w [⊢] B → w [⊢] A ∧ B
[fst] : ∀ {A B w} → w [⊢] A ∧ B → w [⊢] A
[snd] : ∀ {A B w} → w [⊢] A ∧ B → w [⊢] B
[unit] : ∀ {w} → w [⊢] ⊤
-- Syntax in normal form.
_[⊢ⁿᶠ]_ : World → Ty → Set
-- Strong forcing for atomic propositions; monotonic.
_⊪ᵅ_ : World → Atom → Set
mono⊪ᵅ : ∀ {P w w′} → w ≤ w′ → w ⊪ᵅ P → w′ ⊪ᵅ P
-- infixl 5 _[,]⋆_
-- _[,]⋆_ : World → Cx Ty → World
-- w [,]⋆ ∅ = w
-- w [,]⋆ (Ξ , A) = w [,]⋆ Ξ [,] A
--
-- infixl 5 _[m,]⋆_
-- _[m,]⋆_ : World → Cx Ty → World
-- w [m,]⋆ ∅ = w
-- w [m,]⋆ (Ξ , A) = w [m,]⋆ Ξ [m,] A
infix 3 _[⊢]⋆_
_[⊢]⋆_ : World → Cx Ty → Set
w [⊢]⋆ ∅ = 𝟙
w [⊢]⋆ Ξ , A = w [⊢]⋆ Ξ × w [⊢] A
mono[⊢]⋆ : ∀ {Ξ w w′} → w ≤ w′ → w [⊢]⋆ Ξ → w′ [⊢]⋆ Ξ
mono[⊢]⋆ {∅} ξ ∙ = ∙
mono[⊢]⋆ {Ξ , A} ξ (ts , t) = mono[⊢]⋆ ξ ts , mono[⊢] ξ t
open Model {{…}} public
-- Strong forcing and forcing, in a particular world of a particular model.
module _ {{_ : Model}} where
mutual
infix 3 _⊪_
_⊪_ : World → Ty → Set
w ⊪ α P = w ⊪ᵅ P
w ⊪ A ▻ B = ∀ {w′} → w ≤ w′ → w′ ⊩ A → w′ ⊩ B
-- w ⊪ □ A = ∀ {w′} → ⌊ w ⌋ ≤ ⌊ w′ ⌋ → Glue (⌊ w′ ⌋ [⊢] A) (⌊ w′ ⌋ ⊩ A)
w ⊪ □ A = ∀ {Ξ} → Glue ([∅] [+] Ξ [⊢] A) ([∅] [+] Ξ ⊩ A)
w ⊪ A ∧ B = w ⊩ A × w ⊩ B
w ⊪ ⊤ = 𝟙
infix 3 _⊩_
_⊩_ : World → Ty → Set
w ⊩ A = ∀ {C} {w′ : World} → w ≤ w′ → (∀ {w″ : World} → w′ ≤ w″ → w″ ⊪ A → w″ [⊢ⁿᶠ] C) → w′ [⊢ⁿᶠ] C
infix 3 _⊩⋆_
_⊩⋆_ : World → Cx Ty → Set
w ⊩⋆ ∅ = 𝟙
w ⊩⋆ Ξ , A = w ⊩⋆ Ξ × w ⊩ A
-- Monotonicity with respect to intuitionistic accessibility.
module _ {{_ : Model}} where
mutual
mono⊪ : ∀ {A} {w w′ : World} → w ≤ w′ → w ⊪ A → w′ ⊪ A
mono⊪ {α P} ξ s = mono⊪ᵅ ξ s
mono⊪ {A ▻ B} ξ s = λ ξ′ a → s (trans≤ ξ ξ′) a
-- mono⊪ {□ A} ξ s = λ ζ → s (trans≤ (≤→⌊≤⌋ ξ) ζ)
mono⊪ {□ A} ξ s = s
mono⊪ {A ∧ B} ξ s = mono⊩ {A} ξ (π₁ s) , mono⊩ {B} ξ (π₂ s)
mono⊪ {⊤} ξ s = ∙
mono⊩ : ∀ {A} {w w′ : World} → w ≤ w′ → w ⊩ A → w′ ⊩ A
mono⊩ ξ a = λ ξ′ k′ → a (trans≤ ξ ξ′) k′
mono⊩⋆ : ∀ {Ξ} {w w′ : World} → w ≤ w′ → w ⊩⋆ Ξ → w′ ⊩⋆ Ξ
mono⊩⋆ {∅} ξ ∙ = ∙
mono⊩⋆ {Ξ , A} ξ (γ , a) = mono⊩⋆ {Ξ} ξ γ , mono⊩ {A} ξ a
-- TODO: unfinished
-- -- Additional useful equipment.
-- module _ {{_ : Model}} where
-- _⟪$⟫_ : ∀ {A B w} → w ⊪ A ▻ B → w ⊩ A → w ⊩ B
-- s ⟪$⟫ a = s refl≤ a
-- return : ∀ {A w} → w ⊪ A → w ⊩ A
-- return {A} a = λ ξ k → k refl≤ (mono⊪ {A} ξ a)
-- bind : ∀ {A B w} → w ⊩ A → (∀ {w′} → w ≤ w′ → w′ ⊪ A → w′ ⊩ B) → w ⊩ B
-- bind a k = λ ξ k′ → a ξ (λ ξ′ a′ → k (trans≤ ξ ξ′) a′ refl≤ (λ ξ″ a″ → k′ (trans≤ ξ′ ξ″) a″))
-- -- Entailment, or forcing in all worlds of all models, for sequents.
-- infix 3 _⊨_
-- _⊨_ : Cx² Ty Ty → Ty → Set₁
-- Γ ⁏ Δ ⊨ A = ∀ {{_ : Model}} {w} → w ⊩⋆ Γ → ⌊ w ⌋ [⊢]⋆ Δ → ⌊ w ⌋ ⊩⋆ Δ → w ⊩ A
-- infix 3 _⊨⋆_
-- _⊨⋆_ : Cx² Ty Ty → Cx Ty → Set₁
-- Γ ⁏ Δ ⊨⋆ Ξ = ∀ {{_ : Model}} {w} → w ⊩⋆ Γ → ⌊ w ⌋ [⊢]⋆ Δ → ⌊ w ⌋ ⊩⋆ Δ → w ⊩⋆ Ξ
-- -- Additional useful equipment, for sequents.
-- module _ {{_ : Model}} where
-- lookup : ∀ {A Γ w} → A ∈ Γ → w ⊩⋆ Γ → w ⊩ A
-- lookup top (γ , a) = a
-- lookup (pop i) (γ , b) = lookup i γ
-- --
-- open import BasicIS4.Syntax.DyadicGentzenNormalForm public
-- -- Internalisation of syntax as syntax representation in a particular model.
-- module _ {{_ : Model}} where
-- -- [_]ᶜˣ : Cx² Ty Ty → World
-- -- [ ∅ ⁏ ∅ ]ᶜˣ = [∅]
-- -- [ Γ , A ⁏ ∅ ]ᶜˣ = [ Γ ⁏ ∅ ]ᶜˣ [,] A
-- -- [ ∅ ⁏ Δ , B ]ᶜˣ = [ ∅ ⁏ Δ ]ᶜˣ [m,] B
-- -- [ Γ , A ⁏ Δ , B ]ᶜˣ = [ Γ ⁏ Δ ]ᶜˣ [,] A [m,] B
-- -- mel₃ : ∀ {Γ Δ A} → [ Γ , A ⁏ Δ ]ᶜˣ ≡ [ Γ ⁏ Δ ]ᶜˣ [,] A
-- -- mel₃ {∅} = {!!}
-- -- mel₃ {Γ , B} = {!!}
-- --
-- -- lem₃ : ∀ {Δ A C Γ} → [ Γ , A ⁏ Δ ]ᶜˣ [⊢] C → [ Γ ⁏ Δ ]ᶜˣ [,] A [⊢] C
-- -- lem₃ t = {!!}
-- --
-- -- postulate
-- -- lem₄ : ∀ {Γ A Δ} → [ ∅ ⁏ Δ ]ᶜˣ [⊢] A → ⌊ [ Γ ⁏ Δ ]ᶜˣ ⌋ [⊢] A
-- -- lem₅ : ∀ {Γ A C Δ} → [ Γ ⁏ Δ , A ]ᶜˣ [⊢] C → [ Γ ⁏ Δ ]ᶜˣ [m,] A [⊢] C
-- --
-- -- [_]ⁱˣ : ∀ {A Γ Δ} → A ∈ Γ → A [∈] [ Γ ⁏ Δ ]ᶜˣ
-- -- [ top ]ⁱˣ = {![top]!}
-- -- [ pop i ]ⁱˣ = {!!}
-- --
-- -- m[_]ⁱˣ : ∀ {Γ A Δ} → A ∈ Δ → A [m∈] [ Γ ⁏ Δ ]ᶜˣ
-- -- m[ top ]ⁱˣ = {!!}
-- -- m[ pop i ]ⁱˣ = {!!}
-- --
-- -- [_] : ∀ {A Γ Δ} → Γ ⁏ Δ ⊢ A → [ Γ ⁏ Δ ]ᶜˣ [⊢] A
-- -- [ var i ] = [var] [ i ]ⁱˣ
-- -- [ lam {Δ = Δ} t ] = [lam] (lem₃ {Δ} [ t ])
-- -- [ app t u ] = [app] [ t ] [ u ]
-- -- [ mvar {Γ = Γ} i ] = [mvar] (m[_]ⁱˣ {Γ} i)
-- -- [ box {Γ = Γ} t ] = [box] (lem₄ {Γ} [ t ])
-- -- [ unbox {Γ = Γ} t u ] = [unbox] [ t ] (lem₅ {Γ} [ u ])
-- -- [ pair t u ] = [pair] [ t ] [ u ]
-- -- [ fst t ] = [fst] [ t ]
-- -- [ snd t ] = [snd] [ t ]
-- -- [ unit ] = [unit]
-- --
-- -- [box]⋆ : ∀ {Ξ w} → ⌊ w ⌋ [⊢]⋆ Ξ → w [⊢]⋆ □⋆ Ξ
-- -- [box]⋆ {∅} ∙ = ∙
-- -- [box]⋆ {Ξ , A} (ts , t) = [box]⋆ ts , [box] t
-- -- postulate
-- -- lem₆ : ∀ {Ξ C w} → w [⊢] C → w [m,]⋆ Ξ [⊢] C
-- -- lem₇ : ∀ {Ξ A C w} → w [m,]⋆ (Ξ , A) [⊢] C → (w [m,]⋆ Ξ) [m,] A [⊢] C
-- --
-- -- [unbox]⋆ : ∀ {Ξ C w} → w [⊢]⋆ □⋆ Ξ → w [m,]⋆ Ξ [⊢] C → w [⊢] C
-- -- [unbox]⋆ {∅} ∙ u = u
-- -- [unbox]⋆ {Ξ , A} (ts , t) u = [unbox]⋆ ts ([unbox] (lem₆ {Ξ} t) (lem₇ {Ξ} u))
-- --
-- -- mlet : ∀ {A C w} → ⌊ w ⌋ [⊢] A → w [m,] A [⊢] C → w [⊢] C
-- -- mlet t u = [unbox] ([box] t) u
-- --
-- -- mlet⋆ : ∀ {Ξ C w} → ⌊ w ⌋ [⊢]⋆ Ξ → w [m,]⋆ Ξ [⊢] C → w [⊢] C
-- -- mlet⋆ ts u = [unbox]⋆ ([box]⋆ ts) u
-- -- [unbox] : ∀ {A C w} → w [⊢] □ A → w [m,] A [⊢] C → w [⊢] C
-- -- help : ∀ {Ξ w A} → w [⊢] □ A → w [m,]⋆ Ξ [⊢] □ A
-- -- help = {!!}
-- --
-- -- unbox′ : ∀ {Ξ A C w} → w [⊢] □ A → [∅] [m,]⋆ Ξ [m,] A [⊢] C → [∅] [m,]⋆ Ξ [⊢] C
-- -- unbox′ = {!!}
-- --
-- -- [unbox]⋆ : ∀ {Ξ C w} → w [⊢]⋆ □⋆ Ξ → [∅] [m,]⋆ Ξ [⊢] C → [∅] [⊢] C
-- -- [unbox]⋆ {∅} ∙ u = u
-- -- [unbox]⋆ {Ξ , A} (ts , t) u = [unbox]⋆ ts (unbox′ {Ξ} t u)
-- -- [box]⋆ : ∀ {Ξ w} → ⌊ w ⌋ [⊢]⋆ Ξ → w [⊢]⋆ □⋆ Ξ
-- -- [box]⋆ {∅} ∙ = ∙
-- -- [box]⋆ {Ξ , A} (ts , t) = [box]⋆ ts , [box] t
-- [box]⋆ : ∀ {Ξ w} → ⌊ w ⌋ [⊢]⋆ Ξ → ⌊ w ⌋ [⊢]⋆ □⋆ Ξ
-- [box]⋆ {∅} ∙ = ∙
-- [box]⋆ {Ξ , A} (ts , t) = [box]⋆ ts , [box] t
-- -- postulate
-- -- wtf : ∀ {Ξ A w} → w [⊢] □ A → ⌊ w ⌋ [m,]⋆ Ξ [⊢] □ A
-- --
-- -- [unbox]⋆ : ∀ {Ξ C w} → w [⊢]⋆ □⋆ Ξ → ⌊ w ⌋ [m,]⋆ Ξ [⊢] C → ⌊ w ⌋ [⊢] C
-- -- [unbox]⋆ {∅} ∙ u = u
-- -- [unbox]⋆ {Ξ , A} (ts , t) u = [unbox]⋆ ts ([unbox] (wtf {Ξ} t) u)
-- --
-- -- omg : ∀ {Ξ C w} → ⌊ w ⌋ [⊢]⋆ Ξ → ⌊ w ⌋ [m,]⋆ Ξ [⊢] C → ⌊ w ⌋ [⊢] C
-- -- omg ts u = [unbox]⋆ ([box]⋆ ts) u
-- {-
-- postulate
-- [top] : ∀ {A w} → A [∈] w [,] A
-- foo : ∀ {A w} → w ≤ (w [,] A)
-- mfoo : ∀ {A w} → w ≤ (w [m,] A)
-- postulate
-- lemᵛᵃʳ : ∀ {Γ Δ A w} → A ∈ Γ → A [∈] w [,]⋆ Γ [m,]⋆ Δ
-- lemˡᵃᵐ : ∀ {Γ Δ A B w} → w [,]⋆ (Γ , A) [m,]⋆ Δ [⊢] B
-- → w [,]⋆ Γ [m,]⋆ Δ [,] A [⊢] B
-- lemᵐᵛᵃʳ : ∀ {Γ Δ A w} → A ∈ Δ → A [m∈] w [,]⋆ Γ [m,]⋆ Δ
-- lemᵇᵒˣ : ∀ {Γ Δ A w} → w [,]⋆ ∅ [m,]⋆ Δ [⊢] A
-- → ⌊ w [,]⋆ Γ [m,]⋆ Δ ⌋ [⊢] A
-- lemᵘⁿᵇᵒˣ : ∀ {Γ Δ A C w} → w [,]⋆ Γ [m,]⋆ (Δ , A) [⊢] C
-- → w [,]⋆ Γ [m,]⋆ Δ [m,] A [⊢] C
-- wtf : ∀ {Ξ A C w} → ⌊ w ⌋ [m,]⋆ (Ξ , A) [⊢] C → ⌊ w ⌋ [m,]⋆ Ξ [⊢] □ A ▻ C
-- wtf t = [lam] ([unbox] ([var] [top]) (mono[⊢] {!!} t))
-- omg : ∀ {Ξ C w} → ⌊ w ⌋ [⊢]⋆ □⋆ Ξ → ⌊ w ⌋ [m,]⋆ Ξ [⊢] C → ⌊ w ⌋ [⊢] C
-- omg {∅} ∙ u = u
-- omg {Ξ , A} (ts , t) u = [app] (omg ts (wtf {Ξ} u)) t
-- [_] : ∀ {A Γ Δ w} → Γ ⁏ Δ ⊢ A → w [,]⋆ Γ [m,]⋆ Δ [⊢] A
-- [ var {Γ = Γ} {Δ} i ] = [var] (lemᵛᵃʳ {Γ} {Δ} i)
-- [ lam {Γ = Γ} {Δ} t ] = [lam] (lemˡᵃᵐ {Γ} {Δ} [ t ])
-- [ app t u ] = [app] [ t ] [ u ]
-- [ mvar {Γ = Γ} {Δ} i ] = [mvar] (lemᵐᵛᵃʳ {Γ} {Δ} i)
-- [ box {Γ = Γ} {Δ} t ] = mono[⊢] lem₁ ([box] (lemᵇᵒˣ {Γ} {Δ} [ t ]))
-- [ unbox {Γ = Γ} {Δ} t u ] = [unbox] [ t ] (lemᵘⁿᵇᵒˣ {Γ} {Δ} [ u ])
-- [ pair t u ] = [pair] [ t ] [ u ]
-- [ fst t ] = [fst] [ t ]
-- [ snd t ] = [snd] [ t ]
-- [ unit ] = [unit]
-- -}
-- -- Soundness with respect to all models, or evaluation.
-- eval : ∀ {Γ Δ A} → Γ ⁏ Δ ⊢ A → Γ ⁏ Δ ⊨ A
-- eval (var i) γ ד δ = lookup i γ
-- eval (lam {A} {B} t) γ ד δ = return {A ▻ B} λ ξ a →
-- eval t (mono⊩⋆ ξ γ , a)
-- (mono[⊢]⋆ (≤→⌊≤⌋ ξ) ד)
-- (mono⊩⋆ (≤→⌊≤⌋ ξ) δ)
-- eval (app {A} {B} t u) γ ד δ = bind {A ▻ B} {B} (eval t γ ד δ) λ ξ f →
-- _⟪$⟫_ {A} {B} f (eval u (mono⊩⋆ ξ γ)
-- (mono[⊢]⋆ (≤→⌊≤⌋ ξ) ד)
-- (mono⊩⋆ (≤→⌊≤⌋ ξ) δ))
-- eval (mvar {A} i) γ ד δ = mono⊩ {A} lem₁ (lookup i δ)
-- eval {Γ} {Δ} (box {A} t) γ ד δ = return {□ A} λ ζ →
-- let ד′ = mono[⊢]⋆ ζ ד
-- t′ = {!!}
-- in {!omg ([box]⋆ ד′) t′!} ⅋
-- eval t ∙
-- (mono[⊢]⋆ (trans≤ ζ lem₂) ד)
-- (mono⊩⋆ (trans≤ ζ lem₂) δ)
-- eval (unbox {A} {C} t u) γ ד δ = bind {□ A} {C} (eval t γ ד δ) λ ξ a →
-- eval u (mono⊩⋆ ξ γ)
-- (mono[⊢]⋆ (≤→⌊≤⌋ ξ) ד , syn (a refl≤))
-- (mono⊩⋆ (≤→⌊≤⌋ ξ) δ , sem (a refl≤))
-- eval (pair {A} {B} t u) γ ד δ = return {A ∧ B} (eval t γ ד δ , eval u γ ד δ)
-- eval (fst {A} {B} t) γ ד δ = bind {A ∧ B} {A} (eval t γ ד δ) (K π₁)
-- eval (snd {A} {B} t) γ ד δ = bind {A ∧ B} {B} (eval t γ ד δ) (K π₂)
-- eval unit γ ד δ = return {⊤} ∙
-- eval⋆ : ∀ {Ξ Γ} → Γ ⊢⋆ Ξ → Γ ⊨⋆ Ξ
-- eval⋆ {∅} ∙ γ ד δ = ∙
-- eval⋆ {Ξ , A} (ts , t) γ ד δ = eval⋆ ts γ ד δ , eval t γ ד δ
-- -- The canonical model.
-- private
-- instance
-- canon : Model
-- canon = record
-- { World = Cx² Ty Ty
-- ; [∅] = ∅ ⁏ ∅
-- ; _≤_ = _⊆²_
-- ; refl≤ = refl⊆²
-- ; trans≤ = trans⊆²
-- ; bot≤ = bot⊆²
-- ; ⌊_⌋ = λ { (Γ ⁏ Δ) → ∅ ⁏ Δ }
-- ; lem₁ = bot⊆ , refl⊆
-- ; lem₂ = refl⊆²
-- ; ≤→⌊≤⌋ = λ { (η , θ) → refl⊆ , θ }
-- ; _[+]_ = λ { (Γ ⁏ Δ) (Γ′ ⁏ Δ′) → Γ ⧺ Γ′ ⁏ Δ ⧺ Δ′ }
-- -- ; _[,]_ = λ { (Γ ⁏ Δ) A → Γ , A ⁏ Δ }
-- -- ; _[m,]_ = λ { (Γ ⁏ Δ) A → Γ ⁏ Δ , A }
-- ; _[∈]_ = λ { A (Γ ⁏ Δ) → A ∈ Γ }
-- ; _[m∈]_ = λ { A (Γ ⁏ Δ) → A ∈ Δ }
-- ; _[⊢]_ = _⊢_
-- ; mono[⊢] = mono²⊢
-- ; [var] = var
-- ; [lam] = lam
-- ; [app] = app
-- ; [mvar] = mvar
-- ; [box] = box
-- ; [unbox] = unbox
-- ; [pair] = pair
-- ; [fst] = fst
-- ; [snd] = snd
-- ; [unit] = unit
-- ; _[⊢ⁿᶠ]_ = _⊢ⁿᶠ_
-- ; _⊪ᵅ_ = λ { (Γ ⁏ Δ) P → Γ ⁏ Δ ⊢ⁿᵉ α P }
-- ; mono⊪ᵅ = mono²⊢ⁿᵉ
-- }
-- -- Soundness and completeness with respect to the canonical model.
-- module _ {U : Set} where
-- grab∈ : ∀ {A : U} {Γ Γ′} → Γ , A ⊆ Γ′ → A ∈ Γ′
-- grab∈ (skip η) = pop (grab∈ η)
-- grab∈ (keep η) = top
-- mutual
-- reifyᶜ : ∀ {A Γ Δ} → Γ ⁏ Δ ⊩ A → Γ ⁏ Δ ⊢ⁿᶠ A
-- reifyᶜ {α P} k = k refl⊆² λ ξ s → neⁿᶠ s
-- reifyᶜ {A ▻ B} k = k refl⊆² λ ξ s → lamⁿᶠ (reifyᶜ (s weak⊆²₁ (reflectᶜ {A} (varⁿᵉ top))))
-- reifyᶜ {□ A} k = k refl⊆² λ {w} ξ s → boxⁿᶠ (syn (s {w} refl⊆²))
-- reifyᶜ {A ∧ B} k = k refl⊆² λ ξ s → pairⁿᶠ (reifyᶜ (π₁ s)) (reifyᶜ (π₂ s))
-- reifyᶜ {⊤} k = k refl⊆² λ ξ s → unitⁿᶠ
-- reflectᶜ : ∀ {A Γ Δ} → Γ ⁏ Δ ⊢ⁿᵉ A → Γ ⁏ Δ ⊩ A
-- reflectᶜ {α P} t = return {α P} t
-- reflectᶜ {A ▻ B} t = return {A ▻ B} λ { (η , θ) a →
-- reflectᶜ {B} (appⁿᵉ (mono²⊢ⁿᵉ (η , θ) t) (reifyᶜ a)) }
-- reflectᶜ {□ A} t = λ { (η , θ) k →
-- neⁿᶠ (unboxⁿᵉ (mono²⊢ⁿᵉ (η , θ) t) (k (refl⊆ , weak⊆) λ { (η′ , θ′) →
-- mvar (grab∈ θ′) ⅋
-- reflectᶜ {A} (mvarⁿᵉ (grab∈ θ′)) } )) }
-- reflectᶜ {A ∧ B} t = return {A ∧ B} (reflectᶜ (fstⁿᵉ t) , reflectᶜ (sndⁿᵉ t))
-- reflectᶜ {⊤} t = return {⊤} ∙
-- reifyᶜ⋆ : ∀ {Ξ Γ Δ} → Γ ⁏ Δ ⊩⋆ Ξ → Γ ⁏ Δ ⊢⋆ⁿᶠ Ξ
-- reifyᶜ⋆ {∅} ∙ = ∙
-- reifyᶜ⋆ {Ξ , A} (ts , t) = reifyᶜ⋆ ts , reifyᶜ t
-- reflectᶜ⋆ : ∀ {Ξ Γ Δ} → Γ ⁏ Δ ⊢⋆ⁿᵉ Ξ → Γ ⁏ Δ ⊩⋆ Ξ
-- reflectᶜ⋆ {∅} ∙ = ∙
-- reflectᶜ⋆ {Ξ , A} (ts , t) = reflectᶜ⋆ ts , reflectᶜ t
-- -- Reflexivity.
-- refl⊩⋆ : ∀ {Γ Δ} → Γ ⁏ Δ ⊩⋆ Γ
-- refl⊩⋆ = reflectᶜ⋆ refl⊢⋆ⁿᵉ
-- mrefl₀[⊢]⋆ : ∀ {Δ} → ∅ ⁏ Δ [⊢]⋆ Δ
-- mrefl₀[⊢]⋆ {∅} = ∙
-- mrefl₀[⊢]⋆ {Δ , A} = mono[⊢]⋆ (refl⊆ , weak⊆) mrefl₀[⊢]⋆ , mvar top
-- mrefl₀⊢⋆ⁿᵉ : ∀ {Δ} → ∅ ⁏ Δ ⊢⋆ⁿᵉ Δ
-- mrefl₀⊢⋆ⁿᵉ {∅} = ∙
-- mrefl₀⊢⋆ⁿᵉ {Γ , A} = mmono⊢⋆ⁿᵉ weak⊆ mrefl₀⊢⋆ⁿᵉ , mvarⁿᵉ top
-- mrefl₀⊩⋆ : ∀ {Δ} → ∅ ⁏ Δ ⊩⋆ Δ
-- mrefl₀⊩⋆ = reflectᶜ⋆ mrefl₀⊢⋆ⁿᵉ
-- -- Completeness with respect to all models, or quotation.
-- quot : ∀ {A Γ Δ} → Γ ⁏ Δ ⊨ A → Γ ⁏ Δ ⊢ⁿᶠ A
-- quot s = reifyᶜ (s refl⊩⋆ mrefl₀[⊢]⋆ mrefl₀⊩⋆)
-- -- Normalisation by evaluation.
-- norm : ∀ {A Γ Δ} → Γ ⁏ Δ ⊢ A → Γ ⁏ Δ ⊢ⁿᶠ A
-- norm = quot ∘ eval