[Agda] algebra hierarchy in library
Matthew Daggitt
matthewdaggitt at gmail.com
Thu Mar 21 02:39:23 CET 2019
Would you agree that writing
module Semigroup≡ {a} {A : Set a} {_∙_ : Op₂ A} (isSemigroup : IsSemigroup
_≡_ _∙_) where
is easier than writing the "proper part" you've got above?
On Wed, Mar 20, 2019 at 10:39 PM Sergei Meshveliani <mechvel at botik.ru>
wrote:
> On Wed, 2019-03-20 at 11:44 +0800, Matthew Daggitt wrote:
> > Say you have a module and you want to parameterise it by a semigroup
> > that must use propositional equality. How would you do that using your
> > hierarchy?
>
>
> Let me try.
> The prelude is the definition of Magma and Semigroup by the approach II:
> a) with isMagma, b) without isSemigroup,
> c) without repeating fields.
>
> Then, module Semigroup≡ is a submodule in module Magma≡.
> But it can be also declared as a top level module, with joining
> parameters C, _∙_, isMagma≡.
>
> What is wrong here?
>
> --
> SM
>
>
> --====================================================================
> open import Level using (suc; _⊔_)
> open import Algebra.FunctionProperties as FuncProp using (Op₂)
> open import Relation.Binary using (_Preserves₂_⟶_⟶_; Setoid)
> open import Relation.Binary.PropositionalEquality as PE using (_≡_)
>
> record IsMagma {α α=} (S : Setoid α α=) (_∙_ : Op₂ (Setoid.Carrier S)) :
> Set (α ⊔ α=)
> where
> open Setoid S using (_≈_; Carrier)
> field
> ∙-cong : _∙_ Preserves₂ _≈_ ⟶ _≈_ ⟶ _≈_
>
> record Magma α α= : Set (suc (α ⊔ α=))
> where -- non-standard but with `isMagma'
> constructor magma′
>
> field setoid : Setoid α α=
>
> open Setoid setoid public
> infixl 7 _∙_
>
> field _∙_ : Op₂ Carrier
> isMagma : IsMagma setoid _∙_
>
>
> record Semigroup α α= : Set (suc (α ⊔ α=)) -- without `isSemigroup'
> where
> constructor semigroup′
>
> field magma : Magma α α=
>
> open Magma magma using (_≈_; _∙_)
> module FP≈ = FuncProp _≈_
>
> field ∙-assoc : FP≈.Associative _∙_
>
>
> -- The proper part =================================================
> -- Magma≡ is parameterized by a certain representation of arbitrary
> -- magma over _≡_.
>
> module Magma≡ {α} (C : Set α) (_∙_ : Op₂ C)
> (let setoid≡ = PE.setoid C)
> (isMagma≡ : IsMagma setoid≡ _∙_)
> where
> magma≡ : Magma α _
> magma≡ = magma′ setoid≡ _∙_ isMagma≡
>
> module FP≡ = FuncProp (_≡_ {A = C})
>
> -------------------------------------------------------------------
> -- Semigroup≡ is parameterized by a certain representation of
> -- arbitrary semigroup over _≡_,
> -- and semigroup≡ below is an arbitrary semigroup over _≡_.
>
> module Semigroup≡ (∙assoc : FP≡.Associative _∙_)
> where
> semigroup≡ : Semigroup α _
> semigroup≡ = semigroup′ magma≡ ∙assoc
>
> {-
> ...
> -}
> --------------------------------------------------------------------
>
>
>
>
>
>
> > On Sun, Mar 17, 2019 at 2:52 AM Sergei Meshveliani <mechvel at botik.ru>
> > wrote:
> >
> > On Sat, 2019-03-16 at 18:16 +0800, Matthew Daggitt wrote:
> > >[..]
> >
> > > If this is the only reason, then it occurs that `Is'
> > structure
> > > is needed only in few cases.
> > >
> > >
> > > I think your examples miss the point. For example take any
> > binary
> > > operator. That binary operator may form many different
> > > Semigroups/Monoids/Groups etc. depending on what the
> > underlying
> > > equality is. The `Is` structures allow you to expose which
> > equality
> > > you're using at a particular point, whereas your suggestion
> > would hide
> > > it.
> >
> >
> > A Semigroup can be only on some (magma : Magma _ _). This
> > `magma'
> > already has an instance of _≈_ and of _∙_.
> > What freedom has one to define (H : Semigroup _ _) on this
> > particular
> > (magma : Magma _ _) ?
> > The only freedom is to choose a proof for Associative _≈_
> > _∙_,
> > because _≈_ and _∙_ are already fixed, they are brought in by
> > "open Setoid setoid ...".
> > So the matter here is only in the proof relevance.
> >
> > For defining Magma on the given (S : Setoid), there is more
> > freedom.
> > _≈_ is fixed, but _∙_ may be implemented in different ways.
> >
> >
> > > The `Is` structures allow you to expose which equality
> > you're using at
> > > a particular point, whereas your suggestion would hide it.
> >
> > No, in the experimental tower (let us call it so) the equality
> > and all
> > operations are exposed by the `open' declaration:
> >
> > -- experimental
> > -------------------------------------------------------
> >
> > record IsMagma {α α=} (S : Setoid α α=) (_∙_ : Op₂
> > (Setoid.Carrier S)) :
> > Set
> > (α ⊔ α=)
> > where
> > open Setoid S using (_≈_; Carrier)
> > field
> > ∙-cong : _∙_ Preserves₂ _≈_ ⟶ _≈_ ⟶ _≈_
> >
> > record Magma α α= : Set (suc (α ⊔ α=))
> > where
> > field setoid : Setoid α α=
> >
> > open Setoid setoid public
> > infixl 7 _∙_
> >
> > field _∙_ : Op₂ Carrier
> > isMagma : IsMagma setoid _∙_
> >
> > record Semigroup α α= : Set (suc (α ⊔ α=)) -- non-standard
> > where
> > field magma : Magma α α=
> >
> > open Magma magma using (_≈_; _∙_)
> > module FP≈ = FuncProp _≈_
> >
> > field ∙-assoc : FP≈.Associative _∙_
> >
> --------------------------------------------------------------------------
> >
> > Here IsMagma (isMagma) is preserved as in standard, because
> > this enables
> > us to define different Magmae on the same (S : Setoid).
> > But IsSemigroup (isSemigroup) is skipped, because it is not
> > possible to
> > define different semigroups on the given (magma : Magma)
> > -- if only we ignore difference in proofs for FP≈.Associative
> > _∙_.
> >
> > Now I think that IsSemigroup is all right.
> > But repeated fields of Carrier, _≈_, and such, look strange to
> > me.
> >
> > Regards,
> >
> > ------
> > Sergei
> >
> >
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20190321/8c891690/attachment.html>
More information about the Agda
mailing list