src/HOL/Library/ExecutableRat.thy
author haftmann
Mon, 25 Sep 2006 17:04:18 +0200
changeset 20701 17a625996bb0
parent 20597 65fe827aa595
child 20713 823967ef47f1
permissions -rw-r--r--
better handling for div by zero
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/Library/ExecutableRat.thy
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     2
    ID:         $Id$
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     4
*)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     5
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     6
header {* Executable implementation of rational numbers in HOL *}
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     7
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     8
theory ExecutableRat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
     9
imports "~~/src/HOL/Real/Rational" "~~/src/HOL/NumberTheory/IntPrimes"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    10
begin
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    11
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    12
text {*
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    13
  Actually nothing is proved about the implementation.
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    14
*}
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    15
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    16
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    17
section {* HOL definitions *}
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    18
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    19
datatype erat = Rat bool int int
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    20
19233
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    21
instance erat :: zero ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    22
instance erat :: one ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    23
instance erat :: plus ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    24
instance erat :: minus ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    25
instance erat :: times ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    26
instance erat :: inverse ..
77ca20b0ed77 renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents: 19137
diff changeset
    27
instance erat :: ord ..
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    28
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    29
definition
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    30
  norm :: "erat \<Rightarrow> erat"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    31
  norm_def: "norm r = (case r of (Rat a p q) \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    32
     if p = 0 then Rat True 0 1
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    33
     else
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    34
       let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    35
         absp = abs p
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    36
       in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    37
         m = zgcd (absp, q)
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    38
       in Rat (a = (0 <= p)) (absp div m) (q div m))"
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    39
  common :: "(int * int) * (int * int) \<Rightarrow> (int * int) * int"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    40
  common_def: "common r = (case r of ((p1, q1), (p2, q2)) \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    41
       let q' = q1 * q2 div int (gcd (nat q1, nat q2))
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    42
       in ((p1 * (q' div q1), p2 * (q' div q2)), q'))"
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    43
  of_quotient :: "int \<Rightarrow> int \<Rightarrow> erat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    44
  of_quotient_def: "of_quotient a b =
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    45
       norm (Rat True a b)"
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    46
  of_rat :: "rat \<Rightarrow> erat"
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    47
  of_rat_def: "of_rat r = split of_quotient (SOME s. s : Rep_Rat r)"
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    48
  to_rat :: "erat \<Rightarrow> rat"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    49
  to_rat_def: "to_rat r = (case r of (Rat a p q) \<Rightarrow>
19609
a677ac8c9b10 fixed codegen bug, cleanup
haftmann
parents: 19233
diff changeset
    50
       if a then Fract p q else Fract (uminus p) q)"
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
    51
  eq_erat :: "erat \<Rightarrow> erat \<Rightarrow> bool"
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
    52
  "eq_erat r s = (norm r = norm s)"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    53
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    54
axiomatization
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    55
  div_zero :: erat
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    56
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    57
defs (overloaded)
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    58
  zero_rat_def: "0 == Rat True 0 1"
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    59
  one_rat_def: "1 == Rat True 1 1"
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    60
  add_rat_def: "r + s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    61
        let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    62
          ((r1, r2), den) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    63
        in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    64
          num = (if a1 then r1 else -r1) + (if a2 then r2 else -r2)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    65
        in norm (Rat True num den)"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    66
  uminus_rat_def: "- r == case r of Rat a p q \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    67
        if p = 0 then Rat a p q
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    68
        else Rat (\<not> a) p q"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    69
  times_rat_def: "r * s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    70
        norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    71
  inverse_rat_def: "inverse r == case r of Rat a p q \<Rightarrow>
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    72
        if p = 0 then div_zero
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    73
        else Rat a q p"
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    74
  le_rat_def: "r <= s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    75
        (\<not> a1 \<and> a2) \<or>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    76
        (\<not> (a1 \<and> \<not> a2) \<and>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    77
          (let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    78
            ((r1, r2), dummy) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    79
          in if a1 then r1 <= r2 else r2 <= r1))"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    80
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
    81
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    82
section {* code lemmas *}
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    83
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    84
lemma
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    85
  number_of_rat [code unfold]: "(number_of k \<Colon> rat) \<equiv> Fract k 1"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    86
  unfolding Fract_of_int_eq rat_number_of_def by simp
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    87
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    88
instance rat :: eq ..
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    89
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    90
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    91
section {* code names *}
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    92
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    93
code_typename
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    94
  erat "Rational.erat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    95
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    96
code_constname
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    97
  Rat "Rational.rat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    98
  erat_case "Rational.erat_case"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
    99
  norm "Rational.norm"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   100
  common "Rational.common"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   101
  of_quotient "Rational.of_quotient"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   102
  of_rat "Rational.of_rat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   103
  to_rat "Rational.to_rat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   104
  eq_erat "Rational.eq_erat"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   105
  div_zero "Rational.div_zero"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   106
  "0\<Colon>erat" "Rational.erat_zero"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   107
  "1\<Colon>erat" "Rational.erat_one"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   108
  "op + \<Colon> erat \<Rightarrow> erat \<Rightarrow> erat" "Rational.erat_plus"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   109
  "uminus \<Colon> erat \<Rightarrow> erat" "Rational.erat_uminus"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   110
  "op * \<Colon> erat \<Rightarrow> erat \<Rightarrow> erat" "Rational.erat_times"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   111
  "inverse  \<Colon> erat \<Rightarrow> erat" "Rational.erat_inverse"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   112
  "op \<le> \<Colon> erat \<Rightarrow> erat \<Rightarrow> bool" "Rational.erat_le"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   113
  "OperationalEquality.eq \<Colon> erat \<Rightarrow> erat \<Rightarrow> bool" "Rational.erat_eq"
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   114
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   115
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   116
section {* type serializations *}
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   117
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   118
types_code
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   119
  rat ("{*erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   120
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   121
code_gen Rat
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   122
  (SML) (Haskell)
19889
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   123
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   124
code_type rat
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   125
  (SML "{*erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   126
  (Haskell "{*erat*}")
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   127
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   128
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   129
section {* const serializations *}
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   130
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   131
consts_code
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   132
  div_zero ("raise/ (Fail/ \"non-defined rational number\")")
19791
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   133
  Fract ("{*of_quotient*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   134
  0 :: rat ("{*0::erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   135
  1 :: rat ("{*1::erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   136
  HOL.plus :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   137
  uminus :: "rat \<Rightarrow> rat" ("{*uminus :: erat \<Rightarrow> erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   138
  HOL.times :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   139
  inverse :: "rat \<Rightarrow> rat" ("{*inverse :: erat \<Rightarrow> erat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   140
  divide :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   141
  Orderings.less_eq :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   142
  "op =" :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*eq_rat*}")
ab326de16ad5 refined code generation
haftmann
parents: 19609
diff changeset
   143
20701
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   144
code_const div_zero
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   145
  (SML "raise/ (Fail/ \"Division by zero\")")
17a625996bb0 better handling for div by zero
haftmann
parents: 20597
diff changeset
   146
  (Haskell "error/ \"Division by zero\"")
19889
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   147
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   148
code_gen
19889
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   149
  of_quotient
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   150
  "0::erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   151
  "1::erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   152
  "op + :: erat \<Rightarrow> erat \<Rightarrow> erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   153
  "uminus :: erat \<Rightarrow> erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   154
  "op * :: erat \<Rightarrow> erat \<Rightarrow> erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   155
  "inverse :: erat \<Rightarrow> erat"
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   156
  "op <= :: erat \<Rightarrow> erat \<Rightarrow> bool"
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   157
  eq_erat
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   158
  (SML) (Haskell)
19889
2202a5648897 slight adaptions for code generator
haftmann
parents: 19791
diff changeset
   159
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   160
code_const Fract
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   161
  (SML "{*of_quotient*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   162
  (Haskell "{*of_quotient*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   163
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   164
code_const "0 :: rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   165
  (SML "{*0::erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   166
  (Haskell "{*1::erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   167
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   168
code_const "1 :: rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   169
  (SML "{*1::erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   170
  (Haskell "{*1::erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   171
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   172
code_const "op + :: rat \<Rightarrow> rat \<Rightarrow> rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   173
  (SML "{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   174
  (Haskell "{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   175
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   176
code_const "uminus :: rat \<Rightarrow> rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   177
  (SML "{*uminus :: erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   178
  (Haskell "{*uminus :: erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   179
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   180
code_const "op * :: rat \<Rightarrow> rat \<Rightarrow> rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   181
  (SML "{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   182
  (Haskell "{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   183
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   184
code_const "inverse :: rat \<Rightarrow> rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   185
  (SML "{*inverse :: erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   186
  (Haskell "{*inverse :: erat \<Rightarrow> erat*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   187
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   188
code_const "divide :: rat \<Rightarrow> rat \<Rightarrow> rat"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   189
  (SML "{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   190
  (Haskell "{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   191
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   192
code_const "op <= :: rat \<Rightarrow> rat \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   193
  (SML "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   194
  (Haskell "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 19889
diff changeset
   195
20597
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   196
code_const "OperationalEquality.eq :: rat \<Rightarrow> rat \<Rightarrow> bool"
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   197
  (SML "{*eq_erat*}")
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   198
  (Haskell "{*eq_erat*}")
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   199
65fe827aa595 code generation 2 adjustments
haftmann
parents: 20453
diff changeset
   200
code_gen (SML -)
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   201
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   202
end