1 (* Title: Test for rational equations
2 Author: Richard Lang 2009
3 (c) copyright due to lincense terms.
6 "-----------------------------------------------------------------";
7 "table of contents -----------------------------------------------";
8 "-----------------------------------------------------------------";
9 "----------- pbl: rational, univariate, equation ----------------";
10 "----------- solve (1/x = 5, x) by me ---------------------------";
11 "----------- S.68, Bsp.: 40, ((x)/(x - 8) + (x - 8)/(x) = 26/5)--";
12 "----------- x / (x ^ 2 - 6 * x + 9) - 1 / (x ^ 2 - 3 * x) = 1 /x";
13 "----------- ((5*x)/(x - 2) - x/(x+2)=(4::real)), incl. refine ---------------------------------";
14 "-----------------------------------------------------------------";
15 "-----------------------------------------------------------------";
17 val thy = @{theory "RatEq"};
18 val ctxt = Proof_Context.init_global thy;
20 "------------ pbl: rational, univariate, equation ----------------";
21 "------------ pbl: rational, univariate, equation ----------------";
22 "------------ pbl: rational, univariate, equation ----------------";
23 val t = TermC.parseNEW' ctxt "(1/b+1/x=1) is_ratequation_in x";
24 val SOME (t_, _) = rewrite_set_ ctxt false RatEq_prls t;
25 val result = UnparseC.term t_;
26 if result <> "True" then error "rateq.sml: new behaviour 1:" else ();
28 val t = TermC.parseNEW' ctxt "(sqrt(x)=1) is_ratequation_in x";
29 val SOME (t_, _) = rewrite_set_ ctxt false RatEq_prls t;
30 val result = UnparseC.term t_;
31 if result <> "False" then error "rateq.sml: new behaviour 2:" else ();
33 val t = TermC.parseNEW' ctxt "(x=- 1) is_ratequation_in x";
34 val SOME (t_,_) = rewrite_set_ ctxt false RatEq_prls t;
35 val result = UnparseC.term t_;
36 if result <> "False" then error "rateq.sml: new behaviour 3:" else ();
38 val t = TermC.parseNEW' ctxt "(3 + x \<up> 2 + 1/(x \<up> 2+3)=1) is_ratequation_in x";
39 val SOME (t_,_) = rewrite_set_ ctxt false RatEq_prls t;
40 val result = UnparseC.term t_;
41 if result <> "True" then error "rateq.sml: new behaviour 4:" else ();
43 val result = M_Match.match_pbl ["equality (x=(1::real))", "solveFor x", "solutions L"]
44 (Problem.from_store ["rational", "univariate", "equation"]);
45 case result of M_Match.NoMatch' _ => () | _ => error "rateq.sml: new behaviour: 5";
47 val result = M_Match.match_pbl ["equality (3 + x \<up> 2 + 1/(x \<up> 2+3)=1)", "solveFor x", "solutions L"]
48 (Problem.from_store ["rational", "univariate", "equation"]);
49 case result of M_Match.Matches' _ => () | _ => error "rateq.sml: new behaviour: 6";
51 "------------ solve (1/x = 5, x) by me ---------------------------";
52 "------------ solve (1/x = 5, x) by me ---------------------------";
53 "------------ solve (1/x = 5, x) by me ---------------------------";
54 val fmz = ["equality (1/x=(5::real))", "solveFor x", "solutions L"];
56 ((** )"RatEq"( **)"PolyEq"(*rls "make_ratpoly_in" missing in theory "RatEq" (and ancestors)*),
57 ["univariate", "equation"],["no_met"]);
58 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
59 (* val (p,_,f,nxt,_,pt) = me nxt p [1] pt;------------- now Refine_Tacitly*)
60 (* nxt = ("Model_Problem",Model_Problem ["rational", "univariate", "equation"]) *)
61 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
62 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
63 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
64 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
66 case nxt of (Rewrite_Set "RatEq_eliminate") => () | _ => ((*not checked before*));
67 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
69 WN120317.TODO dropped rateq: here "x ~= 0 should TermC.sub_at to ctxt, but it does not:
70 --- repair NO asms from rls RatEq_eliminate --- shows why.
71 so it needs more effort to find out, how Check_elementwise worked in 2002, see below.
74 (* val nxt = (_,Subproblem ("RatEq",["univariate", "equation"] ======= *)
75 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
76 (* val (p,_,f,nxt,_,pt) = me nxt p [1] pt;------------- now Refine_Tacitly*)
77 (*val nxt = ("Model_Problem", Model_Problem ["normalise", "polynomial", "univariate", "equation"])*)
78 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
79 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
80 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
81 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
82 (*val nxt = Apply_Method ["PolyEq", "normalise_poly"])*)
83 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
84 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
85 (* val nxt = (_,Subproblem ("PolyEq",["polynomial", "univariate", "equation"]=======*)
86 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
87 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
88 (* ("Model_Problem", Model_Problem ["degree_1", "polynomial", "univariate", "equation"])*)
89 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
90 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
91 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
92 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
93 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
94 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
95 val (p''',_,f,nxt''',_,pt''') = me nxt p [1] pt;
96 f2str f = "[x = 1 / 5]";
97 case nxt of (Check_elementwise "Assumptions") => () | _ => ((*not checked before*));
98 "~~~~~ fun me, args:"; val (tac, (p:pos'), _, (pt:ctree)) = (nxt, p, c, pt);
99 val (pt, p) = case Step.by_tactic tac (pt,p) of
100 ("ok", (_, _, ptp)) => ptp | _ => error "--- solve (1/x = 5.. Step.by_tactic";
101 "~~~~~ fun Step.do_next, args:"; val (ip as (_,p_), (ptp as (pt,p), tacis)) = (p, ((pt, e_pos'), []))
102 val pIopt = get_pblID (pt,ip); (*= SOME ["rational", "univariate", "equation"]
103 1- 1 associated to metID ["RatEq", "solve_rat_equation"]*)
105 member op = [Pbl,Met] p_; (*= false*)
106 "~~~~~ fun do_next, args:"; val (ptp as (pt, pos as (p, p_))) = (pt, ip);
107 val thy' = get_obj g_domID pt (par_pblobj pt p);
108 val (is, sc) = resume_prog thy' (p,p_) pt; (*is: which ctxt?*)
109 "~~~~~ fun find_next_step, args:"; val () = ();
110 (*----- outcommented during cleanup of args in lucas-interpreter.sml ------------------------\\* )
111 "~~~~~ fun go_scan_up, args:"; val (thy, ptp, (Prog sc), E, l, ay, a, v) =
112 (thy, ptp, sc, E, l, true, a, v);
113 1 < length l; (*true*)
114 val up = drop_last l;
115 TermC.sub_at up sc; (* = Const (\<^const_name>\<open>Let\<close>, *)
116 "~~~~~ fun scan_up, args:"; val (thy, ptp, (scr as (Prog sc)), E, l, ay,
117 (t as Const (\<^const_name>\<open>Let\<close>,_) $ _), a, v) = (thy, ptp, (Prog sc), E, up, ay, (TermC.sub_at up sc), a, v);
118 ay = Napp_; (*false*)
119 val up = drop_last l;
120 val (Const (\<^const_name>\<open>Let\<close>,_) $ e $ (Abs (i,T,body))) = TermC.sub_at up sc; (*Const (\<^const_name>\<open>SubProblem\<close>,..*)
121 val i = mk_Free (i, T);
122 val E = Env.update E (i, v);
123 "~~~~~ fun scan_dn, args:"; val ((thy as (th,sr)), (pt, p), E, l, t, a, v) =
124 (thy, ptp, E, (up@[R,D]), body, a, v);
125 "~~~~~ fun check_leaf, args:"; val (call, thy, srls, (E, (a, v)), t) = ("next ", th, sr, (E, (a, v)), t);
126 "~~~~~ fun eval_leaf, args:"; val (E, a, v,
127 (t as (Const (\<^const_name>\<open>Check_elementwise\<close>,_) $ _ $ _ ))) = (E, a, v, t);
128 val Program.Tac tm = Program.Tac (subst_atomic E t);
129 UnparseC.term tm = "Check_elementwise [x = 1 / 5] {v_v. Assumptions}";
130 (* ------ \<up> ----- ? "x" ?*)
131 "~~~~~ to check_leaf return val:"; val ((Program.Tac stac, a')) = ((Program.Tac (subst_atomic E t), NONE));
132 val stac' = eval_prog_expr (ThyC.get_theory thy) srls (subst_atomic (upd_env_opt E (a,v)) stac);
133 UnparseC.term stac' = "Check_elementwise [x = 1 / 5] {v_v. Assumptions}";
134 "~~~~~ to scan_dn return val:"; val ((a', Program.Tac stac)) = ((a', Program.Tac stac'));
135 val m = LItool.tac_from_prog pt (ThyC.get_theory th) stac;
136 case m of Check_elementwise "Assumptions" => () | _ => (); (*m' = Empty_Tac_ ???!??? *);
137 val (p''''', pt''''', m''''') = (p, pt, m);
138 "~~~~~ fun check , args:"; val ((p,p_), pt, (m as Check_elementwise pred)) = (p, pt, m);
139 member op = [Pbl,Met] p_; (* = false*)
140 val pp = par_pblobj pt p;
141 val thy' = (get_obj g_domID pt pp):theory';
142 val thy = ThyC.get_theory thy'
143 val metID = (get_obj g_metID pt pp)
144 val {crls,...} = MethodC.from_store metID
145 val (f,asm) = case p_ of Frm => (get_obj g_form pt p , [])
146 | Res => get_obj g_result pt p;
147 UnparseC.term f = "[x = 1 / 5]"; (*the current formula*)
148 val vp = (Proof_Context.init_global thy, pred) |-> parseNEW |> the |> mk_set thy pt p f;
149 val (bdv, asms) = vp;
151 UnparseC.term bdv = "x";
152 UnparseC.terms asms = (* asms from rewriting are missing : vvv *)
153 ("[\"~ (matches (?a = 0) (1 = 5 * x)) | ~ lhs (1 = 5 * x) is_poly_in x\",\"x = 1 / 5\", " ^
154 "\"lhs (1 + -5 * x = 0) is_poly_in x\",\"lhs (1 + -5 * x = 0) has_degree_in x = 1\", " ^
155 "\"1 / x = 5 is_ratequation_in x\"]");
157 WN120317.TODO dropped rateq: ctxt should contain "x ~= 0 here, but it does not, see above.
160 val Applicable.Yes (Check_elementwise' (curr_form, pred, (res, asms))) = check p''''' pt''''' m''''';
161 UnparseC.term curr_form = "[x = 1 / 5]";
162 pred = "Assumptions";
163 res = TermC.str2term "[]::bool list";
166 val (p,_,f,nxt,_,pt) = me nxt''' p''' [] pt'''; (*<<<----- this caused the error*)
168 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
170 if p = ([], Res) andalso f2str f = "[x = 1 / 5]"
171 then case nxt of ("End_Proof'", End_Proof') => ()
172 | _ => error "rateq.sml: new behaviour: [x = 1 / 5] 1"
173 else error "rateq.sml: new behaviour: [x = 1 / 5] 2";
174 ( *----- outcommented during cleanup of args in lucas-interpreter.sml ------------------------//*)
176 "------------ S.68, Bsp.: 40, ((x)/(x - 8) + (x - 8)/(x) = 26/5)--";
177 "------------ S.68, Bsp.: 40, ((x)/(x - 8) + (x - 8)/(x) = 26/5)--";
178 "------------ S.68, Bsp.: 40, ((x)/(x - 8) + (x - 8)/(x) = 26/5)--";
179 (*EP Schalk_II_p68_n40*)
180 val fmz = ["equality ((x)/(x - 8) + (x - 8)/(x) = 26/(5::real))", "solveFor x", "solutions L"];
182 ((** )"RatEq"( **)"PolyEq"(*rls "make_ratpoly_in" missing in theory "RatEq" (and ancestors)*),
183 ["univariate", "equation"],["no_met"]);
184 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
185 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
186 (* nxt = ("Model_Problem",Model_Problem ["rational", "univariate", "equation"])*)
187 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
188 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
189 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
190 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
191 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
192 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
193 (* nxt = ("Subproblem",Subproblem ("RatEq",["univariate", "equation"]))*)
194 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
195 (* nxt = ("Model_Problem", Model_Problem ["normalise", "polynomial", "univariate", "equation"])*)
196 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
197 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
198 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
199 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
200 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
202 if p = ([4, 3], Pbl) then ()
205 (Add_Given "equality (320 + 128 * x + - 16 * x \<up> 2 = 0)") =>
207 Test_Out.PpcKF (Test_Out.Problem [], {
208 Find = [Incompl "solutions []"], Given = [Incompl "equality", Incompl "solveFor"],
209 Relate = [], Where = [False "matches (?a + ?v_ \<up> 2 = 0) e_e \<or>\nmatches (?a + ?b * ?v_ \<up> 2 = 0) e_e"],
211 | _ => error ("S.68, Bsp.: 40 PblObj changed"))
212 | _ => error ("S.68, Bsp.: 40 changed nxt =" ^ Tactic.input_to_string (nxt)));
214 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
215 (* ("Subproblem", Subproblem ("PolyEq",["polynomial", "univariate", "equation"])) *)
216 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
217 (* nxt = ("Model_Problem", Model_Problem
218 ["abcFormula", "degree_2", "polynomial", "univariate", "equation"])*)
219 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
220 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
221 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
222 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
223 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
224 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
225 val (p,_,f,nxt,_,pt) = me nxt p [1] pt;val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
226 if p = ([], Res) andalso f2str f = "[x = - 2, x = 10]" then ()
227 else error "rateq.sml: new behaviour: [x = - 2, x = 10]";
229 "----------- remove x = 0 from [x = 0, x = 6 / 5] ----------------------------------------------";
230 "----------- remove x = 0 from [x = 0, x = 6 / 5] ----------------------------------------------";
231 "----------- remove x = 0 from [x = 0, x = 6 / 5] ----------------------------------------------";
232 (*ER-7*) (*Schalk I s.87 Bsp 55b*)
233 val fmz = ["equality (x/(x \<up> 2 - 6*x+9) - 1/(x \<up> 2 - 3*x) =1/x)",
234 "solveFor x", "solutions L"];
236 ((** )"RatEq"( **)"PolyEq"(*rls "make_ratpoly_in" missing in theory "RatEq" (and ancestors)*),
237 ["univariate", "equation"],["no_met"]);
238 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, spec)]; (* 0. specify-phase *)
239 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
240 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
241 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
243 (*[], Met*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;
244 (*+*)case nxt of Apply_Method ["RatEq", "solve_rat_equation"] => ()
245 (*+*)| _ => error "55b root specification broken";
247 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (* 0. solve-phase*)
248 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
249 val (p,_,f,nxt,_,pt) = me nxt p [] pt; f2str f = "(3 + - 1 * x + x \<up> 2) * x = 1 * (9 * x + -6 * x \<up> 2 + x \<up> 3)";
251 (*+*)if eq_set op = (Ctree.get_assumptions pt p |> map UnparseC.term,
252 (*+*) ["x \<noteq> 0", "9 * x + - 6 * x \<up> 2 + x \<up> 3 \<noteq> 0", "x / (x \<up> 2 - 6 * x + 9) - 1 / (x \<up> 2 - 3 * x) =\n1 / x is_ratequation_in x"])
253 (*+*)then () else error "assumptions before 1. Subproblem CHANGED";
254 (*+*)if p = ([3], Res) andalso f2str f = "(3 + - 1 * x + x \<up> 2) * x = 1 * (9 * x + - 6 * x \<up> 2 + x \<up> 3)"
256 (*+*) ((case nxt of Subproblem ("PolyEq", ["normalise", "polynomial", "univariate", "equation"]) => ()
257 (*+*) | _ => error ("S.68, Bsp.: 40 nxt =" ^ Tactic.input_to_string nxt)))
258 (*+*)else error "1. Subproblem -- call changed";
260 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (* 1. specify-phase *)
261 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
262 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
263 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
265 (*[4], Met*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;
266 case nxt of Apply_Method ["PolyEq", "normalise_poly"] => ()
267 | _ => error "55b normalise_poly specification broken 1";
269 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (* 1. solve-phase *)
270 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
271 val (p,_,f,nxt,_,pt) = me nxt p [] pt; f2str f = "-6 * x + 5 * x \<up> 2 = 0";
273 if p = ([4, 3], Res) andalso f2str f = "- 6 * x + 5 * x \<up> 2 = 0"
275 ((case nxt of Subproblem ("PolyEq", ["bdv_only", "degree_2", "polynomial", "univariate", "equation"]) => ()
276 | _ => error ("S.68, Bsp.: 40 nxt =" ^ Tactic.input_to_string nxt)))
278 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (* 2. specify-phase *)
279 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
280 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
281 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
283 (*[4, 4], Met*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*\<rightarrow>*)
284 case nxt of Apply_Method ["PolyEq", "solve_d2_polyeq_bdvonly_equation"] => ()
285 | _ => error "55b normalise_poly specification broken 2";
287 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*f = "-6 * x + 5 * x \<up> 2 = 0"*) (* 2. solve-phase *)
288 val (p,_,f,nxt,_,pt) = me nxt p [] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;
290 (*[4, 4, 3], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*\<rightarrow>Or_to_List*)
291 (*[4, 4, 4], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt; f2str f = "[x = 0, x = 6 / 5]";
292 (*[4, 4, 5], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*\<rightarrow>2. Check_Postcond ["bdv_only", "degree_2", "polynomial", "univariate", "equation"]*)
294 (* *)if eq_set op = ((Ctree.get_assumptions pt p |> map UnparseC.term), [
295 (*0.pre*) "x / (x \<up> 2 - 6 * x + 9) - 1 / (x \<up> 2 - 3 * x) =\n1 / x is_ratequation_in x",
296 (*1.pre*) "\<not> matches (?a = 0)\n ((3 + - 1 * x + x \<up> 2) * x =\n 1 * (9 * x + - 6 * x \<up> 2 + x \<up> 3)) \<or>\n"
297 (*1.pre*) ^ "\<not> lhs ((3 + - 1 * x + x \<up> 2) * x =\n 1 * (9 * x + - 6 * x \<up> 2 + x \<up> 3)) is_poly_in x",
298 (*2.pre*) "lhs (- 6 * x + 5 * x \<up> 2 = 0) is_poly_in x",
299 (*2.pre*) "lhs (- 6 * x + 5 * x \<up> 2 = 0) has_degree_in x = 2",
300 (*0.asm*) "x \<noteq> 0",
301 (*0.asm*) "9 * x + - 6 * x \<up> 2 + x \<up> 3 \<noteq> 0"
303 (* *)then () else error "assumptions at end 2. Subproblem CHANGED";
305 (*[4, 4], Res*)val (p''''',_,f,nxt''''',_,pt''''') = me nxt p [] pt;(*\<rightarrow>1. Check_Postcond ["normalise", "polynomial", "univariate", "equation"]*)
307 (*/--------- step into 2. Check_Postcond SEE .. ----------------------------------------------\*)
308 "----------- rat-equ: remove x = 0 from [x = 0, x = 6 / 5] due to contexts ---------------------";
309 (*\--------- step into 2. Check_Postcond -----------------------------------------------------/*)
311 (*[4], Res*)val (p,_,f,nxt,_,pt) = me nxt''''' p''''' [] pt''''';(*\<rightarrow>IDLE LEGACY: Check_elementwise "Assumptions"*)
312 (*[], Res*)val (p,_,f,nxt,_,pt) = me nxt''''' p''''' [] pt''''';(*\<rightarrow>End_Proof'*)
314 (*/-------- final test -----------------------------------------------------------------------\*)
315 if f2str f = "[x = 6 / 5]" andalso eq_set op = (map UnparseC.term (Ctree.get_assumptions pt p),
317 "lhs (- 6 * x + 5 * x \<up> 2 = 0) is_poly_in x",
318 "lhs (- 6 * x + 5 * x \<up> 2 = 0) has_degree_in x = 2",
319 "\<not> matches (?a = 0)\n ((3 + - 1 * x + x \<up> 2) * x =\n 1 * (9 * x + - 6 * x \<up> 2 + x \<up> 3)) \<or>\n\<not> lhs ((3 + - 1 * x + x \<up> 2) * x =\n 1 * (9 * x + - 6 * x \<up> 2 + x \<up> 3)) is_poly_in x",
321 "9 * x + - 6 * x \<up> 2 + x \<up> 3 \<noteq> 0",
322 "x / (x \<up> 2 - 6 * x + 9) - 1 / (x \<up> 2 - 3 * x) =\n1 / x is_ratequation_in x"]
323 ) then () else error "test CHANGED";
326 "----------- ((5*x)/(x - 2) - x/(x+2)=(4::real)), incl. refine ---------------------------------";
327 "----------- ((5*x)/(x - 2) - x/(x+2)=(4::real)), incl. refine ---------------------------------";
328 "----------- ((5*x)/(x - 2) - x/(x+2)=(4::real)), incl. refine ---------------------------------";
329 (*was in test/../usecases.sml*)
330 val fmz = ["equality ((5*x)/(x - 2) - x/(x+2)=(4::real))", "solveFor x", "solutions L"];
332 ((** )"RatEq"( **)"PolyEq"(*rls "make_ratpoly_in" missing in theory "RatEq" (and ancestors)*),
333 ["univariate", "equation"],["no_met"]);
334 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
335 (*[], Pbl*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
336 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
337 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
338 (*[], Met*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Apply_Method ["RatEq", "solve_rat_equation"]*)
339 (*[1], Frm*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Rewrite_Set "RatEq_simplify":*)
341 (*+*)if (get_istate_LI pt p |> Istate.string_of) (* still specify-phase: found_accept = false ---------------------------------> vvvvv*)
342 (*+*) = "Pstate ([\"\n(e_e, 5 * x / (x - 2) - x / (x + 2) = 4)\", \"\n(v_v, x)\"], [], empty, NONE, \n??.empty, ORundef, false, true)"
343 (*+*)then () else error "rat-eq + subpbl: istate in specify-phase";
345 (*[1], Res*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Rewrite_Set "norm_Rational"*)
347 (*+*)if (get_istate_LI pt p |> Istate.string_of) (* solve-phase: found_accept = true -----------------------------------------------------------------------------------------------> vvvvv*)
348 (*+*) = "Pstate ([\"\n(e_e, 5 * x / (x - 2) - x / (x + 2) = 4)\", \"\n(v_v, x)\"], [R, L, R, L, L, R, R, R], empty, SOME e_e, \n5 * x / (x + - 1 * 2) + - 1 * x / (x + 2) = 4, ORundef, true, true)"
349 (*+*)then () else error "rat-eq + subpbl: istate after found_accept";
351 (*[2], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Rewrite_Set "RatEq_eliminate"*)
354 (*[3], Res*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Subproblem ("PolyEq", ["normalise", "polynomial", "univariate", "equation"])*)
355 (*[4], Pbl*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Model_Problem*)
357 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
358 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
359 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
360 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
362 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
363 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
364 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
365 (**)val (p,_,f,nxt,_,pt) = me nxt p [1] pt; val (p,_,f,nxt,_,pt) = me nxt p [] pt;(**)
367 (*[4,4], Pbl*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Specify_Problem ["degree_1", "polynomial", "univariate", "equation"]*)
368 (*[4,4], Pbl*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Specify_Method ["PolyEq", "solve_d1_polyeq_equation"]*)
370 (*[4,4], Met*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Apply_Method ["PolyEq", "solve_d1_polyeq_equation"]*)
371 (*[4,4,1], Frm*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Rewrite_Set_Inst (["(''bdv'', x)"], "d1_polyeq_simplify")*)
372 (*[4,4,1], Res*)val (p,_,f,nxt,_,pt) = me nxt p [1] pt;(*Rewrite_Set "polyeq_simplify"*)
373 (*[4,4,2], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Or_to_List*)
374 (* f = Test_Out.FormKF "[x = -4 / 3]" *)
375 (*[4,4,3], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Check_elementwise "Assumptions"*)
376 (*[4,4,4], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Check_Postcond ["degree_1", "polynomial", "univariate", "equation"]*)
377 (*[4,4], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Check_Postcond ["normalise", "polynomial", "univariate", "equation"]*)
378 (*[4], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Check_elementwise "Assumptions"*)
379 (*[5], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*Check_Postcond ["rational", "univariate", "equation"]*)
380 (*[], Res*)val (p,_,f,nxt,_,pt) = me nxt p [] pt;(*End_Proof'*)
382 if p = ([], Res) andalso f2str f = "[x = - 4 / 3]"
383 then case nxt of End_Proof' => () | _ => error "rat-eq + subpbl: end CHANGED 1"
384 else error "rat-eq + subpbl: end CHANGED 2";