module Generic.Zip where
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 indexed
open import rel
open import varlike
open import environment
open import Generic.Syntax
open import Generic.Semantics
module _ {I : Set} {X Y : List I → I → List I → Set} where
Zip : (d : Desc I) (R : (δ : List I) (i : I) → [ X δ i ⟶ Y δ i ⟶ κ Set ]) →
{i : I} → [ ⟦ d ⟧ X i ⟶ ⟦ d ⟧ Y i ⟶ κ Set ]
Zip (`∎ i′) R x y = ⊤
Zip (`X δ j d) R (r , x) (r' , y) = R δ j r r' × Zip d R x y
Zip (`σ A d) R (a , x) (a' , y) = Σ[ eq ∈ a' ≡ a ] Zip (d a) R x (rew eq y)
where rew = subst (λ a → ⟦ d a ⟧ _ _ _)
module _ {I : Set} {X Y T : List I → I → List I → Set}
{P : ∀ δ i → [ X δ i ⟶ Y δ i ⟶ κ Set ]} where
zip : (d : Desc I) {γ γ′ : List I}
{f : ∀ δ i → T δ i γ → X δ i γ′} {g : ∀ δ i → T δ i γ → Y δ i γ′}
(FG : ∀ δ i → (t : T δ i γ) → P δ i (f δ i t) (g δ i t)) →
{i : I} (t : ⟦ d ⟧ T i γ) → Zip d P (fmap d f t) (fmap d g t)
zip (`σ A d) FG (a , t) = refl , zip (d a) FG t
zip (`X δ i d) FG (r , t) = FG δ i r , zip d FG t
zip (`∎ i′) FG t = tt
module _ {I : Set} {X : List I → I → List I → Set}
{P : ∀ δ i → [ X δ i ⟶ X δ i ⟶ κ Set ]} where
refl^Zip : (refl^P : ∀ δ i {γ} (x : X δ i γ) → P δ i x x) →
(d : Desc I) {i : I} {γ : List I} (t : ⟦ d ⟧ X i γ) →
Zip d P t t
refl^Zip refl^P (`σ A d) (a , t) = refl , refl^Zip refl^P (d a) t
refl^Zip refl^P (`X δ i d) (r , t) = refl^P δ i r , refl^Zip refl^P d t
refl^Zip refl^P (`∎ i′) t = tt
sym^Zip : (sym^P : ∀ δ i {γ} {x y : X δ i γ} → P δ i x y → P δ i y x) →
(d : Desc I) {i : I} {γ : List I} {t u : ⟦ d ⟧ X i γ} →
Zip d P t u → Zip d P u t
sym^Zip sym^P (`σ A d) (refl , eq) = refl , sym^Zip sym^P (d _) eq
sym^Zip sym^P (`X δ i d) (prs , eq) = sym^P δ i prs , sym^Zip sym^P d eq
sym^Zip sym^P (`∎ i′) eq = tt
trans^Zip : (trans^P : ∀ δ i {γ} {x y z : X δ i γ} → P δ i x y → P δ i y z → P δ i x z)
(d : Desc I) {i : I} {γ : List I} {t u v : ⟦ d ⟧ X i γ} →
Zip d P t u → Zip d P u v → Zip d P t v
trans^Zip trans^P (`σ A d) (refl , t≈u) (refl , u≈v) =
refl , trans^Zip trans^P (d _) t≈u u≈v
trans^Zip trans^P (`X δ i d) (prs , t≈u) (psq , u≈v) =
trans^P δ i prs psq , trans^Zip trans^P d t≈u u≈v
trans^Zip trans^P (`∎ i′) _ _ = tt
module _ {I : Set} {𝓥₁ 𝓥₂ 𝓒 : I → List I → Set} (𝓡^𝓥 : Rel 𝓥₁ 𝓥₂) where
zip^reify : {Γ : List I} {vl^𝓥₁ : VarLike 𝓥₁} {vl^𝓥₂ : VarLike 𝓥₂}
(eq : (Δ : List I) (σ : I) {t₁ : Kripke 𝓥₁ 𝓒 Δ σ Γ} {t₂ : Kripke 𝓥₂ 𝓒 Δ σ Γ} →
Kripke^R 𝓡^𝓥 (mkRel _≡_) Δ σ t₁ t₂ →
reify vl^𝓥₁ Δ σ t₁ ≡ reify vl^𝓥₂ Δ σ t₂) →
(d : Desc I) {σ : I} {b₁ : ⟦ d ⟧ (Kripke 𝓥₁ 𝓒) σ Γ} {b₂ : ⟦ d ⟧ (Kripke 𝓥₂ 𝓒) σ Γ} →
Zip d (Kripke^R 𝓡^𝓥 (mkRel _≡_)) b₁ b₂ →
fmap {X = Kripke 𝓥₁ 𝓒} {Y = Scope 𝓒} d (reify vl^𝓥₁) b₁ ≡ fmap d (reify vl^𝓥₂) b₂
zip^reify eq (`σ A d) (refl , zp) = cong (_ ,_) (zip^reify eq (d _) zp)
zip^reify eq (`X δ i d) (r , zp) = cong₂ _,_ (eq δ i r) (zip^reify eq d zp)
zip^reify eq (`∎ i′) zp = uip _ _ where
uip : ∀ {A : Set} {a b : A} (p q : a ≡ b) → p ≡ q
uip refl refl = refl