{-# OPTIONS --prop --rewriting #-}
module morphism where
open import lib
open import model
record CwF→ {i}{i'}{j}{j'}{k}{k'}{l}{l'} (C : CwF {i}{j}{k}{l}) (D : CwF {i'}{j'}{k'}{l'})
: Set (i ⊔ j ⊔ k ⊔ l ⊔ i' ⊔ j' ⊔ k' ⊔ l') where
module C = CwF C
module D = CwF D
field
Con→ : C.Con → D.Con
Sub→ : ∀ {Γ Δ} → C.Sub Δ Γ → D.Sub (Con→ Δ) (Con→ Γ)
∘→ : ∀ {Γ Δ} (γ : C.Sub Δ Γ) {Θ} (δ : C.Sub Θ Δ) → Sub→ (γ C.∘ δ) ~ (Sub→ γ) D.∘ (Sub→ δ)
id→ : ∀ {Γ} → Sub→ (C.id {Γ = Γ}) ~ D.id {Γ = Con→ Γ}
◇→ : Con→ (C.◇) ~ D.◇
ε→ : ∀ {Γ} → Sub→ (C.ε {Γ = Γ}) ~ D.ε {Γ = Con→ Γ}
Ty→ : ∀ {Γ} → C.Ty Γ → D.Ty (Con→ Γ)
[→]T : ∀ {Γ} (A : C.Ty Γ) {Δ} (γ : C.Sub Δ Γ) → Ty→ (A C.[ γ ]T) ~ (Ty→ A) D.[ Sub→ γ ]T
Tm→ : ∀ {Γ A} → C.Tm Γ A → D.Tm (Con→ Γ) (Ty→ A)
[→]t : ∀ {Γ} (A : C.Ty Γ) (a : C.Tm Γ A) {Δ} (γ : C.Sub Δ Γ) → Tm→ (a C.[ γ ]t) ~ (Tm→ a) D.[ Sub→ γ ]t
▹→ : ∀ {Γ A} → Con→ (Γ C.▹ A) ~ (Con→ Γ) D.▹ (Ty→ A)
,→ : ∀ {Γ Δ} (γ : C.Sub Δ Γ) {A A'} (e : A C.[ γ ]T ~ A') (a : C.Tm Δ A')
→ Sub→ (γ C.,[ e ] a) ~ (Sub→ γ) D.,[ [→]T A γ ⁻¹ ◼ cong Ty→ e ] (Tm→ a)
p→ : ∀ {Γ} (A : C.Ty Γ) → Sub→ (C.p {A = A}) ~ D.p {A = Ty→ A}
q→ : ∀ {Γ} (A : C.Ty Γ) → Tm→ (C.q {A = A}) ~ D.q {A = Ty→ A}
module Tools→ {i j k l i' j' k' l'}{C : CwF {i}{j}{k}{l}}{D : CwF {i'}{j'}{k'}{l'}} (F : CwF→ C D) where
open CwF→ F
open CwF-tools
[ε]T→ : ∀ {Γ A A'} → (Ty→ A ~ A') → Ty→ (A C.[ C.ε {Γ = Γ} ]T) ~ A' D.[ D.ε {Γ = Con→ Γ} ]T
[ε]T→ e = [→]T _ _ ◼ cong₄ (λ Γ Δ A (γ : D.Sub Δ Γ) → A D.[ γ ]T) ◇→ ~refl e ε→
[ε]t→ : ∀ {Γ A A'} (eA : Ty→ A ~ A') {a : C.Tm C.◇ A} {a' : D.Tm D.◇ A'} → (Tm→ a ~ a')
→ Tm→ (a C.[ C.ε {Γ = Γ} ]t) ~ a' D.[ D.ε {Γ = Con→ Γ} ]t
[ε]t→ eA ea = [→]t _ _ _ ◼ cong₄ (λ Γ A (a : D.Tm Γ A) (γ : D.Sub _ Γ) → a D.[ γ ]t) ◇→ eA ea ε→
▹ε→ : ∀ {Γ A A'} → (Ty→ A ~ A') → Con→ (Γ C.▹ A C.[ C.ε ]T) ~ (Con→ Γ) D.▹ (A' D.[ D.ε ]T)
▹ε→ e = ▹→ ◼ cong (D._▹_ (Con→ _)) ([ε]T→ e)
sg→ : ∀ {Γ} {A : C.Ty Γ} {a : C.Tm Γ A} → Sub→ (sg C a) ~ sg D (Tm→ a)
sg→ = ,→ _ C.[id]T _ ◼ cong-subExt D id→ ~refl (cong (D._[_]T (Ty→ _)) id→ ◼ D.[id]T) D.[id]T ~refl
[sgε]T→ : ∀ {Γ A a} (P : C.Ty (Γ C.▹ A C.[ C.ε ]T)) {A'} (eA : Ty→ A ~ A') {a'} (ea : Tm→ a ~ a')
→ Ty→ (P C.[ sg C (a C.[ C.ε ]t) ]T) ~ coe (cong D.Ty (▹ε→ eA)) (Ty→ P) D.[ sg D (a' D.[ D.ε ]t) ]T
[sgε]T→ P eA ea = [→]T _ _ ◼ cong₄ (λ Γ Δ A (γ : D.Sub Δ Γ) → D._[_]T A γ)
(▹ε→ eA) ~refl
(coe-eq (cong D.Ty (▹ε→ eA)) (Ty→ P))
(sg→ ◼ cong₂ (λ A → sg D {A = A}) ([ε]T→ eA) ([ε]t→ eA ea))
record Model→ {i}{i'}{j}{j'}{k}{k'}{l}{l'}{C : CwF {i}{j}{k}{l}}{D : CwF {i'}{j'}{k'}{l'}} (F : CwF→ C D)
(M : Model C) (N : Model D) : Set (i ⊔ j ⊔ k ⊔ l ⊔ i' ⊔ j' ⊔ k' ⊔ l') where
module M = Model M
module N = Model N
open Tools→ F
open CwF→ F
field
Π→ : ∀{Γ}{A : C.Ty Γ}{B : C.Ty (Γ C.▹ A)} → Ty→ (M.Π A B) ~ N.Π (Ty→ A) (coe (cong D.Ty ▹→) (Ty→ B))
lam→ : ∀{Γ}{A : C.Ty Γ}{B : C.Ty (Γ C.▹ A)}{t : C.Tm (Γ C.▹ A) B}
→ Tm→ (M.lam A t) ~ N.lam (Ty→ A) (coe (cong₂ D.Tm ▹→ (coe-eq (cong D.Ty ▹→) (Ty→ B))) (Tm→ t))
app→ : ∀{Γ}{A : C.Ty Γ}{B : C.Ty (Γ C.▹ A)}(t : C.Tm Γ (M.Π A B))(u : C.Tm Γ A)
→ Tm→ (M.app t u) ~ N.app (coe (cong (D.Tm _) Π→) (Tm→ t)) (Tm→ u)
𝔹→ : Ty→ (M.𝔹) ~ N.𝔹
𝕥→ : Tm→ (M.𝕥) ~ N.𝕥
𝕗→ : Tm→ (M.𝕗) ~ N.𝕗
ifᵀ→ : ∀ {Γ} b (A B : C.Ty Γ)
→ Ty→ (M.ifᵀ b A B) ~ N.ifᵀ (coe (cong (D.Tm _) ([ε]T→ 𝔹→)) (Tm→ b)) (Ty→ A) (Ty→ B)
ifᵗ→ : ∀{Γ} (P : C.Ty (Γ C.▹ M.𝔹 C.[ C.ε ]T)) (P𝕥 : C.Tm Γ (P C.[ CwF-tools.sg C (M.𝕥 C.[ C.ε ]t) ]T))
(P𝕗 : C.Tm Γ (P C.[ CwF-tools.sg C (M.𝕗 C.[ C.ε ]t) ]T)) (b : C.Tm Γ (M.𝔹 C.[ C.ε ]T))
→ Tm→ (M.ifᵗ P P𝕥 P𝕗 b) ~ N.ifᵗ (coe (cong D.Ty (▹ε→ 𝔹→)) (Ty→ P))
(coe (cong (D.Tm _) ([sgε]T→ P 𝔹→ 𝕥→)) (Tm→ P𝕥))
(coe (cong (D.Tm _) ([sgε]T→ P 𝔹→ 𝕗→)) (Tm→ P𝕗))
(coe (cong (D.Tm _) ([ε]T→ 𝔹→)) (Tm→ b))
module Identity→ {i}{j}{k}{l} (C : CwF {i}{j}{k}{l}) (M : Model C) where
idCwF : CwF→ C C
idCwF = record
{ Con→ = λ Γ → Γ
; Sub→ = λ γ → γ
; ∘→ = λ γ δ → ~refl
; id→ = ~refl
; ◇→ = ~refl
; ε→ = ~refl
; Ty→ = λ A → A
; [→]T = λ A γ → ~refl
; Tm→ = λ a → a
; [→]t = λ A a γ → ~refl
; ▹→ = ~refl
; ,→ = λ γ e a → ~refl
; p→ = λ A → ~refl
; q→ = λ A → ~refl
}
idModel : Model→ idCwF M M
idModel = record
{ Π→ = ~refl
; lam→ = ~refl
; app→ = λ t u → ~refl
; 𝔹→ = ~refl
; 𝕥→ = ~refl
; 𝕗→ = ~refl
; ifᵀ→ = λ b A B → ~refl
; ifᵗ→ = λ P P𝕥 P𝕗 b → ~refl
}
module Compose→ {i i' i'' j j' j'' k k' k'' l l' l''}
{C1 : CwF {i}{j}{k}{l}}{M1 : Model C1}{C2 : CwF {i'}{j'}{k'}{l'}}{M2 : Model C2}{C3 : CwF {i''}{j''}{k''}{l''}}{M3 : Model C3}
(F1 : CwF→ C2 C1) (G1 : Model→ F1 M2 M1) (F2 : CwF→ C3 C2) (G2 : Model→ F2 M3 M2) where
private module F1 = CwF→ F1
private module F2 = CwF→ F2
private module T1 = Tools→ F1
private module T2 = Tools→ F2
private module G1 = Model→ G1
private module G2 = Model→ G2
compCwF : CwF→ C3 C1
compCwF = record
{ Con→ = λ Γ → F1.Con→ (F2.Con→ Γ)
; Sub→ = λ γ → F1.Sub→ (F2.Sub→ γ)
; ∘→ = λ γ δ → cong F1.Sub→ (F2.∘→ γ δ) ◼ F1.∘→ (F2.Sub→ γ) (F2.Sub→ δ)
; id→ = cong F1.Sub→ F2.id→ ◼ F1.id→
; ◇→ = cong F1.Con→ F2.◇→ ◼ F1.◇→
; ε→ = cong₂ (λ Γ → F1.Sub→ {Γ}) F2.◇→ F2.ε→ ◼ F1.ε→
; Ty→ = λ A → F1.Ty→ (F2.Ty→ A)
; [→]T = λ A γ → cong F1.Ty→ (F2.[→]T A γ) ◼ F1.[→]T (F2.Ty→ A) (F2.Sub→ γ)
; Tm→ = λ a → F1.Tm→ (F2.Tm→ a)
; [→]t = λ A a γ → cong₂ (λ A → F1.Tm→ {A = A}) (F2.[→]T A γ) (F2.[→]t A a γ) ◼ F1.[→]t (F2.Ty→ A) (F2.Tm→ a) (F2.Sub→ γ)
; ▹→ = cong F1.Con→ F2.▹→ ◼ F1.▹→
; ,→ = λ γ e a → cong₂ (λ Γ → F1.Sub→ {Γ = Γ}) F2.▹→ (F2.,→ γ e a) ◼ F1.,→ (F2.Sub→ γ) (F2.[→]T _ γ ⁻¹ ◼ cong F2.Ty→ e) (F2.Tm→ a)
; p→ = λ A → cong₂ (λ Γ → F1.Sub→ {Δ = Γ}) F2.▹→ (F2.p→ A) ◼ F1.p→ (F2.Ty→ A)
; q→ = λ A → cong₃ (λ Γ A → F1.Tm→ {Γ} {A}) F2.▹→
(F2.[→]T A F2.C.p ◼ cong₂ (λ Γ → F2.D._[_]T (F2.Ty→ A) {Δ = Γ}) F2.▹→ (F2.p→ A)) (F2.q→ A) ◼ F1.q→ (F2.Ty→ A)
}
private
aux : {Γ : F2.C.Con} {Γ' : F2.D.Con} {Γ'' : F1.D.Con} (A : F2.C.Ty Γ)
(e1 : F2.Con→ Γ ~ Γ') (e2 : F1.Con→ Γ' ~ Γ'') (e3 : F1.D.Ty (F1.Con→ (F2.Con→ Γ)) ≡ F1.D.Ty Γ'')
→ coe (cong F1.D.Ty e2) (F1.Ty→ (coe (cong F2.D.Ty e1) (F2.Ty→ A))) ~ coe≡ e3 (F1.Ty→ (F2.Ty→ A))
aux A ~refl ~refl e3 = ~refl
aux2 : {Γ : F2.C.Con} {A : F2.C.Ty Γ} {A' : F2.D.Ty (F2.Con→ Γ)} {A'' : F1.D.Ty (F1.Con→ (F2.Con→ Γ))} (t : F2.C.Tm Γ A)
(e1 : F2.Ty→ A ~ A')(e2 : F1.Ty→ A' ~ A'')(e3 : F1.D.Tm (F1.Con→ (F2.Con→ Γ)) (F1.Ty→ (F2.Ty→ A)) ≡ F1.D.Tm (F1.Con→ (F2.Con→ Γ)) A'')
→ coe (cong₂ F1.D.Tm ~refl e2) (F1.Tm→ (coe (cong₂ F2.D.Tm ~refl e1) (F2.Tm→ t))) ~ coe≡ e3 (F1.Tm→ (F2.Tm→ t))
aux2 t ~refl ~refl e3 = ~refl
aux3 : {Γ : F2.C.Con} {Γ' : F2.D.Con} {Γ'' : F1.D.Con}
{A : F2.C.Ty Γ} {A' : F2.D.Ty Γ'} {A'' : F1.D.Ty Γ''} (t : F2.C.Tm Γ A)
(e1 : F2.Con→ Γ ~ Γ')(e2 : F1.Con→ Γ' ~ Γ'')(e3 : F2.Ty→ A ~ A')(e4 : F1.Ty→ A' ~ A'')
→ coe (cong₂ F1.D.Tm e2 e4) (F1.Tm→ (coe (cong₂ F2.D.Tm e1 e3) (F2.Tm→ t))) ~ F1.Tm→ (F2.Tm→ t)
aux3 t ~refl ~refl ~refl ~refl = ~refl
compModel : Model→ compCwF M3 M1
compModel = record
{ Π→ = λ {Γ A B} → cong F1.Ty→ G2.Π→ ◼ G1.Π→
◼ cong (G1.N.Π (F1.Ty→ (F2.Ty→ A)))
(coe≡-eq _ (F1.Ty→ (coe (cong F2.D.Ty (F2.▹→)) (F2.Ty→ B))) ⁻¹
◼ cong₂ (λ Γ → F1.Ty→ {Γ}) (F2.▹→ ⁻¹) (coe≡-eq _ (F2.Ty→ B) ⁻¹)
◼ coe≡-eq _ (F1.Ty→ (F2.Ty→ B)))
; lam→ = λ {Γ A B t} →
cong₂ (λ A → F1.Tm→ {A = A}) (G2.Π→ ◼ cong (G2.N.Π (F2.Ty→ A)) (coe≡-eq₂ (F2.Ty→ B))) G2.lam→
◼ G1.lam→
◼ cong₃ (λ A B t → G1.N.lam A {B} t) ~refl
(aux B F2.▹→ F1.▹→ _)
(aux3 t F2.▹→ F1.▹→ (coe≡-eq _ (F2.Ty→ B)) (coe≡-eq _ (F1.Ty→ (coe≡ _ (F2.Ty→ B)))) ◼ coe≡-eq _ (F1.Tm→ (F2.Tm→ t)))
; app→ = λ {Γ A B} t u →
cong₂ (λ A → F1.Tm→ {A = A})
(F2.[→]T B _ ◼ cong₃ (λ Γ A γ → F2.D._[_]T {Γ} A γ) F2.▹→ (coe≡-eq _ (F2.Ty→ B)) T2.sg→)
(G2.app→ t u)
◼ G1.app→ (coe≡ _ (F2.Tm→ t)) (F2.Tm→ u)
◼ cong₃ (λ B t u → G1.N.app {B = B} t u)
(aux B F2.▹→ F1.▹→ _)
(aux3 t ~refl ~refl G2.Π→ G1.Π→ ◼ coe≡-eq _ (F1.Tm→ (F2.Tm→ t)))
~refl
; 𝔹→ = cong₂ (λ Γ → F1.Ty→ {Γ}) F2.◇→ G2.𝔹→ ◼ G1.𝔹→
; 𝕥→ = cong₃ (λ Γ A → F1.Tm→ {Γ} {A}) F2.◇→ G2.𝔹→ G2.𝕥→ ◼ G1.𝕥→
; 𝕗→ = cong₃ (λ Γ A → F1.Tm→ {Γ} {A}) F2.◇→ G2.𝔹→ G2.𝕗→ ◼ G1.𝕗→
; ifᵀ→ = λ {Γ} b A B →
cong F1.Ty→ (G2.ifᵀ→ b A B)
◼ G1.ifᵀ→ (coe≡ _ (F2.Tm→ b)) (F2.Ty→ A) (F2.Ty→ B)
◼ cong₃ G1.N.ifᵀ (aux2 b (T2.[ε]T→ G2.𝔹→) (T1.[ε]T→ G1.𝔹→) _) ~refl ~refl
; ifᵗ→ = λ {Γ} P P𝕥 P𝕗 b →
let
e = F2.[→]T (G2.M.𝔹) _ ◼ cong₃ (λ Γ A γ → F2.D._[_]T {Γ} A γ) F2.◇→ G2.𝔹→ F2.ε→
e₂ = F2.▹→ ◼ cong (F2.D._▹_ (F2.Con→ Γ)) e
in cong₂ (λ A → F1.Tm→ {A = A})
(F2.[→]T P _ ◼ cong₃ (λ Γ A γ → F2.D._[_]T {Γ} A γ) e₂ (coe≡-eq _ (F2.Ty→ P))
(F2.,→ F2.C.id _ b ◼ CwF-tools.cong-subExt-EX C2 ~refl ~refl F2.id→ e e _ _ (coe≡-eq _ (F2.Tm→ b))))
(G2.ifᵗ→ P P𝕥 P𝕗 b)
◼ G1.ifᵗ→ (coe≡ _ (F2.Ty→ P)) (coe≡ _ (F2.Tm→ P𝕥)) (coe≡ _ (F2.Tm→ P𝕗)) (coe≡ _ (F2.Tm→ b))
◼ cong₄ G1.N.ifᵗ
(coe≡-eq _ (F1.Ty→ (coe≡ _ (F2.Ty→ P))) ⁻¹ ◼ cong₂ (λ Γ → F1.Ty→ {Γ}) (e₂ ⁻¹) (coe≡-eq _ (F2.Ty→ P) ⁻¹)
◼ coe≡-eq _ (F1.Ty→ (F2.Ty→ P)))
(aux3 P𝕥 ~refl ~refl (T2.[sgε]T→ P G2.𝔹→ G2.𝕥→) (T1.[sgε]T→ (coe≡ _ (F2.Ty→ P)) G1.𝔹→ G1.𝕥→) ◼ coe≡-eq _ (F1.Tm→ (F2.Tm→ P𝕥)))
(aux3 P𝕗 ~refl ~refl (T2.[sgε]T→ P G2.𝔹→ G2.𝕗→) (T1.[sgε]T→ (coe≡ _ (F2.Ty→ P)) G1.𝔹→ G1.𝕗→) ◼ coe≡-eq _ (F1.Tm→ (F2.Tm→ P𝕗)))
(aux2 b (T2.[ε]T→ G2.𝔹→) (T1.[ε]T→ G1.𝔹→) _)
}