src/HOL/Library/ExecutableRat.thy
author haftmann
Tue, 14 Feb 2006 17:07:48 +0100
changeset 19039 8eae46249628
child 19082 47532d00e0c8
permissions -rw-r--r--
added theory of executable rational numbers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     1
ML {*
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     2
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     3
fun strip_abs_split 0 t = ([], t)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     4
  | strip_abs_split i (Abs (s, T, t)) =
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     5
      let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     6
        val s' = Codegen.new_name t s;
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     7
        val v = Free (s', T)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     8
      in apfst (cons v) (strip_abs_split (i-1) (subst_bound (v, t))) end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     9
  | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    10
        (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    11
      | _ => ([], u))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    12
  | strip_abs_split i t = ([], t);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    13
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    14
fun let_codegen thy defs gr dep thyname brack t = (case strip_comb t of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    15
    (t1 as Const ("Let", _), t2 :: t3 :: ts) =>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    16
    let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    17
      fun dest_let (l as Const ("Let", _) $ t $ u) =
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    18
          (case strip_abs_split 1 u of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    19
             ([p], u') => apfst (cons (p, t)) (dest_let u')
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    20
           | _ => ([], l))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    21
        | dest_let t = ([], t);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    22
      fun mk_code (gr, (l, r)) =
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    23
        let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    24
          val (gr1, pl) = Codegen.invoke_codegen thy defs dep thyname false (gr, l);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    25
          val (gr2, pr) = Codegen.invoke_codegen thy defs dep thyname false (gr1, r);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    26
        in (gr2, (pl, pr)) end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    27
    in case dest_let (t1 $ t2 $ t3) of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    28
        ([], _) => NONE
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    29
      | (ps, u) =>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    30
          let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    31
            val (gr1, qs) = foldl_map mk_code (gr, ps);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    32
            val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    33
            val (gr3, pargs) = foldl_map
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    34
              (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    35
          in
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    36
            SOME (gr3, Codegen.mk_app brack
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    37
              (Pretty.blk (0, [Pretty.str "let ", Pretty.blk (0, List.concat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    38
                  (separate [Pretty.str ";", Pretty.brk 1] (map (fn (pl, pr) =>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    39
                    [Pretty.block [Pretty.str "val ", pl, Pretty.str " =",
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    40
                       Pretty.brk 1, pr]]) qs))),
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    41
                Pretty.brk 1, Pretty.str "in ", pu,
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    42
                Pretty.brk 1, Pretty.str "end"])) pargs)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    43
          end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    44
    end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    45
  | _ => NONE);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    46
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    47
fun split_codegen thy defs gr dep thyname brack t = (case strip_comb t of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    48
    (t1 as Const ("split", _), t2 :: ts) =>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    49
      (case strip_abs_split 1 (t1 $ t2) of
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    50
         ([p], u) =>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    51
           let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    52
             val (gr1, q) = Codegen.invoke_codegen thy defs dep thyname false (gr, p);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    53
             val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    54
             val (gr3, pargs) = foldl_map
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    55
               (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    56
           in
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    57
             SOME (gr2, Codegen.mk_app brack
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    58
               (Pretty.block [Pretty.str "(fn ", q, Pretty.str " =>",
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    59
                 Pretty.brk 1, pu, Pretty.str ")"]) pargs)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    60
           end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    61
       | _ => NONE)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    62
  | _ => NONE);
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    63
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    64
val prod_codegen_setup =
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    65
  Codegen.add_codegen "let_codegen" let_codegen #>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    66
  Codegen.add_codegen "split_codegen" split_codegen #>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    67
  CodegenPackage.add_appconst
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    68
    ("Let", ((2, 2), CodegenPackage.appgen_let strip_abs_split)) #>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    69
  CodegenPackage.add_appconst
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    70
    ("split", ((1, 1), CodegenPackage.appgen_split strip_abs_split));
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    71
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    72
*}
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    73
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    74
(*  Title:      HOL/Library/ExecutableRat.thy
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    75
    ID:         $Id$
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    76
    Author:     Florian Haftmann, TU Muenchen
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    77
*)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    78
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    79
header {* Executable implementation of rational numbers in HOL *}
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    80
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    81
theory ExecutableRat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    82
imports "~~/src/HOL/Real/Rational" "~~/src/HOL/NumberTheory/IntPrimes"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    83
begin
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    84
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    85
text {*
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    86
  Actually nothing is proved about the implementation.
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    87
*}
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    88
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    89
datatype erat = Rat bool int int
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    90
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    91
instance erat :: zero by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    92
instance erat :: one by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    93
instance erat :: plus by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    94
instance erat :: minus by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    95
instance erat :: times by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    96
instance erat :: inverse by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    97
instance erat :: ord by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    98
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    99
consts
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   100
  norm :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   101
  common :: "(int * int) * (int * int) \<Rightarrow> (int * int) * int"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   102
  of_quotient :: "int * int \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   103
  of_rat :: "rat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   104
  to_rat :: "erat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   105
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   106
defs
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   107
  norm_def [simp]: "norm r == case r of (Rat a p q) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   108
     if p = 0 then Rat True 0 1
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   109
     else
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   110
       let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   111
         absp = abs p
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   112
       in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   113
         m = zgcd (absp, q)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   114
       in Rat (a = (0 <= p)) (absp div m) (q div m)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   115
  common_def [simp]: "common r == case r of ((p1, q1), (p2, q2)) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   116
       let q' = q1 * q2 div int (gcd (nat q1, nat q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   117
       in ((p1 * (q' div q1), p2 * (q' div q2)), q')"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   118
  of_quotient_def [simp]: "of_quotient r == case r of (a, b) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   119
       norm (Rat True a b)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   120
  of_rat_def [simp]: "of_rat r == of_quotient (THE s. s : Rep_Rat r)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   121
  to_rat_def [simp]: "to_rat r == case r of (Rat a p q) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   122
       if a then Fract p q else Fract (uminus p) q"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   123
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   124
consts
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   125
  zero :: erat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   126
  one :: erat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   127
  add :: "erat \<Rightarrow> erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   128
  neg :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   129
  mult :: "erat \<Rightarrow> erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   130
  inv :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   131
  le :: "erat \<Rightarrow> erat \<Rightarrow> bool"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   132
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   133
defs (overloaded)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   134
  zero_rat_def [simp]: "0 == Rat False 0 1"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   135
  one_rat_def [simp]: "1 == Rat False 1 1"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   136
  add_rat_def [simp]: "r + s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   137
        let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   138
          ((r1, r2), den) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   139
        in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   140
          num = (if a1 then r1 else -r1) + (if a2 then r2 else -r2)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   141
        in norm (Rat True num den)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   142
  uminus_rat_def [simp]: "- r == case r of Rat a p q \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   143
        if p = 0 then Rat a p q
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   144
        else Rat (\<not> a) p q"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   145
  times_rat_def [simp]: "r * s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   146
        norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   147
  inverse_rat_def [simp]: "inverse r == case r of Rat a p q \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   148
        if p = 0 then arbitrary
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   149
        else Rat a q p"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   150
  le_rat_def [simp]: "r <= s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   151
        (\<not> a1 \<and> a2) \<or>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   152
        (\<not> (a1 \<and> \<not> a2) \<and>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   153
          (let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   154
            ((r1, r2), dummy) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   155
          in if a1 then r1 <= r2 else r2 <= r1))"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   156
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   157
code_syntax_tyco rat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   158
  ml (target_atom "{*erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   159
  haskell (target_atom "{*erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   160
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   161
code_alias
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   162
  (* an intermediate solution until name resolving of ad-hoc overloaded
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   163
     constants is refined *)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   164
  "HOL.inverse" "Rational.inverse"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   165
  "HOL.divide" "Rational.divide"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   166
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   167
code_syntax_const
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   168
  Fract
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   169
    ml ("{*of_quotient*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   170
    haskell ("{*of_quotient*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   171
  0 :: "rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   172
    ml ("{*0::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   173
    haskell ("{*1::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   174
  1 :: "rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   175
    ml ("{*1::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   176
    haskell ("{*1::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   177
  "op +" :: "rat \<Rightarrow> rat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   178
    ml ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   179
    haskell ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   180
  uminus :: "rat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   181
    ml ("{*uminus :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   182
    haskell ("{*uminus :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   183
  "op *" :: "rat \<Rightarrow> rat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   184
    ml ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   185
    haskell ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   186
  inverse :: "rat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   187
    ml ("{*inverse :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   188
    haskell ("{*inverse :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   189
  divide :: "rat \<Rightarrow> rat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   190
    ml ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   191
    haskell ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   192
  "op <=" :: "rat \<Rightarrow> rat \<Rightarrow> bool"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   193
    ml ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   194
    haskell ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   195
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   196
end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   197