\import Algebra.Field
\import Algebra.Group
\import Algebra.Group.Category
\import Algebra.Monoid
\import Algebra.Monoid.Category
\import Algebra.Pointed
\import Algebra.Pointed.Category
\import Algebra.Ring
\import Algebra.Ring.Category
\import Algebra.Ring.RingHom
\import Algebra.Semiring
\import Category
\import Category.Functor
\import Function.Meta ($)
\import Logic
\import Meta
\import Order.Lattice
\import Order.PartialOrder
\import Paths
\import Paths.Meta
\import Relation.Equivalence
\import Set.Category
\open SetColimit
\instance MonoidLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D MonoidCat) : Monoid (SetColimit (Comp MonoidCat.forget F))
| ide => in~ (D.bottom, ide)
| * (x y : SetColimit (Comp MonoidCat.forget F)) : SetColimit (Comp MonoidCat.forget F) \with {
| in~ a, in~ b => in~ (a.1 ∨ b.1, F.Func join-left a.2 Monoid.* F.Func join-right b.2)
| in~ a, ~-equiv x y r => ~-cequiv (D.join-monotone <=-refl r.1) $ func-* *> pmap2 (Monoid.*) (inv Func-app *> poset-app)
(inv Func-app *> poset-app *> Func-app *> pmap (F.Func _) r.2)
| ~-equiv x y r, in~ b => ~-cequiv (D.join-monotone r.1 <=-refl) $ func-* *> pmap2 (Monoid.*)
(inv Func-app *> poset-app *> Func-app *> pmap (F.Func _) r.2) (inv Func-app *> poset-app)
}
| ide-left {x} => \case \elim x \with {
| in~ a => ~-cequiv (join-univ D.bottom-univ <=-refl) $ func-* *> pmap2 (Monoid.*) (pmap (F.Func _) func-ide *> func-ide) (inv Func-app *> poset-id) *> ide-left
}
| ide-right {x} => \case \elim x \with {
| in~ a => ~-cequiv (join-univ <=-refl D.bottom-univ) $ func-* *> pmap2 (Monoid.*) (inv Func-app *> poset-id) (pmap (F.Func _) func-ide *> func-ide) *> ide-right
}
| *-assoc {x} {y} {z} => \case \elim x, \elim y, \elim z \with {
| in~ a, in~ b, in~ c => ~-cequiv (Preorder.=_<= D.join-assoc) $ func-* *> pmap2 (Monoid.*)
(inv Func-app *> func-* *> pmap2 (Monoid.*) (inv Func-app *> poset-app) (inv Func-app *> poset-app *> Func-app))
(inv Func-app *> poset-app *> Func-app) *> *-assoc *> pmap (_ Monoid.*) (inv func-*)
}
\where {
\private \lemma Func-app {j1 j2 j3 : D} {f : Hom j1 j2} {g : Hom j2 j3} {a : F j1} : F.Func (g ∘ f) a = F.Func g (F.Func f a)
=> SetColimit.Func-app (Comp MonoidCat.forget F)
\private \lemma poset-app {j j' : D} {f g : j <= j'} {a : F j} : F.Func f a = F.Func g a
=> pmap (F.Func __ a) prop-pi
\private \lemma poset-id {j : D} {p : j <= j} {a : F j} : F.Func p a = a
=> SetColimit.poset-id {D} {Comp MonoidCat.forget F}
\func inMap {F : Functor D MonoidCat} (d : D) : MonoidHom (F d) (MonoidLatticeColimit F) \cowith
| func a => in~ (d,a)
| func-ide => inv $ ~-cequiv D.bottom-univ func-ide
| func-* => ~-cequiv join-left func-*
\lemma inMap-coh {d d' : D} (p : d <= d') : inMap d = inMap d' ∘ F.Func p
=> exts \lam a => ~-cequiv p idp
}
\instance AddMonoidLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D AddMonoidCat) : AddMonoid (SetColimit (Comp AddMonoidCat.forget F))
| zro => in~ (D.bottom, zro)
| + (x y : SetColimit (Comp AddMonoidCat.forget F)) : SetColimit (Comp AddMonoidCat.forget F) \with {
| in~ a, in~ b => in~ (a.1 ∨ b.1, F.Func join-left a.2 AddMonoid.+ F.Func join-right b.2)
| in~ a, ~-equiv x y r => ~-cequiv (D.join-monotone <=-refl r.1) $ func-+ *> pmap2 (AddMonoid.+) (inv Func-app *> poset-app)
(inv Func-app *> poset-app *> Func-app *> pmap (F.Func _) r.2)
| ~-equiv x y r, in~ b => ~-cequiv (D.join-monotone r.1 <=-refl) $ func-+ *> pmap2 (AddMonoid.+)
(inv Func-app *> poset-app *> Func-app *> pmap (F.Func _) r.2) (inv Func-app *> poset-app)
}
| zro-left {x} => \case \elim x \with {
| in~ a => ~-cequiv (join-univ D.bottom-univ <=-refl) $ func-+ *> pmap2 (AddMonoid.+) (pmap (F.Func _) func-zro *> func-zro) (inv Func-app *> poset-id) *> zro-left
}
| zro-right {x} => \case \elim x \with {
| in~ a => ~-cequiv (join-univ <=-refl D.bottom-univ) $ func-+ *> pmap2 (AddMonoid.+) (inv Func-app *> poset-id) (pmap (F.Func _) func-zro *> func-zro) *> zro-right
}
| +-assoc {x} {y} {z} => \case \elim x, \elim y, \elim z \with {
| in~ a, in~ b, in~ c => ~-cequiv (Preorder.=_<= D.join-assoc) $ func-+ *> pmap2 (AddMonoid.+)
(inv Func-app *> func-+ *> pmap2 (AddMonoid.+) (inv Func-app *> poset-app) (inv Func-app *> poset-app *> Func-app))
(inv Func-app *> poset-app *> Func-app) *> +-assoc *> pmap (_ AddMonoid.+) (inv func-+)
}
\where {
\private \lemma Func-app {j1 j2 j3 : D} {f : Hom j1 j2} {g : Hom j2 j3} {a : F j1} : F.Func (g ∘ f) a = F.Func g (F.Func f a)
=> SetColimit.Func-app (Comp AddMonoidCat.forget F)
\private \lemma poset-app {j j' : D} {f g : j <= j'} {a : F j} : F.Func f a = F.Func g a
=> pmap (F.Func __ a) prop-pi
\private \lemma poset-id {j : D} {p : j <= j} {a : F j} : F.Func p a = a
=> SetColimit.poset-id {D} {Comp AddMonoidCat.forget F}
\func inMap {F : Functor D AddMonoidCat} (d : D) : AddMonoidHom (F d) (AddMonoidLatticeColimit F) \cowith
| func a => in~ (d,a)
| func-zro => inv $ ~-cequiv D.bottom-univ func-zro
| func-+ => ~-cequiv join-left func-+
\lemma inMap-coh {d d' : D} (p : d <= d') : inMap d = inMap d' ∘ F.Func p
=> exts \lam a => ~-cequiv p idp
}
\instance AddGroupLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D AddGroupCat) : AddGroup (SetColimit (Comp AddGroupCat.forget F))
| AddMonoid => AddMonoidLatticeColimit (Comp AddGroupCat.forgetToAddMonoid F)
| negative (x : SetColimit (Comp AddGroupCat.forget F)) : SetColimit (Comp AddGroupCat.forget F) \with {
| in~ a => in~ (a.1, AddGroup.negative a.2)
| ~-equiv x y r => ~-cequiv r.1 $ AddGroupHom.func-negative *> pmap AddGroup.negative r.2
}
| negative-left {x} => \case \elim x \with {
| in~ a => inv $ ~-cequiv D.bottom-univ $ func-zro *> inv func-zro *> pmap (F.Func _) (inv negative-left) *> func-+
}
| negative-right {x} => \case \elim x \with {
| in~ a => inv $ ~-cequiv D.bottom-univ $ func-zro *> inv func-zro *> pmap (F.Func _) (inv negative-right) *> func-+
} \where {
\func inMap {F : Functor D AddGroupCat} (d : D) : AddGroupHom (F d) (AddGroupLatticeColimit F) \cowith
| func a => in~ (d,a)
| func-zro => inv $ ~-cequiv D.bottom-univ func-zro
| func-+ => ~-cequiv join-left func-+
\lemma inMap-coh {d d' : D} (p : d <= d') : inMap d = inMap d' ∘ F.Func p
=> exts \lam a => ~-cequiv p idp
}
\instance AbGroupLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D AbGroupCat) : AbGroup (SetColimit (Comp AbGroupCat.forget F))
| AddGroup => AddGroupLatticeColimit (Comp AbGroupCat.forgetToAddGroup F)
| +-comm {x} {y} => \case \elim x, \elim y \with {
| in~ a, in~ b => ~-cequiv (Preorder.=_<= D.join-comm) $ func-+ *> +-comm *> pmap2 (+) (inv (Func-app (Comp AbGroupCat.forget F)) *> poset-app) (inv (Func-app (Comp AbGroupCat.forget F)) *> poset-app)
}
\where {
\func inMap {F : Functor D AbGroupCat} (d : D) : AddGroupHom (F d) (AddGroupLatticeColimit F) \cowith
| func a => in~ (d,a)
| func-zro => inv $ ~-cequiv D.bottom-univ func-zro
| func-+ => ~-cequiv join-left func-+
\lemma inMap-coh {d d' : D} (p : d <= d') : inMap d = inMap d' ∘ F.Func p
=> exts \lam a => ~-cequiv p idp
}
\instance RingLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D RingCat) : Ring (SetColimit (Comp RingCat.forget F))
| AbGroup => AbGroupLatticeColimit (Comp RingCat.forgetToAbGroup F)
| Monoid => MonoidLatticeColimit (Comp RingCat.forgetToMonoid F)
| ldistr {x} {y} {z} => \case \elim x, \elim y, \elim z \with {
| in~ a, in~ b, in~ c => ~-cequiv (join-univ (join-left <=∘ join-left) (D.join-monotone join-right join-right)) $
pmap (\lam x => F.Func _ (_ * x)) func-+ *> pmap (F.Func _) ldistr *> func-+ *> pmap2 (+)
(func-* *> pmap2 (*) (inv Func-app *> poset-app *> Func-app) (inv Func-app *> inv Func-app *> poset-app *> Func-app) *> inv func-*)
(func-* *> pmap2 (*) (inv Func-app *> poset-app *> Func-app) (inv Func-app *> inv Func-app *> poset-app *> Func-app) *> inv func-*)
}
| rdistr {x} {y} {z} => \case \elim x, \elim y, \elim z \with {
| in~ a, in~ b, in~ c => ~-cequiv (join-univ (D.join-monotone join-left join-left) (join-right <=∘ join-right)) $
pmap (\lam x => F.Func _ (x * _)) func-+ *> pmap (F.Func _) rdistr *> func-+ *> pmap2 (+)
(func-* *> pmap2 (*) (inv Func-app *> inv Func-app *> poset-app *> Func-app) (inv Func-app *> poset-app *> Func-app) *> inv func-*)
(func-* *> pmap2 (*) (inv Func-app *> inv Func-app *> poset-app *> Func-app) (inv Func-app *> poset-app *> Func-app) *> inv func-*)
}
\where {
\private \lemma Func-app {j1 j2 j3 : D} {f : Hom j1 j2} {g : Hom j2 j3} {a : F j1} : F.Func (g ∘ f) a = F.Func g (F.Func f a)
=> SetColimit.Func-app (Comp RingCat.forget F)
\private \lemma poset-app {j j' : D} {f g : j <= j'} {a : F j} : F.Func f a = F.Func g a
=> pmap (F.Func __ a) prop-pi
\func inMap (d : D) : RingHom (F d) (RingLatticeColimit F) \cowith
| func a => in~ (d,a)
| func-zro => inv $ ~-cequiv D.bottom-univ func-zro
| func-+ => ~-cequiv join-left func-+
| func-ide => inv $ ~-cequiv D.bottom-univ func-ide
| func-* => ~-cequiv join-left func-*
\lemma inMap-coh {d d' : D} (p : d <= d') : inMap d = inMap d' ∘ F.Func p
=> exts \lam a => ~-cequiv p idp
}
\instance CRingLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D CRingCat) : CRing (SetColimit (Comp CRingCat.forget F))
| Ring => RingLatticeColimit (Comp CRingCat.forgetToRing F)
| *-comm {x} {y} => \case \elim x, \elim y \with {
| in~ a, in~ b => ~-cequiv (Preorder.=_<= D.join-comm) $ func-* *> *-comm *> pmap2 (*) (inv (Func-app (Comp CRingCat.forget F)) *> poset-app) (inv (Func-app (Comp CRingCat.forget F)) *> poset-app)
}
\func DiscreteFieldLatticeColimit {D : Bounded.JoinSemilattice} (F : Functor D CRingCat) (p : \Pi (d : D) -> DiscreteField { | CRing => F d }) : DiscreteField (SetColimit (Comp CRingCat.forget F)) \cowith
| CRing => CRingLatticeColimit F
| zro/=ide q => \case unext-ub q \with {
| inP s => zro/=ide {p s.1} $ inv func-zro *> s.4 *> func-ide
}
| eitherZeroOrInv (in~ x) => \case eitherZeroOrInv {p x.1} x.2 \with {
| byLeft r => byLeft $ inv $ ~-cequiv D.bottom-univ $ func-zro *> inv r
| byRight (r : Monoid.Inv) => byRight $ Monoid.Inv.lmake (inC (x.1, r.inv)) $ later $ inv $ ~-cequiv D.bottom-univ $ func-ide *> inv (pmap (F.Func _) r.inv-left *> func-ide) *> func-*
}