doc-src/Classes/Thy/Classes.thy
changeset 30242 aea5d7fa7ef5
parent 30227 853abb4853cc
child 30729 461ee3e49ad3
equal deleted inserted replaced
30241:3a1aef73b2b2 30242:aea5d7fa7ef5
       
     1 theory Classes
       
     2 imports Main Setup
       
     3 begin
       
     4 
       
     5 section {* Introduction *}
       
     6 
       
     7 text {*
       
     8   Type classes were introduces by Wadler and Blott \cite{wadler89how}
       
     9   into the Haskell language, to allow for a reasonable implementation
       
    10   of overloading\footnote{throughout this tutorial, we are referring
       
    11   to classical Haskell 1.0 type classes, not considering
       
    12   later additions in expressiveness}.
       
    13   As a canonical example, a polymorphic equality function
       
    14   @{text "eq \<Colon> \<alpha> \<Rightarrow> \<alpha> \<Rightarrow> bool"} which is overloaded on different
       
    15   types for @{text "\<alpha>"}, which is achieved by splitting introduction
       
    16   of the @{text eq} function from its overloaded definitions by means
       
    17   of @{text class} and @{text instance} declarations:
       
    18   \footnote{syntax here is a kind of isabellized Haskell}
       
    19 
       
    20   \begin{quote}
       
    21 
       
    22   \noindent@{text "class eq where"} \\
       
    23   \hspace*{2ex}@{text "eq \<Colon> \<alpha> \<Rightarrow> \<alpha> \<Rightarrow> bool"}
       
    24 
       
    25   \medskip\noindent@{text "instance nat \<Colon> eq where"} \\
       
    26   \hspace*{2ex}@{text "eq 0 0 = True"} \\
       
    27   \hspace*{2ex}@{text "eq 0 _ = False"} \\
       
    28   \hspace*{2ex}@{text "eq _ 0 = False"} \\
       
    29   \hspace*{2ex}@{text "eq (Suc n) (Suc m) = eq n m"}
       
    30 
       
    31   \medskip\noindent@{text "instance (\<alpha>\<Colon>eq, \<beta>\<Colon>eq) pair \<Colon> eq where"} \\
       
    32   \hspace*{2ex}@{text "eq (x1, y1) (x2, y2) = eq x1 x2 \<and> eq y1 y2"}
       
    33 
       
    34   \medskip\noindent@{text "class ord extends eq where"} \\
       
    35   \hspace*{2ex}@{text "less_eq \<Colon> \<alpha> \<Rightarrow> \<alpha> \<Rightarrow> bool"} \\
       
    36   \hspace*{2ex}@{text "less \<Colon> \<alpha> \<Rightarrow> \<alpha> \<Rightarrow> bool"}
       
    37 
       
    38   \end{quote}
       
    39 
       
    40   \noindent Type variables are annotated with (finitely many) classes;
       
    41   these annotations are assertions that a particular polymorphic type
       
    42   provides definitions for overloaded functions.
       
    43 
       
    44   Indeed, type classes not only allow for simple overloading
       
    45   but form a generic calculus, an instance of order-sorted
       
    46   algebra \cite{Nipkow-Prehofer:1993,nipkow-sorts93,Wenzel:1997:TPHOL}.
       
    47 
       
    48   From a software engeneering point of view, type classes
       
    49   roughly correspond to interfaces in object-oriented languages like Java;
       
    50   so, it is naturally desirable that type classes do not only
       
    51   provide functions (class parameters) but also state specifications
       
    52   implementations must obey.  For example, the @{text "class eq"}
       
    53   above could be given the following specification, demanding that
       
    54   @{text "class eq"} is an equivalence relation obeying reflexivity,
       
    55   symmetry and transitivity:
       
    56 
       
    57   \begin{quote}
       
    58 
       
    59   \noindent@{text "class eq where"} \\
       
    60   \hspace*{2ex}@{text "eq \<Colon> \<alpha> \<Rightarrow> \<alpha> \<Rightarrow> bool"} \\
       
    61   @{text "satisfying"} \\
       
    62   \hspace*{2ex}@{text "refl: eq x x"} \\
       
    63   \hspace*{2ex}@{text "sym: eq x y \<longleftrightarrow> eq x y"} \\
       
    64   \hspace*{2ex}@{text "trans: eq x y \<and> eq y z \<longrightarrow> eq x z"}
       
    65 
       
    66   \end{quote}
       
    67 
       
    68   \noindent From a theoretic point of view, type classes are lightweight
       
    69   modules; Haskell type classes may be emulated by
       
    70   SML functors \cite{classes_modules}. 
       
    71   Isabelle/Isar offers a discipline of type classes which brings
       
    72   all those aspects together:
       
    73 
       
    74   \begin{enumerate}
       
    75     \item specifying abstract parameters together with
       
    76        corresponding specifications,
       
    77     \item instantiating those abstract parameters by a particular
       
    78        type
       
    79     \item in connection with a ``less ad-hoc'' approach to overloading,
       
    80     \item with a direct link to the Isabelle module system
       
    81       (aka locales \cite{kammueller-locales}).
       
    82   \end{enumerate}
       
    83 
       
    84   \noindent Isar type classes also directly support code generation
       
    85   in a Haskell like fashion.
       
    86 
       
    87   This tutorial demonstrates common elements of structured specifications
       
    88   and abstract reasoning with type classes by the algebraic hierarchy of
       
    89   semigroups, monoids and groups.  Our background theory is that of
       
    90   Isabelle/HOL \cite{isa-tutorial}, for which some
       
    91   familiarity is assumed.
       
    92 
       
    93   Here we merely present the look-and-feel for end users.
       
    94   Internally, those are mapped to more primitive Isabelle concepts.
       
    95   See \cite{Haftmann-Wenzel:2006:classes} for more detail.
       
    96 *}
       
    97 
       
    98 section {* A simple algebra example \label{sec:example} *}
       
    99 
       
   100 subsection {* Class definition *}
       
   101 
       
   102 text {*
       
   103   Depending on an arbitrary type @{text "\<alpha>"}, class @{text
       
   104   "semigroup"} introduces a binary operator @{text "(\<otimes>)"} that is
       
   105   assumed to be associative:
       
   106 *}
       
   107 
       
   108 class %quote semigroup =
       
   109   fixes mult :: "\<alpha> \<Rightarrow> \<alpha> \<Rightarrow> \<alpha>"    (infixl "\<otimes>" 70)
       
   110   assumes assoc: "(x \<otimes> y) \<otimes> z = x \<otimes> (y \<otimes> z)"
       
   111 
       
   112 text {*
       
   113   \noindent This @{command class} specification consists of two
       
   114   parts: the \qn{operational} part names the class parameter
       
   115   (@{element "fixes"}), the \qn{logical} part specifies properties on them
       
   116   (@{element "assumes"}).  The local @{element "fixes"} and
       
   117   @{element "assumes"} are lifted to the theory toplevel,
       
   118   yielding the global
       
   119   parameter @{term [source] "mult \<Colon> \<alpha>\<Colon>semigroup \<Rightarrow> \<alpha> \<Rightarrow> \<alpha>"} and the
       
   120   global theorem @{fact "semigroup.assoc:"}~@{prop [source] "\<And>x y
       
   121   z \<Colon> \<alpha>\<Colon>semigroup. (x \<otimes> y) \<otimes> z = x \<otimes> (y \<otimes> z)"}.
       
   122 *}
       
   123 
       
   124 
       
   125 subsection {* Class instantiation \label{sec:class_inst} *}
       
   126 
       
   127 text {*
       
   128   The concrete type @{typ int} is made a @{class semigroup}
       
   129   instance by providing a suitable definition for the class parameter
       
   130   @{text "(\<otimes>)"} and a proof for the specification of @{fact assoc}.
       
   131   This is accomplished by the @{command instantiation} target:
       
   132 *}
       
   133 
       
   134 instantiation %quote int :: semigroup
       
   135 begin
       
   136 
       
   137 definition %quote
       
   138   mult_int_def: "i \<otimes> j = i + (j\<Colon>int)"
       
   139 
       
   140 instance %quote proof
       
   141   fix i j k :: int have "(i + j) + k = i + (j + k)" by simp
       
   142   then show "(i \<otimes> j) \<otimes> k = i \<otimes> (j \<otimes> k)"
       
   143     unfolding mult_int_def .
       
   144 qed
       
   145 
       
   146 end %quote
       
   147 
       
   148 text {*
       
   149   \noindent @{command instantiation} allows to define class parameters
       
   150   at a particular instance using common specification tools (here,
       
   151   @{command definition}).  The concluding @{command instance}
       
   152   opens a proof that the given parameters actually conform
       
   153   to the class specification.  Note that the first proof step
       
   154   is the @{method default} method,
       
   155   which for such instance proofs maps to the @{method intro_classes} method.
       
   156   This boils down an instance judgement to the relevant primitive
       
   157   proof goals and should conveniently always be the first method applied
       
   158   in an instantiation proof.
       
   159 
       
   160   From now on, the type-checker will consider @{typ int}
       
   161   as a @{class semigroup} automatically, i.e.\ any general results
       
   162   are immediately available on concrete instances.
       
   163 
       
   164   \medskip Another instance of @{class semigroup} are the natural numbers:
       
   165 *}
       
   166 
       
   167 instantiation %quote nat :: semigroup
       
   168 begin
       
   169 
       
   170 primrec %quote mult_nat where
       
   171   "(0\<Colon>nat) \<otimes> n = n"
       
   172   | "Suc m \<otimes> n = Suc (m \<otimes> n)"
       
   173 
       
   174 instance %quote proof
       
   175   fix m n q :: nat 
       
   176   show "m \<otimes> n \<otimes> q = m \<otimes> (n \<otimes> q)"
       
   177     by (induct m) auto
       
   178 qed
       
   179 
       
   180 end %quote
       
   181 
       
   182 text {*
       
   183   \noindent Note the occurence of the name @{text mult_nat}
       
   184   in the primrec declaration;  by default, the local name of
       
   185   a class operation @{text f} to instantiate on type constructor
       
   186   @{text \<kappa>} are mangled as @{text f_\<kappa>}.  In case of uncertainty,
       
   187   these names may be inspected using the @{command "print_context"} command
       
   188   or the corresponding ProofGeneral button.
       
   189 *}
       
   190 
       
   191 subsection {* Lifting and parametric types *}
       
   192 
       
   193 text {*
       
   194   Overloaded definitions giving on class instantiation
       
   195   may include recursion over the syntactic structure of types.
       
   196   As a canonical example, we model product semigroups
       
   197   using our simple algebra:
       
   198 *}
       
   199 
       
   200 instantiation %quote * :: (semigroup, semigroup) semigroup
       
   201 begin
       
   202 
       
   203 definition %quote
       
   204   mult_prod_def: "p\<^isub>1 \<otimes> p\<^isub>2 = (fst p\<^isub>1 \<otimes> fst p\<^isub>2, snd p\<^isub>1 \<otimes> snd p\<^isub>2)"
       
   205 
       
   206 instance %quote proof
       
   207   fix p\<^isub>1 p\<^isub>2 p\<^isub>3 :: "\<alpha>\<Colon>semigroup \<times> \<beta>\<Colon>semigroup"
       
   208   show "p\<^isub>1 \<otimes> p\<^isub>2 \<otimes> p\<^isub>3 = p\<^isub>1 \<otimes> (p\<^isub>2 \<otimes> p\<^isub>3)"
       
   209     unfolding mult_prod_def by (simp add: assoc)
       
   210 qed      
       
   211 
       
   212 end %quote
       
   213 
       
   214 text {*
       
   215   \noindent Associativity from product semigroups is
       
   216   established using
       
   217   the definition of @{text "(\<otimes>)"} on products and the hypothetical
       
   218   associativity of the type components;  these hypotheses
       
   219   are facts due to the @{class semigroup} constraints imposed
       
   220   on the type components by the @{command instance} proposition.
       
   221   Indeed, this pattern often occurs with parametric types
       
   222   and type classes.
       
   223 *}
       
   224 
       
   225 
       
   226 subsection {* Subclassing *}
       
   227 
       
   228 text {*
       
   229   We define a subclass @{text monoidl} (a semigroup with a left-hand neutral)
       
   230   by extending @{class semigroup}
       
   231   with one additional parameter @{text neutral} together
       
   232   with its property:
       
   233 *}
       
   234 
       
   235 class %quote monoidl = semigroup +
       
   236   fixes neutral :: "\<alpha>" ("\<one>")
       
   237   assumes neutl: "\<one> \<otimes> x = x"
       
   238 
       
   239 text {*
       
   240   \noindent Again, we prove some instances, by
       
   241   providing suitable parameter definitions and proofs for the
       
   242   additional specifications.  Observe that instantiations
       
   243   for types with the same arity may be simultaneous:
       
   244 *}
       
   245 
       
   246 instantiation %quote nat and int :: monoidl
       
   247 begin
       
   248 
       
   249 definition %quote
       
   250   neutral_nat_def: "\<one> = (0\<Colon>nat)"
       
   251 
       
   252 definition %quote
       
   253   neutral_int_def: "\<one> = (0\<Colon>int)"
       
   254 
       
   255 instance %quote proof
       
   256   fix n :: nat
       
   257   show "\<one> \<otimes> n = n"
       
   258     unfolding neutral_nat_def by simp
       
   259 next
       
   260   fix k :: int
       
   261   show "\<one> \<otimes> k = k"
       
   262     unfolding neutral_int_def mult_int_def by simp
       
   263 qed
       
   264 
       
   265 end %quote
       
   266 
       
   267 instantiation %quote * :: (monoidl, monoidl) monoidl
       
   268 begin
       
   269 
       
   270 definition %quote
       
   271   neutral_prod_def: "\<one> = (\<one>, \<one>)"
       
   272 
       
   273 instance %quote proof
       
   274   fix p :: "\<alpha>\<Colon>monoidl \<times> \<beta>\<Colon>monoidl"
       
   275   show "\<one> \<otimes> p = p"
       
   276     unfolding neutral_prod_def mult_prod_def by (simp add: neutl)
       
   277 qed
       
   278 
       
   279 end %quote
       
   280 
       
   281 text {*
       
   282   \noindent Fully-fledged monoids are modelled by another subclass
       
   283   which does not add new parameters but tightens the specification:
       
   284 *}
       
   285 
       
   286 class %quote monoid = monoidl +
       
   287   assumes neutr: "x \<otimes> \<one> = x"
       
   288 
       
   289 instantiation %quote nat and int :: monoid 
       
   290 begin
       
   291 
       
   292 instance %quote proof
       
   293   fix n :: nat
       
   294   show "n \<otimes> \<one> = n"
       
   295     unfolding neutral_nat_def by (induct n) simp_all
       
   296 next
       
   297   fix k :: int
       
   298   show "k \<otimes> \<one> = k"
       
   299     unfolding neutral_int_def mult_int_def by simp
       
   300 qed
       
   301 
       
   302 end %quote
       
   303 
       
   304 instantiation %quote * :: (monoid, monoid) monoid
       
   305 begin
       
   306 
       
   307 instance %quote proof 
       
   308   fix p :: "\<alpha>\<Colon>monoid \<times> \<beta>\<Colon>monoid"
       
   309   show "p \<otimes> \<one> = p"
       
   310     unfolding neutral_prod_def mult_prod_def by (simp add: neutr)
       
   311 qed
       
   312 
       
   313 end %quote
       
   314 
       
   315 text {*
       
   316   \noindent To finish our small algebra example, we add a @{text group} class
       
   317   with a corresponding instance:
       
   318 *}
       
   319 
       
   320 class %quote group = monoidl +
       
   321   fixes inverse :: "\<alpha> \<Rightarrow> \<alpha>"    ("(_\<div>)" [1000] 999)
       
   322   assumes invl: "x\<div> \<otimes> x = \<one>"
       
   323 
       
   324 instantiation %quote int :: group
       
   325 begin
       
   326 
       
   327 definition %quote
       
   328   inverse_int_def: "i\<div> = - (i\<Colon>int)"
       
   329 
       
   330 instance %quote proof
       
   331   fix i :: int
       
   332   have "-i + i = 0" by simp
       
   333   then show "i\<div> \<otimes> i = \<one>"
       
   334     unfolding mult_int_def neutral_int_def inverse_int_def .
       
   335 qed
       
   336 
       
   337 end %quote
       
   338 
       
   339 
       
   340 section {* Type classes as locales *}
       
   341 
       
   342 subsection {* A look behind the scene *}
       
   343 
       
   344 text {*
       
   345   The example above gives an impression how Isar type classes work
       
   346   in practice.  As stated in the introduction, classes also provide
       
   347   a link to Isar's locale system.  Indeed, the logical core of a class
       
   348   is nothing else than a locale:
       
   349 *}
       
   350 
       
   351 class %quote idem =
       
   352   fixes f :: "\<alpha> \<Rightarrow> \<alpha>"
       
   353   assumes idem: "f (f x) = f x"
       
   354 
       
   355 text {*
       
   356   \noindent essentially introduces the locale
       
   357 *} (*<*)setup %invisible {* Sign.add_path "foo" *}
       
   358 (*>*)
       
   359 locale %quote idem =
       
   360   fixes f :: "\<alpha> \<Rightarrow> \<alpha>"
       
   361   assumes idem: "f (f x) = f x"
       
   362 
       
   363 text {* \noindent together with corresponding constant(s): *}
       
   364 
       
   365 consts %quote f :: "\<alpha> \<Rightarrow> \<alpha>"
       
   366 
       
   367 text {*
       
   368   \noindent The connection to the type system is done by means
       
   369   of a primitive axclass
       
   370 *} (*<*)setup %invisible {* Sign.add_path "foo" *}
       
   371 (*>*)
       
   372 axclass %quote idem < type
       
   373   idem: "f (f x) = f x" (*<*)setup %invisible {* Sign.parent_path *}(*>*)
       
   374 
       
   375 text {* \noindent together with a corresponding interpretation: *}
       
   376 
       
   377 interpretation %quote idem_class:
       
   378   idem "f \<Colon> (\<alpha>\<Colon>idem) \<Rightarrow> \<alpha>"
       
   379 proof qed (rule idem)
       
   380 
       
   381 text {*
       
   382   \noindent This gives you at hand the full power of the Isabelle module system;
       
   383   conclusions in locale @{text idem} are implicitly propagated
       
   384   to class @{text idem}.
       
   385 *} (*<*)setup %invisible {* Sign.parent_path *}
       
   386 (*>*)
       
   387 subsection {* Abstract reasoning *}
       
   388 
       
   389 text {*
       
   390   Isabelle locales enable reasoning at a general level, while results
       
   391   are implicitly transferred to all instances.  For example, we can
       
   392   now establish the @{text "left_cancel"} lemma for groups, which
       
   393   states that the function @{text "(x \<otimes>)"} is injective:
       
   394 *}
       
   395 
       
   396 lemma %quote (in group) left_cancel: "x \<otimes> y = x \<otimes> z \<longleftrightarrow> y = z"
       
   397 proof
       
   398   assume "x \<otimes> y = x \<otimes> z"
       
   399   then have "x\<div> \<otimes> (x \<otimes> y) = x\<div> \<otimes> (x \<otimes> z)" by simp
       
   400   then have "(x\<div> \<otimes> x) \<otimes> y = (x\<div> \<otimes> x) \<otimes> z" using assoc by simp
       
   401   then show "y = z" using neutl and invl by simp
       
   402 next
       
   403   assume "y = z"
       
   404   then show "x \<otimes> y = x \<otimes> z" by simp
       
   405 qed
       
   406 
       
   407 text {*
       
   408   \noindent Here the \qt{@{keyword "in"} @{class group}} target specification
       
   409   indicates that the result is recorded within that context for later
       
   410   use.  This local theorem is also lifted to the global one @{fact
       
   411   "group.left_cancel:"} @{prop [source] "\<And>x y z \<Colon> \<alpha>\<Colon>group. x \<otimes> y = x \<otimes>
       
   412   z \<longleftrightarrow> y = z"}.  Since type @{text "int"} has been made an instance of
       
   413   @{text "group"} before, we may refer to that fact as well: @{prop
       
   414   [source] "\<And>x y z \<Colon> int. x \<otimes> y = x \<otimes> z \<longleftrightarrow> y = z"}.
       
   415 *}
       
   416 
       
   417 
       
   418 subsection {* Derived definitions *}
       
   419 
       
   420 text {*
       
   421   Isabelle locales support a concept of local definitions
       
   422   in locales:
       
   423 *}
       
   424 
       
   425 primrec %quote (in monoid) pow_nat :: "nat \<Rightarrow> \<alpha> \<Rightarrow> \<alpha>" where
       
   426   "pow_nat 0 x = \<one>"
       
   427   | "pow_nat (Suc n) x = x \<otimes> pow_nat n x"
       
   428 
       
   429 text {*
       
   430   \noindent If the locale @{text group} is also a class, this local
       
   431   definition is propagated onto a global definition of
       
   432   @{term [source] "pow_nat \<Colon> nat \<Rightarrow> \<alpha>\<Colon>monoid \<Rightarrow> \<alpha>\<Colon>monoid"}
       
   433   with corresponding theorems
       
   434 
       
   435   @{thm pow_nat.simps [no_vars]}.
       
   436 
       
   437   \noindent As you can see from this example, for local
       
   438   definitions you may use any specification tool
       
   439   which works together with locales (e.g. \cite{krauss2006}).
       
   440 *}
       
   441 
       
   442 
       
   443 subsection {* A functor analogy *}
       
   444 
       
   445 text {*
       
   446   We introduced Isar classes by analogy to type classes
       
   447   functional programming;  if we reconsider this in the
       
   448   context of what has been said about type classes and locales,
       
   449   we can drive this analogy further by stating that type
       
   450   classes essentially correspond to functors which have
       
   451   a canonical interpretation as type classes.
       
   452   Anyway, there is also the possibility of other interpretations.
       
   453   For example, also @{text list}s form a monoid with
       
   454   @{text append} and @{term "[]"} as operations, but it
       
   455   seems inappropriate to apply to lists
       
   456   the same operations as for genuinely algebraic types.
       
   457   In such a case, we simply can do a particular interpretation
       
   458   of monoids for lists:
       
   459 *}
       
   460 
       
   461 interpretation %quote list_monoid!: monoid append "[]"
       
   462   proof qed auto
       
   463 
       
   464 text {*
       
   465   \noindent This enables us to apply facts on monoids
       
   466   to lists, e.g. @{thm list_monoid.neutl [no_vars]}.
       
   467 
       
   468   When using this interpretation pattern, it may also
       
   469   be appropriate to map derived definitions accordingly:
       
   470 *}
       
   471 
       
   472 primrec %quote replicate :: "nat \<Rightarrow> \<alpha> list \<Rightarrow> \<alpha> list" where
       
   473   "replicate 0 _ = []"
       
   474   | "replicate (Suc n) xs = xs @ replicate n xs"
       
   475 
       
   476 interpretation %quote list_monoid!: monoid append "[]" where
       
   477   "monoid.pow_nat append [] = replicate"
       
   478 proof -
       
   479   interpret monoid append "[]" ..
       
   480   show "monoid.pow_nat append [] = replicate"
       
   481   proof
       
   482     fix n
       
   483     show "monoid.pow_nat append [] n = replicate n"
       
   484       by (induct n) auto
       
   485   qed
       
   486 qed intro_locales
       
   487 
       
   488 
       
   489 subsection {* Additional subclass relations *}
       
   490 
       
   491 text {*
       
   492   Any @{text "group"} is also a @{text "monoid"};  this
       
   493   can be made explicit by claiming an additional
       
   494   subclass relation,
       
   495   together with a proof of the logical difference:
       
   496 *}
       
   497 
       
   498 subclass %quote (in group) monoid
       
   499 proof
       
   500   fix x
       
   501   from invl have "x\<div> \<otimes> x = \<one>" by simp
       
   502   with assoc [symmetric] neutl invl have "x\<div> \<otimes> (x \<otimes> \<one>) = x\<div> \<otimes> x" by simp
       
   503   with left_cancel show "x \<otimes> \<one> = x" by simp
       
   504 qed
       
   505 
       
   506 text {*
       
   507   The logical proof is carried out on the locale level.
       
   508   Afterwards it is propagated
       
   509   to the type system, making @{text group} an instance of
       
   510   @{text monoid} by adding an additional edge
       
   511   to the graph of subclass relations
       
   512   (cf.\ \figref{fig:subclass}).
       
   513 
       
   514   \begin{figure}[htbp]
       
   515    \begin{center}
       
   516      \small
       
   517      \unitlength 0.6mm
       
   518      \begin{picture}(40,60)(0,0)
       
   519        \put(20,60){\makebox(0,0){@{text semigroup}}}
       
   520        \put(20,40){\makebox(0,0){@{text monoidl}}}
       
   521        \put(00,20){\makebox(0,0){@{text monoid}}}
       
   522        \put(40,00){\makebox(0,0){@{text group}}}
       
   523        \put(20,55){\vector(0,-1){10}}
       
   524        \put(15,35){\vector(-1,-1){10}}
       
   525        \put(25,35){\vector(1,-3){10}}
       
   526      \end{picture}
       
   527      \hspace{8em}
       
   528      \begin{picture}(40,60)(0,0)
       
   529        \put(20,60){\makebox(0,0){@{text semigroup}}}
       
   530        \put(20,40){\makebox(0,0){@{text monoidl}}}
       
   531        \put(00,20){\makebox(0,0){@{text monoid}}}
       
   532        \put(40,00){\makebox(0,0){@{text group}}}
       
   533        \put(20,55){\vector(0,-1){10}}
       
   534        \put(15,35){\vector(-1,-1){10}}
       
   535        \put(05,15){\vector(3,-1){30}}
       
   536      \end{picture}
       
   537      \caption{Subclass relationship of monoids and groups:
       
   538         before and after establishing the relationship
       
   539         @{text "group \<subseteq> monoid"};  transitive edges are left out.}
       
   540      \label{fig:subclass}
       
   541    \end{center}
       
   542   \end{figure}
       
   543 
       
   544   For illustration, a derived definition
       
   545   in @{text group} which uses @{text pow_nat}:
       
   546 *}
       
   547 
       
   548 definition %quote (in group) pow_int :: "int \<Rightarrow> \<alpha> \<Rightarrow> \<alpha>" where
       
   549   "pow_int k x = (if k >= 0
       
   550     then pow_nat (nat k) x
       
   551     else (pow_nat (nat (- k)) x)\<div>)"
       
   552 
       
   553 text {*
       
   554   \noindent yields the global definition of
       
   555   @{term [source] "pow_int \<Colon> int \<Rightarrow> \<alpha>\<Colon>group \<Rightarrow> \<alpha>\<Colon>group"}
       
   556   with the corresponding theorem @{thm pow_int_def [no_vars]}.
       
   557 *}
       
   558 
       
   559 subsection {* A note on syntax *}
       
   560 
       
   561 text {*
       
   562   As a commodity, class context syntax allows to refer
       
   563   to local class operations and their global counterparts
       
   564   uniformly;  type inference resolves ambiguities.  For example:
       
   565 *}
       
   566 
       
   567 context %quote semigroup
       
   568 begin
       
   569 
       
   570 term %quote "x \<otimes> y" -- {* example 1 *}
       
   571 term %quote "(x\<Colon>nat) \<otimes> y" -- {* example 2 *}
       
   572 
       
   573 end  %quote
       
   574 
       
   575 term %quote "x \<otimes> y" -- {* example 3 *}
       
   576 
       
   577 text {*
       
   578   \noindent Here in example 1, the term refers to the local class operation
       
   579   @{text "mult [\<alpha>]"}, whereas in example 2 the type constraint
       
   580   enforces the global class operation @{text "mult [nat]"}.
       
   581   In the global context in example 3, the reference is
       
   582   to the polymorphic global class operation @{text "mult [?\<alpha> \<Colon> semigroup]"}.
       
   583 *}
       
   584 
       
   585 section {* Further issues *}
       
   586 
       
   587 subsection {* Type classes and code generation *}
       
   588 
       
   589 text {*
       
   590   Turning back to the first motivation for type classes,
       
   591   namely overloading, it is obvious that overloading
       
   592   stemming from @{command class} statements and
       
   593   @{command instantiation}
       
   594   targets naturally maps to Haskell type classes.
       
   595   The code generator framework \cite{isabelle-codegen} 
       
   596   takes this into account.  Concerning target languages
       
   597   lacking type classes (e.g.~SML), type classes
       
   598   are implemented by explicit dictionary construction.
       
   599   As example, let's go back to the power function:
       
   600 *}
       
   601 
       
   602 definition %quote example :: int where
       
   603   "example = pow_int 10 (-2)"
       
   604 
       
   605 text {*
       
   606   \noindent This maps to Haskell as:
       
   607 *}
       
   608 
       
   609 text %quote {*@{code_stmts example (Haskell)}*}
       
   610 
       
   611 text {*
       
   612   \noindent The whole code in SML with explicit dictionary passing:
       
   613 *}
       
   614 
       
   615 text %quote {*@{code_stmts example (SML)}*}
       
   616 
       
   617 subsection {* Inspecting the type class universe *}
       
   618 
       
   619 text {*
       
   620   To facilitate orientation in complex subclass structures,
       
   621   two diagnostics commands are provided:
       
   622 
       
   623   \begin{description}
       
   624 
       
   625     \item[@{command "print_classes"}] print a list of all classes
       
   626       together with associated operations etc.
       
   627 
       
   628     \item[@{command "class_deps"}] visualizes the subclass relation
       
   629       between all classes as a Hasse diagram.
       
   630 
       
   631   \end{description}
       
   632 *}
       
   633 
       
   634 end