{-# OPTIONS --safe --sized-types #-}
module Generic.Fundamental where
open import Size
open import Agda.Builtin.List
open import Data.Unit
open import Data.Product
open import Function
open import Relation.Unary hiding (Pred)
open import Relation.Binary.PropositionalEquality
open import Data.Var
open import Data.Pred as P using (Pred; pred; lookupᴾ)
open import Data.Relation as R using (Rel; rel; lookupᴿ)
open import Data.Var.Varlike
open import Data.Environment
open import Generic.Syntax
open import Generic.Semantics
open import Generic.Semantics.Unit
open import Generic.Relator
open import Generic.Simulation
private
variable
I : Set
i : I
Γ Δ : List I
T 𝓥 𝓒 : I ─Scoped
Tᴾ : Pred T
X : List I → I ─Scoped
fromPred : Pred {I} T → Rel T Unit
rel (fromPred Tᴾ) = λ σ t _ → pred Tᴾ σ t
fromPred∀ : ∀ {ρ : (Γ ─Env) T Δ} {ρ′} → P.All Tᴾ _ ρ → R.All (fromPred Tᴾ) _ ρ ρ′
lookupᴿ (fromPred∀ ρᴾ) k = lookupᴾ ρᴾ k
fromRel∀ : ∀ {ρ : (Γ ─Env) T Δ} {ρ′} → R.All (fromPred Tᴾ) _ ρ ρ′ → P.All Tᴾ _ ρ
lookupᴾ (fromRel∀ ρᴿ) k = lookupᴿ ρᴿ k
All : (d : Desc I) (Xᴾ : ∀ Δ i → ∀[ X Δ i ⇒ const Set ]) (v : ⟦ d ⟧ X i Γ) → Set
All (`σ A d) Xᴾ (a , v) = All (d a) Xᴾ v
All (`X Δ j d) Xᴾ (r , v) = Xᴾ Δ j r × All d Xᴾ v
All (`∎ i) Xᴾ v = ⊤
module _ (𝓥ᴾ : Pred {I} 𝓥) (𝓒ᴾ : Pred {I} 𝓒) where
fromKripkeᴿ : ∀ Δ j {k₂} {k₁ : Kripke 𝓥 𝓒 Δ j Γ} →
Kripkeᴿ (fromPred 𝓥ᴾ) (fromPred 𝓒ᴾ) Δ j k₁ k₂ → Kripkeᴾ 𝓥ᴾ 𝓒ᴾ Δ j k₁
fromKripkeᴿ [] j kᴿ = kᴿ
fromKripkeᴿ Δ@(_ ∷ _) j kᴿ = λ ρ vsᴾ → kᴿ ρ (fromPred∀ vsᴾ)
fromRelator : ∀ (d : Desc I) {v : ⟦ d ⟧ (Kripke 𝓥 𝓒) i Γ} {w : ⟦ d ⟧ (Kripke Unit Unit) i Γ} →
⟦ d ⟧ᴿ (Kripkeᴿ (fromPred 𝓥ᴾ) (fromPred 𝓒ᴾ)) v w → All d (Kripkeᴾ 𝓥ᴾ 𝓒ᴾ) v
fromRelator (`σ A d) (refl , v) = fromRelator (d _) v
fromRelator (`X Δ j d) (r , v) = fromKripkeᴿ Δ j r , fromRelator d v
fromRelator (`∎ eq) _ = _
record Fundamental
(d : Desc I) (𝓢 : Semantics d 𝓥 𝓒)
(𝓥ᴾ : Pred 𝓥) (𝓒ᴾ : Pred 𝓒): Set where
module 𝓢 = Semantics 𝓢
field thᴾ : ∀ {v} (ρ : Thinning Γ Δ) → pred 𝓥ᴾ i v → pred 𝓥ᴾ i (𝓢.th^𝓥 v ρ)
varᴾ : ∀ {v : 𝓥 i Γ} → pred 𝓥ᴾ i v → pred 𝓒ᴾ i (𝓢.var v)
algᴾ : ∀ {s} {ρ : (Γ ─Env) 𝓥 Δ}
(b : ⟦ d ⟧ (Scope (Tm d s)) i Γ) → let v = fmap d (Semantics.body 𝓢 ρ) b in
(ρᴾ : P.All 𝓥ᴾ _ ρ) →
All d (Kripkeᴾ 𝓥ᴾ 𝓒ᴾ) v → pred 𝓒ᴾ i (𝓢.alg v)
sim : Simulation d 𝓢 SemUnit (fromPred 𝓥ᴾ) (fromPred 𝓒ᴾ)
Simulation.thᴿ sim = thᴾ
Simulation.varᴿ sim = varᴾ
Simulation.algᴿ sim = λ b ρᴿ zp → algᴾ b (fromRel∀ ρᴿ) (fromRelator _ _ d zp)
fundamental : ∀ {s} {ρ : (Γ ─Env) 𝓥 Δ} → P.All 𝓥ᴾ _ ρ →
(t : Tm d s i Γ) → pred 𝓒ᴾ i (Semantics.semantics 𝓢 ρ t)
fundamental ρᴾ t = Simulation.sim sim (fromPred∀ ρᴾ) t