doc-src/IsarAdvanced/Classes/Thy/code_examples/classes.ML
author haftmann
Wed, 14 Feb 2007 10:06:13 +0100
changeset 22317 b550d2c6ca90
child 22479 de15ea8fb348
permissions -rw-r--r--
continued class tutorial
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     1
structure ROOT = 
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     2
struct
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     3
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     4
structure Nat = 
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     5
struct
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     6
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     7
datatype nat = Zero_nat | Suc of nat;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     8
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     9
end; (*struct Nat*)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    10
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    11
structure Integer = 
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    12
struct
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    13
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    14
fun nat_aux n i =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    15
  (if IntInf.<= (i, (0 : IntInf.int)) then n
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    16
    else nat_aux (Nat.Suc n) (IntInf.- (i, (1 : IntInf.int))));
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    17
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    18
fun nat i = nat_aux Nat.Zero_nat i;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    19
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    20
fun op_eq_bit false false = true
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    21
  | op_eq_bit true true = true
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    22
  | op_eq_bit false true = false
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    23
  | op_eq_bit true false = false;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    24
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    25
end; (*struct Integer*)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    26
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    27
structure Classes = 
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    28
struct
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    29
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    30
type 'a semigroup = {Classes__mult : 'a -> 'a -> 'a};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    31
fun mult (A_:'a semigroup) = #Classes__mult A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    32
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    33
type 'a monoidl =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    34
  {Classes__monoidl_semigroup : 'a semigroup, Classes__neutral : 'a};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    35
fun monoidl_semigroup (A_:'a monoidl) = #Classes__monoidl_semigroup A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    36
fun neutral (A_:'a monoidl) = #Classes__neutral A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    37
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    38
type 'a group =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    39
  {Classes__group_monoidl : 'a monoidl, Classes__inverse : 'a -> 'a};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    40
fun group_monoidl (A_:'a group) = #Classes__group_monoidl A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    41
fun inverse (A_:'a group) = #Classes__inverse A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    42
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    43
fun inverse_int i = IntInf.~ i;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    44
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    45
val neutral_int : IntInf.int = (0 : IntInf.int);
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    46
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    47
fun mult_int i j = IntInf.+ (i, j);
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    48
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    49
val semigroup_int = {Classes__mult = mult_int} : IntInf.int semigroup;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    50
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    51
val monoidl_int =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    52
  {Classes__monoidl_semigroup = semigroup_int,
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    53
    Classes__neutral = neutral_int}
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    54
  : IntInf.int monoidl;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    55
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    56
val group_int =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    57
  {Classes__group_monoidl = monoidl_int, Classes__inverse = inverse_int} :
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    58
  IntInf.int group;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    59
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    60
fun pow_nat A_ (Nat.Suc n) x =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    61
  mult (monoidl_semigroup A_) x (pow_nat A_ n x)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    62
  | pow_nat A_ Nat.Zero_nat x = neutral A_;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    63
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    64
fun pow_int A_ k x =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    65
  (if IntInf.<= ((0 : IntInf.int), k)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    66
    then pow_nat (group_monoidl A_) (Integer.nat k) x
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    67
    else inverse A_
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    68
           (pow_nat (group_monoidl A_) (Integer.nat (IntInf.~ k)) x));
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    69
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    70
val example : IntInf.int =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    71
  pow_int group_int (10 : IntInf.int) (~2 : IntInf.int);
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    72
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    73
end; (*struct Classes*)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    74
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    75
end; (*struct ROOT*)