doc-src/IsarAdvanced/Classes/Thy/code_examples/classes.ML
author wenzelm
Thu, 26 Apr 2007 15:41:49 +0200
changeset 22813 882513df2472
parent 22479 de15ea8fb348
child 23956 48494ccfabaf
permissions -rw-r--r--
updated;
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
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    14
datatype bit = B0 | B1;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    15
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    16
datatype int = Pls | Min | Bit of int * bit | Number_of_int of int;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    17
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    18
fun pred (Bit (k, B0)) = Bit (pred k, B1)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    19
  | pred (Bit (k, B1)) = Bit (k, B0)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    20
  | pred Min = Bit (Min, B0)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    21
  | pred Pls = Min;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    22
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    23
fun uminus_int (Number_of_int w) = Number_of_int (uminus_int w)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    24
  | uminus_int (Bit (k, B0)) = Bit (uminus_int k, B0)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    25
  | uminus_int (Bit (k, B1)) = Bit (pred (uminus_int k), B1)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    26
  | uminus_int Min = Bit (Pls, B1)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    27
  | uminus_int Pls = Pls;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    28
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    29
fun succ (Bit (k, B0)) = Bit (k, B1)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    30
  | succ (Bit (k, B1)) = Bit (succ k, B0)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    31
  | succ Min = Pls
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    32
  | succ Pls = Bit (Pls, B1);
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    33
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    34
fun plus_int (Number_of_int v) (Number_of_int w) =
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    35
  Number_of_int (plus_int v w)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    36
  | plus_int k Min = pred k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    37
  | plus_int k Pls = k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    38
  | plus_int (Bit (k, B1)) (Bit (l, B1)) = Bit (plus_int k (succ l), B0)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    39
  | plus_int (Bit (k, B1)) (Bit (l, B0)) = Bit (plus_int k l, B1)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    40
  | plus_int (Bit (k, B0)) (Bit (l, b)) = Bit (plus_int k l, b)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    41
  | plus_int Min k = pred k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    42
  | plus_int Pls k = k;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    43
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    44
fun minus_int (Number_of_int v) (Number_of_int w) =
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    45
  Number_of_int (plus_int v (uminus_int w))
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    46
  | minus_int z w = plus_int z (uminus_int w);
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    47
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    48
fun less_eq_int (Number_of_int k) (Number_of_int l) = less_eq_int k l
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    49
  | less_eq_int (Bit (k1, B1)) (Bit (k2, B0)) = less_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    50
  | less_eq_int (Bit (k1, v)) (Bit (k2, B1)) = less_eq_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    51
  | less_eq_int (Bit (k1, B0)) (Bit (k2, v)) = less_eq_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    52
  | less_eq_int (Bit (k, v)) Min = less_eq_int k Min
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    53
  | less_eq_int (Bit (k, B1)) Pls = less_int k Pls
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    54
  | less_eq_int (Bit (k, B0)) Pls = less_eq_int k Pls
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    55
  | less_eq_int Min (Bit (k, B1)) = less_eq_int Min k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    56
  | less_eq_int Min (Bit (k, B0)) = less_int Min k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    57
  | less_eq_int Min Min = true
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    58
  | less_eq_int Min Pls = true
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    59
  | less_eq_int Pls (Bit (k, v)) = less_eq_int Pls k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    60
  | less_eq_int Pls Min = false
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    61
  | less_eq_int Pls Pls = true
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    62
and less_int (Number_of_int k) (Number_of_int l) = less_int k l
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    63
  | less_int (Bit (k1, B0)) (Bit (k2, B1)) = less_eq_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    64
  | less_int (Bit (k1, B1)) (Bit (k2, v)) = less_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    65
  | less_int (Bit (k1, v)) (Bit (k2, B0)) = less_int k1 k2
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    66
  | less_int (Bit (k, B1)) Min = less_int k Min
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    67
  | less_int (Bit (k, B0)) Min = less_eq_int k Min
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    68
  | less_int (Bit (k, v)) Pls = less_int k Pls
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    69
  | less_int Min (Bit (k, v)) = less_int Min k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    70
  | less_int Min Min = false
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    71
  | less_int Min Pls = true
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    72
  | less_int Pls (Bit (k, B1)) = less_eq_int Pls k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    73
  | less_int Pls (Bit (k, B0)) = less_int Pls k
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    74
  | less_int Pls Min = false
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    75
  | less_int Pls Pls = false;
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    76
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    77
fun nat_aux n i =
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    78
  (if less_eq_int i (Number_of_int Pls) then n
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    79
    else nat_aux (Nat.Suc n)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
    80
           (minus_int i (Number_of_int (Bit (Pls, B1)))));
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    81
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    82
fun nat i = nat_aux Nat.Zero_nat i;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    83
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    84
end; (*struct Integer*)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    85
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    86
structure Classes = 
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    87
struct
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    88
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    89
type 'a semigroup = {mult : 'a -> 'a -> 'a};
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    90
fun mult (A_:'a semigroup) = #mult A_;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    91
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    92
type 'a monoidl =
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    93
  {Classes__monoidl_semigroup : 'a semigroup, neutral : 'a};
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    94
fun monoidl_semigroup (A_:'a monoidl) = #Classes__monoidl_semigroup A_;
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    95
fun neutral (A_:'a monoidl) = #neutral A_;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    96
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    97
type 'a group = {Classes__group_monoidl : 'a monoidl, inverse : 'a -> 'a};
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    98
fun group_monoidl (A_:'a group) = #Classes__group_monoidl A_;
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
    99
fun inverse (A_:'a group) = #inverse A_;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   100
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   101
fun inverse_int i = Integer.uminus_int i;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   102
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   103
val neutral_int : Integer.int = Integer.Number_of_int Integer.Pls;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   104
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   105
fun mult_int i j = Integer.plus_int i j;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   106
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   107
val semigroup_int = {mult = mult_int} : Integer.int semigroup;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   108
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   109
val monoidl_int =
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
   110
  {Classes__monoidl_semigroup = semigroup_int, neutral = neutral_int} :
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   111
  Integer.int monoidl;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   112
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   113
val group_int =
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22317
diff changeset
   114
  {Classes__group_monoidl = monoidl_int, inverse = inverse_int} :
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   115
  Integer.int group;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   116
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   117
fun pow_nat B_ (Nat.Suc n) x =
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   118
  mult (monoidl_semigroup B_) x (pow_nat B_ n x)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   119
  | pow_nat B_ Nat.Zero_nat x = neutral B_;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   120
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   121
fun pow_int A_ k x =
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   122
  (if Integer.less_eq_int (Integer.Number_of_int Integer.Pls) k
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   123
    then pow_nat (group_monoidl A_) (Integer.nat k) x
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   124
    else inverse A_
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   125
           (pow_nat (group_monoidl A_)
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   126
             (Integer.nat (Integer.uminus_int k)) x));
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   127
22813
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   128
val example : Integer.int =
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   129
  pow_int group_int
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   130
    (Integer.Number_of_int
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   131
      (Integer.Bit
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   132
        (Integer.Bit
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   133
           (Integer.Bit
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   134
              (Integer.Bit (Integer.Pls, Integer.B1), Integer.B0),
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   135
             Integer.B1),
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   136
          Integer.B0)))
882513df2472 updated;
wenzelm
parents: 22479
diff changeset
   137
    (Integer.Number_of_int (Integer.Bit (Integer.Min, Integer.B0)));
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   138
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   139
end; (*struct Classes*)
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   140
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
   141
end; (*struct ROOT*)