doc-src/IsarAdvanced/Classes/Thy/code_examples/classes.ML
changeset 24991 c6f5cc939c29
parent 24628 33137422d7fd
child 26318 967323f93c67
--- a/doc-src/IsarAdvanced/Classes/Thy/code_examples/classes.ML	Thu Oct 11 23:03:51 2007 +0200
+++ b/doc-src/IsarAdvanced/Classes/Thy/code_examples/classes.ML	Fri Oct 12 08:20:43 2007 +0200
@@ -19,8 +19,11 @@
 fun semigroup_monoidl (A_:'a monoidl) = #Classes__semigroup_monoidl A_;
 fun neutral (A_:'a monoidl) = #neutral A_;
 
-type 'a group = {Classes__monoidl_group : 'a monoidl, inverse : 'a -> 'a};
-fun monoidl_group (A_:'a group) = #Classes__monoidl_group A_;
+type 'a monoid = {Classes__monoidl_monoid : 'a monoidl};
+fun monoidl_monoid (A_:'a monoid) = #Classes__monoidl_monoid A_;
+
+type 'a group = {Classes__monoid_group : 'a monoid, inverse : 'a -> 'a};
+fun monoid_group (A_:'a group) = #Classes__monoid_group A_;
 fun inverse (A_:'a group) = #inverse A_;
 
 fun inverse_int i = IntInf.~ i;
@@ -35,17 +38,21 @@
   {Classes__semigroup_monoidl = semigroup_int, neutral = neutral_int} :
   IntInf.int monoidl;
 
+val monoid_int = {Classes__monoidl_monoid = monoidl_int} :
+  IntInf.int monoid;
+
 val group_int =
-  {Classes__monoidl_group = monoidl_int, inverse = inverse_int} :
+  {Classes__monoid_group = monoid_int, inverse = inverse_int} :
   IntInf.int group;
 
-fun pow_nat B_ (Suc n) x =
-  mult ((semigroup_monoidl o monoidl_group) B_) x (pow_nat B_ n x)
-  | pow_nat B_ Zero_nat x = neutral (monoidl_group B_);
+fun pow_nat A_ (Suc n) x =
+  mult ((semigroup_monoidl o monoidl_monoid) A_) x (pow_nat A_ n x)
+  | pow_nat A_ Zero_nat x = neutral (monoidl_monoid A_);
 
 fun pow_int A_ k x =
-  (if IntInf.<= ((0 : IntInf.int), k) then pow_nat A_ (nat k) x
-    else inverse A_ (pow_nat A_ (nat (IntInf.~ k)) x));
+  (if IntInf.<= ((0 : IntInf.int), k)
+    then pow_nat (monoid_group A_) (nat k) x
+    else inverse A_ (pow_nat (monoid_group A_) (nat (IntInf.~ k)) x));
 
 val example : IntInf.int =
   pow_int group_int (10 : IntInf.int) (~2 : IntInf.int);