{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Base.MCorrSetoid where
open import Agda.Primitive using (Level; _⊔_; lsuc; lzero)
open import Agda.Builtin.Sigma using (Σ; _,_)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Data.Empty using (⊥)
open import Data.Unit.Polymorphic.Base using (⊤; tt)
open import Data.Nat using (ℕ)
open import Data.Bool using (Bool; true; false)
open import Data.Product.Base using (_×_; proj₁; proj₂)
open import Function.Base using (id; _∘_)
open import Relation.Binary.Core using (Rel)
open import Relation.Binary.Structures using (IsEquivalence)
open import Relation.Binary.PropositionalEquality.Core as Prop using (cong; sym; trans)
open import Relation.Binary.PropositionalEquality.Properties renaming
(isEquivalence to ≡-isEquivalence)
open import Relation.Nullary.Negation using (¬_)
open import ALMA.Base.MCorr using (M; FiberAdj; _⍮_)
record EqOn {a ℓ : Level} (Carrier : Set a) : Set (lsuc (a ⊔ ℓ)) where
infix 4 _≈_
field
_≈_ : Rel Carrier ℓ
isEquivalence : IsEquivalence _≈_
open IsEquivalence isEquivalence public using (refl; sym; trans; reflexive)
record FiberAdjˢ {c d ℓc ℓd : Level}
{P : Set c} {R : Set d}
(EP : EqOn {ℓ = ℓc} P) (ER : EqOn {ℓ = ℓd} R)
: Set (c ⊔ d ⊔ ℓc ⊔ ℓd) where
private
module EP = EqOn EP
module ER = EqOn ER
field
to : R → P
fro : P → R
to-cong : ∀ {r r'} → r ER.≈ r' → to r EP.≈ to r'
fro-cong : ∀ {p p'} → p EP.≈ p' → fro p ER.≈ fro p'
η : (r : R) → fro (to r) ER.≈ r
ε : (p : P) → to (fro p) EP.≈ p
open FiberAdjˢ public
idAdjˢ : ∀ {c ℓ} {P : Set c} (E : EqOn {ℓ = ℓ} P) → FiberAdjˢ E E
idAdjˢ E = record
{ to = id
; fro = id
; to-cong = λ e → e
; fro-cong = λ e → e
; η = λ _ → EqOn.refl E
; ε = λ _ → EqOn.refl E
}
symAdjˢ : ∀ {c d ℓc ℓd} {P : Set c} {R : Set d}
{EP : EqOn {ℓ = ℓc} P} {ER : EqOn {ℓ = ℓd} R}
→ FiberAdjˢ EP ER → FiberAdjˢ ER EP
symAdjˢ a = record
{ to = fro a
; fro = to a
; to-cong = fro-cong a
; fro-cong = to-cong a
; η = ε a
; ε = η a
}
compAdjˢ : ∀ {r g h ℓr ℓg ℓh : Level}
{R : Set r} {G : Set g} {H : Set h}
(ER : EqOn {ℓ = ℓr} R)
(EG : EqOn {ℓ = ℓg} G)
(EH : EqOn {ℓ = ℓh} H)
→ FiberAdjˢ EG ER → FiberAdjˢ EH EG → FiberAdjˢ EH ER
compAdjˢ ER EG EH a₁ a₂ = record
{ to = to a₂ ∘ to a₁
; fro = fro a₁ ∘ fro a₂
; to-cong = to-cong a₂ ∘ to-cong a₁
; fro-cong = fro-cong a₁ ∘ fro-cong a₂
; η = λ r → EqOn.trans ER
(fro-cong a₁ (η a₂ (to a₁ r)))
(η a₁ r)
; ε = λ p → EqOn.trans EH
(to-cong a₂ (ε a₁ (fro a₂ p)))
(ε a₂ p)
}
record _≈Mˢ_ {i a b ℓa ℓe : Level}
{I : Set i} {A : I → Set a}
{E : (x : I) (a : A x) (y : I) → Set b}
(≈A : (x : I) → EqOn {ℓ = ℓa} (A x))
(≈E : (x : I) (a : A x) (y : I) → EqOn {ℓ = ℓe} (E x a y))
{x : I} (t s : M A E x)
: Set (i ⊔ a ⊔ b ⊔ ℓa ⊔ ℓe) where
coinductive
field
here-eq : EqOn._≈_ (≈A x) (M.here t) (M.here s)
below-eq : ∀ (y : I)
→ Σ (FiberAdjˢ (≈E x (M.here s) y) (≈E x (M.here t) y)) λ adj
→ (∀ (e₁ : E x (M.here t) y)
→ _≈Mˢ_ ≈A ≈E (M.below t y e₁)
(M.below s y (to adj e₁)))
× (∀ (e₂ : E x (M.here s) y)
→ _≈Mˢ_ ≈A ≈E (M.below s y e₂)
(M.below t y (fro adj e₂)))
open _≈Mˢ_ public
≈Mˢ-refl : ∀ {i a b ℓa ℓe : Level}
{I : Set i} {A : I → Set a}
{E : (x : I) (a : A x) (y : I) → Set b}
(≈A : (x : I) → EqOn {ℓ = ℓa} (A x))
(≈E : (x : I) (a : A x) (y : I) → EqOn {ℓ = ℓe} (E x a y))
{x : I} (t : M A E x) → _≈Mˢ_ ≈A ≈E t t
≈Mˢ-refl ≈A ≈E t .here-eq = EqOn.refl (≈A _)
≈Mˢ-refl ≈A ≈E {x = x} t .below-eq y =
idAdjˢ (≈E x (M.here t) y)
, ( (λ e₁ → ≈Mˢ-refl ≈A ≈E (M.below t y e₁))
, (λ e₂ → ≈Mˢ-refl ≈A ≈E (M.below t y e₂)) )
≈Mˢ-sym : ∀ {i a b ℓa ℓe : Level}
{I : Set i} {A : I → Set a}
{E : (x : I) (a : A x) (y : I) → Set b}
(≈A : (x : I) → EqOn {ℓ = ℓa} (A x))
(≈E : (x : I) (a : A x) (y : I) → EqOn {ℓ = ℓe} (E x a y))
{x : I} {t s : M A E x}
→ _≈Mˢ_ ≈A ≈E t s → _≈Mˢ_ ≈A ≈E s t
≈Mˢ-sym ≈A ≈E {x = x} p .here-eq = EqOn.sym (≈A x) (p .here-eq)
≈Mˢ-sym ≈A ≈E {x = x} p .below-eq y
with p .below-eq y
... | adj , fwd , bwd =
symAdjˢ adj , ( bwd , fwd )
≈Mˢ-trans : ∀ {i a b ℓa ℓe : Level}
{I : Set i} {A : I → Set a}
{E : (x : I) (a : A x) (y : I) → Set b}
(≈A : (x : I) → EqOn {ℓ = ℓa} (A x))
(≈E : (x : I) (a : A x) (y : I) → EqOn {ℓ = ℓe} (E x a y))
{x : I} {t m s : M A E x}
→ _≈Mˢ_ ≈A ≈E t m → _≈Mˢ_ ≈A ≈E m s
→ _≈Mˢ_ ≈A ≈E t s
≈Mˢ-trans ≈A ≈E {x = x} p q .here-eq =
EqOn.trans (≈A x) (p .here-eq) (q .here-eq)
≈Mˢ-trans ≈A ≈E {x = x} {t = t} {m = m} {s = s} p q .below-eq y
with p .below-eq y | q .below-eq y
... | adjp , fwdp , bwdp | adjq , fwdq , bwdq =
compAdjˢ (≈E x (M.here t) y) (≈E x (M.here m) y) (≈E x (M.here s) y)
adjp adjq
, ( (λ e₁ → ≈Mˢ-trans ≈A ≈E (fwdp e₁) (fwdq (to adjp e₁)))
, (λ e₂ → ≈Mˢ-trans ≈A ≈E (bwdq e₂) (bwdp (fro adjq e₂))) )
propEqOn : ∀ {a} (A : Set a) → EqOn {ℓ = a} A
propEqOn A = record
{ _≈_ = _≡_
; isEquivalence = ≡-isEquivalence
}
fromAdjˢ : ∀ {ℓp ℓr : Level} {P : Set ℓp} {R : Set ℓr}
→ FiberAdj P R → FiberAdjˢ (propEqOn P) (propEqOn R)
fromAdjˢ a = record
{ to = FiberAdj.to a
; fro = FiberAdj.fro a
; to-cong = cong (FiberAdj.to a)
; fro-cong = cong (FiberAdj.fro a)
; η = FiberAdj.η a
; ε = FiberAdj.ε a
}
toAdjˢ : ∀ {ℓp ℓr : Level} {P : Set ℓp} {R : Set ℓr}
→ FiberAdjˢ (propEqOn P) (propEqOn R) → FiberAdj P R
toAdjˢ a = record
{ to = to a
; fro = fro a
; η = η a
; ε = ε a
}
record SysEq (i a b ℓa ℓe : Level) : Set (lsuc (i ⊔ a ⊔ ℓa ⊔ b ⊔ ℓe)) where
field
I : Set i
A : I → Set a
E : (x : I) (a : A x) (y : I) → Set b
≈A : (x : I) → EqOn {ℓ = ℓa} (A x)
≈E : (x : I) (a : A x) (y : I) → EqOn {ℓ = ℓe} (E x a y)
open SysEq public
record Stepˢ {i j a b c d ℓr ℓa ℓe ℓc ℓd : Level}
(X : SysEq i a b ℓa ℓe)
(Y : SysEq j c d ℓc ℓd)
(R : I X → I Y → Set ℓr)
{x : I X} {y : I Y} (r : R x y)
: Set (i ⊔ j ⊔ a ⊔ b ⊔ c ⊔ d ⊔ ℓr ⊔ ℓa ⊔ ℓe ⊔ ℓc ⊔ ℓd) where
field
shapeᴿ : A X x → A Y y
child : (a : A X x) (v : I Y) → Σ (I X) λ x' → R x' v
edge-adj : (a : A X x) (v : I Y)
→ FiberAdjˢ (≈E Y y (shapeᴿ a) v)
(≈E X x a (proj₁ (child a v)))
pullˢ : (a : A X x) (v : I Y) (q : E Y y (shapeᴿ a) v)
→ Σ (I X) λ x' → Σ (E X x a x') λ e → R x' v
pullˢ a v q =
let x' , r' = child a v
in x' , fro (edge-adj a v) q , r'
open Stepˢ public
record Morphˢ {i j a b c d ℓr ℓa ℓe ℓc ℓd : Level}
(X : SysEq i a b ℓa ℓe)
(Y : SysEq j c d ℓc ℓd)
(R : I X → I Y → Set ℓr)
: Set (i ⊔ j ⊔ a ⊔ b ⊔ c ⊔ d ⊔ ℓr ⊔ ℓa ⊔ ℓe ⊔ ℓc ⊔ ℓd) where
field
step : ∀ {x : I X} {y : I Y} (r : R x y)
→ Stepˢ X Y R r
mapR : ∀ {x : I X} {y : I Y} → R x y
→ M (A X) (E X) x → M (A Y) (E Y) y
mapR r t .M.here = shapeᴿ (step r) (M.here t)
mapR r t .M.below v q =
let x' , e , r' = pullˢ (step r) (M.here t) v q
in mapR r' (M.below t x' e)
open Morphˢ public
compMˢ :
∀ {i j k a b c d e f ℓ₁ ℓ₂ ℓa ℓe ℓc ℓd ℓg ℓh : Level}
{X : SysEq i a b ℓa ℓe}
{Y : SysEq j c d ℓc ℓd}
{Z : SysEq k e f ℓg ℓh}
{R : I X → I Y → Set ℓ₁} {S : I Y → I Z → Set ℓ₂}
→ Morphˢ X Y R → Morphˢ Y Z S → Morphˢ X Z (R ⍮ S)
compMˢ {X = X} {Y = Y} {Z = Z} φ ψ .step {x = x} {y = z} (ym , r , s) =
let φr = step φ r
ψs = step ψ s
in record
{ shapeᴿ = λ a → shapeᴿ ψs (shapeᴿ φr a)
; child = λ a w →
let ym' , s' = child ψs (shapeᴿ φr a) w
x' , r' = child φr a ym'
in x' , (ym' , r' , s')
; edge-adj = λ a w →
let ym' , s' = child ψs (shapeᴿ φr a) w
x' , r' = child φr a ym'
in compAdjˢ (≈E X x a x')
(≈E Y ym (shapeᴿ φr a) ym')
(≈E Z z (shapeᴿ ψs (shapeᴿ φr a)) w)
(edge-adj φr a ym')
(edge-adj ψs (shapeᴿ φr a) w)
}
idMˢ : ∀ {i a b ℓa ℓe : Level} (X : SysEq i a b ℓa ℓe)
→ Morphˢ X X (λ (x y : I X) → x ≡ y)
idMˢ X .step {x = x₀} {y = .x₀} refl = record
{ shapeᴿ = λ a → a
; child = λ a v → v , refl
; edge-adj = λ a v → idAdjˢ (≈E X x₀ a v)
}
L : Set lzero
L = ℕ × Bool
infix 4 _≈L_
_≈L_ : Rel L lzero
(n , _) ≈L (m , _) = n ≡ m
LEq : EqOn L
LEq = record
{ _≈_ = _≈L_
; isEquivalence = record
{ refl = refl
; sym = Prop.sym
; trans = Prop.trans
}
}
bool-neq : true ≡ false → ⊥
bool-neq ()
tag-neq : ¬ ((0 , true) ≡ (0 , false))
tag-neq e = bool-neq (cong proj₂ e)
onPosAdj : FiberAdjˢ (propEqOn ℕ) LEq
onPosAdj = record
{ to = proj₁
; fro = λ n → (n , true)
; to-cong = λ e → e
; fro-cong = λ e → e
; η = λ { (n , _) → refl }
; ε = λ _ → refl
}
private
Iᵗ : Set lzero
Iᵗ = ⊤ {lzero}
ttᵗ : Iᵗ
ttᵗ = tt {lzero}
Aᵗ : Iᵗ → Set lzero
Aᵗ _ = L
Eᵗ : (i : Iᵗ) (a : Aᵗ i) (j : Iᵗ) → Set lzero
Eᵗ _ _ _ = L
≈Aᵗ : (x : Iᵗ) → EqOn (Aᵗ x)
≈Aᵗ _ = LEq
≈Eᵗ : (x : Iᵗ) (a : Aᵗ x) (j : Iᵗ) → EqOn (Eᵗ x a j)
≈Eᵗ _ _ _ = LEq
K : M Aᵗ Eᵗ ttᵗ
K .M.here = (0 , true)
K .M.below _ _ = K
t : M Aᵗ Eᵗ ttᵗ
t .M.here = (0 , true)
t .M.below _ _ = K
s : M Aᵗ Eᵗ ttᵗ
s .M.here = (0 , false)
s .M.below _ _ = K
t≈Mˢs : _≈Mˢ_ ≈Aᵗ ≈Eᵗ t s
t≈Mˢs .here-eq = refl
t≈Mˢs .below-eq _ =
idAdjˢ LEq
, ( (λ _ → ≈Mˢ-refl ≈Aᵗ ≈Eᵗ K)
, (λ _ → ≈Mˢ-refl ≈Aᵗ ≈Eᵗ K) )
t≄Ms-head : ¬ (M.here t ≡ M.here s)
t≄Ms-head = tag-neq