{-# OPTIONS --safe --sized-types #-}
module Generic.Relator where
open import Axiom.UniquenessOfIdentityProofs.WithK
open import Size
open import Data.Unit
open import Data.List hiding ([_] ; zip)
open import Data.Product hiding (zip)
open import Relation.Binary.PropositionalEquality hiding ([_])
open import Function
open import Relation.Unary
open import Data.Var
open import Data.Var.Varlike
open import Data.Environment
open import Generic.Syntax
open import Generic.Semantics
private
variable
I : Set
T X Y Z : List I → I ─Scoped
γ δ θ : List I
σ τ : I
𝓥 𝓦 𝓒 : I ─Scoped
⟦_⟧ᴿ : (d : Desc I) → (∀ Δ σ → ∀[ X Δ σ ⇒ Y Δ σ ⇒ const Set ])
→ ∀[ ⟦ d ⟧ X σ ⇒ ⟦ d ⟧ Y σ ⇒ const Set ]
⟦ `∎ j ⟧ᴿ R x y = ⊤
⟦ `X Δ j d ⟧ᴿ R (r , x) (r' , y) = R Δ j r r' × ⟦ d ⟧ᴿ R x y
⟦ `σ A d ⟧ᴿ R (a , x) (a' , y) = Σ (a' ≡ a) (λ where refl → ⟦ d a ⟧ᴿ R x y)
module _
{R : ∀ θ σ → ∀[ X θ σ ⇒ Y θ σ ⇒ const Set ]}
{f : ∀ θ σ → T θ σ γ → X θ σ δ}
{g : ∀ θ σ → T θ σ γ → Y θ σ δ}
where
liftᴿ : ∀ d (FG : ∀ θ σ t → R θ σ (f θ σ t) (g θ σ t)) →
∀ (t : ⟦ d ⟧ T σ γ) → ⟦ d ⟧ᴿ R (fmap d f t) (fmap d g t)
liftᴿ (`σ A d) FG (a , t) = refl , liftᴿ (d a) FG t
liftᴿ (`X j Δ d) FG (x , t) = FG j Δ x , liftᴿ d FG t
liftᴿ (`∎ j) FG refl = tt
module _ {R : ∀ θ σ → ∀[ X θ σ ⇒ X θ σ ⇒ const Set ]} where
reflᴿ : ∀ d (re : ∀ θ σ (x : X θ σ γ) → R θ σ x x) →
(t : ⟦ d ⟧ X σ γ) → ⟦ d ⟧ᴿ R t t
reflᴿ (`σ A d) re (a , t) = refl , reflᴿ (d a) re t
reflᴿ (`X j Δ d) re (x , t) = re j Δ x , reflᴿ d re t
reflᴿ (`∎ j) re refl = tt
module _ {R : ∀ θ σ → ∀[ X θ σ ⇒ Y θ σ ⇒ const Set ]}
{S : ∀ θ σ → ∀[ Y θ σ ⇒ X θ σ ⇒ const Set ]}
where
symᴿ : ∀ d (sy : ∀ θ σ {x : X θ σ γ} {y} → R θ σ x y → S θ σ y x) →
∀ {t : ⟦ d ⟧ X σ γ} {u} → ⟦ d ⟧ᴿ R t u → ⟦ d ⟧ᴿ S u t
symᴿ (`σ A d) sy (refl , t) = refl , symᴿ (d _) sy t
symᴿ (`X j Δ d) sy (r , t) = sy j Δ r , symᴿ d sy t
symᴿ (`∎ j) sy tt = tt
module _ {R : ∀ θ σ → ∀[ X θ σ ⇒ Y θ σ ⇒ const Set ]}
{S : ∀ θ σ → ∀[ Y θ σ ⇒ Z θ σ ⇒ const Set ]}
{RS : ∀ θ σ → ∀[ X θ σ ⇒ Z θ σ ⇒ const Set ]}
where
transᴿ : ∀ d (tr : ∀ θ σ {x : X θ σ γ} {y z} → R θ σ x y → S θ σ y z → RS θ σ x z) →
∀ {t : ⟦ d ⟧ X σ γ} {u v} → ⟦ d ⟧ᴿ R t u → ⟦ d ⟧ᴿ S u v → ⟦ d ⟧ᴿ RS t v
transᴿ (`σ A d) tr (refl , t) (refl , u) = refl , transᴿ (d _) tr t u
transᴿ (`X j Δ d) tr (x , t) (y , u) = tr j Δ x y , transᴿ d tr t u
transᴿ (`∎ j) tr tt tt = tt
open import Data.Relation
module _ (𝓥ᴿ : Rel {I} 𝓥 𝓦) {vl^𝓥 : VarLike 𝓥} {vl^𝓦 : VarLike 𝓦} where
reifyᴿ : ∀ d (re : ∀ θ σ {v : Kripke 𝓥 𝓒 θ σ γ} {w} →
Kripkeᴿ 𝓥ᴿ Eqᴿ θ σ v w →
reify vl^𝓥 θ σ v ≡ reify vl^𝓦 θ σ w) →
∀ {bv : ⟦ d ⟧ (Kripke 𝓥 𝓒) σ γ} {bw : ⟦ d ⟧ (Kripke 𝓦 𝓒) σ γ} →
⟦ d ⟧ᴿ (Kripkeᴿ 𝓥ᴿ Eqᴿ) bv bw →
(⟦ d ⟧ (Scope 𝓒) σ γ ∋ fmap d (reify vl^𝓥) bv) ≡ fmap d (reify vl^𝓦) bw
reifyᴿ (`σ A d) re (refl , t) = cong -,_ (reifyᴿ (d _) re t)
reifyᴿ (`X j Δ d) re (x , t) = cong₂ _,_ (re j Δ x) (reifyᴿ d re t)
reifyᴿ (`∎ j) re tt = uip _ _