You have misunderstood.

The Hol_datatype call establishes a type entirely within the logic and is *not* 
an SML entity at all. The mathematical content is entirely within the logic.

The definition of Group that you found is expressed in terms of Monoid.  (Every 
group is a monoid.) The monoid type mentions the carrier set with the 
Hol_datatype definition, as you found, and so we can, within the logic, talk 
about groups’ carrier sets.

Your examples are trivial to establish given the framework, and again, entirely 
within the logic.

Michael

On 6 Feb 2021, at 02:35, Ken Kubota 
<m...@kenkubota.de<mailto:m...@kenkubota.de>> wrote:

Thanks, Michael. I have provided links and quotes from the source with 
definitions below.

My knowledge on the technical details of the HOL/HOL4 implementation is limited.
Is it correct to say that 'a is the polymorphic type-variable, and that the 
(monoid and) group definition is based on an ML datatype (which is 
syntactically in some sense equivalent to a struct in C or a class in C++, as 
type information is bundled there)?

val _ = Hol_datatype`
  monoid = <| carrier: 'a -> bool;
                   op: 'a -> 'a -> 'a;
                   id: 'a
            |>`;

https://bitbucket.org/jhlchan/hol/src/master/algebra/monoid/monoid.hol 
(February 5, 2021)


My criticism would be that part of the mathematical content is represented 
outside of the mathematical logic, as is the case with group theory in 
Isabelle/HOL.
In HOL4, features of the meta-language (datatypes in ML) are deployed to 
represent type information, and in Isabelle/HOL group theory, the meta-logic of 
the logical framework is used to represent type dependencies.
This leads to an only implicit type handling within the mathematical logic 
(e.g., in HOL4: "Group_def   |- !g. Group g <=> [...]"), where the carrier set 
(the type of group elements) is not mentioned.

However, one would like to express _within_ the mathematical logic that, for 
example, (Z,+) is a group:
Grp(Z,+)


In my example, I had shown that (o, XOR) is a group:
Grp(o, XOR)

Quote:
Grp o XOR
https://www.owlofminerva.net/files/formulae.pdf#page=420

Definition of group:

:= Grp [λgτ .[λlggg.(∧oooGrpAsco(∃o(o\3)τ gτ 
[λeg.(∧oooGrpIdyoGrpInvo)o]))o](o(ggg))]
# wff 266 : [λg.[λl.(∧ GrpAsc (∃ g [λe.(∧ GrpIdy GrpInv)]))]]o(\4\4\3)τ := Grp

https://www.owlofminerva.net/files/formulae.pdf#page=362


Note that the type of group elements (the carrier set g) is bound by lambda 
(type abstraction).
See also section "Type abstraction" at: 
https://owlofminerva.net/kubota/software-implementation-of-the-mathematical-logic-r0-available-for-download/


The well-formed formula
lggg
(or l: g -> g-> g) corresponds to the HOL4 expression of the binary operation 
of group
                   op: 'a -> 'a -> 'a;
and the wff
eg
(or e: g) corresponds to the HOL4 expression of the identity element of group
                   id: 'a
quoted above.


Kind regards,

Ken Kubota

____________________________________________________

Ken Kubota
https://doi.org/10.4444/100



Group Theory in HOL4: 
https://bitbucket.org/jhlchan/hol/src/master/algebra/group/group.hol
Repository location: https://bitbucket.org/jhlchan/hol/src/ (provided on p. 145 
of the PhD thesis)
DOI Link PhD Thesis: https://doi.org/10.25911/5f58b06ca124e
Release notes for HOL4, Kananaskis-14: 
https://sourceforge.net/p/hol/mailman/message/37211501/


Quote from group.hol:

(* ------------------------------------------------------------------------- *)
(* Group Documentation                                                      *)
(* ------------------------------------------------------------------------- *)
(* Data type (same as monoid):
   The generic symbol for group data is g.
   g.carrier = Carrier set of group, overloaded as G.
   g.op      = Binary operation of group, overloaded as *.
   g.id<http://g.id>      = Identity element of group, overloaded as #e.
   g.exp     = Iteration of g.op (added by monoid)
   g.inv     = Inverse of g.op   (added by monoid)
*)
(* Definitions and Theorems (# are exported):

   Definitions:
   Group_def               |- !g. Group g <=> Monoid g /\ (G* = G)
[...]

(* ------------------------------------------------------------------------- *)
(* Group Definition.                                                         *)
(* ------------------------------------------------------------------------- *)

(* Set up group type as a record
   A Group has:
   . a carrier set (set = function 'a -> bool, since MEM is a boolean function)
   . an identity element
   . an inverse function (unary operation)
   . a product function called multiplication (binary operation)
*)

(* Monoid and Group share the same type: already defined in monoid.hol
val _ = Hol_datatype`
  group = <| carrier:'a -> bool;
                  id: 'a;
                 inv:'a -> 'a; -- by val _ = add_record_field ("inv", 
``monoid_inv``);
                mult:'a -> 'a -> 'a
           |>`;
*)
val _ = type_abbrev ("group", Type `:'a monoid`);

(* Define Group by Monoid *)
val Group_def = Define`
  Group (g:'a group) <=>
    Monoid g /\ (G* = G)
`;

https://bitbucket.org/jhlchan/hol/src/master/algebra/group/group.hol (February 
5, 2021)


Quote from monoid.hol:

(* ------------------------------------------------------------------------- *)
(* Monoid Documentation                                                      *)
(* ------------------------------------------------------------------------- *)
(* Data type:
   The generic symbol for monoid data is g.
   g.carrier = Carrier set of monoid, overloaded as G.
   g.op      = Binary operation of monoid, overloaded as *.
   g.id<http://g.id>      = Identity element of monoid, overloaded as #e.

   Overloading:
   *              = g.op
   #e             = g.id<http://g.id>
   **             = g.exp
   G              = g.carrier
   GITSET g s b   = ITSET g.op s b
*)
(* Definitions and Theorems (# are exported):

   Definitions:
   Monoid_def                |- !g. Monoid g <=>
                                (!x y. x IN G /\ y IN G ==> x * y IN G) /\
                                (!x y z. x IN G /\ y IN G /\ z IN G ==> ((x * 
y) * z = x * (y * z))) /\
                                #e IN G /\ (!x. x IN G ==> (#e * x = x) /\ (x * 
#e = x))
[...]

(* ------------------------------------------------------------------------- *)
(* Monoid Definition.                                                        *)
(* ------------------------------------------------------------------------- *)

(* Monoid and Group share the same type *)

(* Set up monoid type as a record
   A Monoid has:
   . a carrier set (set = function 'a -> bool, since MEM is a boolean function)
   . a binary operation (2-nary function) called multiplication
   . an identity element for the binary operation
*)
val _ = Hol_datatype`
  monoid = <| carrier: 'a -> bool;
                   op: 'a -> 'a -> 'a;
                   id: 'a
            |>`;
[...]

(* Using symbols m for monoid and g for group
   will give excessive overloading for Monoid and Group,
   so the generic symbol for both is taken as g. *)
(* set overloading  *)
val _ = overload_on ("*", ``g.op``);
val _ = overload_on ("#e", ``g.id<http://g.id>``);
val _ = overload_on ("G", ``g.carrier``);

(* Monoid Definition:
   A Monoid is a set with elements of type 'a monoid, such that
   . Closure: x * y is in the carrier set
   . Associativity: (x * y) * z = x * (y * z))
   . Existence of identity: #e is in the carrier set
   . Property of identity: #e * x = x * #e = x
*)
(* Define Monoid by predicate *)
val Monoid_def = Define`
  Monoid (g:'a monoid) <=>
    (!x y. x IN G /\ y IN G ==> x * y IN G) /\
    (!x y z. x IN G /\ y IN G /\ z IN G ==> ((x * y) * z = x * (y * z))) /\
    #e IN G /\ (!x. x IN G ==> (#e * x = x) /\ (x * #e = x))
`;

https://bitbucket.org/jhlchan/hol/src/master/algebra/monoid/monoid.hol 
(February 5, 2021)


Quote from bossLib.Hol_datatype.html:

Hol_datatype : hol_type quotation -> unit

STRUCTURE
bossLib

SYNOPSIS
Define a concrete datatype (deprecated syntax).

DESCRIPTION
The Hol_datatype function provides exactly the same definitional power as the 
Datatype function (which see), with a slightly different input syntax, given 
below:
   spec    ::= [ <binding> ; ]* <binding>

   binding ::= <ident> = [ <clause> | ]* <clause>
            |  <ident> = <| [ <ident> : <type> ; ]* <ident> : <type> |>

   clause  ::= <ident>
            |  <ident> of [<type> => ]* <type>

https://hol-theorem-prover.org/kananaskis-14-helpdocs/help/Docfiles/HTML/bossLib.Hol_datatype.html
 (February 5, 2021)


Quote from bossLib.Datatype.html:

Datatype : hol_type quotation -> unit

STRUCTURE
bossLib

SYNOPSIS
Define a concrete datatype.

DESCRIPTION
Many formalizations require the definition of new types. For example, ML-style 
datatypes are commonly used to model the abstract syntax of programming 
languages and the state-space of elaborate transition systems. In HOL, such 
datatypes (at least, those that are inductive, or, alternatively, have a model 
in an initial algebra) may be specified using the invocation Datatype `<spec>`, 
where <spec> should conform to the following grammar:
   spec    ::= [ <binding> ; ]* <binding>

   binding ::= <ident> = [ <clause> | ]* <clause>
            |  <ident> = <| [ <ident> : <type> ; ]* <ident> : <type> |>

   clause  ::= <ident> <tyspec>*

   tyspec  ::= ( <type> )
            |  <atomic-type>

where <atomic-type> is a single token denoting a type. For example, num, bool 
and 'a.

https://hol-theorem-prover.org/kananaskis-14-helpdocs/help/Docfiles/HTML/bossLib.Datatype.html
 (February 5, 2021)



Am 03.02.2021 um 23:29 schrieb Norrish, Michael (Data61, Acton) 
<michael.norr...@data61.csiro.au<mailto:michael.norr...@data61.csiro.au>>:

Hing Lun Chan’s thesis (linked to in the notes below) provides pretty good 
documentation of the approach taken, as do the various papers arising from the 
work.

The short version of the story is that the “obvious” approach of working with a 
polymorphic type-variable to represent the type of group elements doesn’t make 
the task of proving the required results too arduous.

Michael



On 4 Feb 2021, at 01:13, Ken Kubota 
<m...@kenkubota.de<mailto:m...@kenkubota.de>> wrote:

Is there any documentation on how abstract algebra is implemented in HOL4?
Usually the HOL type system is considered too weak.

Freek Wiedijk: “The HOL type system is too poor. As we already argued in the 
previous section, it is too weak to properly do abstract algebra.”
John Harrison, Josef Urban, and Freek Wiedijk: “Another limitation of the 
simple HOL type system is that there is no explicit quantifier over polymorphic 
type variables, which can make many standard results [...] awkward to express 
[...]. [...] For example, in one of the most impressive formalization efforts 
to date [Gonthier et al., 2013] the entire group theory framework is developed 
in terms of subsets of a single universe group, apparently to avoid the 
complications from groups with general and possibly heterogeneous types.”
https://lists.cam.ac.uk/pipermail/cl-isabelle-users/2020-July/msg00074.html

Kind regards,

Ken Kubota

____________________________________________________

Ken Kubota
https://doi.org/10.4444/100



Am 03.02.2021 um 03:47 schrieb Norrish, Michael (Data61, Acton) 
<michael.norr...@data61.csiro.au<mailto:michael.norr...@data61.csiro.au>>:

Release notes for HOL4, Kananaskis-14

(Released: 3 February 2021)

We are pleased to announce the Kananaskis-14 release of HOL4.

New examples:

  *   algebra: an abstract algebra library for HOL4. The algebraic types are 
generic, so the library is useful in general. The algebraic structures consist 
of monoidTheory for monoids with identity, groupTheory for groups, ringTheory 
for commutative rings, fieldTheory for fields, polynomialTheory for polynomials 
with coefficients from rings or fields, linearTheory for vector spaces, 
including linear independence, and finitefieldTheory for finite fields, 
including existence and uniqueness.


_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net<mailto:hol-info@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/hol-info


_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to