walther@60327
|
1 |
(* Title: test/Tools/isac/Knowledge/rational-1.sml
|
walther@60327
|
2 |
Author: Walther Neuper
|
walther@60327
|
3 |
Use is subject to license terms.
|
walther@60327
|
4 |
|
walther@60327
|
5 |
Test of basic functions and application to complex examples.
|
walther@60327
|
6 |
*)
|
walther@60327
|
7 |
|
walther@60327
|
8 |
"-----------------------------------------------------------------------------------------------";
|
walther@60327
|
9 |
"-----------------------------------------------------------------------------------------------";
|
walther@60327
|
10 |
"table of contents -----------------------------------------------------------------------------";
|
walther@60327
|
11 |
"-----------------------------------------------------------------------------------------------";
|
walther@60327
|
12 |
"-------- fun poly_of_term ---------------------------------------------------------------------";
|
walther@60327
|
13 |
"-------- fun is_poly --------------------------------------------------------------------------";
|
walther@60355
|
14 |
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
|
walther@60327
|
15 |
"-------- fun term_of_poly ---------------------------------------------------------------------";
|
walther@60347
|
16 |
"-------- fun cancel_p special cases -----------------------------------------------------------";
|
walther@60327
|
17 |
"-------- complex examples: rls norm_Rational --------------------------------------------------";
|
walther@60327
|
18 |
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
|
walther@60327
|
19 |
"-----------------------------------------------------------------------------------------------";
|
walther@60327
|
20 |
"-----------------------------------------------------------------------------------------------";
|
walther@60327
|
21 |
|
walther@60327
|
22 |
|
walther@60327
|
23 |
"-------- fun poly_of_term ---------------------------------------------------------------------";
|
walther@60327
|
24 |
"-------- fun poly_of_term ---------------------------------------------------------------------";
|
walther@60327
|
25 |
"-------- fun poly_of_term ---------------------------------------------------------------------";
|
walther@60348
|
26 |
val thy = @{theory Isac_Knowledge};
|
Walther@60565
|
27 |
val vs = TermC.vars_of (TermC.parse_test @{context} "12 * x \<up> 3 * y \<up> 4 * z \<up> 6");
|
walther@60327
|
28 |
|
Walther@60565
|
29 |
val t = TermC.parse_test @{context} "0 ::real";
|
walther@60347
|
30 |
if poly_of_term vs t = SOME [(0, [0, 0, 0])]
|
walther@60347
|
31 |
then () else error "poly_of_term 0 changed";
|
walther@60347
|
32 |
|
Walther@60565
|
33 |
val t = TermC.parse_test @{context} "-3 + - 2 * x ::real";
|
walther@60327
|
34 |
if poly_of_term vs t = SOME [(~3, [0, 0, 0]), (~2, [1, 0, 0])]
|
walther@60327
|
35 |
then () else error "poly_of_term uminus changed";
|
walther@60327
|
36 |
|
Walther@60565
|
37 |
if poly_of_term vs (TermC.parse_test @{context} "12::real") = SOME [(12, [0, 0, 0])]
|
walther@60327
|
38 |
then () else error "poly_of_term 1 changed";
|
walther@60327
|
39 |
|
Walther@60565
|
40 |
if poly_of_term vs (TermC.parse_test @{context} "x::real") = SOME [(1, [1, 0, 0])]
|
walther@60327
|
41 |
then () else error "poly_of_term 2 changed";
|
walther@60327
|
42 |
|
Walther@60565
|
43 |
if poly_of_term vs (TermC.parse_test @{context} "12 * x \<up> 3") = SOME [(12, [3, 0, 0])]
|
walther@60327
|
44 |
then () else error "poly_of_term 3 changed";
|
walther@60327
|
45 |
"~~~~~ fun poly_of_term , args:"; val (vs, t) =
|
Walther@60565
|
46 |
(vs, (TermC.parse_test @{context} "12 * x \<up> 3"));
|
walther@60327
|
47 |
|
walther@60327
|
48 |
monom_of_term vs (1, replicate (length vs) 0) t;(*poly malformed 1 with x \<up> 3*)
|
walther@60336
|
49 |
"~~~~~ fun monom_of_term , args:"; val (vs, (c, es), (Const (\<^const_name>\<open>times\<close>, _) $ m1 $ m2)) =
|
walther@60327
|
50 |
(vs, (1, replicate (length vs) 0), t);
|
walther@60327
|
51 |
val (c', es') =
|
walther@60327
|
52 |
|
walther@60327
|
53 |
monom_of_term vs (c, es) m1;
|
wenzelm@60405
|
54 |
"~~~~~ fun monom_of_term , args:"; val (vs, (c, es), (Const (\<^const_name>\<open>realpow\<close>, _) $ (t as Free _) $ (Const (\<^const_name>\<open>numeral\<close>, _) $ num)) ) =
|
walther@60327
|
55 |
(vs, (c', es'), m2);
|
walther@60327
|
56 |
(*+*)c = 12;
|
walther@60327
|
57 |
(*+*)(num |> HOLogic.dest_numeral |> list_update es (find_index (curry op = t) vs)) = [3, 0, 0];
|
walther@60327
|
58 |
|
walther@60327
|
59 |
if (c, num |> HOLogic.dest_numeral |> list_update es (find_index (curry op = t) vs)) = (12, [3, 0, 0])
|
wenzelm@60405
|
60 |
then () else error "monom_of_term (realpow): return value CHANGED";
|
walther@60327
|
61 |
|
Walther@60565
|
62 |
if poly_of_term vs (TermC.parse_test @{context} "12 * x \<up> 3 * y \<up> 4 * z \<up> 6") = SOME [(12, [3, 4, 6])]
|
walther@60327
|
63 |
then () else error "poly_of_term 4 changed";
|
walther@60327
|
64 |
|
Walther@60565
|
65 |
if poly_of_term vs (TermC.parse_test @{context} "1 + 2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + y") =
|
walther@60327
|
66 |
SOME [(1, [0, 0, 0]), (1, [0, 1, 0]), (2, [3, 4, 6])]
|
walther@60327
|
67 |
then () else error "poly_of_term 5 changed";
|
walther@60327
|
68 |
|
walther@60327
|
69 |
(*poly_of_term is quite liberal:*)
|
walther@60327
|
70 |
(*the coefficient may be somewhere, the order of variables and the parentheses
|
walther@60327
|
71 |
within a monomial are arbitrary*)
|
Walther@60565
|
72 |
if poly_of_term vs (TermC.parse_test @{context} "y \<up> 4 * (x \<up> 3 * 12 * z \<up> 6)") = SOME [(12, [3, 4, 6])]
|
walther@60327
|
73 |
then () else error "poly_of_term 6 changed";
|
walther@60327
|
74 |
|
walther@60327
|
75 |
(*there may even be more than 1 coefficient:*)
|
Walther@60565
|
76 |
if poly_of_term vs (TermC.parse_test @{context} "2 * y \<up> 4 * (x \<up> 3 * 6 * z \<up> 6)") = SOME [(12, [3, 4, 6])]
|
walther@60327
|
77 |
then () else error "poly_of_term 7 changed";
|
walther@60327
|
78 |
|
walther@60327
|
79 |
(*the order and the parentheses within monomials are arbitrary:*)
|
Walther@60565
|
80 |
if poly_of_term vs (TermC.parse_test @{context} "2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + (7 * y \<up> 8 + 1)")
|
walther@60327
|
81 |
= SOME [(1, [0, 0, 0]), (7, [0, 8, 0]), (2, [3, 4, 6])]
|
walther@60327
|
82 |
then () else error "poly_of_term 8 changed";
|
walther@60327
|
83 |
|
walther@60327
|
84 |
(*from --- rls norm_Rational downto fun gcd_poly ---*)
|
Walther@60565
|
85 |
val t = TermC.parse_test @{context} (*copy from above: "::real" is not required due to " \<up> "*)
|
walther@60329
|
86 |
("(- 12 + 4 * y + 3 * x \<up> 2 + - 1 * (x \<up> 2 * y)) /" ^
|
walther@60329
|
87 |
"(- 18 + -9 * x + 2 * y \<up> 2 + x * y \<up> 2)");
|
walther@60327
|
88 |
"~~~~~ fun cancel_p_, args:"; val (t) = (t);
|
walther@60327
|
89 |
val opt = check_fraction t;
|
walther@60327
|
90 |
val SOME (numerator, denominator) = opt;
|
walther@60327
|
91 |
(*+*)UnparseC.term numerator = "- 12 + 4 * y + 3 * x \<up> 2 + - 1 * (x \<up> 2 * y)"; (*isa -- isa2*);
|
walther@60327
|
92 |
(*+*)UnparseC.term denominator = "- 18 + - 9 * x + 2 * y \<up> 2 + x * y \<up> 2"; (*isa -- isa2*);
|
walther@60327
|
93 |
val vs = TermC.vars_of t;
|
walther@60327
|
94 |
(*+*)UnparseC.terms vs = "[\"x\", \"y\"]";
|
walther@60327
|
95 |
val baseT = type_of numerator
|
walther@60327
|
96 |
val expT = HOLogic.realT;
|
walther@60327
|
97 |
val (SOME _, SOME _) = (poly_of_term vs numerator, poly_of_term vs denominator); (*isa <> isa2*)
|
walther@60327
|
98 |
|
walther@60327
|
99 |
"-------- fun is_poly --------------------------------------------------------------------------";
|
walther@60327
|
100 |
"-------- fun is_poly --------------------------------------------------------------------------";
|
walther@60327
|
101 |
"-------- fun is_poly --------------------------------------------------------------------------";
|
Walther@60565
|
102 |
if is_poly (TermC.parse_test @{context} "2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + 7 * y \<up> 8 + 1")
|
walther@60327
|
103 |
then () else error "is_poly 1 changed";
|
Walther@60565
|
104 |
if not (is_poly (TermC.parse_test @{context} "2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1"))
|
walther@60327
|
105 |
then () else error "is_poly 2 changed";
|
walther@60327
|
106 |
|
walther@60355
|
107 |
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
|
walther@60355
|
108 |
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
|
walther@60355
|
109 |
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
|
walther@60355
|
110 |
if is_ratpolyexp @{term "14 * x * y / (x * y)"}
|
walther@60355
|
111 |
then () else error "is_ratpolyexp (14 * x * y / (x * y)) CHANGED";
|
walther@60355
|
112 |
if is_ratpolyexp @{term "2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1"}
|
walther@60355
|
113 |
then () else error "is_ratpolyexp (2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1) CHANGED";
|
walther@60355
|
114 |
|
walther@60355
|
115 |
if is_ratpolyexp @{term "((sin x) \<up> 2 - (cos x) \<up> 2)/ ((sin x)+ (cos x))"}
|
walther@60355
|
116 |
then error "is_ratpolyexp (((sin x) \<up> 2 - (cos x) \<up> 2)/ ((sin x)+ (cos x)) CHANGED" else ();
|
walther@60355
|
117 |
if is_ratpolyexp @{term "1 + sqrt x + sqrt y"}
|
walther@60355
|
118 |
then error "is_ratpolyexp (1 + sqrt x + sqrt y) CHANGED" else ();
|
walther@60355
|
119 |
|
walther@60355
|
120 |
|
walther@60327
|
121 |
"-------- fun term_of_poly ---------------------------------------------------------------------";
|
walther@60327
|
122 |
"-------- fun term_of_poly ---------------------------------------------------------------------";
|
walther@60327
|
123 |
"-------- fun term_of_poly ---------------------------------------------------------------------";
|
walther@60327
|
124 |
val expT = HOLogic.realT
|
Walther@60565
|
125 |
val Free (_, baseT) = (hd o vars o TermC.parse_test @{context}) "12 * x \<up> 3 * y \<up> 4 * z \<up> 6";
|
walther@60327
|
126 |
val p = [(1, [0, 0, 0]), (7, [0, 8, 0]), (2, [3, 4, 5])]
|
walther@60327
|
127 |
val vs = TermC.vars_of (the (parseNEW ctxt "12 * x \<up> 3 * y \<up> 4 * z \<up> 6"))
|
walther@60327
|
128 |
(*precondition for [(c, es),...]: legth es = length vs*)
|
walther@60327
|
129 |
;
|
walther@60327
|
130 |
if UnparseC.term (term_of_poly baseT expT vs p) = "1 + 7 * y \<up> 8 + 2 * x \<up> 3 * y \<up> 4 * z \<up> 5"
|
walther@60327
|
131 |
then () else error "term_of_poly 1 changed";
|
walther@60327
|
132 |
|
walther@60347
|
133 |
"-------- fun cancel_p special cases -----------------------------------------------------------";
|
walther@60347
|
134 |
"-------- fun cancel_p special cases -----------------------------------------------------------";
|
walther@60347
|
135 |
"-------- fun cancel_p special cases -----------------------------------------------------------";
|
walther@60349
|
136 |
val thy = @{theory Isac_Knowledge};
|
Walther@60500
|
137 |
val ctxt = Proof_Context.init_global thy
|
walther@60349
|
138 |
|
walther@60347
|
139 |
(*------- standard case: *)
|
Walther@60565
|
140 |
val t = TermC.parse_test @{context} "2 / 3 + 1 / 6 ::real";
|
walther@60347
|
141 |
"~~~~~ fun add_fraction_p_ , args:"; val ((_: theory), t) = (thy, t);
|
walther@60347
|
142 |
val SOME ((n1, d1), (n2, d2)) =
|
walther@60347
|
143 |
(*case*) check_frac_sum t (*of*);
|
walther@60347
|
144 |
val vs = TermC.vars_of t;
|
walther@60347
|
145 |
(*+*)val [] = vs;
|
walther@60347
|
146 |
val (SOME n1', SOME a, SOME n2', SOME b) =
|
walther@60347
|
147 |
(*case*) (poly_of_term vs n1, poly_of_term vs d1, poly_of_term vs n2, poly_of_term vs d2) (*of*);
|
walther@60347
|
148 |
val ((a', b'), c) = gcd_poly a b
|
walther@60347
|
149 |
val (baseT, expT) = (type_of n1, HOLogic.realT);
|
walther@60347
|
150 |
(*+*)val [(1, [])] = a'; (* 6 * _1_ = 6 *)
|
walther@60347
|
151 |
(*+*)val [(2, [])] = b'; (* 3 * _2_ = 6 *)
|
walther@60347
|
152 |
(*+*)val [(3, [])] = c; (* 3 / 6 \<and> 3 / 3 ..gcd *)
|
walther@60347
|
153 |
|
walther@60347
|
154 |
val nomin = term_of_poly baseT expT vs
|
walther@60347
|
155 |
(((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
|
walther@60347
|
156 |
|
walther@60347
|
157 |
(*+*)val "5" = UnparseC.term nomin; (* = "3" ERROR*)
|
walther@60347
|
158 |
|
walther@60347
|
159 |
(*+*)val [(2, [])] = the (poly_of_term vs n1); (*---v----------------------v----*)
|
walther@60347
|
160 |
(*+*)val [(4, [])] = ((the (poly_of_term vs n1)) %%*%% b'); (* = 2 * _2_ new nomin for 2 / 3*)
|
walther@60347
|
161 |
|
walther@60347
|
162 |
(*+*)val [(1, [])] = the (poly_of_term vs n2); (*---v----------------------v----*)
|
walther@60347
|
163 |
(*+*)val [(1, [])] = ((the (poly_of_term vs n2)) %%*%% a'); (* = 1 * _1_ new nomin for 1 / 6*)
|
walther@60347
|
164 |
|
walther@60347
|
165 |
(*+*)val [(5, [])] = (* = 4 + 1 new nomin for sum *)
|
walther@60347
|
166 |
(((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
|
walther@60347
|
167 |
|
walther@60347
|
168 |
val denom = (* = 3 * 1 * 2 new denom for sum *)
|
walther@60347
|
169 |
term_of_poly baseT expT vs ((c %%*%% a') %%*%% b');
|
walther@60347
|
170 |
(*+*)val "6" = UnparseC.term denom;
|
walther@60347
|
171 |
|
walther@60347
|
172 |
val t' = HOLogic.mk_binop \<^const_name>\<open>divide\<close> (nomin, denom);
|
walther@60347
|
173 |
(*+*)val "5 / 6" = UnparseC.term t'
|
walther@60347
|
174 |
|
walther@60347
|
175 |
|
walther@60347
|
176 |
(*------- 0 / m + 0 / n
|
walther@60347
|
177 |
20 years old bug found here: *)
|
Walther@60565
|
178 |
val t = TermC.parse_test @{context} "0 = c_2 + c * 0 + 1 / EI * (L * q_0 / 12 * 0 \<up> 3 + - 1 * q_0 / 24 * 0 \<up> 4)";
|
Walther@60500
|
179 |
val SOME (t', _) = rewrite_set_ ctxt true norm_Rational t;
|
walther@60347
|
180 |
(*
|
walther@60347
|
181 |
:
|
walther@60347
|
182 |
## rls: cancel_p_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
|
walther@60347
|
183 |
### rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
|
walther@60347
|
184 |
------------------------------------------------------------these are missing now -----\
|
walther@60347
|
185 |
/## rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 1) from isa2: strange behaviour
|
walther@60347
|
186 |
/## rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 1 + 0 / 1) from isa2: strange behaviour
|
walther@60347
|
187 |
------------------------------------------------------------these are missing now -----/
|
walther@60347
|
188 |
## rls: norm_Rational_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
|
walther@60347
|
189 |
### rls: add_fractions_p_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
|
walther@60347
|
190 |
#### rls: add_fractions_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
|
walther@60347
|
191 |
--------------------------------------------------^v^v^v^v^v^v^v^v^--undetected bug
|
walther@60347
|
192 |
#### rls: add_fractions_p on: 0 = c_2 + 1 / EI * (3 / 24) =3: ERROR
|
walther@60347
|
193 |
### rls: rat_mult_div_pow on: 0 = c_2 + 1 / EI * (3 / 24)
|
walther@60347
|
194 |
:
|
walther@60347
|
195 |
*)
|
walther@60347
|
196 |
if UnparseC.term t' = "0 = c_2" then () else error "norm_Rational CHANGED"; (*isa2*)
|
walther@60347
|
197 |
|
Walther@60565
|
198 |
val t = TermC.parse_test @{context} "0 / 12 + 0 / 24 ::real";
|
walther@60347
|
199 |
add_fraction_p_ @{theory} t;
|
walther@60347
|
200 |
"~~~~~ fun add_fraction_p_ , args:"; val ((_: theory), t) = (thy, t);
|
walther@60347
|
201 |
val SOME ((n1, d1), (n2, d2)) =
|
walther@60347
|
202 |
(*case*) check_frac_sum t (*of*);
|
walther@60347
|
203 |
|
walther@60347
|
204 |
(*+*)val Const ("Groups.zero_class.zero", _) = n1;
|
walther@60347
|
205 |
(*+*)val Const ("Groups.zero_class.zero", _) = n2;
|
walther@60347
|
206 |
|
walther@60347
|
207 |
val vs = TermC.vars_of t;
|
walther@60347
|
208 |
(*+*)val [] = vs;
|
walther@60347
|
209 |
|
walther@60347
|
210 |
val (SOME n1', SOME a, SOME n2', SOME b) =
|
walther@60347
|
211 |
(*case*) (poly_of_term vs n1, poly_of_term vs d1, poly_of_term vs n2, poly_of_term vs d2) (*of*);
|
walther@60347
|
212 |
|
walther@60347
|
213 |
(*+*)if n1' = [(0, [])] then () else error "correction w.r.t zero polynomial CHANGED";
|
walther@60347
|
214 |
|
walther@60347
|
215 |
val ((a', b'), c) = gcd_poly a b
|
walther@60347
|
216 |
val (baseT, expT) = (type_of n1, HOLogic.realT);
|
walther@60347
|
217 |
(*+*)val [(1, [])] = a'; (* 1 * _1_ = 24 *)
|
walther@60347
|
218 |
(*+*)val [(2, [])] = b'; (* 2 * _2_ = 12 *)
|
walther@60347
|
219 |
(*+*)val [(12, [])] = c; (* 12 / 24 \<and> 12 / 12 ..gcd *)
|
walther@60347
|
220 |
|
walther@60347
|
221 |
val nomin = term_of_poly baseT expT vs
|
walther@60347
|
222 |
(((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
|
walther@60347
|
223 |
|
walther@60347
|
224 |
(*+*)UnparseC.term nomin; (* = "3" ERROR*)
|
walther@60347
|
225 |
(* correct ERROR ------------------------------------------------------------------\\*)
|
walther@60347
|
226 |
(*+*)val SOME [(0, [])] = poly_of_term vs n1 (* ERROR WAS [(1, [])] *)
|
walther@60347
|
227 |
(* correct ERROR ------------------------------------------------------------------//*)
|
walther@60347
|
228 |
|
walther@60347
|
229 |
(*+*)val [(0, [])] = the (poly_of_term vs n1); (*---v----------------------v-----*)
|
walther@60347
|
230 |
(*+*)val [(0, [])] = ((the (poly_of_term vs n1)) %%*%% b'); (* = 0 * _0_ new nomin for 0 / 12*)
|
walther@60347
|
231 |
|
walther@60347
|
232 |
(*+*)val [(0, [])] = the (poly_of_term vs n2); (*---v----------------------v-----*)
|
walther@60347
|
233 |
(*+*)val [(0, [])] = ((the (poly_of_term vs n2)) %%*%% a'); (* = 0 * _0_ new nomin for 0 / 24*)
|
walther@60347
|
234 |
|
walther@60347
|
235 |
(*+*)val [(0, [])] = (* = 0 + 0 new nomin for sum *)
|
walther@60347
|
236 |
(((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
|
walther@60347
|
237 |
|
walther@60347
|
238 |
val denom = (* = 12 * 1 * 2 new denom for sum *)
|
walther@60347
|
239 |
term_of_poly baseT expT vs ((c %%*%% a') %%*%% b');
|
walther@60347
|
240 |
(*+*)val "24" = UnparseC.term denom;
|
walther@60347
|
241 |
|
walther@60347
|
242 |
val t' = HOLogic.mk_binop \<^const_name>\<open>divide\<close> (nomin, denom);
|
walther@60347
|
243 |
(*+*)val "0 / 24" = UnparseC.term t'
|
walther@60347
|
244 |
|
walther@60347
|
245 |
(*---------- fun cancel_p with Const AA *)
|
walther@60347
|
246 |
val thy = @{theory Partial_Fractions};
|
walther@60347
|
247 |
val ctxt = Proof_Context.init_global @{theory}
|
walther@60347
|
248 |
val SOME t = TermC.parseNEW ctxt "2 * AA / 2"; (* Const (\<^const_name>\<open>AA\<close>, "real") *)
|
walther@60347
|
249 |
|
Walther@60500
|
250 |
val SOME (t', _) = rewrite_set_ ctxt true cancel_p t;
|
walther@60347
|
251 |
case t' of
|
walther@60347
|
252 |
Const (\<^const_name>\<open>divide\<close>, _) $ Const (\<^const_name>\<open>AA\<close>, _) $
|
walther@60347
|
253 |
Const (\<^const_name>\<open>one_class.one\<close>, _) => ()
|
walther@60347
|
254 |
| _ => error "WRONG rewrite_set_ cancel_p (2 * AA / 2) \<longrightarrow> AA changed";
|
walther@60347
|
255 |
|
walther@60347
|
256 |
"~~~~~ fun cancel_p , args:"; val (t) = (t);
|
walther@60347
|
257 |
val opt = check_fraction t
|
walther@60347
|
258 |
val SOME (numerator, denominator) = (*case*) opt (*of*);
|
walther@60347
|
259 |
|
walther@60347
|
260 |
if UnparseC.term numerator = "2 * AA" andalso UnparseC.term denominator = "2"
|
walther@60347
|
261 |
then () else error "check_fraction (2 * AA / 2) changed";
|
walther@60347
|
262 |
val vs = TermC.vars_of t;
|
walther@60347
|
263 |
case vs of
|
walther@60347
|
264 |
[Const (\<^const_name>\<open>AA\<close>, _)] => ()
|
walther@60347
|
265 |
| _ => error "rewrite_set_ cancel_p (2 * AA / 2) \<longrightarrow> AA/1 changed";
|
walther@60347
|
266 |
|
walther@60347
|
267 |
|
walther@60327
|
268 |
"-------- complex examples: rls norm_Rational --------------------------------------------------";
|
walther@60327
|
269 |
"-------- complex examples: rls norm_Rational --------------------------------------------------";
|
walther@60327
|
270 |
"-------- complex examples: rls norm_Rational --------------------------------------------------";
|
Walther@60565
|
271 |
val t = TermC.parse_test @{context} "(3*x+5)/18 - x/2 - -(3*x - 2)/9 = 0";
|
Walther@60500
|
272 |
val SOME (t', _) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
|
walther@60327
|
273 |
if UnparseC.term t' = "1 / 18 = 0" then () else error "rational.sml 1";
|
walther@60327
|
274 |
|
Walther@60565
|
275 |
val t = TermC.parse_test @{context} "(17*x - 51)/9 - (-(13*x - 3)/6) + 11 - (9*x - 7)/4 = 0";
|
Walther@60500
|
276 |
val SOME (t',_) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
|
walther@60327
|
277 |
if UnparseC.term t' = "(237 + 65 * x) / 36 = 0" then ()
|
walther@60327
|
278 |
else error "rational.sml 2";
|
walther@60327
|
279 |
|
Walther@60565
|
280 |
val t = TermC.parse_test @{context} "(1/2 + (5*x)/2) \<up> 2 - ((13*x)/2 - 5/2) \<up> 2 - (6*x) \<up> 2 + 29";
|
Walther@60500
|
281 |
val SOME (t',_) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
|
walther@60327
|
282 |
if UnparseC.term t' = "23 + 35 * x + - 72 * x \<up> 2" then ()
|
walther@60327
|
283 |
else error "rational.sml 3";
|
walther@60327
|
284 |
|
walther@60327
|
285 |
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
|
walther@60327
|
286 |
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
|
walther@60327
|
287 |
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
|
walther@60327
|
288 |
(*Schalk I, p.60 Nr. 215c *)
|
Walther@60565
|
289 |
val t = TermC.parse_test @{context} "(a + b) \<up> 4 * (x - y) / ((x - y) \<up> 3 * (a + b) \<up> 2)";
|
Walther@60500
|
290 |
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
|
walther@60327
|
291 |
if UnparseC.term t = "(a \<up> 2 + 2 * a * b + b \<up> 2) / (x \<up> 2 + - 2 * x * y + y \<up> 2)"
|
walther@60327
|
292 |
then () else error "rational.sml: diff.behav. in norm_Rational_mg 7";
|
walther@60327
|
293 |
|
walther@60327
|
294 |
(*SRC Schalk I, p.66 Nr. 381b *)
|
Walther@60565
|
295 |
val t = TermC.parse_test @{context}
|
walther@60327
|
296 |
"(4*x \<up> 2 - 20*x + 25)/(2*x - 5) \<up> 3";
|
Walther@60500
|
297 |
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
|
walther@60327
|
298 |
if UnparseC.term t = "1 / (- 5 + 2 * x)"
|
walther@60327
|
299 |
then () else error "rational.sml: diff.behav. in norm_Rational_mg 9";
|
walther@60327
|
300 |
|
walther@60327
|
301 |
(*Schalk I, p.60 Nr. 215c *)
|
Walther@60565
|
302 |
val t = TermC.parse_test @{context} "(a + b) \<up> 4 * (x - y) / ((x - y) \<up> 3 * (a + b) \<up> 2)";
|
Walther@60500
|
303 |
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
|
walther@60327
|
304 |
if UnparseC.term t = "(a \<up> 2 + 2 * a * b + b \<up> 2) / (x \<up> 2 + - 2 * x * y + y \<up> 2)"
|
walther@60327
|
305 |
then () else error "Schalk I, p.60 Nr. 215c: with Isabelle2002 cancellation incomplete, changed";
|
walther@60327
|
306 |
|