src/Tools/isac/Knowledge/PolyEq.ML
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 25 Aug 2010 16:20:07 +0200
branchisac-update-Isa09-2
changeset 37947 22235e4dbe5f
parent 37938 src/Tools/isac/IsacKnowledge/PolyEq.ML@f6164be9280d
child 37952 9ddd1000b900
permissions -rw-r--r--
renamed isac's directories and Build_Isac.thy

Scripts --> ProgLang
ME --> Interpret
IsacKnowledge --> Knowledge
neuper@37906
     1
(*. (c) by Richard Lang, 2003 .*)
neuper@37906
     2
(*   collecting all knowledge for PolynomialEquations
neuper@37906
     3
   created by: rlang 
neuper@37906
     4
         date: 02.07
neuper@37906
     5
   changed by: rlang
neuper@37906
     6
   last change by: rlang
neuper@37906
     7
             date: 02.11.26
neuper@37906
     8
*)
neuper@37906
     9
neuper@37947
    10
(* use"Knowledge/PolyEq.ML";
neuper@37906
    11
   use"PolyEq.ML";
neuper@37906
    12
neuper@37906
    13
   use"ROOT.ML";
neuper@37906
    14
   cd"IsacKnowledge";
neuper@37906
    15
neuper@37906
    16
   remove_thy"PolyEq";
neuper@37947
    17
   use_thy"Knowledge/Isac";
neuper@37906
    18
   *)
neuper@37906
    19
"******* PolyEq.ML begin *******";
neuper@37906
    20
neuper@37906
    21
theory' := overwritel (!theory', [("PolyEq.thy",PolyEq.thy)]);
neuper@37906
    22
(*-------------------------functions---------------------*)
neuper@37906
    23
(* just for try
neuper@37906
    24
local
neuper@37906
    25
    fun add0 l d d_  = if (d_+1) < d then  add0 (str2term"0"::l) d (d_+1) else l;
neuper@37906
    26
    fun poly2list_ (t as (Const ("op +",_) $ t1 $ (Const ("Atools.pow",_) $ v_ $ Free (d_,_)))) v l d =
neuper@37906
    27
	    if (v=v_) 
neuper@37906
    28
	    then poly2list_ t1 v (((str2term("1")))::(add0 l d (int_of_str' d_))) (int_of_str' d_)
neuper@37906
    29
	    else  t::(add0 l d 0)
neuper@37906
    30
      | poly2list_ (t as (Const ("op +",_) $ t1 $ (Const ("op *",_) $ t11 $ 
neuper@37906
    31
                                                   (Const ("Atools.pow",_) $ v_ $ Free (d_,_))))) v l d =
neuper@37906
    32
	    if (v=v_) 
neuper@37906
    33
	    then poly2list_ t1 v (((t11))::(add0 l d (int_of_str' d_))) (int_of_str' d_)
neuper@37906
    34
	    else  t::(add0 l d 0)
neuper@37906
    35
      | poly2list_ (t as (Const ("op +",_) $ t1 $ (Free (v_ , _)) )) v l d =
neuper@37906
    36
	    if (v = (str2term v_)) 
neuper@37906
    37
	    then poly2list_ t1 v (((str2term("1")))::(add0 l d 1 )) 1
neuper@37906
    38
	    else  t::(add0 l d 0)
neuper@37906
    39
      | poly2list_ (t as (Const ("op +",_) $ t1 $ (Const ("op *",_) $ t11 $ (Free (v_,_)) ))) v l d =
neuper@37906
    40
	    if (v= (str2term v_)) 
neuper@37906
    41
	    then poly2list_ t1 v ( (t11)::(add0 l d 1 )) 1
neuper@37906
    42
	    else  t::(add0 l d 0)
neuper@37906
    43
      | poly2list_ (t as (Const ("op +",_) $ _ $ _))_ l d = t::(add0 l d 0)
neuper@37906
    44
      | poly2list_ (t as (Free (_,_))) _ l d  =  t::(add0 l d 0)
neuper@37906
    45
      | poly2list_ t _ l d  = t::(add0 l d 0);
neuper@37906
    46
neuper@37906
    47
    fun poly2list t v = poly2list_ t v [] 0;
neuper@37906
    48
    fun diffpolylist_ [] _ = []
neuper@37906
    49
      | diffpolylist_ (x::xs) d =  (str2term (if term2str(x)="0" 
neuper@37906
    50
					      then "0" 
neuper@37906
    51
					      else term2str(x)^"*"^str_of_int(d)))::diffpolylist_ xs (d+1);
neuper@37906
    52
    fun diffpolylist [] = []
neuper@37906
    53
      | diffpolylist (x::xs) = diffpolylist_ xs 1;
neuper@37906
    54
	(* diffpolylist(poly2list (str2term "1+ x +3*x^^^3") (str2term "x"));*)
neuper@37906
    55
in
neuper@37906
    56
neuper@37906
    57
end;
neuper@37906
    58
*)
neuper@37906
    59
(*-------------------------rulse-------------------------*)
neuper@37906
    60
val PolyEq_prls = (*3.10.02:just the following order due to subterm evaluation*)
neuper@37906
    61
  append_rls "PolyEq_prls" e_rls 
neuper@37906
    62
	     [Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37906
    63
	      Calc ("Tools.matches",eval_matches ""),
neuper@37906
    64
	      Calc ("Tools.lhs"    ,eval_lhs ""),
neuper@37906
    65
	      Calc ("Tools.rhs"    ,eval_rhs ""),
neuper@37906
    66
	      Calc ("Poly.is'_expanded'_in",eval_is_expanded_in ""),
neuper@37906
    67
	      Calc ("Poly.is'_poly'_in",eval_is_poly_in ""),
neuper@37906
    68
	      Calc ("Poly.has'_degree'_in",eval_has_degree_in ""),    
neuper@37906
    69
              Calc ("Poly.is'_polyrat'_in",eval_is_polyrat_in ""),
neuper@37906
    70
	      (*Calc ("Atools.occurs'_in",eval_occurs_in ""),   *) 
neuper@37906
    71
	      (*Calc ("Atools.is'_const",eval_const "#is_const_"),*)
neuper@37906
    72
	      Calc ("op =",eval_equal "#equal_"),
neuper@37906
    73
              Calc ("RootEq.is'_rootTerm'_in",eval_is_rootTerm_in ""),
neuper@37906
    74
	      Calc ("RatEq.is'_ratequation'_in",eval_is_ratequation_in ""),
neuper@37906
    75
	      Thm ("not_true",num_str not_true),
neuper@37906
    76
	      Thm ("not_false",num_str not_false),
neuper@37906
    77
	      Thm ("and_true",num_str and_true),
neuper@37906
    78
	      Thm ("and_false",num_str and_false),
neuper@37906
    79
	      Thm ("or_true",num_str or_true),
neuper@37906
    80
	      Thm ("or_false",num_str or_false)
neuper@37906
    81
	       ];
neuper@37906
    82
neuper@37906
    83
val PolyEq_erls = 
neuper@37906
    84
    merge_rls "PolyEq_erls" LinEq_erls
neuper@37906
    85
    (append_rls "ops_preds" calculate_Rational
neuper@37906
    86
		[Calc ("op =",eval_equal "#equal_"),
neuper@37906
    87
		 Thm ("plus_leq", num_str plus_leq),
neuper@37906
    88
		 Thm ("minus_leq", num_str minus_leq),
neuper@37906
    89
		 Thm ("rat_leq1", num_str rat_leq1),
neuper@37906
    90
		 Thm ("rat_leq2", num_str rat_leq2),
neuper@37906
    91
		 Thm ("rat_leq3", num_str rat_leq3)
neuper@37906
    92
		 ]);
neuper@37906
    93
neuper@37906
    94
val PolyEq_crls = 
neuper@37906
    95
    merge_rls "PolyEq_crls" LinEq_crls
neuper@37906
    96
    (append_rls "ops_preds" calculate_Rational
neuper@37906
    97
		[Calc ("op =",eval_equal "#equal_"),
neuper@37906
    98
		 Thm ("plus_leq", num_str plus_leq),
neuper@37906
    99
		 Thm ("minus_leq", num_str minus_leq),
neuper@37906
   100
		 Thm ("rat_leq1", num_str rat_leq1),
neuper@37906
   101
		 Thm ("rat_leq2", num_str rat_leq2),
neuper@37906
   102
		 Thm ("rat_leq3", num_str rat_leq3)
neuper@37906
   103
		 ]);
neuper@37906
   104
(*------
neuper@37906
   105
val PolyEq_erls = 
neuper@37906
   106
    merge_rls "PolyEq_erls" 
neuper@37906
   107
	      (append_rls "" (Rls {(*asm_thm=[],*)calc=[],
neuper@37906
   108
				   erls= Rls {(*asm_thm=[],*)calc=[],
neuper@37906
   109
					      erls= Erls,
neuper@37906
   110
					      id="e_rls",preconds=[],
neuper@37906
   111
					      rew_ord=("dummy_ord",dummy_ord),
neuper@37906
   112
					      rules=[Thm ("",
neuper@37906
   113
							  num_str ),
neuper@37906
   114
						     Thm ("",
neuper@37906
   115
							  num_str ),
neuper@37906
   116
						     Thm ("",
neuper@37906
   117
							  num_str )
neuper@37906
   118
						     ],
neuper@37906
   119
					      scr=EmptyScr,srls=Erls},
neuper@37906
   120
				   id="e_rls",preconds=[],rew_ord=("dummy_ord",
neuper@37906
   121
								   dummy_ord),
neuper@37906
   122
				   rules=[],scr=EmptyScr,srls=Erls}
neuper@37906
   123
			      ) 
neuper@37906
   124
			  ((#rules o rep_rls) LinEq_erls))
neuper@37906
   125
	      (append_rls "ops_preds" calculate_Rational
neuper@37906
   126
			  [Calc ("op =",eval_equal "#equal_"),
neuper@37906
   127
			   Thm ("plus_leq", num_str plus_leq),
neuper@37906
   128
			   Thm ("minus_leq", num_str minus_leq),
neuper@37906
   129
			   Thm ("rat_leq1", num_str rat_leq1),
neuper@37906
   130
			   Thm ("rat_leq2", num_str rat_leq2),
neuper@37906
   131
			   Thm ("rat_leq3", num_str rat_leq3)
neuper@37906
   132
			   ]);
neuper@37906
   133
-----*)
neuper@37906
   134
neuper@37906
   135
neuper@37906
   136
val cancel_leading_coeff = prep_rls(
neuper@37906
   137
  Rls {id = "cancel_leading_coeff", preconds = [], 
neuper@37906
   138
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   139
      erls = PolyEq_erls, srls = Erls, calc = [], (*asm_thm = [],*)
neuper@37906
   140
      rules = [Thm ("cancel_leading_coeff1",num_str cancel_leading_coeff1),
neuper@37906
   141
	       Thm ("cancel_leading_coeff2",num_str cancel_leading_coeff2),
neuper@37906
   142
	       Thm ("cancel_leading_coeff3",num_str cancel_leading_coeff3),
neuper@37906
   143
	       Thm ("cancel_leading_coeff4",num_str cancel_leading_coeff4),
neuper@37906
   144
	       Thm ("cancel_leading_coeff5",num_str cancel_leading_coeff5),
neuper@37906
   145
	       Thm ("cancel_leading_coeff6",num_str cancel_leading_coeff6),
neuper@37906
   146
	       Thm ("cancel_leading_coeff7",num_str cancel_leading_coeff7),
neuper@37906
   147
	       Thm ("cancel_leading_coeff8",num_str cancel_leading_coeff8),
neuper@37906
   148
	       Thm ("cancel_leading_coeff9",num_str cancel_leading_coeff9),
neuper@37906
   149
	       Thm ("cancel_leading_coeff10",num_str cancel_leading_coeff10),
neuper@37906
   150
	       Thm ("cancel_leading_coeff11",num_str cancel_leading_coeff11),
neuper@37906
   151
	       Thm ("cancel_leading_coeff12",num_str cancel_leading_coeff12),
neuper@37906
   152
	       Thm ("cancel_leading_coeff13",num_str cancel_leading_coeff13)
neuper@37906
   153
	       ],
neuper@37906
   154
      scr = Script ((term_of o the o (parse thy)) 
neuper@37906
   155
      "empty_script")
neuper@37906
   156
      }:rls);
neuper@37906
   157
val complete_square = prep_rls(
neuper@37906
   158
  Rls {id = "complete_square", preconds = [], 
neuper@37906
   159
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   160
      erls = PolyEq_erls, srls = Erls, calc = [], (*asm_thm = [],*)
neuper@37906
   161
      rules = [Thm ("complete_square1",num_str complete_square1),
neuper@37906
   162
	       Thm ("complete_square2",num_str complete_square2),
neuper@37906
   163
	       Thm ("complete_square3",num_str complete_square3),
neuper@37906
   164
	       Thm ("complete_square4",num_str complete_square4),
neuper@37906
   165
	       Thm ("complete_square5",num_str complete_square5)
neuper@37906
   166
	       ],
neuper@37906
   167
      scr = Script ((term_of o the o (parse thy)) 
neuper@37906
   168
      "empty_script")
neuper@37906
   169
      }:rls);
neuper@37906
   170
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   171
			[("cancel_leading_coeff",cancel_leading_coeff),
neuper@37906
   172
			 ("complete_square",complete_square),
neuper@37906
   173
			 ("PolyEq_erls",PolyEq_erls)(*FIXXXME:del with rls.rls'*)
neuper@37906
   174
			 ]);
neuper@37906
   175
val polyeq_simplify = prep_rls(
neuper@37906
   176
  Rls {id = "polyeq_simplify", preconds = [], 
neuper@37906
   177
       rew_ord = ("termlessI",termlessI), 
neuper@37906
   178
       erls = PolyEq_erls, 
neuper@37906
   179
       srls = Erls, 
neuper@37906
   180
       calc = [], 
neuper@37906
   181
       (*asm_thm = [],*)
neuper@37906
   182
       rules = [Thm  ("real_assoc_1",num_str real_assoc_1),
neuper@37906
   183
		Thm  ("real_assoc_2",num_str real_assoc_2),
neuper@37906
   184
		Thm  ("real_diff_minus",num_str real_diff_minus),
neuper@37906
   185
		Thm  ("real_unari_minus",num_str real_unari_minus),
neuper@37906
   186
		Thm  ("realpow_multI",num_str realpow_multI),
neuper@37906
   187
		Calc ("op +",eval_binop "#add_"),
neuper@37906
   188
		Calc ("op -",eval_binop "#sub_"),
neuper@37906
   189
		Calc ("op *",eval_binop "#mult_"),
neuper@37906
   190
		Calc ("HOL.divide", eval_cancel "#divide_"),
neuper@37906
   191
		Calc ("Root.sqrt",eval_sqrt "#sqrt_"),
neuper@37906
   192
		Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37906
   193
                Rls_ reduce_012
neuper@37906
   194
                ],
neuper@37906
   195
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   196
       }:rls);
neuper@37906
   197
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   198
			  [("polyeq_simplify",polyeq_simplify)]);
neuper@37906
   199
neuper@37906
   200
neuper@37906
   201
(* ------------- polySolve ------------------ *)
neuper@37906
   202
(* -- d0 -- *)
neuper@37906
   203
(*isolate the bound variable in an d0 equation; 'bdv' is a meta-constant*)
neuper@37906
   204
val d0_polyeq_simplify = prep_rls(
neuper@37906
   205
  Rls {id = "d0_polyeq_simplify", preconds = [],
neuper@37906
   206
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   207
       erls = PolyEq_erls,
neuper@37906
   208
       srls = Erls, 
neuper@37906
   209
       calc = [], 
neuper@37906
   210
       (*asm_thm = [],*)
neuper@37906
   211
       rules = [Thm("d0_true",num_str d0_true),
neuper@37906
   212
		Thm("d0_false",num_str d0_false)
neuper@37906
   213
		],
neuper@37906
   214
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   215
       }:rls);
neuper@37906
   216
(* -- d1 -- *)
neuper@37906
   217
(*isolate the bound variable in an d1 equation; 'bdv' is a meta-constant*)
neuper@37906
   218
val d1_polyeq_simplify = prep_rls(
neuper@37906
   219
  Rls {id = "d1_polyeq_simplify", preconds = [],
neuper@37906
   220
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   221
       erls = PolyEq_erls,
neuper@37906
   222
       srls = Erls, 
neuper@37906
   223
       calc = [], 
neuper@37906
   224
       (*asm_thm = [("d1_isolate_div","")],*)
neuper@37906
   225
       rules = [
neuper@37906
   226
		Thm("d1_isolate_add1",num_str d1_isolate_add1), 
neuper@37906
   227
		(* a+bx=0 -> bx=-a *)
neuper@37906
   228
		Thm("d1_isolate_add2",num_str d1_isolate_add2), 
neuper@37906
   229
		(* a+ x=0 ->  x=-a *)
neuper@37906
   230
		Thm("d1_isolate_div",num_str d1_isolate_div)    
neuper@37906
   231
		(*   bx=c -> x=c/b *)  
neuper@37906
   232
		],
neuper@37906
   233
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   234
       }:rls);
neuper@37906
   235
(* -- d2 -- *)
neuper@37906
   236
(*isolate the bound variable in an d2 equation with bdv only; 'bdv' is a meta-constant*)
neuper@37906
   237
val d2_polyeq_bdv_only_simplify = prep_rls(
neuper@37906
   238
  Rls {id = "d2_polyeq_bdv_only_simplify", preconds = [],
neuper@37906
   239
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   240
       erls = PolyEq_erls,
neuper@37906
   241
       srls = Erls, 
neuper@37906
   242
       calc = [], 
neuper@37906
   243
       (*asm_thm = [("d2_sqrt_equation1",""),("d2_sqrt_equation1_neg",""),
neuper@37906
   244
                  ("d2_isolate_div","")],*)
neuper@37906
   245
       rules = [
neuper@37906
   246
		Thm("d2_prescind1",num_str d2_prescind1),              (*   ax+bx^2=0 -> x(a+bx)=0 *)
neuper@37906
   247
		Thm("d2_prescind2",num_str d2_prescind2),              (*   ax+ x^2=0 -> x(a+ x)=0 *)
neuper@37906
   248
		Thm("d2_prescind3",num_str d2_prescind3),              (*    x+bx^2=0 -> x(1+bx)=0 *)
neuper@37906
   249
		Thm("d2_prescind4",num_str d2_prescind4),              (*    x+ x^2=0 -> x(1+ x)=0 *)
neuper@37906
   250
		Thm("d2_sqrt_equation1",num_str d2_sqrt_equation1),       (* x^2=c   -> x=+-sqrt(c)*)
neuper@37906
   251
		Thm("d2_sqrt_equation1_neg",num_str d2_sqrt_equation1_neg),  (* [0<c] x^2=c  -> [] *)
neuper@37906
   252
		Thm("d2_sqrt_equation2",num_str d2_sqrt_equation2),         (*  x^2=0 ->    x=0    *)
neuper@37906
   253
		Thm("d2_reduce_equation1",num_str d2_reduce_equation1),(* x(a+bx)=0 -> x=0 | a+bx=0*)
neuper@37906
   254
		Thm("d2_reduce_equation2",num_str d2_reduce_equation2),(* x(a+ x)=0 -> x=0 | a+ x=0*)
neuper@37906
   255
		Thm("d2_isolate_div",num_str d2_isolate_div)                   (* bx^2=c -> x^2=c/b*)
neuper@37906
   256
		],
neuper@37906
   257
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   258
       }:rls);
neuper@37906
   259
(*isolate the bound variable in an d2 equation with sqrt only; 'bdv' is a meta-constant*)
neuper@37906
   260
val d2_polyeq_sq_only_simplify = prep_rls(
neuper@37906
   261
  Rls {id = "d2_polyeq_sq_only_simplify", preconds = [],
neuper@37906
   262
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   263
       erls = PolyEq_erls,
neuper@37906
   264
       srls = Erls, 
neuper@37906
   265
       calc = [], 
neuper@37906
   266
       (*asm_thm = [("d2_sqrt_equation1",""),("d2_sqrt_equation1_neg",""),
neuper@37906
   267
                  ("d2_isolate_div","")],*)
neuper@37906
   268
       rules = [
neuper@37906
   269
		Thm("d2_isolate_add1",num_str d2_isolate_add1),        (* a+   bx^2=0 -> bx^2=(-1)a*)
neuper@37906
   270
		Thm("d2_isolate_add2",num_str d2_isolate_add2),        (* a+    x^2=0 ->  x^2=(-1)a*)
neuper@37906
   271
		Thm("d2_sqrt_equation2",num_str d2_sqrt_equation2),         (*  x^2=0 ->    x=0    *)
neuper@37906
   272
		Thm("d2_sqrt_equation1",num_str d2_sqrt_equation1),       (* x^2=c   -> x=+-sqrt(c)*)
neuper@37906
   273
		Thm("d2_sqrt_equation1_neg",num_str d2_sqrt_equation1_neg),(* [c<0] x^2=c  -> x=[] *)
neuper@37906
   274
		Thm("d2_isolate_div",num_str d2_isolate_div)                   (* bx^2=c -> x^2=c/b*)
neuper@37906
   275
		],
neuper@37906
   276
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   277
       }:rls);
neuper@37906
   278
(*isolate the bound variable in an d2 equation with pqFormula; 'bdv' is a meta-constant*)
neuper@37906
   279
val d2_polyeq_pqFormula_simplify = prep_rls(
neuper@37906
   280
  Rls {id = "d2_polyeq_pqFormula_simplify", preconds = [],
neuper@37906
   281
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   282
       erls = PolyEq_erls,
neuper@37906
   283
       srls = Erls, 
neuper@37906
   284
       calc = [], 
neuper@37906
   285
       (*asm_thm = [("d2_pqformula1",""),("d2_pqformula2",""),("d2_pqformula3",""),("d2_pqformula4",""),
neuper@37906
   286
                  ("d2_pqformula5",""),("d2_pqformula6",""),("d2_pqformula7",""),("d2_pqformula8",""),
neuper@37906
   287
                  ("d2_pqformula9",""),("d2_pqformula10",""),
neuper@37906
   288
                  ("d2_pqformula1_neg",""),("d2_pqformula2_neg",""),("d2_pqformula3_neg",""),
neuper@37906
   289
                  ("d2_pqformula4_neg",""),("d2_pqformula9_neg",""),("d2_pqformula10_neg","")],*)
neuper@37906
   290
       rules = [
neuper@37906
   291
		Thm("d2_pqformula1",num_str d2_pqformula1),                         (* q+px+ x^2=0 *)
neuper@37906
   292
		Thm("d2_pqformula1_neg",num_str d2_pqformula1_neg),                 (* q+px+ x^2=0 *)
neuper@37906
   293
		Thm("d2_pqformula2",num_str d2_pqformula2),                         (* q+px+1x^2=0 *)
neuper@37906
   294
		Thm("d2_pqformula2_neg",num_str d2_pqformula2_neg),                 (* q+px+1x^2=0 *)
neuper@37906
   295
		Thm("d2_pqformula3",num_str d2_pqformula3),                         (* q+ x+ x^2=0 *)
neuper@37906
   296
		Thm("d2_pqformula3_neg",num_str d2_pqformula3_neg),                 (* q+ x+ x^2=0 *)
neuper@37906
   297
		Thm("d2_pqformula4",num_str d2_pqformula4),                         (* q+ x+1x^2=0 *)
neuper@37906
   298
		Thm("d2_pqformula4_neg",num_str d2_pqformula4_neg),                 (* q+ x+1x^2=0 *)
neuper@37906
   299
		Thm("d2_pqformula5",num_str d2_pqformula5),                         (*   qx+ x^2=0 *)
neuper@37906
   300
		Thm("d2_pqformula6",num_str d2_pqformula6),                         (*   qx+1x^2=0 *)
neuper@37906
   301
		Thm("d2_pqformula7",num_str d2_pqformula7),                         (*    x+ x^2=0 *)
neuper@37906
   302
		Thm("d2_pqformula8",num_str d2_pqformula8),                         (*    x+1x^2=0 *)
neuper@37906
   303
		Thm("d2_pqformula9",num_str d2_pqformula9),                         (* q   +1x^2=0 *)
neuper@37906
   304
		Thm("d2_pqformula9_neg",num_str d2_pqformula9_neg),                 (* q   +1x^2=0 *)
neuper@37906
   305
		Thm("d2_pqformula10",num_str d2_pqformula10),                       (* q   + x^2=0 *)
neuper@37906
   306
		Thm("d2_pqformula10_neg",num_str d2_pqformula10_neg),               (* q   + x^2=0 *)
neuper@37906
   307
		Thm("d2_sqrt_equation2",num_str d2_sqrt_equation2),                 (*       x^2=0 *)
neuper@37906
   308
		Thm("d2_sqrt_equation3",num_str d2_sqrt_equation3)                  (*      1x^2=0 *)
neuper@37906
   309
		],
neuper@37906
   310
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   311
       }:rls);
neuper@37906
   312
(*isolate the bound variable in an d2 equation with abcFormula; 'bdv' is a meta-constant*)
neuper@37906
   313
val d2_polyeq_abcFormula_simplify = prep_rls(
neuper@37906
   314
  Rls {id = "d2_polyeq_abcFormula_simplify", preconds = [],
neuper@37906
   315
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   316
       erls = PolyEq_erls,
neuper@37906
   317
       srls = Erls, 
neuper@37906
   318
       calc = [], 
neuper@37906
   319
       (*asm_thm = [("d2_abcformula1",""),("d2_abcformula2",""),("d2_abcformula3",""),
neuper@37906
   320
                  ("d2_abcformula4",""),("d2_abcformula5",""),("d2_abcformula6",""),
neuper@37906
   321
                  ("d2_abcformula7",""),("d2_abcformula8",""),("d2_abcformula9",""),
neuper@37906
   322
                  ("d2_abcformula10",""),("d2_abcformula1_neg",""),("d2_abcformula2_neg",""),
neuper@37906
   323
                  ("d2_abcformula3_neg",""),("d2_abcformula4_neg",""),("d2_abcformula5_neg",""),
neuper@37906
   324
                  ("d2_abcformula6_neg","")],*)
neuper@37906
   325
       rules = [
neuper@37906
   326
		Thm("d2_abcformula1",num_str d2_abcformula1),                        (*c+bx+cx^2=0 *)
neuper@37906
   327
		Thm("d2_abcformula1_neg",num_str d2_abcformula1_neg),                (*c+bx+cx^2=0 *)
neuper@37906
   328
		Thm("d2_abcformula2",num_str d2_abcformula2),                        (*c+ x+cx^2=0 *)
neuper@37906
   329
		Thm("d2_abcformula2_neg",num_str d2_abcformula2_neg),                (*c+ x+cx^2=0 *)
neuper@37906
   330
		Thm("d2_abcformula3",num_str d2_abcformula3),                        (*c+bx+ x^2=0 *)
neuper@37906
   331
		Thm("d2_abcformula3_neg",num_str d2_abcformula3_neg),                (*c+bx+ x^2=0 *)
neuper@37906
   332
		Thm("d2_abcformula4",num_str d2_abcformula4),                        (*c+ x+ x^2=0 *)
neuper@37906
   333
		Thm("d2_abcformula4_neg",num_str d2_abcformula4_neg),                (*c+ x+ x^2=0 *)
neuper@37906
   334
		Thm("d2_abcformula5",num_str d2_abcformula5),                        (*c+   cx^2=0 *)
neuper@37906
   335
		Thm("d2_abcformula5_neg",num_str d2_abcformula5_neg),                (*c+   cx^2=0 *)
neuper@37906
   336
		Thm("d2_abcformula6",num_str d2_abcformula6),                        (*c+    x^2=0 *)
neuper@37906
   337
		Thm("d2_abcformula6_neg",num_str d2_abcformula6_neg),                (*c+    x^2=0 *)
neuper@37906
   338
		Thm("d2_abcformula7",num_str d2_abcformula7),                        (*  bx+ax^2=0 *)
neuper@37906
   339
		Thm("d2_abcformula8",num_str d2_abcformula8),                        (*  bx+ x^2=0 *)
neuper@37906
   340
		Thm("d2_abcformula9",num_str d2_abcformula9),                        (*   x+ax^2=0 *)
neuper@37906
   341
		Thm("d2_abcformula10",num_str d2_abcformula10),                      (*   x+ x^2=0 *)
neuper@37906
   342
		Thm("d2_sqrt_equation2",num_str d2_sqrt_equation2),                  (*      x^2=0 *)  
neuper@37906
   343
		Thm("d2_sqrt_equation3",num_str d2_sqrt_equation3)                   (*     bx^2=0 *)  
neuper@37906
   344
		],
neuper@37906
   345
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   346
       }:rls);
neuper@37906
   347
(*isolate the bound variable in an d2 equation; 'bdv' is a meta-constant*)
neuper@37906
   348
val d2_polyeq_simplify = prep_rls(
neuper@37906
   349
  Rls {id = "d2_polyeq_simplify", preconds = [],
neuper@37906
   350
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   351
       erls = PolyEq_erls,
neuper@37906
   352
       srls = Erls, 
neuper@37906
   353
       calc = [], 
neuper@37906
   354
       (*asm_thm = [("d2_pqformula1",""),("d2_pqformula2",""),("d2_pqformula3",""),("d2_pqformula4",""),
neuper@37906
   355
                  ("d2_pqformula1_neg",""),("d2_pqformula2_neg",""),("d2_pqformula3_neg",""),
neuper@37906
   356
                  ("d2_pqformula4_neg",""),
neuper@37906
   357
                  ("d2_abcformula1",""),("d2_abcformula2",""),("d2_abcformula1_neg",""),
neuper@37906
   358
                  ("d2_abcformula2_neg",""), ("d2_sqrt_equation1",""),
neuper@37906
   359
                  ("d2_sqrt_equation1_neg",""),("d2_isolate_div","")],*)
neuper@37906
   360
       rules = [
neuper@37906
   361
		Thm("d2_pqformula1",num_str d2_pqformula1),                         (* p+qx+ x^2=0 *)
neuper@37906
   362
		Thm("d2_pqformula1_neg",num_str d2_pqformula1_neg),                 (* p+qx+ x^2=0 *)
neuper@37906
   363
		Thm("d2_pqformula2",num_str d2_pqformula2),                         (* p+qx+1x^2=0 *)
neuper@37906
   364
		Thm("d2_pqformula2_neg",num_str d2_pqformula2_neg),                 (* p+qx+1x^2=0 *)
neuper@37906
   365
		Thm("d2_pqformula3",num_str d2_pqformula3),                         (* p+ x+ x^2=0 *)
neuper@37906
   366
		Thm("d2_pqformula3_neg",num_str d2_pqformula3_neg),                 (* p+ x+ x^2=0 *)
neuper@37906
   367
		Thm("d2_pqformula4",num_str d2_pqformula4),                         (* p+ x+1x^2=0 *)
neuper@37906
   368
		Thm("d2_pqformula4_neg",num_str d2_pqformula4_neg),                 (* p+ x+1x^2=0 *)
neuper@37906
   369
		Thm("d2_abcformula1",num_str d2_abcformula1),                       (* c+bx+cx^2=0 *)
neuper@37906
   370
		Thm("d2_abcformula1_neg",num_str d2_abcformula1_neg),               (* c+bx+cx^2=0 *)
neuper@37906
   371
		Thm("d2_abcformula2",num_str d2_abcformula2),                       (* c+ x+cx^2=0 *)
neuper@37906
   372
		Thm("d2_abcformula2_neg",num_str d2_abcformula2_neg),               (* c+ x+cx^2=0 *)
neuper@37906
   373
		Thm("d2_prescind1",num_str d2_prescind1),              (*   ax+bx^2=0 -> x(a+bx)=0 *)
neuper@37906
   374
		Thm("d2_prescind2",num_str d2_prescind2),              (*   ax+ x^2=0 -> x(a+ x)=0 *)
neuper@37906
   375
		Thm("d2_prescind3",num_str d2_prescind3),              (*    x+bx^2=0 -> x(1+bx)=0 *)
neuper@37906
   376
		Thm("d2_prescind4",num_str d2_prescind4),              (*    x+ x^2=0 -> x(1+ x)=0 *)
neuper@37906
   377
		Thm("d2_isolate_add1",num_str d2_isolate_add1),        (* a+   bx^2=0 -> bx^2=(-1)a*)
neuper@37906
   378
		Thm("d2_isolate_add2",num_str d2_isolate_add2),        (* a+    x^2=0 ->  x^2=(-1)a*)
neuper@37906
   379
		Thm("d2_sqrt_equation1",num_str d2_sqrt_equation1),       (* x^2=c   -> x=+-sqrt(c)*)
neuper@37906
   380
		Thm("d2_sqrt_equation1_neg",num_str d2_sqrt_equation1_neg),(* [c<0] x^2=c   -> x=[]*)
neuper@37906
   381
		Thm("d2_sqrt_equation2",num_str d2_sqrt_equation2),         (*  x^2=0 ->    x=0    *)
neuper@37906
   382
		Thm("d2_reduce_equation1",num_str d2_reduce_equation1),(* x(a+bx)=0 -> x=0 | a+bx=0*)
neuper@37906
   383
		Thm("d2_reduce_equation2",num_str d2_reduce_equation2),(* x(a+ x)=0 -> x=0 | a+ x=0*)
neuper@37906
   384
		Thm("d2_isolate_div",num_str d2_isolate_div)                   (* bx^2=c -> x^2=c/b*)
neuper@37906
   385
		],
neuper@37906
   386
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   387
       }:rls);
neuper@37906
   388
(* -- d3 -- *)
neuper@37906
   389
(*isolate the bound variable in an d3 equation; 'bdv' is a meta-constant*)
neuper@37906
   390
val d3_polyeq_simplify = prep_rls(
neuper@37906
   391
  Rls {id = "d3_polyeq_simplify", preconds = [],
neuper@37906
   392
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   393
       erls = PolyEq_erls,
neuper@37906
   394
       srls = Erls, 
neuper@37906
   395
       calc = [], 
neuper@37906
   396
       (*asm_thm = [("d3_isolate_div","")],*)
neuper@37906
   397
       rules = [
neuper@37906
   398
		Thm("d3_reduce_equation1",num_str d3_reduce_equation1),
neuper@37906
   399
		(*a*bdv + b*bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (a + b*bdv + c*bdv^^^2=0)*)
neuper@37906
   400
		Thm("d3_reduce_equation2",num_str d3_reduce_equation2),
neuper@37906
   401
		(*  bdv + b*bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (1 + b*bdv + c*bdv^^^2=0)*)
neuper@37906
   402
		Thm("d3_reduce_equation3",num_str d3_reduce_equation3),
neuper@37906
   403
		(*a*bdv +   bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (a +   bdv + c*bdv^^^2=0)*)
neuper@37906
   404
		Thm("d3_reduce_equation4",num_str d3_reduce_equation4),
neuper@37906
   405
		(*  bdv +   bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (1 +   bdv + c*bdv^^^2=0)*)
neuper@37906
   406
		Thm("d3_reduce_equation5",num_str d3_reduce_equation5),
neuper@37906
   407
		(*a*bdv + b*bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (a + b*bdv +   bdv^^^2=0)*)
neuper@37906
   408
		Thm("d3_reduce_equation6",num_str d3_reduce_equation6),
neuper@37906
   409
		(*  bdv + b*bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (1 + b*bdv +   bdv^^^2=0)*)
neuper@37906
   410
		Thm("d3_reduce_equation7",num_str d3_reduce_equation7),
neuper@37906
   411
		(*a*bdv +   bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (1 +   bdv +   bdv^^^2=0)*)
neuper@37906
   412
		Thm("d3_reduce_equation8",num_str d3_reduce_equation8),
neuper@37906
   413
		(*  bdv +   bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (1 +   bdv +   bdv^^^2=0)*)
neuper@37906
   414
		Thm("d3_reduce_equation9",num_str d3_reduce_equation9),
neuper@37906
   415
		(*a*bdv             + c*bdv^^^3=0) = (bdv=0 | (a         + c*bdv^^^2=0)*)
neuper@37906
   416
		Thm("d3_reduce_equation10",num_str d3_reduce_equation10),
neuper@37906
   417
		(*  bdv             + c*bdv^^^3=0) = (bdv=0 | (1         + c*bdv^^^2=0)*)
neuper@37906
   418
		Thm("d3_reduce_equation11",num_str d3_reduce_equation11),
neuper@37906
   419
		(*a*bdv             +   bdv^^^3=0) = (bdv=0 | (a         +   bdv^^^2=0)*)
neuper@37906
   420
		Thm("d3_reduce_equation12",num_str d3_reduce_equation12),
neuper@37906
   421
		(*  bdv             +   bdv^^^3=0) = (bdv=0 | (1         +   bdv^^^2=0)*)
neuper@37906
   422
		Thm("d3_reduce_equation13",num_str d3_reduce_equation13),
neuper@37906
   423
		(*        b*bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (    b*bdv + c*bdv^^^2=0)*)
neuper@37906
   424
		Thm("d3_reduce_equation14",num_str d3_reduce_equation14),
neuper@37906
   425
		(*          bdv^^^2 + c*bdv^^^3=0) = (bdv=0 | (      bdv + c*bdv^^^2=0)*)
neuper@37906
   426
		Thm("d3_reduce_equation15",num_str d3_reduce_equation15),
neuper@37906
   427
		(*        b*bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (    b*bdv +   bdv^^^2=0)*)
neuper@37906
   428
		Thm("d3_reduce_equation16",num_str d3_reduce_equation16),
neuper@37906
   429
		(*          bdv^^^2 +   bdv^^^3=0) = (bdv=0 | (      bdv +   bdv^^^2=0)*)
neuper@37906
   430
		Thm("d3_isolate_add1",num_str d3_isolate_add1),
neuper@37906
   431
		(*[|Not(bdv occurs_in a)|] ==> (a + b*bdv^^^3=0) = (bdv=0 | (b*bdv^^^3=a)*)
neuper@37906
   432
		Thm("d3_isolate_add2",num_str d3_isolate_add2),
neuper@37906
   433
                (*[|Not(bdv occurs_in a)|] ==> (a +   bdv^^^3=0) = (bdv=0 | (  bdv^^^3=a)*)
neuper@37906
   434
	        Thm("d3_isolate_div",num_str d3_isolate_div),
neuper@37906
   435
                (*[|Not(b=0)|] ==> (b*bdv^^^3=c) = (bdv^^^3=c/b*)
neuper@37906
   436
                Thm("d3_root_equation2",num_str d3_root_equation2),
neuper@37906
   437
                (*(bdv^^^3=0) = (bdv=0) *)
neuper@37906
   438
	        Thm("d3_root_equation1",num_str d3_root_equation1)
neuper@37906
   439
                (*bdv^^^3=c) = (bdv = nroot 3 c*)
neuper@37906
   440
		],
neuper@37906
   441
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   442
       }:rls);
neuper@37906
   443
(* -- d4 -- *)
neuper@37906
   444
(*isolate the bound variable in an d4 equation; 'bdv' is a meta-constant*)
neuper@37906
   445
val d4_polyeq_simplify = prep_rls(
neuper@37906
   446
  Rls {id = "d4_polyeq_simplify", preconds = [],
neuper@37906
   447
       rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37906
   448
       erls = PolyEq_erls,
neuper@37906
   449
       srls = Erls, 
neuper@37906
   450
       calc = [], 
neuper@37906
   451
       (*asm_thm = [],*)
neuper@37906
   452
       rules = [Thm("d4_sub_u1",num_str d4_sub_u1)  
neuper@37906
   453
		(* ax^4+bx^2+c=0 -> x=+-sqrt(ax^2+bx^+c) *)
neuper@37906
   454
		],
neuper@37906
   455
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37906
   456
       }:rls);
neuper@37906
   457
  
neuper@37906
   458
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
   459
                        [("d0_polyeq_simplify", d0_polyeq_simplify),
neuper@37906
   460
                         ("d1_polyeq_simplify", d1_polyeq_simplify),
neuper@37906
   461
                         ("d2_polyeq_simplify", d2_polyeq_simplify),
neuper@37906
   462
                         ("d2_polyeq_bdv_only_simplify", d2_polyeq_bdv_only_simplify),
neuper@37906
   463
                         ("d2_polyeq_sq_only_simplify", d2_polyeq_sq_only_simplify),
neuper@37906
   464
                         ("d2_polyeq_pqFormula_simplify", d2_polyeq_pqFormula_simplify),
neuper@37906
   465
                         ("d2_polyeq_abcFormula_simplify", d2_polyeq_abcFormula_simplify),
neuper@37906
   466
                         ("d3_polyeq_simplify", d3_polyeq_simplify),
neuper@37906
   467
			 ("d4_polyeq_simplify", d4_polyeq_simplify)
neuper@37906
   468
			 ]);
neuper@37906
   469
neuper@37906
   470
(*------------------------problems------------------------*)
neuper@37906
   471
(*
neuper@37906
   472
(get_pbt ["degree_2","polynomial","univariate","equation"]);
neuper@37906
   473
show_ptyps(); 
neuper@37906
   474
*)
neuper@37906
   475
neuper@37906
   476
(*-------------------------poly-----------------------*)
neuper@37906
   477
store_pbt
neuper@37906
   478
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly" [] e_pblID
neuper@37906
   479
 (["polynomial","univariate","equation"],
neuper@37906
   480
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   481
   ("#Where" ,["~((e_::bool) is_ratequation_in (v_::real))",
neuper@37906
   482
	       "~((lhs e_) is_rootTerm_in (v_::real))",
neuper@37906
   483
	       "~((rhs e_) is_rootTerm_in (v_::real))"]),
neuper@37906
   484
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   485
   ],
neuper@37926
   486
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   487
  []));
neuper@37906
   488
(*--- d0 ---*)
neuper@37906
   489
store_pbt
neuper@37906
   490
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg0" [] e_pblID
neuper@37906
   491
 (["degree_0","polynomial","univariate","equation"],
neuper@37906
   492
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   493
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   494
	       "(lhs e_) is_poly_in v_",
neuper@37906
   495
	       "((lhs e_) has_degree_in v_ ) = 0"
neuper@37906
   496
	      ]),
neuper@37906
   497
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   498
  ],
neuper@37926
   499
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   500
  [["PolyEq","solve_d0_polyeq_equation"]]));
neuper@37906
   501
neuper@37906
   502
(*--- d1 ---*)
neuper@37906
   503
store_pbt
neuper@37906
   504
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg1" [] e_pblID
neuper@37906
   505
 (["degree_1","polynomial","univariate","equation"],
neuper@37906
   506
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   507
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   508
	       "(lhs e_) is_poly_in v_",
neuper@37906
   509
	       "((lhs e_) has_degree_in v_ ) = 1"
neuper@37906
   510
	      ]),
neuper@37906
   511
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   512
  ],
neuper@37926
   513
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   514
  [["PolyEq","solve_d1_polyeq_equation"]]));
neuper@37906
   515
neuper@37906
   516
(*--- d2 ---*)
neuper@37906
   517
store_pbt
neuper@37906
   518
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg2" [] e_pblID
neuper@37906
   519
 (["degree_2","polynomial","univariate","equation"],
neuper@37906
   520
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   521
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   522
	       "(lhs e_) is_poly_in v_ ",
neuper@37906
   523
	       "((lhs e_) has_degree_in v_ ) = 2"]),
neuper@37906
   524
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   525
  ],
neuper@37926
   526
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   527
  [["PolyEq","solve_d2_polyeq_equation"]]));
neuper@37906
   528
neuper@37906
   529
 store_pbt
neuper@37906
   530
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg2_sqonly" [] e_pblID
neuper@37906
   531
 (["sq_only","degree_2","polynomial","univariate","equation"],
neuper@37906
   532
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   533
   ("#Where" ,["matches ( ?a +    ?v_^^^2 = 0) e_ | \
neuper@37906
   534
	       \matches ( ?a + ?b*?v_^^^2 = 0) e_ | \
neuper@37906
   535
	       \matches (         ?v_^^^2 = 0) e_ | \
neuper@37906
   536
	       \matches (      ?b*?v_^^^2 = 0) e_" ,
neuper@37906
   537
	       "Not (matches (?a +    ?v_ +    ?v_^^^2 = 0) e_) &\
neuper@37906
   538
	       \Not (matches (?a + ?b*?v_ +    ?v_^^^2 = 0) e_) &\
neuper@37906
   539
	       \Not (matches (?a +    ?v_ + ?c*?v_^^^2 = 0) e_) &\
neuper@37906
   540
	       \Not (matches (?a + ?b*?v_ + ?c*?v_^^^2 = 0) e_) &\
neuper@37906
   541
	       \Not (matches (        ?v_ +    ?v_^^^2 = 0) e_) &\
neuper@37906
   542
	       \Not (matches (     ?b*?v_ +    ?v_^^^2 = 0) e_) &\
neuper@37906
   543
	       \Not (matches (        ?v_ + ?c*?v_^^^2 = 0) e_) &\
neuper@37906
   544
	       \Not (matches (     ?b*?v_ + ?c*?v_^^^2 = 0) e_)"]),
neuper@37906
   545
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   546
  ],
neuper@37926
   547
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   548
  [["PolyEq","solve_d2_polyeq_sqonly_equation"]]));
neuper@37906
   549
neuper@37906
   550
store_pbt
neuper@37906
   551
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg2_bdvonly" [] e_pblID
neuper@37906
   552
 (["bdv_only","degree_2","polynomial","univariate","equation"],
neuper@37906
   553
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   554
   ("#Where" ,["matches (?a*?v_ +    ?v_^^^2 = 0) e_ | \
neuper@37906
   555
	       \matches (   ?v_ +    ?v_^^^2 = 0) e_ | \
neuper@37906
   556
	       \matches (   ?v_ + ?b*?v_^^^2 = 0) e_ | \
neuper@37906
   557
	       \matches (?a*?v_ + ?b*?v_^^^2 = 0) e_ | \
neuper@37906
   558
	       \matches (            ?v_^^^2 = 0) e_ | \
neuper@37906
   559
	       \matches (         ?b*?v_^^^2 = 0) e_ "]),
neuper@37906
   560
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   561
  ],
neuper@37926
   562
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   563
  [["PolyEq","solve_d2_polyeq_bdvonly_equation"]]));
neuper@37906
   564
neuper@37906
   565
store_pbt
neuper@37906
   566
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg2_pq" [] e_pblID
neuper@37906
   567
 (["pqFormula","degree_2","polynomial","univariate","equation"],
neuper@37906
   568
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   569
   ("#Where" ,["matches (?a + 1*?v_^^^2 = 0) e_ | \
neuper@37906
   570
	       \matches (?a +   ?v_^^^2 = 0) e_"]),
neuper@37906
   571
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   572
  ],
neuper@37926
   573
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   574
  [["PolyEq","solve_d2_polyeq_pq_equation"]]));
neuper@37906
   575
neuper@37906
   576
store_pbt
neuper@37906
   577
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg2_abc" [] e_pblID
neuper@37906
   578
 (["abcFormula","degree_2","polynomial","univariate","equation"],
neuper@37906
   579
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   580
   ("#Where" ,["matches (?a +    ?v_^^^2 = 0) e_ | \
neuper@37906
   581
	       \matches (?a + ?b*?v_^^^2 = 0) e_"]),
neuper@37906
   582
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   583
  ],
neuper@37926
   584
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   585
  [["PolyEq","solve_d2_polyeq_abc_equation"]]));
neuper@37906
   586
neuper@37906
   587
(*--- d3 ---*)
neuper@37906
   588
store_pbt
neuper@37906
   589
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg3" [] e_pblID
neuper@37906
   590
 (["degree_3","polynomial","univariate","equation"],
neuper@37906
   591
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   592
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   593
	       "(lhs e_) is_poly_in v_ ",
neuper@37906
   594
	       "((lhs e_) has_degree_in v_) = 3"]),
neuper@37906
   595
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   596
  ],
neuper@37926
   597
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   598
  [["PolyEq","solve_d3_polyeq_equation"]]));
neuper@37906
   599
neuper@37906
   600
(*--- d4 ---*)
neuper@37906
   601
store_pbt
neuper@37906
   602
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_deg4" [] e_pblID
neuper@37906
   603
 (["degree_4","polynomial","univariate","equation"],
neuper@37906
   604
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   605
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   606
	       "(lhs e_) is_poly_in v_ ",
neuper@37906
   607
	       "((lhs e_) has_degree_in v_) = 4"]),
neuper@37906
   608
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   609
  ],
neuper@37926
   610
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   611
  [(*["PolyEq","solve_d4_polyeq_equation"]*)]));
neuper@37906
   612
neuper@37906
   613
(*--- normalize ---*)
neuper@37906
   614
store_pbt
neuper@37906
   615
 (prep_pbt PolyEq.thy "pbl_equ_univ_poly_norm" [] e_pblID
neuper@37906
   616
 (["normalize","polynomial","univariate","equation"],
neuper@37906
   617
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   618
   ("#Where" ,["(Not((matches (?a = 0 ) e_ ))) |\
neuper@37906
   619
	       \(Not(((lhs e_) is_poly_in v_)))"]),
neuper@37906
   620
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   621
  ],
neuper@37926
   622
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   623
  [["PolyEq","normalize_poly"]]));
neuper@37906
   624
(*-------------------------expanded-----------------------*)
neuper@37906
   625
store_pbt
neuper@37906
   626
 (prep_pbt PolyEq.thy "pbl_equ_univ_expand" [] e_pblID
neuper@37906
   627
 (["expanded","univariate","equation"],
neuper@37906
   628
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   629
   ("#Where" ,["matches (?a = 0) e_",
neuper@37906
   630
	       "(lhs e_) is_expanded_in v_ "]),
neuper@37906
   631
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   632
   ],
neuper@37926
   633
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   634
  []));
neuper@37906
   635
neuper@37906
   636
(*--- d2 ---*)
neuper@37906
   637
store_pbt
neuper@37906
   638
 (prep_pbt PolyEq.thy "pbl_equ_univ_expand_deg2" [] e_pblID
neuper@37906
   639
 (["degree_2","expanded","univariate","equation"],
neuper@37906
   640
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   641
   ("#Where" ,["((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   642
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   643
  ],
neuper@37926
   644
  PolyEq_prls, SOME "solve (e_::bool, v_)",
neuper@37906
   645
  [["PolyEq","complete_square"]]));
neuper@37906
   646
neuper@37906
   647
neuper@37906
   648
"-------------------------methods-----------------------";
neuper@37906
   649
store_met
neuper@37906
   650
 (prep_met PolyEq.thy "met_polyeq" [] e_metID
neuper@37906
   651
 (["PolyEq"],
neuper@37906
   652
   [],
neuper@37906
   653
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   654
    crls=PolyEq_crls, nrls=norm_Rational
neuper@37906
   655
    (*, asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37906
   656
neuper@37906
   657
store_met
neuper@37906
   658
 (prep_met PolyEq.thy "met_polyeq_norm" [] e_metID
neuper@37906
   659
 (["PolyEq","normalize_poly"],
neuper@37906
   660
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   661
   ("#Where" ,["(Not((matches (?a = 0 ) e_ ))) |\
neuper@37906
   662
	       \(Not(((lhs e_) is_poly_in v_)))"]),
neuper@37906
   663
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   664
  ],
neuper@37906
   665
   {rew_ord'="termlessI",
neuper@37906
   666
    rls'=PolyEq_erls,
neuper@37906
   667
    srls=e_rls,
neuper@37906
   668
    prls=PolyEq_prls,
neuper@37906
   669
    calc=[],
neuper@37906
   670
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   671
    asm_rls=[],
neuper@37906
   672
    asm_thm=[]*)},
neuper@37906
   673
    (*RL: Ratpoly loest Brueche ohne bdv*)
neuper@37906
   674
    "Script Normalize_poly (e_::bool) (v_::real) =                     \
neuper@37906
   675
    \(let e_ =((Try         (Rewrite     all_left          False)) @@  \ 
neuper@37906
   676
    \          (Try (Repeat (Rewrite     makex1_x         False))) @@  \ 
neuper@37906
   677
    \          (Try (Repeat (Rewrite_Set expand_binoms    False))) @@  \ 
neuper@37906
   678
    \          (Try (Repeat (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   679
    \                                 make_ratpoly_in     False))) @@  \
neuper@37906
   680
    \          (Try (Repeat (Rewrite_Set polyeq_simplify  False)))) e_ \
neuper@37906
   681
    \ in (SubProblem (PolyEq_,[polynomial,univariate,equation],        \
neuper@37906
   682
    \                [no_met]) [bool_ e_, real_ v_]))"
neuper@37906
   683
   ));
neuper@37906
   684
neuper@37906
   685
store_met
neuper@37906
   686
 (prep_met PolyEq.thy "met_polyeq_d0" [] e_metID
neuper@37906
   687
 (["PolyEq","solve_d0_polyeq_equation"],
neuper@37906
   688
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   689
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   690
	       "((lhs e_) has_degree_in v_) = 0"]),
neuper@37906
   691
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   692
  ],
neuper@37906
   693
   {rew_ord'="termlessI",
neuper@37906
   694
    rls'=PolyEq_erls,
neuper@37906
   695
    srls=e_rls,
neuper@37906
   696
    prls=PolyEq_prls,
neuper@37906
   697
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   698
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   699
    asm_rls=[],
neuper@37906
   700
    asm_thm=[]*)},
neuper@37906
   701
   "Script Solve_d0_polyeq_equation  (e_::bool) (v_::real)  = \
neuper@37906
   702
    \(let e_ =  ((Try (Rewrite_Set_Inst [(bdv,v_::real)]      \
neuper@37906
   703
    \                  d0_polyeq_simplify  False))) e_        \
neuper@37906
   704
    \ in ((Or_to_List e_)::bool list))"
neuper@37906
   705
 ));
neuper@37906
   706
neuper@37906
   707
store_met
neuper@37906
   708
 (prep_met PolyEq.thy "met_polyeq_d1" [] e_metID
neuper@37906
   709
 (["PolyEq","solve_d1_polyeq_equation"],
neuper@37906
   710
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   711
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   712
	       "((lhs e_) has_degree_in v_) = 1"]),
neuper@37906
   713
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   714
  ],
neuper@37906
   715
   {rew_ord'="termlessI",
neuper@37906
   716
    rls'=PolyEq_erls,
neuper@37906
   717
    srls=e_rls,
neuper@37906
   718
    prls=PolyEq_prls,
neuper@37906
   719
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   720
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   721
    (*    asm_rls=["d1_polyeq_simplify"],*)
neuper@37906
   722
    asm_rls=[],
neuper@37906
   723
    asm_thm=[("d1_isolate_div","")]*)},
neuper@37906
   724
   "Script Solve_d1_polyeq_equation  (e_::bool) (v_::real)  =   \
neuper@37906
   725
    \(let e_ =  ((Try (Rewrite_Set_Inst [(bdv,v_::real)]        \
neuper@37906
   726
    \                  d1_polyeq_simplify   True))          @@  \
neuper@37906
   727
    \            (Try (Rewrite_Set polyeq_simplify  False)) @@  \
neuper@37906
   728
    \            (Try (Rewrite_Set norm_Rational_parenthesized    False))) e_;\
neuper@37906
   729
    \ (L_::bool list) = ((Or_to_List e_)::bool list)            \
neuper@37906
   730
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   731
 ));
neuper@37906
   732
neuper@37906
   733
store_met
neuper@37906
   734
 (prep_met PolyEq.thy "met_polyeq_d22" [] e_metID
neuper@37906
   735
 (["PolyEq","solve_d2_polyeq_equation"],
neuper@37906
   736
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   737
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   738
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   739
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   740
  ],
neuper@37906
   741
   {rew_ord'="termlessI",
neuper@37906
   742
    rls'=PolyEq_erls,
neuper@37906
   743
    srls=e_rls,
neuper@37906
   744
    prls=PolyEq_prls,
neuper@37906
   745
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   746
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   747
    (*asm_rls=["d2_polyeq_simplify","d1_polyeq_simplify"],*)
neuper@37906
   748
    asm_rls=[],
neuper@37906
   749
    asm_thm = [("d1_isolate_div",""),("d2_pqformula1",""),("d2_pqformula2",""),
neuper@37906
   750
               ("d2_pqformula3",""),("d2_pqformula4",""),("d2_pqformula1_neg",""),
neuper@37906
   751
               ("d2_pqformula2_neg",""),("d2_pqformula3_neg",""),("d2_pqformula4_neg",""),
neuper@37906
   752
               ("d2_abcformula1",""),("d2_abcformula2",""),("d2_abcformula1_neg",""),
neuper@37906
   753
               ("d2_abcformula2_neg",""), ("d2_sqrt_equation1",""),
neuper@37906
   754
               ("d2_sqrt_equation1_neg",""), ("d2_isolate_div","")]*)},
neuper@37906
   755
   "Script Solve_d2_polyeq_equation  (e_::bool) (v_::real) =      \
neuper@37906
   756
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   757
    \                    d2_polyeq_simplify           True)) @@   \
neuper@37906
   758
    \             (Try (Rewrite_Set polyeq_simplify   False)) @@  \
neuper@37906
   759
    \             (Try (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   760
    \                    d1_polyeq_simplify            True)) @@  \
neuper@37906
   761
    \            (Try (Rewrite_Set polyeq_simplify    False)) @@  \
neuper@37906
   762
    \            (Try (Rewrite_Set norm_Rational_parenthesized      False))) e_;\
neuper@37906
   763
    \ (L_::bool list) = ((Or_to_List e_)::bool list)              \
neuper@37906
   764
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   765
 ));
neuper@37906
   766
neuper@37906
   767
store_met
neuper@37906
   768
 (prep_met PolyEq.thy "met_polyeq_d2_bdvonly" [] e_metID
neuper@37906
   769
 (["PolyEq","solve_d2_polyeq_bdvonly_equation"],
neuper@37906
   770
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   771
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   772
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   773
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   774
  ],
neuper@37906
   775
   {rew_ord'="termlessI",
neuper@37906
   776
    rls'=PolyEq_erls,
neuper@37906
   777
    srls=e_rls,
neuper@37906
   778
    prls=PolyEq_prls,
neuper@37906
   779
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   780
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   781
    (*asm_rls=["d2_polyeq_bdv_only_simplify","d1_polyeq_simplify "],*)
neuper@37906
   782
    asm_rls=[],
neuper@37906
   783
    asm_thm=[("d1_isolate_div",""),("d2_isolate_div",""),
neuper@37906
   784
             ("d2_sqrt_equation1",""),("d2_sqrt_equation1_neg","")]*)},
neuper@37906
   785
   "Script Solve_d2_polyeq_bdvonly_equation  (e_::bool) (v_::real) =\
neuper@37906
   786
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   787
    \                   d2_polyeq_bdv_only_simplify    True)) @@  \
neuper@37906
   788
    \             (Try (Rewrite_Set polyeq_simplify   False)) @@  \
neuper@37906
   789
    \             (Try (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   790
    \                   d1_polyeq_simplify             True)) @@  \
neuper@37906
   791
    \            (Try (Rewrite_Set polyeq_simplify    False)) @@  \
neuper@37906
   792
    \            (Try (Rewrite_Set norm_Rational_parenthesized      False))) e_;\
neuper@37906
   793
    \ (L_::bool list) = ((Or_to_List e_)::bool list)              \
neuper@37906
   794
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   795
 ));
neuper@37906
   796
neuper@37906
   797
store_met
neuper@37906
   798
 (prep_met PolyEq.thy "met_polyeq_d2_sqonly" [] e_metID
neuper@37906
   799
 (["PolyEq","solve_d2_polyeq_sqonly_equation"],
neuper@37906
   800
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   801
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   802
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   803
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   804
  ],
neuper@37906
   805
   {rew_ord'="termlessI",
neuper@37906
   806
    rls'=PolyEq_erls,
neuper@37906
   807
    srls=e_rls,
neuper@37906
   808
    prls=PolyEq_prls,
neuper@37906
   809
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   810
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   811
    (*asm_rls=["d2_polyeq_sq_only_simplify"],*)
neuper@37906
   812
    asm_rls=[],
neuper@37906
   813
    asm_thm=[("d2_sqrt_equation1",""),("d2_sqrt_equation1_neg",""),
neuper@37906
   814
             ("d2_isolate_div","")]*)},
neuper@37906
   815
   "Script Solve_d2_polyeq_sqonly_equation  (e_::bool) (v_::real) =\
neuper@37906
   816
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]          \
neuper@37906
   817
    \                   d2_polyeq_sq_only_simplify     True)) @@   \
neuper@37906
   818
    \            (Try (Rewrite_Set polyeq_simplify    False)) @@   \
neuper@37906
   819
    \            (Try (Rewrite_Set norm_Rational_parenthesized      False))) e_; \
neuper@37906
   820
    \ (L_::bool list) = ((Or_to_List e_)::bool list)               \
neuper@37906
   821
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   822
 ));
neuper@37906
   823
neuper@37906
   824
store_met
neuper@37906
   825
 (prep_met PolyEq.thy "met_polyeq_d2_pq" [] e_metID
neuper@37906
   826
 (["PolyEq","solve_d2_polyeq_pq_equation"],
neuper@37906
   827
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   828
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   829
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   830
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   831
  ],
neuper@37906
   832
   {rew_ord'="termlessI",
neuper@37906
   833
    rls'=PolyEq_erls,
neuper@37906
   834
    srls=e_rls,
neuper@37906
   835
    prls=PolyEq_prls,
neuper@37906
   836
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   837
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   838
    (*asm_rls=["d2_polyeq_pqFormula_simplify"],*)
neuper@37906
   839
    asm_rls=[],
neuper@37906
   840
    asm_thm=[("d2_pqformula1",""),("d2_pqformula2",""),("d2_pqformula3",""),
neuper@37906
   841
             ("d2_pqformula4",""),("d2_pqformula5",""),("d2_pqformula6",""),
neuper@37906
   842
             ("d2_pqformula7",""),("d2_pqformula8",""),("d2_pqformula9",""),
neuper@37906
   843
             ("d2_pqformula10",""),("d2_pqformula1_neg",""),("d2_pqformula2_neg",""),
neuper@37906
   844
             ("d2_pqformula3_neg",""), ("d2_pqformula4_neg",""),("d2_pqformula9_neg",""),
neuper@37906
   845
             ("d2_pqformula10_neg","")]*)},
neuper@37906
   846
   "Script Solve_d2_polyeq_pq_equation  (e_::bool) (v_::real) =   \
neuper@37906
   847
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]         \
neuper@37906
   848
    \                   d2_polyeq_pqFormula_simplify   True)) @@  \
neuper@37906
   849
    \            (Try (Rewrite_Set polyeq_simplify    False)) @@  \
neuper@37906
   850
    \            (Try (Rewrite_Set norm_Rational_parenthesized      False))) e_;\
neuper@37906
   851
    \ (L_::bool list) = ((Or_to_List e_)::bool list)              \
neuper@37906
   852
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   853
 ));
neuper@37906
   854
neuper@37906
   855
store_met
neuper@37906
   856
 (prep_met PolyEq.thy "met_polyeq_d2_abc" [] e_metID
neuper@37906
   857
 (["PolyEq","solve_d2_polyeq_abc_equation"],
neuper@37906
   858
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   859
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   860
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   861
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   862
  ],
neuper@37906
   863
   {rew_ord'="termlessI",
neuper@37906
   864
    rls'=PolyEq_erls,
neuper@37906
   865
    srls=e_rls,
neuper@37906
   866
    prls=PolyEq_prls,
neuper@37906
   867
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   868
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   869
    (*asm_rls=["d2_polyeq_abcFormula_simplify"],*)
neuper@37906
   870
    asm_rls=[],
neuper@37906
   871
    asm_thm=[("d2_abcformula1",""),("d2_abcformula2",""),("d2_abcformula3",""),
neuper@37906
   872
             ("d2_abcformula4",""),("d2_abcformula5",""),("d2_abcformula6",""),
neuper@37906
   873
             ("d2_abcformula7",""),("d2_abcformula8",""),("d2_abcformula9",""),
neuper@37906
   874
             ("d2_abcformula10",""),("d2_abcformula1_neg",""),("d2_abcformula2_neg",""),
neuper@37906
   875
             ("d2_abcformula3_neg",""), ("d2_abcformula4_neg",""),("d2_abcformula5_neg",""),
neuper@37906
   876
             ("d2_abcformula6_neg","")]*)},
neuper@37906
   877
   "Script Solve_d2_polyeq_abc_equation  (e_::bool) (v_::real) =   \
neuper@37906
   878
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]          \
neuper@37906
   879
    \                   d2_polyeq_abcFormula_simplify   True)) @@  \
neuper@37906
   880
    \            (Try (Rewrite_Set polyeq_simplify     False)) @@  \
neuper@37906
   881
    \            (Try (Rewrite_Set norm_Rational_parenthesized       False))) e_;\
neuper@37906
   882
    \ (L_::bool list) = ((Or_to_List e_)::bool list)               \
neuper@37906
   883
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   884
 ));
neuper@37906
   885
neuper@37906
   886
store_met
neuper@37906
   887
 (prep_met PolyEq.thy "met_polyeq_d3" [] e_metID
neuper@37906
   888
 (["PolyEq","solve_d3_polyeq_equation"],
neuper@37906
   889
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   890
   ("#Where" ,["(lhs e_) is_poly_in v_ ",
neuper@37906
   891
	       "((lhs e_) has_degree_in v_) = 3"]),
neuper@37906
   892
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   893
  ],
neuper@37906
   894
   {rew_ord'="termlessI",
neuper@37906
   895
    rls'=PolyEq_erls,
neuper@37906
   896
    srls=e_rls,
neuper@37906
   897
    prls=PolyEq_prls,
neuper@37906
   898
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   899
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   900
    (* asm_rls=["d1_polyeq_simplify","d2_polyeq_simplify","d1_polyeq_simplify"],*)
neuper@37906
   901
    asm_rls=[],
neuper@37906
   902
    asm_thm=[("d3_isolate_div",""),("d1_isolate_div",""),("d2_pqformula1",""),
neuper@37906
   903
             ("d2_pqformula2",""),("d2_pqformula3",""),("d2_pqformula4",""),
neuper@37906
   904
             ("d2_pqformula1_neg",""), ("d2_pqformula2_neg",""),("d2_pqformula3_neg",""),
neuper@37906
   905
             ("d2_pqformula4_neg",""), ("d2_abcformula1",""),("d2_abcformula2",""),
neuper@37906
   906
             ("d2_abcformula1_neg",""),("d2_abcformula2_neg",""),
neuper@37906
   907
             ("d2_sqrt_equation1",""),("d2_sqrt_equation1_neg",""), ("d2_isolate_div","")]*)},
neuper@37906
   908
   "Script Solve_d3_polyeq_equation  (e_::bool) (v_::real) =     \
neuper@37906
   909
    \  (let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_::real)]        \
neuper@37906
   910
    \                    d3_polyeq_simplify           True)) @@  \
neuper@37906
   911
    \             (Try (Rewrite_Set polyeq_simplify  False)) @@  \
neuper@37906
   912
    \             (Try (Rewrite_Set_Inst [(bdv,v_::real)]        \
neuper@37906
   913
    \                    d2_polyeq_simplify           True)) @@  \
neuper@37906
   914
    \             (Try (Rewrite_Set polyeq_simplify  False)) @@  \
neuper@37906
   915
    \             (Try (Rewrite_Set_Inst [(bdv,v_::real)]        \   
neuper@37906
   916
    \                    d1_polyeq_simplify           True)) @@  \
neuper@37906
   917
    \             (Try (Rewrite_Set polyeq_simplify  False)) @@  \
neuper@37906
   918
    \             (Try (Rewrite_Set norm_Rational_parenthesized False))) e_;\
neuper@37906
   919
    \ (L_::bool list) = ((Or_to_List e_)::bool list)             \
neuper@37906
   920
    \ in Check_elementwise L_ {(v_::real). Assumptions} )"
neuper@37906
   921
   ));
neuper@37906
   922
neuper@37906
   923
 (*.solves all expanded (ie. normalized) terms of degree 2.*) 
neuper@37906
   924
 (*Oct.02 restriction: 'eval_true 0 =< discriminant' ony for integer values
neuper@37906
   925
   by 'PolyEq_erls'; restricted until Float.thy is implemented*)
neuper@37906
   926
store_met
neuper@37906
   927
 (prep_met PolyEq.thy "met_polyeq_complsq" [] e_metID
neuper@37906
   928
 (["PolyEq","complete_square"],
neuper@37906
   929
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37906
   930
   ("#Where" ,["matches (?a = 0) e_", 
neuper@37906
   931
	       "((lhs e_) has_degree_in v_) = 2"]),
neuper@37906
   932
   ("#Find"  ,["solutions v_i_"])
neuper@37906
   933
  ],
neuper@37906
   934
   {rew_ord'="termlessI",rls'=PolyEq_erls,srls=e_rls,prls=PolyEq_prls,
neuper@37906
   935
    calc=[("sqrt", ("Root.sqrt", eval_sqrt "#sqrt_"))],
neuper@37906
   936
    crls=PolyEq_crls, nrls=norm_Rational(*,
neuper@37906
   937
    asm_rls=[],
neuper@37906
   938
    asm_thm=[("root_plus_minus","")]*)},
neuper@37906
   939
   "Script Complete_square (e_::bool) (v_::real) =                          \
neuper@37906
   940
   \(let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_)] cancel_leading_coeff True))\
neuper@37906
   941
   \        @@ (Try (Rewrite_Set_Inst [(bdv,v_)] complete_square True))     \
neuper@37906
   942
   \        @@ (Try (Rewrite square_explicit1 False))                       \
neuper@37906
   943
   \        @@ (Try (Rewrite square_explicit2 False))                       \
neuper@37906
   944
   \        @@ (Rewrite root_plus_minus True)                               \
neuper@37906
   945
   \        @@ (Try (Repeat (Rewrite_Inst [(bdv,v_)] bdv_explicit1 False))) \
neuper@37906
   946
   \        @@ (Try (Repeat (Rewrite_Inst [(bdv,v_)] bdv_explicit2 False))) \
neuper@37906
   947
   \        @@ (Try (Repeat                                                 \
neuper@37906
   948
   \                  (Rewrite_Inst [(bdv,v_)] bdv_explicit3 False)))       \
neuper@37906
   949
   \        @@ (Try (Rewrite_Set calculate_RootRat False))                  \
neuper@37906
   950
   \        @@ (Try (Repeat (Calculate sqrt_)))) e_                         \
neuper@37906
   951
   \ in ((Or_to_List e_)::bool list))"
neuper@37906
   952
   ));
neuper@37906
   953
(*6.10.02: x^2=64: root_plus_minus -/-/-> 
neuper@37906
   954
   "Script Complete_square (e_::bool) (v_::real) =                          \
neuper@37906
   955
   \(let e_ = ((Try (Rewrite_Set_Inst [(bdv,v_)] cancel_leading_coeff True))\
neuper@37906
   956
   \        @@ (Try (Rewrite_Set_Inst [(bdv,v_)] complete_square True))     \
neuper@37906
   957
   \        @@ (Try ((Rewrite square_explicit1 False)                       \
neuper@37906
   958
   \              Or (Rewrite square_explicit2 False)))                     \
neuper@37906
   959
   \        @@ (Rewrite root_plus_minus True)                               \
neuper@37906
   960
   \        @@ ((Repeat (Rewrite_Inst [(bdv,v_)] bdv_explicit1 False))      \
neuper@37906
   961
   \         Or (Repeat (Rewrite_Inst [(bdv,v_)] bdv_explicit2 False)))     \
neuper@37906
   962
   \        @@ (Try (Repeat                                                 \
neuper@37906
   963
   \                  (Rewrite_Inst [(bdv,v_)] bdv_explicit3 False)))       \
neuper@37906
   964
   \        @@ (Try (Rewrite_Set calculate_RootRat False))                  \
neuper@37906
   965
   \        @@ (Try (Repeat (Calculate sqrt_)))) e_                         \
neuper@37906
   966
   \ in ((Or_to_List e_)::bool list))"*)
neuper@37906
   967
neuper@37906
   968
"******* PolyEq.ML end *******";
neuper@37906
   969
neuper@37906
   970
(*eine gehackte termorder*)
neuper@37906
   971
local (*. for make_polynomial_in .*)
neuper@37906
   972
neuper@37906
   973
open Term;  (* for type order = EQUAL | LESS | GREATER *)
neuper@37906
   974
neuper@37906
   975
fun pr_ord EQUAL = "EQUAL"
neuper@37906
   976
  | pr_ord LESS  = "LESS"
neuper@37906
   977
  | pr_ord GREATER = "GREATER";
neuper@37906
   978
neuper@37906
   979
fun dest_hd' x (Const (a, T)) = (((a, 0), T), 0)
neuper@37906
   980
  | dest_hd' x (t as Free (a, T)) =
neuper@37906
   981
    if x = t then ((("|||||||||||||", 0), T), 0)                        (*WN*)
neuper@37906
   982
    else (((a, 0), T), 1)
neuper@37906
   983
  | dest_hd' x (Var v) = (v, 2)
neuper@37906
   984
  | dest_hd' x (Bound i) = ((("", i), dummyT), 3)
neuper@37906
   985
  | dest_hd' x (Abs (_, T, _)) = ((("", 0), T), 4);
neuper@37906
   986
neuper@37906
   987
fun size_of_term' x (Const ("Atools.pow",_) $ Free (var,_) $ Free (pot,_)) =
neuper@37906
   988
    (case x of                                                          (*WN*)
neuper@37906
   989
	    (Free (xstr,_)) => 
neuper@37906
   990
		(if xstr = var then 1000*(the (int_of_str pot)) else 3)
neuper@37906
   991
	  | _ => raise error ("size_of_term' called with subst = "^
neuper@37906
   992
			      (term2str x)))
neuper@37906
   993
  | size_of_term' x (Free (subst,_)) =
neuper@37906
   994
    (case x of
neuper@37906
   995
	    (Free (xstr,_)) => (if xstr = subst then 1000 else 1)
neuper@37906
   996
	  | _ => raise error ("size_of_term' called with subst = "^
neuper@37906
   997
			  (term2str x)))
neuper@37906
   998
  | size_of_term' x (Abs (_,_,body)) = 1 + size_of_term' x body
neuper@37906
   999
  | size_of_term' x (f$t) = size_of_term' x f  +  size_of_term' x t
neuper@37906
  1000
  | size_of_term' x _ = 1;
neuper@37906
  1001
neuper@37906
  1002
neuper@37906
  1003
fun term_ord' x pr thy (Abs (_, T, t), Abs(_, U, u)) =       (* ~ term.ML *)
neuper@37906
  1004
      (case term_ord' x pr thy (t, u) of EQUAL => typ_ord (T, U) | ord => ord)
neuper@37906
  1005
  | term_ord' x pr thy (t, u) =
neuper@37906
  1006
      (if pr then 
neuper@37906
  1007
	 let
neuper@37906
  1008
	   val (f, ts) = strip_comb t and (g, us) = strip_comb u;
neuper@37906
  1009
	   val _=writeln("t= f@ts= \""^
neuper@37938
  1010
	      ((Syntax.string_of_term (thy2ctxt thy)) f)^"\" @ \"["^
neuper@37906
  1011
	      (commas(map(string_of_cterm o cterm_of(sign_of thy)) ts))^"]\"");
neuper@37906
  1012
	   val _=writeln("u= g@us= \""^
neuper@37938
  1013
	      ((Syntax.string_of_term (thy2ctxt thy)) g)^"\" @ \"["^
neuper@37906
  1014
	      (commas(map(string_of_cterm o cterm_of(sign_of thy)) us))^"]\"");
neuper@37906
  1015
	   val _=writeln("size_of_term(t,u)= ("^
neuper@37906
  1016
	      (string_of_int(size_of_term' x t))^", "^
neuper@37906
  1017
	      (string_of_int(size_of_term' x u))^")");
neuper@37906
  1018
	   val _=writeln("hd_ord(f,g)      = "^((pr_ord o (hd_ord x))(f,g)));
neuper@37906
  1019
	   val _=writeln("terms_ord(ts,us) = "^
neuper@37906
  1020
			   ((pr_ord o (terms_ord x) str false)(ts,us)));
neuper@37906
  1021
	   val _=writeln("-------");
neuper@37906
  1022
	 in () end
neuper@37906
  1023
       else ();
neuper@37906
  1024
	 case int_ord (size_of_term' x t, size_of_term' x u) of
neuper@37906
  1025
	   EQUAL =>
neuper@37906
  1026
	     let val (f, ts) = strip_comb t and (g, us) = strip_comb u in
neuper@37906
  1027
	       (case hd_ord x (f, g) of EQUAL => (terms_ord x str pr) (ts, us) 
neuper@37906
  1028
	     | ord => ord)
neuper@37906
  1029
	     end
neuper@37906
  1030
	 | ord => ord)
neuper@37906
  1031
and hd_ord x (f, g) =                                        (* ~ term.ML *)
neuper@37906
  1032
  prod_ord (prod_ord indexname_ord typ_ord) int_ord (dest_hd' x f, 
neuper@37906
  1033
						     dest_hd' x g)
neuper@37906
  1034
and terms_ord x str pr (ts, us) = 
neuper@37906
  1035
    list_ord (term_ord' x pr (assoc_thy "Isac.thy"))(ts, us);
neuper@37906
  1036
(*val x = (term_of o the o (parse thy)) "x"; (*FIXXXXXXME*)
neuper@37906
  1037
*)
neuper@37906
  1038
neuper@37906
  1039
in
neuper@37906
  1040
neuper@37906
  1041
fun ord_make_polynomial_in (pr:bool) thy subst tu = 
neuper@37906
  1042
    let
neuper@37906
  1043
	(* val _=writeln("*** subs variable is: "^(subst2str subst)); *)
neuper@37906
  1044
    in
neuper@37906
  1045
	case subst of
neuper@37906
  1046
	    (_,x)::_ => (term_ord' x pr thy tu = LESS)
neuper@37906
  1047
	  | _ => raise error ("ord_make_polynomial_in called with subst = "^
neuper@37906
  1048
			  (subst2str subst))
neuper@37906
  1049
    end;
neuper@37906
  1050
end;
neuper@37906
  1051
neuper@37906
  1052
val order_add_mult_in = prep_rls(
neuper@37906
  1053
  Rls{id = "order_add_mult_in", preconds = [], 
neuper@37906
  1054
      rew_ord = ("ord_make_polynomial_in",
neuper@37906
  1055
		 ord_make_polynomial_in false Poly.thy),
neuper@37906
  1056
      erls = e_rls,srls = Erls,
neuper@37906
  1057
      calc = [],
neuper@37906
  1058
      (*asm_thm = [],*)
neuper@37906
  1059
      rules = [Thm ("real_mult_commute",num_str real_mult_commute),
neuper@37906
  1060
	       (* z * w = w * z *)
neuper@37906
  1061
	       Thm ("real_mult_left_commute",num_str real_mult_left_commute),
neuper@37906
  1062
	       (*z1.0 * (z2.0 * z3.0) = z2.0 * (z1.0 * z3.0)*)
neuper@37906
  1063
	       Thm ("real_mult_assoc",num_str real_mult_assoc),		
neuper@37906
  1064
	       (*z1.0 * z2.0 * z3.0 = z1.0 * (z2.0 * z3.0)*)
neuper@37906
  1065
	       Thm ("real_add_commute",num_str real_add_commute),	
neuper@37906
  1066
	       (*z + w = w + z*)
neuper@37906
  1067
	       Thm ("real_add_left_commute",num_str real_add_left_commute),
neuper@37906
  1068
	       (*x + (y + z) = y + (x + z)*)
neuper@37906
  1069
	       Thm ("real_add_assoc",num_str real_add_assoc)	               
neuper@37906
  1070
	       (*z1.0 + z2.0 + z3.0 = z1.0 + (z2.0 + z3.0)*)
neuper@37906
  1071
	       ], scr = EmptyScr}:rls);
neuper@37906
  1072
neuper@37906
  1073
val collect_bdv = prep_rls(
neuper@37906
  1074
  Rls{id = "collect_bdv", preconds = [], 
neuper@37906
  1075
      rew_ord = ("dummy_ord", dummy_ord),
neuper@37906
  1076
      erls = e_rls,srls = Erls,
neuper@37906
  1077
      calc = [],
neuper@37906
  1078
      (*asm_thm = [],*)
neuper@37906
  1079
      rules = [Thm ("bdv_collect_1",num_str bdv_collect_1),
neuper@37906
  1080
	       Thm ("bdv_collect_2",num_str bdv_collect_2),
neuper@37906
  1081
	       Thm ("bdv_collect_3",num_str bdv_collect_3),
neuper@37906
  1082
neuper@37906
  1083
	       Thm ("bdv_collect_assoc1_1",num_str bdv_collect_assoc1_1),
neuper@37906
  1084
	       Thm ("bdv_collect_assoc1_2",num_str bdv_collect_assoc1_2),
neuper@37906
  1085
	       Thm ("bdv_collect_assoc1_3",num_str bdv_collect_assoc1_3),
neuper@37906
  1086
neuper@37906
  1087
	       Thm ("bdv_collect_assoc2_1",num_str bdv_collect_assoc2_1),
neuper@37906
  1088
	       Thm ("bdv_collect_assoc2_2",num_str bdv_collect_assoc2_2),
neuper@37906
  1089
	       Thm ("bdv_collect_assoc2_3",num_str bdv_collect_assoc2_3),
neuper@37906
  1090
neuper@37906
  1091
neuper@37906
  1092
	       Thm ("bdv_n_collect_1",num_str bdv_n_collect_1),
neuper@37906
  1093
	       Thm ("bdv_n_collect_2",num_str bdv_n_collect_2),
neuper@37906
  1094
	       Thm ("bdv_n_collect_3",num_str bdv_n_collect_3),
neuper@37906
  1095
neuper@37906
  1096
	       Thm ("bdv_n_collect_assoc1_1",num_str bdv_n_collect_assoc1_1),
neuper@37906
  1097
	       Thm ("bdv_n_collect_assoc1_2",num_str bdv_n_collect_assoc1_2),
neuper@37906
  1098
	       Thm ("bdv_n_collect_assoc1_3",num_str bdv_n_collect_assoc1_3),
neuper@37906
  1099
neuper@37906
  1100
	       Thm ("bdv_n_collect_assoc2_1",num_str bdv_n_collect_assoc2_1),
neuper@37906
  1101
	       Thm ("bdv_n_collect_assoc2_2",num_str bdv_n_collect_assoc2_2),
neuper@37906
  1102
	       Thm ("bdv_n_collect_assoc2_3",num_str bdv_n_collect_assoc2_3)
neuper@37906
  1103
	       ], scr = EmptyScr}:rls);
neuper@37906
  1104
neuper@37906
  1105
(*.transforms an arbitrary term without roots to a polynomial [4] 
neuper@37906
  1106
   according to knowledge/Poly.sml.*) 
neuper@37906
  1107
val make_polynomial_in = prep_rls(
neuper@37906
  1108
  Seq {id = "make_polynomial_in", preconds = []:term list, 
neuper@37906
  1109
       rew_ord = ("dummy_ord", dummy_ord),
neuper@37906
  1110
      erls = Atools_erls, srls = Erls,
neuper@37906
  1111
      calc = [], (*asm_thm = [],*)
neuper@37906
  1112
      rules = [Rls_ expand_poly,
neuper@37906
  1113
	       Rls_ order_add_mult_in,
neuper@37906
  1114
	       Rls_ simplify_power,
neuper@37906
  1115
	       Rls_ collect_numerals,
neuper@37906
  1116
	       Rls_ reduce_012,
neuper@37906
  1117
	       Thm ("realpow_oneI",num_str realpow_oneI),
neuper@37906
  1118
	       Rls_ discard_parentheses,
neuper@37906
  1119
	       Rls_ collect_bdv
neuper@37906
  1120
	       ],
neuper@37906
  1121
      scr = EmptyScr
neuper@37906
  1122
      }:rls);     
neuper@37906
  1123
neuper@37906
  1124
val separate_bdvs = 
neuper@37906
  1125
    append_rls "separate_bdvs"
neuper@37906
  1126
	       collect_bdv
neuper@37906
  1127
	       [Thm ("separate_bdv", num_str separate_bdv),
neuper@37906
  1128
		(*"?a * ?bdv / ?b = ?a / ?b * ?bdv"*)
neuper@37906
  1129
		Thm ("separate_bdv_n", num_str separate_bdv_n),
neuper@37906
  1130
		Thm ("separate_1_bdv", num_str separate_1_bdv),
neuper@37906
  1131
		(*"?bdv / ?b = (1 / ?b) * ?bdv"*)
neuper@37906
  1132
		Thm ("separate_1_bdv_n", num_str separate_1_bdv_n),
neuper@37906
  1133
		(*"?bdv ^^^ ?n / ?b = 1 / ?b * ?bdv ^^^ ?n"*)
neuper@37906
  1134
		Thm ("real_add_divide_distrib", 
neuper@37906
  1135
		     num_str real_add_divide_distrib)
neuper@37906
  1136
		(*"(?x + ?y) / ?z = ?x / ?z + ?y / ?z"
neuper@37906
  1137
		      WN051031 DOES NOT BELONG TO HERE*)
neuper@37906
  1138
		];
neuper@37906
  1139
val make_ratpoly_in = prep_rls(
neuper@37906
  1140
  Seq {id = "make_ratpoly_in", preconds = []:term list, 
neuper@37906
  1141
       rew_ord = ("dummy_ord", dummy_ord),
neuper@37906
  1142
      erls = Atools_erls, srls = Erls,
neuper@37906
  1143
      calc = [], (*asm_thm = [],*)
neuper@37906
  1144
      rules = [Rls_ norm_Rational,
neuper@37906
  1145
	       Rls_ order_add_mult_in,
neuper@37906
  1146
	       Rls_ discard_parentheses,
neuper@37906
  1147
	       Rls_ separate_bdvs,
neuper@37906
  1148
	       (* Rls_ rearrange_assoc, WN060916 why does cancel_p not work?*)
neuper@37906
  1149
	       Rls_ cancel_p
neuper@37906
  1150
	       (*Calc ("HOL.divide"  ,eval_cancel "#divide_") too weak!*)
neuper@37906
  1151
	       ],
neuper@37906
  1152
      scr = EmptyScr}:rls);      
neuper@37906
  1153
neuper@37906
  1154
neuper@37906
  1155
ruleset' := overwritelthy thy (!ruleset',
neuper@37906
  1156
  [("order_add_mult_in", order_add_mult_in),
neuper@37906
  1157
   ("collect_bdv", collect_bdv),
neuper@37906
  1158
   ("make_polynomial_in", make_polynomial_in),
neuper@37906
  1159
   ("make_ratpoly_in", make_ratpoly_in),
neuper@37906
  1160
   ("separate_bdvs", separate_bdvs)
neuper@37906
  1161
   ]);
neuper@37906
  1162