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 -) |