{-# OPTIONS --allow-unsolved-metas --sized-types #-}

module A201607.WIP2.BasicIS4.Semantics.Sketch7 where

open import A201607.Common.Semantics public
open import A201607.BasicIS4.Syntax.Common public


record Model : Set₁ where
  field
    World : Set

    -- Zero : World

    _L_    : World → World → Set
    reflL  : ∀ {w} → w L w
    transL : ∀ {w w′ w″} → w L w′ → w′ L w″ → w L w″
    -- botL   : ∀ {w} → Zero L w

    _R_    : World → World → Set
    reflR  : ∀ {w} → w R w
    transR : ∀ {w w′ w″} → w R w′ → w′ R w″ → w R w″
    -- botR   : ∀ {w} → Zero R w

    _[⊢]_   : World → Ty → Set
    mono[⊢] : ∀ {A w w′} → w L w′ × w R w′ → w [⊢] A → w′ [⊢] A

    _[⊢ⁿᶠ]_ : World → Ty → Set

    _⊪ᵅ_   : World → Atom → Set
    mono⊪ᵅ : ∀ {P w w′} → w L w′ × w R w′ → w ⊪ᵅ P → w′ ⊪ᵅ P

  _≤_ : World → World → Set
  w ≤ w′ = w L w′ × w R w′

  refl≤ : ∀ {w} → w ≤ w
  refl≤ = reflL , reflR

  trans≤ : ∀ {w w′ w″} → w ≤ w′ → w′ ≤ w″ → w ≤ w″
  trans≤ (η , θ) (η′ , θ′) = transL η η′ , transR θ θ′

  -- bot≤ : ∀ {w} → Zero ≤ w
  -- bot≤ = botL , botR

  _≤⨾R_ : World → World → Set
  _≤⨾R_ = _≤_ ⨾ _R_

  -- _R⨾≤_ : World → World → Set
  -- _R⨾≤_ = _R_ ⨾ _≤_

  -- refl≤⨾R : ∀ {w} → w ≤⨾R w
  -- refl≤⨾R {w} = w , (refl≤ , reflR)

  -- reflR⨾≤ : ∀ {w} → w R⨾≤ w
  -- reflR⨾≤ {w} = w , (reflR , refl≤)

  ≤⨾R→R : ∀ {v′ w} → w ≤⨾R v′ → w R v′
  ≤⨾R→R (w′ , ((η , θ) , θ′)) = transR θ θ′

  -- R⨾≤→R : ∀ {w v′} → w R⨾≤ v′ → w R v′
  -- R⨾≤→R (v , (θ , (η , θ′))) = transR θ θ′

  -- ≤⨾R→R⨾≤ : ∀ {w′ w} → w ≤⨾R w′ → w R⨾≤ w′
  -- ≤⨾R→R⨾≤ {w′} ξ,θ = w′ , (≤⨾R→R ξ,θ , refl≤)

  -- transR⨾≤ : ∀ {w′ w w″} → w R⨾≤ w′ → w′ R⨾≤ w″ → w R⨾≤ w″
  -- transR⨾≤ {w′} (v , (θ , ξ)) (v′ , (θ′ , ξ′)) = let v″ , (θ″ , ξ″) = ≤⨾R→R⨾≤ (w′ , (ξ , θ′))
  --                                                in  v″ , (transR θ θ″ , trans≤ ξ″ ξ′)

  ≤→R : ∀ {v′ w} → w ≤ v′ → w R v′
  ≤→R {v′} ξ = ≤⨾R→R (v′ , (ξ , reflR))

  -- R⨾≤→≤⨾R : ∀ {w v′} → w R⨾≤ v′ → w ≤⨾R v′
  -- R⨾≤→≤⨾R {w} θ,ξ = w , (refl≤ , R⨾≤→R θ,ξ)

  -- trans≤⨾R : ∀ {w′ w w″} → w ≤⨾R w′ → w′ ≤⨾R w″ → w ≤⨾R w″
  -- trans≤⨾R {w′} (v , (ξ , θ)) (v′ , (ξ′ , θ′)) = let v″ , (ξ″ , θ″) = R⨾≤→≤⨾R (w′ , (θ , ξ′))
  --                                                in  v″ , (trans≤ ξ ξ″ , transR θ″ θ′)

  -- ≤→R′ : ∀ {w v′} → w ≤ v′ → w R v′
  -- ≤→R′ {w} ξ = R⨾≤→R (w , (reflR , ξ))

  -- _≤⊓R_ : World → World → Set
  -- _≤⊓R_ = _≤_ ⊓ _R_

  -- _R⊓≤_ : World → World → Set
  -- _R⊓≤_ = _R_ ⊓ _≤_

  -- ≤⊓R→R⊓≤ : ∀ {w′ v} → w′ ≤⊓R v → v R⊓≤ w′
  -- ≤⊓R→R⊓≤ (w , (ξ , θ)) = w , (θ , ξ)

  -- R⊓≤→≤⊓R : ∀ {w′ v} → v R⊓≤ w′ → w′ ≤⊓R v
  -- R⊓≤→≤⊓R (w , (θ , ξ)) = w , (ξ , θ)

  -- infix 3 _≤⊔R_
  -- _≤⊔R_ : World → World → Set
  -- _≤⊔R_ = _≤_ ⊔ _R_

  -- infix 3 _R⊔≤_
  -- _R⊔≤_ : World → World → Set
  -- _R⊔≤_ = _R_ ⊔ _≤_

  -- ≤⊔R→R⊔≤ : ∀ {w′ v} → w′ ≤⊔R v → v R⊔≤ w′
  -- ≤⊔R→R⊔≤ (v′ , (ξ , θ)) = v′ , (θ , ξ)

  -- R⊔≤→≤⊔R : ∀ {w′ v} → v R⊔≤ w′ → w′ ≤⊔R v
  -- R⊔≤→≤⊔R (v′ , (θ , ξ)) = v′ , (ξ , θ)

  -- ≤⊓R→≤⊔R : ∀ {v w′} → w′ ≤⊓R v → v ≤⊔R w′
  -- ≤⊓R→≤⊔R {v} {w′} (w , ((η , θ) , θ′)) = {!!} , ({!!} , {!!})

  -- ≤⊔R→≤⊓R : ∀ {w′ v} → v ≤⊔R w′ → w′ ≤⊓R v
  -- ≤⊔R→≤⊓R (v′ , ((η , θ) , θ′)) = Zero , (bot≤ , botR)

open Model {{…}} public


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′ L {!w!} → w R w′ → w′ [⊢] A × w′ ⊩ 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