22317
|
1 |
module Classes where {
|
|
2 |
|
22813
|
3 |
import qualified Integer;
|
|
4 |
import qualified Nat;
|
22317
|
5 |
|
|
6 |
class Semigroup a where {
|
|
7 |
mult :: a -> a -> a;
|
|
8 |
};
|
|
9 |
|
22813
|
10 |
class (Classes.Semigroup a) => Monoidl a where {
|
22317
|
11 |
neutral :: a;
|
|
12 |
};
|
|
13 |
|
22813
|
14 |
class (Classes.Monoidl a) => Group a where {
|
22317
|
15 |
inverse :: a -> a;
|
|
16 |
};
|
|
17 |
|
22813
|
18 |
inverse_int :: Integer.Inta -> Integer.Inta;
|
|
19 |
inverse_int i = Integer.uminus_int i;
|
22317
|
20 |
|
22813
|
21 |
neutral_int :: Integer.Inta;
|
|
22 |
neutral_int = Integer.Number_of_int Integer.Pls;
|
22317
|
23 |
|
22813
|
24 |
mult_int :: Integer.Inta -> Integer.Inta -> Integer.Inta;
|
|
25 |
mult_int i j = Integer.plus_int i j;
|
22317
|
26 |
|
22813
|
27 |
instance Classes.Semigroup Integer.Inta where {
|
|
28 |
mult = Classes.mult_int;
|
22317
|
29 |
};
|
|
30 |
|
22813
|
31 |
instance Classes.Monoidl Integer.Inta where {
|
|
32 |
neutral = Classes.neutral_int;
|
|
33 |
};
|
|
34 |
|
|
35 |
instance Classes.Group Integer.Inta where {
|
|
36 |
inverse = Classes.inverse_int;
|
22317
|
37 |
};
|
|
38 |
|
22813
|
39 |
pow_nat :: (Classes.Monoidl b) => Nat.Nat -> b -> b;
|
|
40 |
pow_nat (Nat.Suc n) x = Classes.mult x (Classes.pow_nat n x);
|
|
41 |
pow_nat Nat.Zero_nat x = Classes.neutral;
|
22317
|
42 |
|
22813
|
43 |
pow_int :: (Classes.Group a) => Integer.Inta -> a -> a;
|
|
44 |
pow_int k x =
|
|
45 |
(if Integer.less_eq_int (Integer.Number_of_int Integer.Pls) k
|
|
46 |
then Classes.pow_nat (Integer.nat k) x
|
|
47 |
else Classes.inverse
|
|
48 |
(Classes.pow_nat (Integer.nat (Integer.uminus_int k)) x));
|
22317
|
49 |
|
22813
|
50 |
example :: Integer.Inta;
|
|
51 |
example =
|
|
52 |
Classes.pow_int
|
|
53 |
(Integer.Number_of_int
|
|
54 |
(Integer.Bit
|
|
55 |
(Integer.Bit
|
|
56 |
(Integer.Bit (Integer.Bit Integer.Pls Integer.B1) Integer.B0)
|
|
57 |
Integer.B1)
|
|
58 |
Integer.B0))
|
|
59 |
(Integer.Number_of_int (Integer.Bit Integer.Min Integer.B0));
|
22317
|
60 |
|
|
61 |
}
|