Natural.algebra
import Core.id (Id, idToEq, eqToId)
import Core.prelude (funext)
IsNatAlgebra : ๐ โ ๐
IsNatAlgebra = ฮปA. (z : A) ร A โ A
NatAlgHom : (A B : ๐) โ IsNatAlgebra A โ IsNatAlgebra B โ ๐
using (Natural.algebra.IsNatAlgebra.unfold)
NatAlgHom =
ฮปA B a b. (h : A โ B) ร Id _ (h (a .ฯโ)) (b .ฯโ) ร ((x : A) โ Id _ (h (a .ฯโ x)) (b .ฯโ (h x)))
natAlg : IsNatAlgebra โ using (Natural.algebra.IsNatAlgebra.unfold)
natAlg = Z, ฮปn. S n
natFold : (A : ๐) โ IsNatAlgebra A โ โ โ A using (Natural.algebra.IsNatAlgebra.unfold)
natFold = ฮปA a n. โ-elim (a .ฯโ) (k ih. a .ฯโ ih) n
natAlgInitial : (A : ๐) (a : IsNatAlgebra A) โ NatAlgHom _ _ natAlg a
using (Core.id.Id.eq,
Natural.algebra.IsNatAlgebra.unfold,
Natural.algebra.NatAlgHom.unfold,
Natural.algebra.natAlg.eq,
Natural.algebra.natFold.eq)
natAlgInitial = ฮปA a. natFold _ a, eqToId (natFold _ a Z) _ โ, ฮปx. eqToId (natFold _ a (S x)) _ โ
natAlgHomUnique : (A : ๐)
(a : IsNatAlgebra A)
(f g : NatAlgHom _ _ natAlg a)
(n : โ)
โ f .ฯโ n โก g .ฯโ n
using (hyp.rw,
Core.id.Id.eq,
Core.id.Id.unfold,
Natural.algebra.IsNatAlgebra.unfold,
Natural.algebra.NatAlgHom.unfold,
Natural.algebra.natAlg.eq)
natAlgHomUnique =
ฮปA a f g n. โ-elim
let hf = idToEq _ (f .ฯโ Z) (a .ฯโ) (f .ฯโ .ฯโ)
hg = idToEq _ (g .ฯโ Z) (a .ฯโ) (g .ฯโ .ฯโ)
โ
k ih. let hf = idToEq _ (f .ฯโ (S k)) (a .ฯโ (f .ฯโ k)) (f .ฯโ .ฯโ k)
hg = idToEq _ (g .ฯโ (S k)) (a .ฯโ (g .ฯโ k)) (g .ฯโ .ฯโ k)
f .ฯโ (S k) โกโจ hf โฉ a .ฯโ (f .ฯโ k) โกโจ ih โฉ a .ฯโ (g .ฯโ k) โกโจ hg โฉ g .ฯโ (S k)
n
natAlgHomUniqueFun : (A : ๐) (a : IsNatAlgebra A) (f g : NatAlgHom _ _ natAlg a) โ f .ฯโ โก g .ฯโ
using (Natural.algebra.NatAlgHom.unfold)
natAlgHomUniqueFun = ฮปA a f g. funext (natAlgHomUnique _ _ f g)