{-# OPTIONS --safe --sized-types #-}
module Data.Relation where
open import Size
open import Data.Sum
open import Data.List.Base hiding (lookup ; [_])
open import Data.Var hiding (_<$>_)
open import Data.Environment
open import Generic.Syntax
open import Relation.Unary hiding (U)
open import Agda.Builtin.Equality
open import Function
private
variable
I : Set
σ : I
T U : I ─Scoped
𝓥ᴬ 𝓥ᴮ : I ─Scoped
Γ Δ : List I
record Rel (T U : I ─Scoped) : Set₁ where
constructor mkRel
field rel : ∀ σ → ∀[ T σ ⇒ U σ ⇒ const Set ]
open Rel public
record All (𝓥ᴿ : Rel 𝓥ᴬ 𝓥ᴮ) (Γ : List I)
(ρᴬ : (Γ ─Env) 𝓥ᴬ Δ) (ρᴮ : (Γ ─Env) 𝓥ᴮ Δ) : Set where
constructor packᴿ
field lookupᴿ : ∀ k → rel 𝓥ᴿ σ (lookup ρᴬ k) (lookup ρᴮ k)
open All public
module _ {T U : I ─Scoped} {𝓡 : Rel T U} where
private
variable
ρᵀ σᵀ : (Γ ─Env) T Δ
ρᵁ σᵁ : (Γ ─Env) U Δ
vᵀ : T σ Γ
vᵁ : U σ Γ
fᵀ : ∀ {i} → T i Γ → T i Δ
fᵁ : ∀ {i} → U i Γ → U i Δ
εᴿ : All 𝓡 [] ρᵀ ρᵁ
lookupᴿ εᴿ ()
infixl 20 _∙ᴿ_ _∷ᴿ_
_∙ᴿ_ : All 𝓡 Γ ρᵀ ρᵁ → rel 𝓡 σ vᵀ vᵁ → All 𝓡 (σ ∷ Γ) (ρᵀ ∙ vᵀ) (ρᵁ ∙ vᵁ)
lookupᴿ (ρ ∙ᴿ v) z = v
lookupᴿ (ρ ∙ᴿ v) (s k) = lookupᴿ ρ k
_∷ᴿ_ : rel 𝓡 σ (lookup ρᵀ z) (lookup ρᵁ z) →
(∀ {σ} (v : Var σ Γ) → rel 𝓡 _ (lookup ρᵀ (s v)) (lookup ρᵁ (s v))) →
All 𝓡 (σ ∷ Γ) ρᵀ ρᵁ
lookupᴿ (v ∷ᴿ ρ) z = v
lookupᴿ (v ∷ᴿ ρ) (s k) = ρ k
_>>ᴿ_ : All 𝓡 Γ ρᵀ ρᵁ → All 𝓡 Δ σᵀ σᵁ →
All 𝓡 (Γ ++ Δ) (ρᵀ >> σᵀ) (ρᵁ >> σᵁ)
lookupᴿ (_>>ᴿ_ {Γ} ρᴿ σᴿ) k with split Γ k
... | inj₁ k₁ = lookupᴿ ρᴿ k₁
... | inj₂ k₂ = lookupᴿ σᴿ k₂
selectᴿ : ∀ ρ → All 𝓡 Δ ρᵀ ρᵁ → All 𝓡 Γ (select ρ ρᵀ) (select ρ ρᵁ)
lookupᴿ (selectᴿ ρ ρᴿ) k = lookupᴿ ρᴿ (lookup ρ k)
_<$>ᴿ_ : (∀ {i t u} → rel 𝓡 i t u → rel 𝓡 i (fᵀ t) (fᵁ u)) →
All 𝓡 Γ ρᵀ ρᵁ → All 𝓡 Γ (fᵀ <$> ρᵀ) (fᵁ <$> ρᵁ)
lookupᴿ (F <$>ᴿ ρ) k = F (lookupᴿ ρ k)
module _ {T : I ─Scoped} where
private
variable
ρ : (Γ ─Env) T Δ
Eqᴿ : Rel T T
rel Eqᴿ i = _≡_
reflᴿ : All Eqᴿ Γ ρ ρ
lookupᴿ reflᴿ k = refl
module _ {A B : I ─Scoped} where
open import Relation.Binary.HeterogeneousEquality.Core
HEqᴿ : Rel A B
rel HEqᴿ i = λ a b → a ≅ b
module _ {d : Desc I} where
VarTmᴿ : Rel Var (Tm d ∞)
rel VarTmᴿ i v t = `var v ≡ t