module Uniform.Constructions.Product
(C : Set1)(HomC : C -> C -> Set)
(idC : (c : C) -> HomC c c)
(_∘C_ : {a b c : C} -> HomC b c -> HomC a b -> HomC a c)
where
open import Data.Product as P
open import Function
import Uniform.posIR
open Uniform.posIR C HomC idC _∘C_
infixl 2 _×IR[_,_]_
mutual
replace-ι : {Γ : Ctxt} ->
(G : C -> C -> C)
(Gmor : ∀ {a b a' b'} -> (f : HomC a b)(g : HomC a' b')
-> HomC (G a a') (G b b')) ->
IR' Γ -> (Env Γ -> C) -> IR' Γ
replace-ι G Gmor (ι c') c = ι (λ e → G (c' e) (c e))
replace-ι G Gmor (σ A γ) c = σ A (replace-ι G Gmor γ (c ∘ proj₁))
replace-ι G Gmor (δ A γ γ→) c
= δ A (replace-ι G Gmor γ (λ { (x , g) → c x }))
(replace-ι-mor (idC _) ∘ γ→)
replace-ι-mor : {Γ Δ : Ctxt} ->
{G : C -> C -> C}
{Gmor : ∀{a b a' b'} -> (f : HomC a b)(g : HomC a' b')
-> HomC (G a a') (G b b')} ->
{e : Env Γ}{e' : Env Δ}{γ : IR' Γ}{ψ : IR' Δ} ->
{c : Env Γ -> C}{c' : Env Δ -> C} ->
HomC (c e) (c' e') -> Hom' e e' γ ψ ->
Hom' e e' (replace-ι G Gmor γ c) (replace-ι G Gmor ψ c')
replace-ι-mor {Gmor = Gmor} h (ι→ι f) = ι→ι (Gmor f h)
replace-ι-mor h (σ→σ f g) = σ→σ f (replace-ι-mor h ∘ g)
replace-ι-mor h (δ→δ f g) = δ→δ f (replace-ι-mor h ∘ g)
syntax replace-ι G Gmor γ c = γ [ιx↦ι[ G , Gmor ][ c ,x]]
mutual
_×IR[_,_]_ : {Γ : Ctxt} ->
IR' Γ ->
(G : C -> C -> C) ->
(Gmor : ∀{a b a' b'} -> (f : HomC a b)(g : HomC a' b')
-> HomC (G a a') (G b b')) ->
IR' Γ -> IR' Γ
(ι c) ×IR[ G , Gmor ] ψ = ψ [ιx↦ι[ G , Gmor ][ c ,x]]
(σ A γ) ×IR[ G , Gmor ] ψ = σ A (γ ×IR[ G , Gmor ] (IRwkσ ψ))
_×IR[_,_]_ {Γ} (δ A γ γ→) G Gmor ψ
= δ A (γ ×IR[ G , Gmor ] (IRwkδ ψ))
(λ {e} {f} {g} η → _×IR[_,_]-mor_ {Γ' = Γ ,δ A} {Γ'' = Γ ,δ A}
{e'' = e , g} {γ' = γ}
(γ→ η) G Gmor
(HomcMor _ _ (idIR' ψ)))
_×IR[_,_]-mor_ : {Γ Γ' Γ'' : Ctxt} ->
{e e' : Env Γ}{e'' : Env Γ'}
{γ : IR' Γ}{γ' : IR' Γ}{ψ ψ' : IR' Γ} ->
Hom' e e' γ γ ->
(G : C -> C -> C) ->
(Gmor : ∀{a b a' b'} -> (f : HomC a b)(g : HomC a' b')
-> HomC (G a a') (G b b')) ->
Hom' e e' ψ ψ' ->
Hom' e e' (γ ×IR[ G , Gmor ] ψ) (γ ×IR[ G , Gmor ] ψ')
(ι→ι f) ×IR[ G , Gmor ]-mor h = replace-ι-mor f h
_×IR[_,_]-mor_ {Γ' = Γ'} {Γ''} {e'' = e''} {σ A γ} (σ→σ f g) G Gmor h
= σ→σ f (λ x → _×IR[_,_]-mor_ {Γ' = Γ'} {Γ''} {e'' = e''} {γ' = γ} (g x) G Gmor (HomcMor _ _ h))
_×IR[_,_]-mor_ {Γ' = Γ'} {Γ''} {e'' = e''} {δ A γ γ→} (δ→δ f g) G Gmor h
= δ→δ f (λ k → _×IR[_,_]-mor_ {Γ' = Γ'} {Γ''} {e'' = e''} {γ' = γ} (g k) G Gmor (HomcMor _ _ h))