src/HOL/Library/ExecutableRat.thy
author haftmann
Sat, 25 Feb 2006 15:19:19 +0100
changeset 19137 f92919b141b2
parent 19082 47532d00e0c8
child 19233 77ca20b0ed77
permissions -rw-r--r--
change in codegen syntax
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
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    16
datatype erat = Rat bool int int
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    17
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    18
instance erat :: zero by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    19
instance erat :: one by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    20
instance erat :: plus by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    21
instance erat :: minus by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    22
instance erat :: times by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    23
instance erat :: inverse by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    24
instance erat :: ord by intro_classes
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    25
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    26
consts
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    27
  norm :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    28
  common :: "(int * int) * (int * int) \<Rightarrow> (int * int) * int"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    29
  of_quotient :: "int * int \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    30
  of_rat :: "rat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    31
  to_rat :: "erat \<Rightarrow> rat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    32
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    33
defs
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    34
  norm_def [simp]: "norm r == case r of (Rat a p q) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    35
     if p = 0 then Rat True 0 1
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    36
     else
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    37
       let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    38
         absp = abs p
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    39
       in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    40
         m = zgcd (absp, q)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    41
       in Rat (a = (0 <= p)) (absp div m) (q div m)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    42
  common_def [simp]: "common r == case r of ((p1, q1), (p2, q2)) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    43
       let q' = q1 * q2 div int (gcd (nat q1, nat q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    44
       in ((p1 * (q' div q1), p2 * (q' div q2)), q')"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    45
  of_quotient_def [simp]: "of_quotient r == case r of (a, b) \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    46
       norm (Rat True a b)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    47
  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
    48
  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
    49
       if a then Fract p q else Fract (uminus p) q"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    50
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    51
consts
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    52
  zero :: erat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    53
  one :: erat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    54
  add :: "erat \<Rightarrow> erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    55
  neg :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    56
  mult :: "erat \<Rightarrow> erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    57
  inv :: "erat \<Rightarrow> erat"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    58
  le :: "erat \<Rightarrow> erat \<Rightarrow> bool"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    59
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    60
defs (overloaded)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    61
  zero_rat_def [simp]: "0 == Rat False 0 1"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    62
  one_rat_def [simp]: "1 == Rat False 1 1"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    63
  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
    64
        let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    65
          ((r1, r2), den) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    66
        in let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    67
          num = (if a1 then r1 else -r1) + (if a2 then r2 else -r2)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    68
        in norm (Rat True num den)"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    69
  uminus_rat_def [simp]: "- r == case r of Rat a p q \<Rightarrow>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    70
        if p = 0 then Rat a p q
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    71
        else Rat (\<not> a) p q"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    72
  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
    73
        norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    74
  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
    75
        if p = 0 then arbitrary
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    76
        else Rat a q p"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    77
  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
    78
        (\<not> a1 \<and> a2) \<or>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    79
        (\<not> (a1 \<and> \<not> a2) \<and>
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    80
          (let
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    81
            ((r1, r2), dummy) = common ((p1, q1), (p2, q2))
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    82
          in if a1 then r1 <= r2 else r2 <= r1))"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    83
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    84
code_syntax_tyco rat
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    85
  ml (target_atom "{*erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    86
  haskell (target_atom "{*erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    87
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    88
code_alias
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    89
  (* an intermediate solution until name resolving of ad-hoc overloaded
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    90
     constants is refined *)
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    91
  "HOL.inverse" "Rational.inverse"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    92
  "HOL.divide" "Rational.divide"
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    93
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    94
code_syntax_const
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    95
  Fract
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    96
    ml ("{*of_quotient*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    97
    haskell ("{*of_quotient*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
    98
  "0 :: rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
    99
    ml ("{*0::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   100
    haskell ("{*1::erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   101
  "1 :: rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   102
    ml ("{*1::erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   103
    haskell ("{*1::erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   104
  "op + :: rat \<Rightarrow> rat \<Rightarrow> rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   105
    ml ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   106
    haskell ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   107
  "uminus :: rat \<Rightarrow> rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   108
    ml ("{*uminus :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   109
    haskell ("{*uminus :: erat \<Rightarrow> erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   110
  "op * :: rat \<Rightarrow> rat \<Rightarrow> rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   111
    ml ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   112
    haskell ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   113
  "inverse :: rat \<Rightarrow> rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   114
    ml ("{*inverse :: erat \<Rightarrow> erat*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   115
    haskell ("{*inverse :: erat \<Rightarrow> erat*}")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   116
  "divide :: rat \<Rightarrow> rat \<Rightarrow> rat"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   117
    ml ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   118
    haskell ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
19137
f92919b141b2 change in codegen syntax
haftmann
parents: 19082
diff changeset
   119
  "op <= :: rat \<Rightarrow> rat \<Rightarrow> bool"
19039
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   120
    ml ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   121
    haskell ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   122
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   123
end
8eae46249628 added theory of executable rational numbers
haftmann
parents:
diff changeset
   124