diff -r f1ba12c117ec -r 48494ccfabaf doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs --- a/doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs Tue Jul 24 15:20:53 2007 +0200 +++ b/doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs Tue Jul 24 15:21:54 2007 +0200 @@ -1,61 +1,59 @@ module Classes where { -import qualified Integer; -import qualified Nat; + +data Nat = Zero_nat | Suc Nat; + +data Bit = B0 | B1; + +nat_aux :: Integer -> Nat -> Nat; +nat_aux i n = (if i <= 0 then n else nat_aux (i - 1) (Suc n)); + +nat :: Integer -> Nat; +nat i = nat_aux i Zero_nat; class Semigroup a where { mult :: a -> a -> a; }; -class (Classes.Semigroup a) => Monoidl a where { +class (Semigroup a) => Monoidl a where { neutral :: a; }; -class (Classes.Monoidl a) => Group a where { +class (Monoidl a) => Group a where { inverse :: a -> a; }; -inverse_int :: Integer.Inta -> Integer.Inta; -inverse_int i = Integer.uminus_int i; +inverse_int :: Integer -> Integer; +inverse_int i = negate i; -neutral_int :: Integer.Inta; -neutral_int = Integer.Number_of_int Integer.Pls; +neutral_int :: Integer; +neutral_int = 0; -mult_int :: Integer.Inta -> Integer.Inta -> Integer.Inta; -mult_int i j = Integer.plus_int i j; +mult_int :: Integer -> Integer -> Integer; +mult_int i j = i + j; -instance Classes.Semigroup Integer.Inta where { - mult = Classes.mult_int; +instance Semigroup Integer where { + mult = mult_int; }; -instance Classes.Monoidl Integer.Inta where { - neutral = Classes.neutral_int; -}; - -instance Classes.Group Integer.Inta where { - inverse = Classes.inverse_int; +instance Monoidl Integer where { + neutral = neutral_int; }; -pow_nat :: (Classes.Monoidl b) => Nat.Nat -> b -> b; -pow_nat (Nat.Suc n) x = Classes.mult x (Classes.pow_nat n x); -pow_nat Nat.Zero_nat x = Classes.neutral; +instance Group Integer where { + inverse = inverse_int; +}; -pow_int :: (Classes.Group a) => Integer.Inta -> a -> a; -pow_int k x = - (if Integer.less_eq_int (Integer.Number_of_int Integer.Pls) k - then Classes.pow_nat (Integer.nat k) x - else Classes.inverse - (Classes.pow_nat (Integer.nat (Integer.uminus_int k)) x)); +pow_nat :: (Group b) => Nat -> b -> b; +pow_nat (Suc n) x = mult x (pow_nat n x); +pow_nat Zero_nat x = neutral; -example :: Integer.Inta; -example = - Classes.pow_int - (Integer.Number_of_int - (Integer.Bit - (Integer.Bit - (Integer.Bit (Integer.Bit Integer.Pls Integer.B1) Integer.B0) - Integer.B1) - Integer.B0)) - (Integer.Number_of_int (Integer.Bit Integer.Min Integer.B0)); +pow_int :: (Group a) => Integer -> a -> a; +pow_int k x = + (if 0 <= k then pow_nat (nat k) x + else inverse (pow_nat (nat (negate k)) x)); + +example :: Integer; +example = pow_int 10 (-2); }