Natural.monoid
import Natural (+, *, plusAssoc, zeroPlusId, plusZeroId, multAssoc, sucPlus)
import Core.id (eqToId)
import Algebra.monoid (IsMonoid)
natAddMonoid : IsMonoid ℕ using (Algebra.monoid.IsMonoid.unfold)
natAddMonoid =
(,)
(+)
Z
λx y z. eqToId _ _ (plusAssoc x y z)
λx. eqToId _ _ (zeroPlusId x)
λx. eqToId _ _ (plusZeroId x)
multOneR : (n : ℕ) → n * S Z ≡ n using (Natural.*.eq, Natural.+.eq)
multOneR = λn. ⋆
oneMultL : (n : ℕ) → S Z * n ≡ n
using (*.eq,
hyp.rw,
Natural.multZeroId,
Natural.multZeroId.rw,
sucPlus,
sucPlus.rw,
zeroPlusId,
zeroPlusId.rw)
oneMultL = λn. ℕ-elim ⋆ (k ih. ⋆) n
natMulMonoid : IsMonoid ℕ using (Algebra.monoid.IsMonoid.unfold)
natMulMonoid =
(,)
(*)
S Z
λx y z. eqToId _ _ (multAssoc x y z)
λx. eqToId _ _ (oneMultL x)
λx. eqToId _ _ (multOneR x)