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