{-# OPTIONS --rewriting #-}
module A201801.S4NewNormalisation2 where
open import A201801.Prelude
open import A201801.Category
open import A201801.List
open List²
open import A201801.ListLemmas
open import A201801.AllList
open import A201801.S4Propositions
open import A201801.S4StandardDerivations
open import A201801.S4NewBidirectionalDerivationsForNormalisation
import A201801.S4EmbeddingOfIPL as OfIPL
import A201801.S4ProjectionToIPL as ToIPL
import A201801.IPLPropositions as IPL
import A201801.IPLStandardDerivations as IPL
import A201801.IPLStandardNormalisation
--------------------------------------------------------------------------------
-- TODO: unfinished
-- open IPLNormalisation using (Model ; World ; Ground ; Explode ; _≥_ ; id≥ ; _∘≥_ ; relG)
-- -- record Model : Set₁
-- -- where
-- -- field
-- -- World : Set
-- --
-- -- -- TODO: Better name
-- -- Ground : World → String → Set
-- --
-- -- -- TODO: Better name
-- -- Explode : World → Prop → Set
-- --
-- -- _≥_ : World → World → Set
-- --
-- -- id≥ : ∀ {W} → W ≥ W
-- --
-- -- _∘≥_ : ∀ {W W′ W″} → W′ ≥ W → W″ ≥ W′
-- -- → W″ ≥ W
-- --
-- -- relG : ∀ {P W W′} → W′ ≥ W → Ground W P
-- -- → Ground W′ P
-- --
-- -- open Model {{...}}
-- --------------------------------------------------------------------------------
-- mutual
-- infix 3 _⊩_value
-- _⊩_value : ∀ {{_ : Model}} → World → Prop → Set
-- W ⊩ ι P value = Ground W P
-- W ⊩ A ⊃ B value = ∀ {W′} → W′ ≥ W → W′ ⊩ A thunk
-- → W′ ⊩ B thunk
-- W ⊩ □ A value = W ⊩ ⟪⊫ A ⟫ chunk
-- infix 3 _⊩_thunk
-- _⊩_thunk : ∀ {{_ : Model}} → World → Prop → Set
-- W ⊩ A thunk = ∀ {B W′} → W′ ≥ W → (∀ {W″} → W″ ≥ W′ → W″ ⊩ A value
-- → Explode W″ B)
-- → Explode W′ B
-- infix 3 _⊩_chunk
-- _⊩_chunk : ∀ {{_ : Model}} → World → Assert → Set
-- W ⊩ ⟪⊫ A ⟫ chunk = ∙ IPL.⊢ ToIPL.↓ₚ A true × W IPL.⊩ (ToIPL.↓ₚ A) value
-- infix 3 _⊩_allthunk
-- _⊩_allthunk : ∀ {{_ : Model}} → World → List Prop → Set
-- W ⊩ Γ allthunk = All (W ⊩_thunk) Γ
-- infix 3 _⊩_allchunk
-- _⊩_allchunk : ∀ {{_ : Model}} → World → List Assert → Set
-- W ⊩ Δ allchunk = All (W ⊩_chunk) Δ
-- --------------------------------------------------------------------------------
-- syn : ∀ {{_ : Model}} {A W} → W ⊩ ⟪⊫ A ⟫ chunk
-- → ∙ IPL.⊢ ToIPL.↓ₚ A true
-- syn (𝒟 , k) = 𝒟
-- syns : ∀ {{_ : Model}} {Δ W} → W ⊩ Δ allchunk
-- → ∙ IPL.⊢ ToIPL.↓ₐₛ Δ alltrue
-- syns ∙ = ∙
-- syns (_,_ {A = ⟪⊫ A ⟫} δ c) = syns δ , syn {A} c
-- sem : ∀ {{_ : Model}} {A W} → W ⊩ ⟪⊫ A ⟫ chunk
-- → W IPL.⊩ ToIPL.↓ₚ A value
-- sem (𝒟 , k) = k
-- --------------------------------------------------------------------------------
-- mutual
-- rel : ∀ {{_ : Model}} {A W W′} → W′ ≥ W → W ⊩ A value
-- → W′ ⊩ A value
-- rel {ι P} η 𝒟 = relG η 𝒟
-- rel {A ⊃ B} η f = \ η′ k → f (η ∘≥ η′) k
-- rel {□ A} η c = chrel {⟪⊫ A ⟫} η c
-- threl : ∀ {{_ : Model}} {A W W′} → W′ ≥ W → W ⊩ A thunk
-- → W′ ⊩ A thunk
-- threl η k = \ η′ f → k (η ∘≥ η′) f
-- chrel : ∀ {{_ : Model}} {A W W′} → W′ ≥ W → W ⊩ A chunk
-- → W′ ⊩ A chunk
-- chrel {⟪⊫ A ⟫} η c = syn {A} c , IPL.rel {ToIPL.↓ₚ A} η (sem {A} c)
-- threls : ∀ {{_ : Model}} {Γ W W′} → W′ ≥ W → W ⊩ Γ allthunk
-- → W′ ⊩ Γ allthunk
-- threls η γ = maps (\ {A} k {B} {W′} → threl {A} η (\ {C} {W″} → k {C} {W″})) γ -- NOTE: Annoying
-- chrels : ∀ {{_ : Model}} {Δ W W′} → W′ ≥ W → W ⊩ Δ allchunk
-- → W′ ⊩ Δ allchunk
-- chrels η δ = maps (\ {A} c → chrel {A} η c) δ
-- --------------------------------------------------------------------------------
-- return : ∀ {{_ : Model}} {A W} → W ⊩ A value
-- → W ⊩ A thunk
-- return {A} a = \ η f → f id≥ (rel {A} η a)
-- bind : ∀ {{_ : Model}} {A B W} → W ⊩ A thunk → (∀ {W′} → W′ ≥ W → W′ ⊩ A value
-- → W′ ⊩ B thunk)
-- → W ⊩ B thunk
-- bind k f = \ η f′ →
-- k η (\ η′ a →
-- f (η ∘≥ η′) a id≥ (\ η″ b →
-- f′ (η′ ∘≥ η″) b))
-- --------------------------------------------------------------------------------
-- infix 3 _⊨_valid[_]
-- _⊨_valid[_] : List Assert → Prop → List Prop → Set₁
-- Δ ⊨ A valid[ Γ ] = ∀ {{_ : Model}} {W} → W ⊩ Δ allchunk → W ⊩ Γ allthunk
-- → W ⊩ A thunk
-- ↓ : ∀ {Δ Γ A} → Δ ⊢ A valid[ Γ ]
-- → Δ ⊨ A valid[ Γ ]
-- ↓ (var i) δ γ = get γ i
-- ↓ (lam {A} {B} 𝒟) δ γ = return {A ⊃ B} (\ η k →
-- ↓ 𝒟 (chrels η δ) (threls η γ , k))
-- ↓ (app {A} {B} 𝒟 ℰ) δ γ = bind {A ⊃ B} {B} (↓ 𝒟 δ γ) (\ η f →
-- f id≥ (↓ ℰ (chrels η δ) (threls η γ)))
-- ↓ (mvar {A} i) δ γ = {!sem {A} (get δ i)!}
-- ↓ (box {A} 𝒟) δ γ = {!!} -- return {□ A} (IPL.sub (syns δ) (ToIPL.↓ 𝒟) , ↓ 𝒟 δ ∙)
-- ↓ (letbox {A} {B} 𝒟 ℰ) δ γ = bind {□ A} {B} (↓ 𝒟 δ γ) (\ η c →
-- ↓ ℰ (chrels η δ , c) (threls η γ))
-- --------------------------------------------------------------------------------
-- -- ren² : ∀ {Δ Δ′ Γ Γ′ A} → Δ′ ⨾ Γ′ ⊇² Δ ⨾ Γ → Δ ⊢ A neutral[ Γ ]
-- -- → Δ′ ⊢ A neutral[ Γ′ ]
-- -- ren² (η₁ , η₂) 𝒟 = mrenᵣ η₁ (renᵣ η₂ 𝒟)
-- -- instance
-- -- canon : Model
-- -- canon = record
-- -- { World = List² Assert Prop
-- -- ; Ground = \ { (Δ ⨾ Γ) P → Δ ⊢ ι P neutral[ Γ ] }
-- -- ; Explode = \ { (Δ ⨾ Γ) A → Δ ⊢ A normal[ Γ ] }
-- -- ; _≥_ = _⊇²_
-- -- ; id≥ = id
-- -- ; _∘≥_ = _∘_
-- -- ; relG = ren²
-- -- }
-- -- mutual
-- -- ⇓ : ∀ {A Δ Γ} → Δ ⊢ A neutral[ Γ ]
-- -- → Δ ⨾ Γ ⊩ A thunk
-- -- ⇓ {ι P} 𝒟 = return {ι P} 𝒟
-- -- ⇓ {A ⊃ B} 𝒟 = return {A ⊃ B} (\ η k → ⇓ (app (ren² η 𝒟) (⇑ k)))
-- -- ⇓ {□ A} 𝒟 = \ η f → {!!}
-- -- -- letbox (ren² η 𝒟) (f (drop₁ id) (mvz , ⇓ mvzᵣ))
-- -- ⇑ : ∀ {A Δ Γ} → Δ ⨾ Γ ⊩ A thunk
-- -- → Δ ⊢ A normal[ Γ ]
-- -- ⇑ {ι P} k = k id (\ η 𝒟 → use 𝒟)
-- -- ⇑ {A ⊃ B} k = k id (\ η f → lam (⇑ (f (drop₂ id) (⇓ vzᵣ))))
-- -- ⇑ {□ A} k = k id (\ η c → {!box (syn {A} c)!})
-- -- --------------------------------------------------------------------------------
-- -- swks : ∀ {A Δ Γ Ξ} → Δ ⨾ Γ ⊩ Ξ allthunk
-- -- → Δ ⨾ Γ , A ⊩ Ξ allthunk
-- -- swks ξ = threls (drop₂ id) ξ
-- -- slifts : ∀ {A Δ Γ Ξ} → Δ ⨾ Γ ⊩ Ξ allthunk
-- -- → Δ ⨾ Γ , A ⊩ Ξ , A allthunk
-- -- slifts ξ = swks ξ , ⇓ vzᵣ
-- -- svars : ∀ {Δ Γ Γ′} → Γ′ ⊇ Γ
-- -- → Δ ⨾ Γ′ ⊩ Γ allthunk
-- -- svars done = ∙
-- -- svars (drop η) = swks (svars η)
-- -- svars (keep η) = slifts (svars η)
-- -- sids : ∀ {Δ Γ} → Δ ⨾ Γ ⊩ Γ allthunk
-- -- sids = svars id
-- -- --------------------------------------------------------------------------------
-- -- smwks : ∀ {A Δ Γ Ξ} → Δ ⨾ Γ ⊩ Ξ allchunk
-- -- → Δ , A ⨾ Γ ⊩ Ξ allchunk
-- -- smwks ξ = chrels (drop₁ id) ξ
-- -- smlifts : ∀ {A Δ Γ Ξ} → Δ ⨾ Γ ⊩ Ξ allchunk
-- -- → Δ , A ⨾ Γ ⊩ Ξ , A allchunk
-- -- smlifts ξ = {!!} -- smwks ξ , (mvz , ⇓ mvzᵣ)
-- -- smvars : ∀ {Δ Δ′ Γ} → Δ′ ⊇ Δ
-- -- → Δ′ ⨾ Γ ⊩ Δ allchunk
-- -- smvars done = ∙
-- -- smvars (drop η) = smwks (smvars η)
-- -- smvars (keep η) = smlifts (smvars η)
-- -- smids : ∀ {Δ Γ} → Δ ⨾ Γ ⊩ Δ allchunk
-- -- smids = smvars id
-- -- --------------------------------------------------------------------------------
-- -- ↑ : ∀ {Δ Γ A} → Δ ⊨ A valid[ Γ ]
-- -- → Δ ⊢ A normal[ Γ ]
-- -- ↑ f = ⇑ (f smids sids)
-- -- nm : ∀ {Δ Γ A} → Δ ⊢ A valid[ Γ ]
-- -- → Δ ⊢ A normal[ Γ ]
-- -- nm 𝒟 = ↑ (↓ 𝒟)
-- -- --------------------------------------------------------------------------------