--- 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);