doc-src/AxClass/Group/Semigroups.thy
author wenzelm
Sun, 15 Oct 2000 19:51:56 +0200
changeset 10223 31346d22bb54
parent 10140 ba9297b71897
child 11099 b301d1f72552
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8906
wenzelm
parents: 8903
diff changeset
     1
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
     2
header {* Semigroups *}
8906
wenzelm
parents: 8903
diff changeset
     3
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
     4
theory Semigroups = Main:
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     5
8906
wenzelm
parents: 8903
diff changeset
     6
text {*
wenzelm
parents: 8903
diff changeset
     7
 \medskip\noindent An axiomatic type class is simply a class of types
8907
wenzelm
parents: 8906
diff changeset
     8
 that all meet certain properties, which are also called \emph{class
wenzelm
parents: 8906
diff changeset
     9
 axioms}. Thus, type classes may be also understood as type predicates
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    10
 --- i.e.\ abstractions over a single type argument @{typ 'a}.  Class
8907
wenzelm
parents: 8906
diff changeset
    11
 axioms typically contain polymorphic constants that depend on this
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    12
 type @{typ 'a}.  These \emph{characteristic constants} behave like
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    13
 operations associated with the ``carrier'' type @{typ 'a}.
8906
wenzelm
parents: 8903
diff changeset
    14
wenzelm
parents: 8903
diff changeset
    15
 We illustrate these basic concepts by the following formulation of
wenzelm
parents: 8903
diff changeset
    16
 semigroups.
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    17
*}
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    18
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    19
consts
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    20
  times :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<odot>" 70)
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    21
axclass semigroup < "term"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    22
  assoc: "(x \<odot> y) \<odot> z = x \<odot> (y \<odot> z)"
8906
wenzelm
parents: 8903
diff changeset
    23
wenzelm
parents: 8903
diff changeset
    24
text {*
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    25
 \noindent Above we have first declared a polymorphic constant @{text
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    26
 "\<odot> \<Colon> 'a \<Rightarrow> 'a \<Rightarrow> 'a"} and then defined the class @{text semigroup} of
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    27
 all types @{text \<tau>} such that @{text "\<odot> \<Colon> \<tau> \<Rightarrow> \<tau> \<Rightarrow> \<tau>"} is indeed an
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    28
 associative operator.  The @{text assoc} axiom contains exactly one
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    29
 type variable, which is invisible in the above presentation, though.
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    30
 Also note that free term variables (like @{term x}, @{term y}, @{term
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    31
 z}) are allowed for user convenience --- conceptually all of these
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    32
 are bound by outermost universal quantifiers.
8906
wenzelm
parents: 8903
diff changeset
    33
wenzelm
parents: 8903
diff changeset
    34
 \medskip In general, type classes may be used to describe
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    35
 \emph{structures} with exactly one carrier @{typ 'a} and a fixed
8906
wenzelm
parents: 8903
diff changeset
    36
 \emph{signature}.  Different signatures require different classes.
10223
wenzelm
parents: 10140
diff changeset
    37
 Below, class @{text plus_semigroup} represents semigroups 
wenzelm
parents: 10140
diff changeset
    38
 @{text "(\<tau>, \<oplus>\<^sup>\<tau>)"}, while the original @{text semigroup} would
wenzelm
parents: 10140
diff changeset
    39
 correspond to semigroups of the form @{text "(\<tau>, \<odot>\<^sup>\<tau>)"}.
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    40
*}
8906
wenzelm
parents: 8903
diff changeset
    41
wenzelm
parents: 8903
diff changeset
    42
consts
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    43
  plus :: "'a \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "\<oplus>" 70)
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    44
axclass plus_semigroup < "term"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    45
  assoc: "(x \<oplus> y) \<oplus> z = x \<oplus> (y \<oplus> z)"
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    46
8906
wenzelm
parents: 8903
diff changeset
    47
text {*
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    48
 \noindent Even if classes @{text plus_semigroup} and @{text
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    49
 semigroup} both represent semigroups in a sense, they are certainly
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    50
 not quite the same.
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    51
*}
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    52
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    53
end