doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs
author wenzelm
Thu, 26 Apr 2007 15:41:49 +0200
changeset 22813 882513df2472
parent 22317 b550d2c6ca90
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
module Classes where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     2
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
     3
import qualified Integer;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
     4
import qualified Nat;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     5
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     6
class Semigroup a where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     7
  mult :: a -> a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     8
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     9
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    10
class (Classes.Semigroup a) => Monoidl a where {
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    11
  neutral :: a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    12
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    13
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    14
class (Classes.Monoidl a) => Group a where {
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    15
  inverse :: a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    16
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    17
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    18
inverse_int :: Integer.Inta -> Integer.Inta;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    19
inverse_int i = Integer.uminus_int i;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    20
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    21
neutral_int :: Integer.Inta;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    22
neutral_int = Integer.Number_of_int Integer.Pls;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    23
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    24
mult_int :: Integer.Inta -> Integer.Inta -> Integer.Inta;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    25
mult_int i j = Integer.plus_int i j;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    26
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    27
instance Classes.Semigroup Integer.Inta where {
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    28
  mult = Classes.mult_int;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    29
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    30
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    31
instance Classes.Monoidl Integer.Inta where {
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    32
  neutral = Classes.neutral_int;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    33
};
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    34
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    35
instance Classes.Group Integer.Inta where {
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    36
  inverse = Classes.inverse_int;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    37
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    38
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    39
pow_nat :: (Classes.Monoidl b) => Nat.Nat -> b -> b;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    40
pow_nat (Nat.Suc n) x = Classes.mult x (Classes.pow_nat n x);
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    41
pow_nat Nat.Zero_nat x = Classes.neutral;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    42
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    43
pow_int :: (Classes.Group a) => Integer.Inta -> a -> a;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    44
pow_int k x =
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    45
  (if Integer.less_eq_int (Integer.Number_of_int Integer.Pls) k
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    46
    then Classes.pow_nat (Integer.nat k) x
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    47
    else Classes.inverse
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    48
           (Classes.pow_nat (Integer.nat (Integer.uminus_int k)) x));
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    49
22813
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    50
example :: Integer.Inta;
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    51
example =
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    52
  Classes.pow_int
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    53
    (Integer.Number_of_int
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    54
      (Integer.Bit
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    55
        (Integer.Bit
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    56
          (Integer.Bit (Integer.Bit Integer.Pls Integer.B1) Integer.B0)
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    57
          Integer.B1)
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    58
        Integer.B0))
882513df2472 updated;
wenzelm
parents: 22317
diff changeset
    59
    (Integer.Number_of_int (Integer.Bit Integer.Min Integer.B0));
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    60
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    61
}