diff -r 1c788c6974e8 -r ab326de16ad5 src/HOL/Library/ExecutableRat.thy --- a/src/HOL/Library/ExecutableRat.thy Tue Jun 06 15:02:09 2006 +0200 +++ b/src/HOL/Library/ExecutableRat.thy Tue Jun 06 15:02:55 2006 +0200 @@ -13,6 +13,9 @@ Actually nothing is proved about the implementation. *} + +section {* HOL definitions *} + datatype erat = Rat bool int int instance erat :: zero .. @@ -25,7 +28,7 @@ definition norm :: "erat \ erat" - norm_def [simp]: "norm r = (case r of (Rat a p q) \ + norm_def: "norm r = (case r of (Rat a p q) \ if p = 0 then Rat True 0 1 else let @@ -34,46 +37,70 @@ m = zgcd (absp, q) in Rat (a = (0 <= p)) (absp div m) (q div m))" common :: "(int * int) * (int * int) \ (int * int) * int" - common_def [simp]: "common r = (case r of ((p1, q1), (p2, q2)) \ + common_def: "common r = (case r of ((p1, q1), (p2, q2)) \ let q' = q1 * q2 div int (gcd (nat q1, nat q2)) in ((p1 * (q' div q1), p2 * (q' div q2)), q'))" of_quotient :: "int * int \ erat" - of_quotient_def [simp]: "of_quotient r = (case r of (a, b) \ + of_quotient_def: "of_quotient r = (case r of (a, b) \ norm (Rat True a b))" of_rat :: "rat \ erat" - of_rat_def [simp]: "of_rat r = of_quotient (THE s. s : Rep_Rat r)" + of_rat_def: "of_rat r = of_quotient (SOME s. s : Rep_Rat r)" to_rat :: "erat \ rat" - to_rat_def [simp]: "to_rat r = (case r of (Rat a p q) \ + to_rat_def: "to_rat r = (case r of (Rat a p q) \ if a then Fract p q else Fract (uminus p) q)" + eq_rat :: "erat \ erat \ bool" + "eq_rat r s = (norm r = norm s)" defs (overloaded) - zero_rat_def [simp]: "0 == Rat False 0 1" - one_rat_def [simp]: "1 == Rat False 1 1" - add_rat_def [simp]: "r + s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ + zero_rat_def: "0 == Rat True 0 1" + one_rat_def: "1 == Rat True 1 1" + add_rat_def: "r + s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ let ((r1, r2), den) = common ((p1, q1), (p2, q2)) in let num = (if a1 then r1 else -r1) + (if a2 then r2 else -r2) in norm (Rat True num den)" - uminus_rat_def [simp]: "- r == case r of Rat a p q \ + uminus_rat_def: "- r == case r of Rat a p q \ if p = 0 then Rat a p q else Rat (\ a) p q" - times_rat_def [simp]: "r * s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ + times_rat_def: "r * s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ norm (Rat (a1 = a2) (p1 * p2) (q1 * q2))" - inverse_rat_def [simp]: "inverse r == case r of Rat a p q \ + inverse_rat_def: "inverse r == case r of Rat a p q \ if p = 0 then arbitrary else Rat a q p" - le_rat_def [simp]: "r <= s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ + le_rat_def: "r <= s == case r of Rat a1 p1 q1 \ case s of Rat a2 p2 q2 \ (\ a1 \ a2) \ (\ (a1 \ \ a2) \ (let ((r1, r2), dummy) = common ((p1, q1), (p2, q2)) in if a1 then r1 <= r2 else r2 <= r1))" + +section {* type serializations *} + +types_code + rat ("{*erat*}") + code_syntax_tyco rat ml (target_atom "{*erat*}") haskell (target_atom "{*erat*}") + +section {* const serializations *} + +consts_code + arbitrary :: erat ("raise/ (Fail/ \"non-defined rational number\")") + Fract ("{*of_quotient*}") + 0 :: rat ("{*0::erat*}") + 1 :: rat ("{*1::erat*}") + HOL.plus :: "rat \ rat \ rat" ("{*op + :: erat \ erat \ erat*}") + uminus :: "rat \ rat" ("{*uminus :: erat \ erat*}") + HOL.times :: "rat \ rat \ rat" ("{*op * :: erat \ erat \ erat*}") + inverse :: "rat \ rat" ("{*inverse :: erat \ erat*}") + divide :: "rat \ rat \ rat" ("{*op * :: erat \ erat \ erat*}/ _/ ({*inverse :: erat \ erat*}/ _)") + Orderings.less_eq :: "rat \ rat \ bool" ("{*op <= :: erat \ erat \ bool*}") + "op =" :: "rat \ rat \ bool" ("{*eq_rat*}") + code_syntax_const "arbitrary :: erat" ml ("raise/ (Fail/ \"non-defined rational number\")") @@ -89,7 +116,7 @@ haskell ("{*1::erat*}") "op + :: rat \ rat \ rat" ml ("{*op + :: erat \ erat \ erat*}") - haskell ("{*HOL.plus :: erat \ erat \ erat*}") + haskell ("{*op + :: erat \ erat \ erat*}") "uminus :: rat \ rat" ml ("{*uminus :: erat \ erat*}") haskell ("{*uminus :: erat \ erat*}") @@ -105,6 +132,9 @@ "op <= :: rat \ rat \ bool" ml ("{*op <= :: erat \ erat \ bool*}") haskell ("{*op <= :: erat \ erat \ bool*}") + "op = :: rat \ rat \ bool" + ml ("{*eq_rat*}") + haskell ("{*eq_rat*}") end