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