module rel where open import Size open import Data.Sum open import Data.List.Base hiding (lookup ; [_]) open import indexed open import var hiding (_<$>_) open import environment open import Generic.Syntax open import Agda.Builtin.Equality record Rel {I : Set} (T U : I ─Scoped) : Set₁ where constructor mkRel field rel : {i : I} → [ T i ⟶ U i ⟶ κ Set ] open Rel public module _ {I : Set} {T U : I ─Scoped} where record ∀[_] (𝓡 : Rel T U) {Γ Δ : List I} (ρ₁ : (Γ ─Env) T Δ) (ρ₂ : (Γ ─Env) U Δ) : Set where constructor pack^R field lookup^R : ∀ {i} k → rel 𝓡 {i} (lookup ρ₁ k) (lookup ρ₂ k) open ∀[_] public module _ {I : Set} {T U : I ─Scoped} {𝓡 : Rel T U} {Δ : List I} where ε^R : {ρ₁ : ([] ─Env) T Δ} {ρ₂ : ([] ─Env) U Δ} → ∀[ 𝓡 ] ρ₁ ρ₂ lookup^R ε^R () module _ {I : Set} {T U : I ─Scoped} {𝓡 : Rel T U} {Γ Δ : List I} where _∙^R_ : {ρ₁ : (Γ ─Env) T Δ} {ρ₂ : (Γ ─Env) U Δ} → ∀[ 𝓡 ] ρ₁ ρ₂ → {i : I} {v₁ : T i Δ} {v₂ : U i Δ} → rel 𝓡 v₁ v₂ → ∀[ 𝓡 ] (ρ₁ ∙ v₁) (ρ₂ ∙ v₂) lookup^R (ρ ∙^R v) z = v lookup^R (ρ ∙^R v) (s k) = lookup^R ρ k _>>^R_ : {Γ′ : List I} {ρ₁ : (Γ ─Env) T Δ} {ρ₂ : (Γ ─Env) U Δ} → ∀[ 𝓡 ] ρ₁ ρ₂ → {ρ₁′ : (Γ′ ─Env) T Δ} {ρ₂′ : (Γ′ ─Env) U Δ} → ∀[ 𝓡 ] ρ₁′ ρ₂′ → ∀[ 𝓡 ] (ρ₁ >> ρ₁′) (ρ₂ >> ρ₂′) lookup^R (_>>^R_ ρ^R ρ′^R) k with split Γ k ... | inj₁ k₁ = lookup^R ρ^R k₁ ... | inj₂ k₂ = lookup^R ρ′^R k₂ _<$>^R_ : {Θ : List I} {f : {i : I} → T i Δ → T i Θ} {g : {i : I} → U i Δ → U i Θ} → ({i : I} {t : T i Δ} {u : U i Δ} → rel 𝓡 t u → rel 𝓡 (f t) (g u)) → {ρ₁ : (Γ ─Env) T Δ} {ρ₂ : (Γ ─Env) U Δ} → ∀[ 𝓡 ] ρ₁ ρ₂ → ∀[ 𝓡 ] (f <$> ρ₁) (g <$> ρ₂) lookup^R (F <$>^R ρ) k = F (lookup^R ρ k) module _ {I : Set} where Eq^R : {A : I ─Scoped} → Rel A A rel Eq^R = _≡_ open import Relation.Binary.HeterogeneousEquality.Core HEq^R : {A B : I ─Scoped} → Rel A B rel HEq^R = λ a b → a ≅ b module _ {I : Set} {d : Desc I} where VarTm^R : Rel Var (Tm d ∞) rel VarTm^R v t = `var v ≡ t