src/HOL/Library/ExecutableRat.thy
changeset 20701 17a625996bb0
parent 20597 65fe827aa595
child 20713 823967ef47f1
equal deleted inserted replaced
20700:7e3450c10c2d 20701:17a625996bb0
    38        in Rat (a = (0 <= p)) (absp div m) (q div m))"
    38        in Rat (a = (0 <= p)) (absp div m) (q div m))"
    39   common :: "(int * int) * (int * int) \<Rightarrow> (int * int) * int"
    39   common :: "(int * int) * (int * int) \<Rightarrow> (int * int) * int"
    40   common_def: "common r = (case r of ((p1, q1), (p2, q2)) \<Rightarrow>
    40   common_def: "common r = (case r of ((p1, q1), (p2, q2)) \<Rightarrow>
    41        let q' = q1 * q2 div int (gcd (nat q1, nat q2))
    41        let q' = q1 * q2 div int (gcd (nat q1, nat q2))
    42        in ((p1 * (q' div q1), p2 * (q' div q2)), q'))"
    42        in ((p1 * (q' div q1), p2 * (q' div q2)), q'))"
    43   of_quotient :: "int * int \<Rightarrow> erat"
    43   of_quotient :: "int \<Rightarrow> int \<Rightarrow> erat"
    44   of_quotient_def: "of_quotient r = (case r of (a, b) \<Rightarrow>
    44   of_quotient_def: "of_quotient a b =
    45        norm (Rat True a b))"
    45        norm (Rat True a b)"
    46   of_rat :: "rat \<Rightarrow> erat"
    46   of_rat :: "rat \<Rightarrow> erat"
    47   of_rat_def: "of_rat r = of_quotient (SOME s. s : Rep_Rat r)"
    47   of_rat_def: "of_rat r = split of_quotient (SOME s. s : Rep_Rat r)"
    48   to_rat :: "erat \<Rightarrow> rat"
    48   to_rat :: "erat \<Rightarrow> rat"
    49   to_rat_def: "to_rat r = (case r of (Rat a p q) \<Rightarrow>
    49   to_rat_def: "to_rat r = (case r of (Rat a p q) \<Rightarrow>
    50        if a then Fract p q else Fract (uminus p) q)"
    50        if a then Fract p q else Fract (uminus p) q)"
    51   eq_erat :: "erat \<Rightarrow> erat \<Rightarrow> bool"
    51   eq_erat :: "erat \<Rightarrow> erat \<Rightarrow> bool"
    52   "eq_erat r s = (norm r = norm s)"
    52   "eq_erat r s = (norm r = norm s)"
       
    53 
       
    54 axiomatization
       
    55   div_zero :: erat
    53 
    56 
    54 defs (overloaded)
    57 defs (overloaded)
    55   zero_rat_def: "0 == Rat True 0 1"
    58   zero_rat_def: "0 == Rat True 0 1"
    56   one_rat_def: "1 == Rat True 1 1"
    59   one_rat_def: "1 == Rat True 1 1"
    57   add_rat_def: "r + s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    60   add_rat_def: "r + s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    64         if p = 0 then Rat a p q
    67         if p = 0 then Rat a p q
    65         else Rat (\<not> a) p q"
    68         else Rat (\<not> a) p q"
    66   times_rat_def: "r * s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    69   times_rat_def: "r * s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    67         norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))"
    70         norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))"
    68   inverse_rat_def: "inverse r == case r of Rat a p q \<Rightarrow>
    71   inverse_rat_def: "inverse r == case r of Rat a p q \<Rightarrow>
    69         if p = 0 then arbitrary
    72         if p = 0 then div_zero
    70         else Rat a q p"
    73         else Rat a q p"
    71   le_rat_def: "r <= s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    74   le_rat_def: "r <= s == case r of Rat a1 p1 q1 \<Rightarrow> case s of Rat a2 p2 q2 \<Rightarrow>
    72         (\<not> a1 \<and> a2) \<or>
    75         (\<not> a1 \<and> a2) \<or>
    73         (\<not> (a1 \<and> \<not> a2) \<and>
    76         (\<not> (a1 \<and> \<not> a2) \<and>
    74           (let
    77           (let
    75             ((r1, r2), dummy) = common ((p1, q1), (p2, q2))
    78             ((r1, r2), dummy) = common ((p1, q1), (p2, q2))
    76           in if a1 then r1 <= r2 else r2 <= r1))"
    79           in if a1 then r1 <= r2 else r2 <= r1))"
    77 
    80 
    78 
    81 
       
    82 section {* code lemmas *}
       
    83 
       
    84 lemma
       
    85   number_of_rat [code unfold]: "(number_of k \<Colon> rat) \<equiv> Fract k 1"
       
    86   unfolding Fract_of_int_eq rat_number_of_def by simp
       
    87 
       
    88 instance rat :: eq ..
       
    89 
       
    90 
       
    91 section {* code names *}
       
    92 
       
    93 code_typename
       
    94   erat "Rational.erat"
       
    95 
       
    96 code_constname
       
    97   Rat "Rational.rat"
       
    98   erat_case "Rational.erat_case"
       
    99   norm "Rational.norm"
       
   100   common "Rational.common"
       
   101   of_quotient "Rational.of_quotient"
       
   102   of_rat "Rational.of_rat"
       
   103   to_rat "Rational.to_rat"
       
   104   eq_erat "Rational.eq_erat"
       
   105   div_zero "Rational.div_zero"
       
   106   "0\<Colon>erat" "Rational.erat_zero"
       
   107   "1\<Colon>erat" "Rational.erat_one"
       
   108   "op + \<Colon> erat \<Rightarrow> erat \<Rightarrow> erat" "Rational.erat_plus"
       
   109   "uminus \<Colon> erat \<Rightarrow> erat" "Rational.erat_uminus"
       
   110   "op * \<Colon> erat \<Rightarrow> erat \<Rightarrow> erat" "Rational.erat_times"
       
   111   "inverse  \<Colon> erat \<Rightarrow> erat" "Rational.erat_inverse"
       
   112   "op \<le> \<Colon> erat \<Rightarrow> erat \<Rightarrow> bool" "Rational.erat_le"
       
   113   "OperationalEquality.eq \<Colon> erat \<Rightarrow> erat \<Rightarrow> bool" "Rational.erat_eq"
       
   114 
       
   115 
    79 section {* type serializations *}
   116 section {* type serializations *}
    80 
   117 
    81 types_code
   118 types_code
    82   rat ("{*erat*}")
   119   rat ("{*erat*}")
    83 
   120 
    90 
   127 
    91 
   128 
    92 section {* const serializations *}
   129 section {* const serializations *}
    93 
   130 
    94 consts_code
   131 consts_code
    95   arbitrary :: erat ("raise/ (Fail/ \"non-defined rational number\")")
   132   div_zero ("raise/ (Fail/ \"non-defined rational number\")")
    96   Fract ("{*of_quotient*}")
   133   Fract ("{*of_quotient*}")
    97   0 :: rat ("{*0::erat*}")
   134   0 :: rat ("{*0::erat*}")
    98   1 :: rat ("{*1::erat*}")
   135   1 :: rat ("{*1::erat*}")
    99   HOL.plus :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
   136   HOL.plus :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op + :: erat \<Rightarrow> erat \<Rightarrow> erat*}")
   100   uminus :: "rat \<Rightarrow> rat" ("{*uminus :: erat \<Rightarrow> erat*}")
   137   uminus :: "rat \<Rightarrow> rat" ("{*uminus :: erat \<Rightarrow> erat*}")
   102   inverse :: "rat \<Rightarrow> rat" ("{*inverse :: erat \<Rightarrow> erat*}")
   139   inverse :: "rat \<Rightarrow> rat" ("{*inverse :: erat \<Rightarrow> erat*}")
   103   divide :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
   140   divide :: "rat \<Rightarrow> rat \<Rightarrow> rat" ("{*op * :: erat \<Rightarrow> erat \<Rightarrow> erat*}/ _/ ({*inverse :: erat \<Rightarrow> erat*}/ _)")
   104   Orderings.less_eq :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   141   Orderings.less_eq :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   105   "op =" :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*eq_rat*}")
   142   "op =" :: "rat \<Rightarrow> rat \<Rightarrow> bool" ("{*eq_rat*}")
   106 
   143 
   107 code_const "arbitrary :: erat"
   144 code_const div_zero
   108   (SML "raise/ (Fail/ \"non-defined rational number\")")
   145   (SML "raise/ (Fail/ \"Division by zero\")")
   109   (Haskell "error/ \"non-defined rational number\"")
   146   (Haskell "error/ \"Division by zero\"")
   110 
   147 
   111 code_gen
   148 code_gen
   112   of_quotient
   149   of_quotient
   113   "0::erat"
   150   "0::erat"
   114   "1::erat"
   151   "1::erat"
   154 
   191 
   155 code_const "op <= :: rat \<Rightarrow> rat \<Rightarrow> bool"
   192 code_const "op <= :: rat \<Rightarrow> rat \<Rightarrow> bool"
   156   (SML "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   193   (SML "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   157   (Haskell "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   194   (Haskell "{*op <= :: erat \<Rightarrow> erat \<Rightarrow> bool*}")
   158 
   195 
   159 instance rat :: eq ..
       
   160 
       
   161 code_const "OperationalEquality.eq :: rat \<Rightarrow> rat \<Rightarrow> bool"
   196 code_const "OperationalEquality.eq :: rat \<Rightarrow> rat \<Rightarrow> bool"
   162   (SML "{*eq_erat*}")
   197   (SML "{*eq_erat*}")
   163   (Haskell "{*eq_erat*}")
   198   (Haskell "{*eq_erat*}")
   164 
   199 
   165 code_gen (SML -)
   200 code_gen (SML -)