src/Tools/isac/Knowledge/RootEq.thy
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 01 Sep 2010 15:17:43 +0200
branchisac-update-Isa09-2
changeset 37969 81922154e742
parent 37967 bd4f7a35e892
child 37972 66fc615a1e89
permissions -rw-r--r--
fixed all @{thm } in src+test
neuper@37906
     1
(*.(c) by Richard Lang, 2003 .*)
neuper@37906
     2
(* collecting all knowledge for Root Equations
neuper@37906
     3
   created by: rlang 
neuper@37906
     4
         date: 02.08
neuper@37906
     5
   changed by: rlang
neuper@37906
     6
   last change by: rlang
neuper@37906
     7
             date: 02.11.14
neuper@37906
     8
*)
neuper@37906
     9
neuper@37950
    10
theory RootEq imports Root end
neuper@37906
    11
neuper@37906
    12
consts
neuper@37906
    13
  (*-------------------------root-----------------------*)
neuper@37950
    14
  is'_rootTerm'_in     :: "[real, real] => bool" ("_ is'_rootTerm'_in _") 
neuper@37950
    15
  is'_sqrtTerm'_in     :: "[real, real] => bool" ("_ is'_sqrtTerm'_in _") 
neuper@37950
    16
  is'_normSqrtTerm'_in :: "[real, real] => bool" ("_ is'_normSqrtTerm'_in _") 
neuper@37950
    17
neuper@37906
    18
  (*----------------------scripts-----------------------*)
neuper@37906
    19
  Norm'_sq'_root'_equation
neuper@37950
    20
             :: "[bool,real, 
neuper@37950
    21
		   bool list] => bool list"
neuper@37950
    22
               ("((Script Norm'_sq'_root'_equation (_ _ =))// 
neuper@37950
    23
                  (_))" 9)
neuper@37906
    24
  Solve'_sq'_root'_equation
neuper@37950
    25
             :: "[bool,real, 
neuper@37950
    26
		   bool list] => bool list"
neuper@37950
    27
               ("((Script Solve'_sq'_root'_equation (_ _ =))// 
neuper@37950
    28
                  (_))" 9)
neuper@37906
    29
  Solve'_left'_sq'_root'_equation
neuper@37950
    30
             :: "[bool,real, 
neuper@37950
    31
		   bool list] => bool list"
neuper@37950
    32
               ("((Script Solve'_left'_sq'_root'_equation (_ _ =))// 
neuper@37950
    33
                  (_))" 9)
neuper@37906
    34
  Solve'_right'_sq'_root'_equation
neuper@37950
    35
             :: "[bool,real, 
neuper@37950
    36
		   bool list] => bool list"
neuper@37950
    37
               ("((Script Solve'_right'_sq'_root'_equation (_ _ =))// 
neuper@37950
    38
                  (_))" 9)
neuper@37906
    39
 
neuper@37950
    40
axioms 
neuper@37906
    41
neuper@37906
    42
(* normalize *)
neuper@37950
    43
  makex1_x            "a^^^1  = a"  
neuper@37950
    44
  real_assoc_1        "a+(b+c) = a+b+c"
neuper@37950
    45
  real_assoc_2        "a*(b*c) = a*b*c"
neuper@37906
    46
neuper@37906
    47
  (* simplification of root*)
neuper@37950
    48
  sqrt_square_1       "[|0 <= a|] ==>  (sqrt a)^^^2 = a"
neuper@37950
    49
  sqrt_square_2       "sqrt (a ^^^ 2) = a"
neuper@37950
    50
  sqrt_times_root_1   "sqrt a * sqrt b = sqrt(a*b)"
neuper@37950
    51
  sqrt_times_root_2   "a * sqrt b * sqrt c = a * sqrt(b*c)"
neuper@37906
    52
neuper@37906
    53
  (* isolate one root on the LEFT or RIGHT hand side of the equation *)
neuper@37950
    54
  sqrt_isolate_l_add1 "[|bdv occurs_in c|] ==> 
neuper@37950
    55
   (a + b*sqrt(c) = d) = (b * sqrt(c) = d+ (-1) * a)"
neuper@37950
    56
  sqrt_isolate_l_add2 "[|bdv occurs_in c|] ==>
neuper@37950
    57
   (a + sqrt(c) = d) = ((sqrt(c) = d+ (-1) * a))"
neuper@37950
    58
  sqrt_isolate_l_add3 "[|bdv occurs_in c|] ==>
neuper@37950
    59
   (a + b*(e/sqrt(c)) = d) = (b * (e/sqrt(c)) = d + (-1) * a)"
neuper@37950
    60
  sqrt_isolate_l_add4 "[|bdv occurs_in c|] ==>
neuper@37950
    61
   (a + b/(f*sqrt(c)) = d) = (b / (f*sqrt(c)) = d + (-1) * a)"
neuper@37950
    62
  sqrt_isolate_l_add5 "[|bdv occurs_in c|] ==>
neuper@37950
    63
   (a + b*(e/(f*sqrt(c))) = d) = (b * (e/(f*sqrt(c))) = d+ (-1) * a)"
neuper@37950
    64
  sqrt_isolate_l_add6 "[|bdv occurs_in c|] ==>
neuper@37950
    65
   (a + b/sqrt(c) = d) = (b / sqrt(c) = d+ (-1) * a)"
neuper@37950
    66
  sqrt_isolate_r_add1 "[|bdv occurs_in f|] ==>
neuper@37950
    67
   (a = d + e*sqrt(f)) = (a + (-1) * d = e*sqrt(f))"
neuper@37950
    68
  sqrt_isolate_r_add2 "[|bdv occurs_in f|] ==>
neuper@37950
    69
   (a = d + sqrt(f)) = (a + (-1) * d = sqrt(f))"
neuper@37906
    70
 (* small hack: thm 3,5,6 are not needed if rootnormalize is well done*)
neuper@37950
    71
  sqrt_isolate_r_add3 "[|bdv occurs_in f|] ==>
neuper@37950
    72
   (a = d + e*(g/sqrt(f))) = (a + (-1) * d = e*(g/sqrt(f)))"
neuper@37950
    73
  sqrt_isolate_r_add4 "[|bdv occurs_in f|] ==>
neuper@37950
    74
   (a = d + g/sqrt(f)) = (a + (-1) * d = g/sqrt(f))"
neuper@37950
    75
  sqrt_isolate_r_add5 "[|bdv occurs_in f|] ==>
neuper@37950
    76
   (a = d + e*(g/(h*sqrt(f)))) = (a + (-1) * d = e*(g/(h*sqrt(f))))"
neuper@37950
    77
  sqrt_isolate_r_add6 "[|bdv occurs_in f|] ==>
neuper@37950
    78
   (a = d + g/(h*sqrt(f))) = (a + (-1) * d = g/(h*sqrt(f)))"
neuper@37906
    79
 
neuper@37906
    80
  (* eliminate isolates sqrt *)
neuper@37950
    81
  sqrt_square_equation_both_1 "[|bdv occurs_in b; bdv occurs_in d|] ==> 
neuper@37950
    82
   ( (sqrt a + sqrt b         = sqrt c + sqrt d) = 
neuper@37950
    83
     (a+2*sqrt(a)*sqrt(b)+b  = c+2*sqrt(c)*sqrt(d)+d))"
neuper@37950
    84
  sqrt_square_equation_both_2 "[|bdv occurs_in b; bdv occurs_in d|] ==> 
neuper@37950
    85
   ( (sqrt a - sqrt b           = sqrt c + sqrt d) = 
neuper@37950
    86
     (a - 2*sqrt(a)*sqrt(b)+b  = c+2*sqrt(c)*sqrt(d)+d))"
neuper@37950
    87
  sqrt_square_equation_both_3 "[|bdv occurs_in b; bdv occurs_in d|] ==> 
neuper@37950
    88
   ( (sqrt a + sqrt b           = sqrt c - sqrt d) = 
neuper@37950
    89
     (a + 2*sqrt(a)*sqrt(b)+b  = c - 2*sqrt(c)*sqrt(d)+d))"
neuper@37950
    90
  sqrt_square_equation_both_4 "[|bdv occurs_in b; bdv occurs_in d|] ==> 
neuper@37950
    91
   ( (sqrt a - sqrt b           = sqrt c - sqrt d) = 
neuper@37950
    92
     (a - 2*sqrt(a)*sqrt(b)+b  = c - 2*sqrt(c)*sqrt(d)+d))"
neuper@37950
    93
  sqrt_square_equation_left_1 "[|bdv occurs_in a; 0 <= a; 0 <= b|] ==>
neuper@37950
    94
   ( (sqrt (a) = b) = (a = (b^^^2)))"
neuper@37950
    95
  sqrt_square_equation_left_2 "[|bdv occurs_in a; 0 <= a; 0 <= b*c|] ==> 
neuper@37950
    96
   ( (c*sqrt(a) = b) = (c^^^2*a = b^^^2))"
neuper@37950
    97
  sqrt_square_equation_left_3 "[|bdv occurs_in a; 0 <= a; 0 <= b*c|] ==> 
neuper@37950
    98
   ( c/sqrt(a) = b) = (c^^^2 / a = b^^^2)"
neuper@37906
    99
  (* small hack: thm 4-6 are not needed if rootnormalize is well done*)
neuper@37950
   100
  sqrt_square_equation_left_4 "[|bdv occurs_in a; 0 <= a; 0 <= b*c*d|] ==> 
neuper@37950
   101
   ( (c*(d/sqrt (a)) = b) = (c^^^2*(d^^^2/a) = b^^^2))"
neuper@37950
   102
  sqrt_square_equation_left_5 "[|bdv occurs_in a; 0 <= a; 0 <= b*c*d|] ==> 
neuper@37950
   103
   ( c/(d*sqrt(a)) = b) = (c^^^2 / (d^^^2*a) = b^^^2)"
neuper@37950
   104
  sqrt_square_equation_left_6 "[|bdv occurs_in a; 0 <= a; 0 <= b*c*d*e|] ==> 
neuper@37950
   105
   ( (c*(d/(e*sqrt (a))) = b) = (c^^^2*(d^^^2/(e^^^2*a)) = b^^^2))"
neuper@37950
   106
  sqrt_square_equation_right_1  "[|bdv occurs_in b; 0 <= a; 0 <= b|] ==> 
neuper@37950
   107
   ( (a = sqrt (b)) = (a^^^2 = b))"
neuper@37950
   108
  sqrt_square_equation_right_2 "[|bdv occurs_in b; 0 <= a*c; 0 <= b|] ==> 
neuper@37950
   109
   ( (a = c*sqrt (b)) = ((a^^^2) = c^^^2*b))"
neuper@37950
   110
  sqrt_square_equation_right_3 "[|bdv occurs_in b; 0 <= a*c; 0 <= b|] ==> 
neuper@37950
   111
   ( (a = c/sqrt (b)) = (a^^^2 = c^^^2/b))"
neuper@37906
   112
 (* small hack: thm 4-6 are not needed if rootnormalize is well done*)
neuper@37950
   113
  sqrt_square_equation_right_4 "[|bdv occurs_in b; 0 <= a*c*d; 0 <= b|] ==> 
neuper@37950
   114
   ( (a = c*(d/sqrt (b))) = ((a^^^2) = c^^^2*(d^^^2/b)))"
neuper@37950
   115
  sqrt_square_equation_right_5 "[|bdv occurs_in b; 0 <= a*c*d; 0 <= b|] ==> 
neuper@37950
   116
   ( (a = c/(d*sqrt (b))) = (a^^^2 = c^^^2/(d^^^2*b)))"
neuper@37950
   117
  sqrt_square_equation_right_6 "[|bdv occurs_in b; 0 <= a*c*d*e; 0 <= b|] ==> 
neuper@37950
   118
   ( (a = c*(d/(e*sqrt (b)))) = ((a^^^2) = c^^^2*(d^^^2/(e^^^2*b))))"
neuper@37950
   119
neuper@37950
   120
ML {*
neuper@37950
   121
(*-------------------------functions---------------------*)
neuper@37950
   122
(* true if bdv is under sqrt of a Equation*)
neuper@37950
   123
fun is_rootTerm_in t v = 
neuper@37950
   124
    let 
neuper@37950
   125
	fun coeff_in c v = member op = (vars c) v;
neuper@37950
   126
   	fun findroot (_ $ _ $ _ $ _) v = raise error("is_rootTerm_in:")
neuper@37950
   127
	  (* at the moment there is no term like this, but ....*)
neuper@37950
   128
	  | findroot (t as (Const ("Root.nroot",_) $ _ $ t3)) v = coeff_in t3 v
neuper@37950
   129
	  | findroot (_ $ t2 $ t3) v = (findroot t2 v) orelse (findroot t3 v)
neuper@37950
   130
	  | findroot (t as (Const ("Root.sqrt",_) $ t2)) v = coeff_in t2 v
neuper@37950
   131
	  | findroot (_ $ t2) v = (findroot t2 v)
neuper@37950
   132
	  | findroot _ _ = false;
neuper@37950
   133
     in
neuper@37950
   134
	findroot t v
neuper@37950
   135
    end;
neuper@37950
   136
neuper@37950
   137
 fun is_sqrtTerm_in t v = 
neuper@37950
   138
    let 
neuper@37950
   139
	fun coeff_in c v = member op = (vars c) v;
neuper@37950
   140
   	fun findsqrt (_ $ _ $ _ $ _) v = raise error("is_sqrteqation_in:")
neuper@37950
   141
	  (* at the moment there is no term like this, but ....*)
neuper@37950
   142
	  | findsqrt (_ $ t1 $ t2) v = (findsqrt t1 v) orelse (findsqrt t2 v)
neuper@37950
   143
	  | findsqrt (t as (Const ("Root.sqrt",_) $ a)) v = coeff_in a v
neuper@37950
   144
	  | findsqrt (_ $ t1) v = (findsqrt t1 v)
neuper@37950
   145
	  | findsqrt _ _ = false;
neuper@37950
   146
     in
neuper@37950
   147
	findsqrt t v
neuper@37950
   148
    end;
neuper@37950
   149
neuper@37950
   150
(* RL: 030518: Is in the rightest subterm of a term a sqrt with bdv,
neuper@37950
   151
and the subterm ist connected with + or * --> is normalized*)
neuper@37950
   152
 fun is_normSqrtTerm_in t v =
neuper@37950
   153
     let
neuper@37950
   154
	fun coeff_in c v = member op = (vars c) v;
neuper@37950
   155
        fun isnorm (_ $ _ $ _ $ _) v = raise error("is_normSqrtTerm_in:")
neuper@37950
   156
	  (* at the moment there is no term like this, but ....*)
neuper@37950
   157
          | isnorm (Const ("op +",_) $ _ $ t2) v = is_sqrtTerm_in t2 v
neuper@37950
   158
          | isnorm (Const ("op *",_) $ _ $ t2) v = is_sqrtTerm_in t2 v
neuper@37950
   159
          | isnorm (Const ("op -",_) $ _ $ _) v = false
neuper@37950
   160
          | isnorm (Const ("HOL.divide",_) $ t1 $ t2) v = (is_sqrtTerm_in t1 v) orelse 
neuper@37950
   161
                              (is_sqrtTerm_in t2 v)
neuper@37950
   162
          | isnorm (Const ("Root.sqrt",_) $ t1) v = coeff_in t1 v
neuper@37950
   163
 	  | isnorm (_ $ t1) v = is_sqrtTerm_in t1 v
neuper@37950
   164
          | isnorm _ _ = false;
neuper@37950
   165
     in
neuper@37950
   166
         isnorm t v
neuper@37950
   167
     end;
neuper@37950
   168
neuper@37950
   169
fun eval_is_rootTerm_in _ _ 
neuper@37950
   170
       (p as (Const ("RootEq.is'_rootTerm'_in",_) $ t $ v)) _  =
neuper@37950
   171
    if is_rootTerm_in t v then 
neuper@37950
   172
	SOME ((term2str p) ^ " = True",
neuper@37950
   173
	      Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37950
   174
    else SOME ((term2str p) ^ " = True",
neuper@37950
   175
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37950
   176
  | eval_is_rootTerm_in _ _ _ _ = ((*writeln"### nichts matcht";*) NONE);
neuper@37950
   177
neuper@37950
   178
fun eval_is_sqrtTerm_in _ _ 
neuper@37950
   179
       (p as (Const ("RootEq.is'_sqrtTerm'_in",_) $ t $ v)) _  =
neuper@37950
   180
    if is_sqrtTerm_in t v then 
neuper@37950
   181
	SOME ((term2str p) ^ " = True",
neuper@37950
   182
	      Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37950
   183
    else SOME ((term2str p) ^ " = True",
neuper@37950
   184
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37950
   185
  | eval_is_sqrtTerm_in _ _ _ _ = ((*writeln"### nichts matcht";*) NONE);
neuper@37950
   186
neuper@37950
   187
fun eval_is_normSqrtTerm_in _ _ 
neuper@37950
   188
       (p as (Const ("RootEq.is'_normSqrtTerm'_in",_) $ t $ v)) _  =
neuper@37950
   189
    if is_normSqrtTerm_in t v then 
neuper@37950
   190
	SOME ((term2str p) ^ " = True",
neuper@37950
   191
	      Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37950
   192
    else SOME ((term2str p) ^ " = True",
neuper@37950
   193
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37950
   194
  | eval_is_normSqrtTerm_in _ _ _ _ = ((*writeln"### nichts matcht";*) NONE);
neuper@37950
   195
neuper@37950
   196
(*-------------------------rulse-------------------------*)
neuper@37950
   197
val RootEq_prls =(*15.10.02:just the following order due to subterm evaluation*)
neuper@37950
   198
  append_rls "RootEq_prls" e_rls 
neuper@37950
   199
	     [Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37950
   200
	      Calc ("Tools.matches",eval_matches ""),
neuper@37950
   201
	      Calc ("Tools.lhs"    ,eval_lhs ""),
neuper@37950
   202
	      Calc ("Tools.rhs"    ,eval_rhs ""),
neuper@37950
   203
	      Calc ("RootEq.is'_sqrtTerm'_in",eval_is_sqrtTerm_in ""),
neuper@37950
   204
	      Calc ("RootEq.is'_rootTerm'_in",eval_is_rootTerm_in ""),
neuper@37950
   205
	      Calc ("RootEq.is'_normSqrtTerm'_in",eval_is_normSqrtTerm_in ""),
neuper@37950
   206
	      Calc ("op =",eval_equal "#equal_"),
neuper@37969
   207
	      Thm ("not_true",num_str @{thm not_true}),
neuper@37969
   208
	      Thm ("not_false",num_str @{thm not_false}),
neuper@37969
   209
	      Thm ("and_true",num_str @{thm and_true}),
neuper@37969
   210
	      Thm ("and_false",num_str @{thm and_false}),
neuper@37969
   211
	      Thm ("or_true",num_str @{thm or_true}),
neuper@37969
   212
	      Thm ("or_false",num_str @{thm or_false})
neuper@37950
   213
	      ];
neuper@37950
   214
neuper@37950
   215
val RootEq_erls =
neuper@37950
   216
     append_rls "RootEq_erls" Root_erls
neuper@37965
   217
          [Thm ("divide_divide_eq_left",num_str @{thm divide_divide_eq_left})
neuper@37950
   218
           ];
neuper@37950
   219
neuper@37950
   220
val RootEq_crls = 
neuper@37950
   221
     append_rls "RootEq_crls" Root_crls
neuper@37965
   222
          [Thm ("divide_divide_eq_left",num_str @{thm divide_divide_eq_left})
neuper@37950
   223
           ];
neuper@37950
   224
neuper@37950
   225
val rooteq_srls = 
neuper@37950
   226
     append_rls "rooteq_srls" e_rls
neuper@37950
   227
		[Calc ("RootEq.is'_sqrtTerm'_in",eval_is_sqrtTerm_in ""),
neuper@37950
   228
                 Calc ("RootEq.is'_normSqrtTerm'_in",eval_is_normSqrtTerm_in""),
neuper@37950
   229
                 Calc ("RootEq.is'_rootTerm'_in",eval_is_rootTerm_in "")
neuper@37950
   230
		 ];
neuper@37950
   231
neuper@37967
   232
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37950
   233
			[("RootEq_erls",RootEq_erls),
neuper@37950
   234
                                             (*FIXXXME:del with rls.rls'*)
neuper@37950
   235
			 ("rooteq_srls",rooteq_srls)
neuper@37950
   236
                         ]);
neuper@37950
   237
neuper@37950
   238
(*isolate the bound variable in an sqrt equation; 'bdv' is a meta-constant*)
neuper@37950
   239
 val sqrt_isolate = prep_rls(
neuper@37950
   240
  Rls {id = "sqrt_isolate", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37950
   241
       erls = RootEq_erls, srls = Erls, calc = [], 
neuper@37950
   242
       rules = [
neuper@37969
   243
       Thm("sqrt_square_1",num_str @{thm sqrt_square_1}),
neuper@37950
   244
                     (* (sqrt a)^^^2 -> a *)
neuper@37969
   245
       Thm("sqrt_square_2",num_str @{thm sqrt_square_2}),
neuper@37950
   246
                     (* sqrt (a^^^2) -> a *)
neuper@37969
   247
       Thm("sqrt_times_root_1",num_str @{thm sqrt_times_root_1}),
neuper@37950
   248
            (* sqrt a sqrt b -> sqrt(ab) *)
neuper@37969
   249
       Thm("sqrt_times_root_2",num_str @{thm sqrt_times_root_2}),
neuper@37950
   250
            (* a sqrt b sqrt c -> a sqrt(bc) *)
neuper@37950
   251
       Thm("sqrt_square_equation_both_1",
neuper@37969
   252
           num_str @{thm sqrt_square_equation_both_1}),
neuper@37950
   253
       (* (sqrt a + sqrt b  = sqrt c + sqrt d) -> 
neuper@37950
   254
            (a+2*sqrt(a)*sqrt(b)+b) = c+2*sqrt(c)*sqrt(d)+d) *)
neuper@37950
   255
       Thm("sqrt_square_equation_both_2",
neuper@37969
   256
            num_str @{thm sqrt_square_equation_both_2}),
neuper@37950
   257
       (* (sqrt a - sqrt b  = sqrt c + sqrt d) -> 
neuper@37950
   258
            (a-2*sqrt(a)*sqrt(b)+b) = c+2*sqrt(c)*sqrt(d)+d) *)
neuper@37950
   259
       Thm("sqrt_square_equation_both_3",
neuper@37969
   260
            num_str @{thm sqrt_square_equation_both_3}),
neuper@37950
   261
       (* (sqrt a + sqrt b  = sqrt c - sqrt d) -> 
neuper@37950
   262
            (a+2*sqrt(a)*sqrt(b)+b) = c-2*sqrt(c)*sqrt(d)+d) *)
neuper@37950
   263
       Thm("sqrt_square_equation_both_4",
neuper@37969
   264
            num_str @{thm sqrt_square_equation_both_4}),
neuper@37950
   265
       (* (sqrt a - sqrt b  = sqrt c - sqrt d) -> 
neuper@37950
   266
            (a-2*sqrt(a)*sqrt(b)+b) = c-2*sqrt(c)*sqrt(d)+d) *)
neuper@37950
   267
       Thm("sqrt_isolate_l_add1",
neuper@37969
   268
            num_str @{thm sqrt_isolate_l_add1}), 
neuper@37950
   269
       (* a+b*sqrt(x)=d -> b*sqrt(x) = d-a *)
neuper@37950
   270
       Thm("sqrt_isolate_l_add2",
neuper@37969
   271
            num_str @{thm sqrt_isolate_l_add2}), 
neuper@37950
   272
       (* a+  sqrt(x)=d ->   sqrt(x) = d-a *)
neuper@37950
   273
       Thm("sqrt_isolate_l_add3",
neuper@37969
   274
            num_str @{thm sqrt_isolate_l_add3}), 
neuper@37950
   275
       (* a+b*c/sqrt(x)=d->b*c/sqrt(x)=d-a *)
neuper@37950
   276
       Thm("sqrt_isolate_l_add4",
neuper@37969
   277
            num_str @{thm sqrt_isolate_l_add4}), 
neuper@37950
   278
       (* a+c/sqrt(x)=d -> c/sqrt(x) = d-a *)
neuper@37950
   279
       Thm("sqrt_isolate_l_add5",
neuper@37969
   280
            num_str @{thm sqrt_isolate_l_add5}), 
neuper@37950
   281
       (* a+b*c/f*sqrt(x)=d->b*c/f*sqrt(x)=d-a *)
neuper@37950
   282
       Thm("sqrt_isolate_l_add6",
neuper@37969
   283
            num_str @{thm sqrt_isolate_l_add6}), 
neuper@37950
   284
       (* a+c/f*sqrt(x)=d -> c/f*sqrt(x) = d-a *)
neuper@37969
   285
       (*Thm("sqrt_isolate_l_div",num_str @{thm sqrt_isolate_l_div}),*)
neuper@37950
   286
         (* b*sqrt(x) = d sqrt(x) d/b *)
neuper@37950
   287
       Thm("sqrt_isolate_r_add1",
neuper@37969
   288
            num_str @{thm sqrt_isolate_r_add1}),
neuper@37950
   289
       (* a= d+e*sqrt(x) -> a-d=e*sqrt(x) *)
neuper@37950
   290
       Thm("sqrt_isolate_r_add2",
neuper@37969
   291
            num_str @{thm sqrt_isolate_r_add2}),
neuper@37950
   292
       (* a= d+  sqrt(x) -> a-d=  sqrt(x) *)
neuper@37950
   293
       Thm("sqrt_isolate_r_add3",
neuper@37969
   294
            num_str @{thm sqrt_isolate_r_add3}),
neuper@37950
   295
       (* a=d+e*g/sqrt(x)->a-d=e*g/sqrt(x)*)
neuper@37950
   296
       Thm("sqrt_isolate_r_add4",
neuper@37969
   297
            num_str @{thm sqrt_isolate_r_add4}),
neuper@37950
   298
       (* a= d+g/sqrt(x) -> a-d=g/sqrt(x) *)
neuper@37950
   299
       Thm("sqrt_isolate_r_add5",
neuper@37969
   300
            num_str @{thm sqrt_isolate_r_add5}),
neuper@37950
   301
       (* a=d+e*g/h*sqrt(x)->a-d=e*g/h*sqrt(x)*)
neuper@37950
   302
       Thm("sqrt_isolate_r_add6",
neuper@37969
   303
            num_str @{thm sqrt_isolate_r_add6}),
neuper@37950
   304
       (* a= d+g/h*sqrt(x) -> a-d=g/h*sqrt(x) *)
neuper@37969
   305
       (*Thm("sqrt_isolate_r_div",num_str @{thm sqrt_isolate_r_div}),*)
neuper@37950
   306
         (* a=e*sqrt(x) -> a/e = sqrt(x) *)
neuper@37950
   307
       Thm("sqrt_square_equation_left_1",
neuper@37969
   308
            num_str @{thm sqrt_square_equation_left_1}),   
neuper@37950
   309
       (* sqrt(x)=b -> x=b^2 *)
neuper@37950
   310
       Thm("sqrt_square_equation_left_2",
neuper@37969
   311
            num_str @{thm sqrt_square_equation_left_2}),   
neuper@37950
   312
       (* c*sqrt(x)=b -> c^2*x=b^2 *)
neuper@37969
   313
       Thm("sqrt_square_equation_left_3",num_str @{thm sqrt_square_equation_left_3}),  
neuper@37950
   314
	      (* c/sqrt(x)=b -> c^2/x=b^2 *)
neuper@37969
   315
       Thm("sqrt_square_equation_left_4",num_str @{thm sqrt_square_equation_left_4}),
neuper@37950
   316
	      (* c*d/sqrt(x)=b -> c^2*d^2/x=b^2 *)
neuper@37969
   317
       Thm("sqrt_square_equation_left_5",num_str @{thm sqrt_square_equation_left_5}),
neuper@37950
   318
	      (* c/d*sqrt(x)=b -> c^2/d^2x=b^2 *)
neuper@37969
   319
       Thm("sqrt_square_equation_left_6",num_str @{thm sqrt_square_equation_left_6}),
neuper@37950
   320
	      (* c*d/g*sqrt(x)=b -> c^2*d^2/g^2x=b^2 *)
neuper@37969
   321
       Thm("sqrt_square_equation_right_1",num_str @{thm sqrt_square_equation_right_1}),
neuper@37950
   322
	      (* a=sqrt(x) ->a^2=x *)
neuper@37969
   323
       Thm("sqrt_square_equation_right_2",num_str @{thm sqrt_square_equation_right_2}),
neuper@37950
   324
	      (* a=c*sqrt(x) ->a^2=c^2*x *)
neuper@37969
   325
       Thm("sqrt_square_equation_right_3",num_str @{thm sqrt_square_equation_right_3}),
neuper@37950
   326
	      (* a=c/sqrt(x) ->a^2=c^2/x *)
neuper@37969
   327
       Thm("sqrt_square_equation_right_4",num_str @{thm sqrt_square_equation_right_4}),
neuper@37950
   328
	      (* a=c*d/sqrt(x) ->a^2=c^2*d^2/x *)
neuper@37969
   329
       Thm("sqrt_square_equation_right_5",num_str @{thm sqrt_square_equation_right_5}),
neuper@37950
   330
	      (* a=c/e*sqrt(x) ->a^2=c^2/e^2x *)
neuper@37969
   331
       Thm("sqrt_square_equation_right_6",num_str @{thm sqrt_square_equation_right_6})
neuper@37950
   332
	      (* a=c*d/g*sqrt(x) ->a^2=c^2*d^2/g^2*x *)
neuper@37950
   333
       ],scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37950
   334
      }:rls);
neuper@37950
   335
neuper@37967
   336
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37950
   337
			[("sqrt_isolate",sqrt_isolate)
neuper@37950
   338
			 ]);
neuper@37950
   339
(* -- left 28.08.02--*)
neuper@37950
   340
(*isolate the bound variable in an sqrt left equation; 'bdv' is a meta-constant*)
neuper@37950
   341
 val l_sqrt_isolate = prep_rls(
neuper@37950
   342
     Rls {id = "l_sqrt_isolate", preconds = [], 
neuper@37950
   343
	  rew_ord = ("termlessI",termlessI), 
neuper@37950
   344
          erls = RootEq_erls, srls = Erls, calc = [], 
neuper@37950
   345
     rules = [
neuper@37969
   346
     Thm("sqrt_square_1",num_str @{thm sqrt_square_1}),
neuper@37950
   347
                            (* (sqrt a)^^^2 -> a *)
neuper@37969
   348
     Thm("sqrt_square_2",num_str @{thm sqrt_square_2}),
neuper@37950
   349
                            (* sqrt (a^^^2) -> a *)
neuper@37969
   350
     Thm("sqrt_times_root_1",num_str @{thm sqrt_times_root_1}),
neuper@37950
   351
            (* sqrt a sqrt b -> sqrt(ab) *)
neuper@37969
   352
     Thm("sqrt_times_root_2",num_str @{thm sqrt_times_root_2}),
neuper@37950
   353
        (* a sqrt b sqrt c -> a sqrt(bc) *)
neuper@37969
   354
     Thm("sqrt_isolate_l_add1",num_str @{thm sqrt_isolate_l_add1}),
neuper@37950
   355
        (* a+b*sqrt(x)=d -> b*sqrt(x) = d-a *)
neuper@37969
   356
     Thm("sqrt_isolate_l_add2",num_str @{thm sqrt_isolate_l_add2}),
neuper@37950
   357
        (* a+  sqrt(x)=d ->   sqrt(x) = d-a *)
neuper@37969
   358
     Thm("sqrt_isolate_l_add3",num_str @{thm sqrt_isolate_l_add3}),
neuper@37950
   359
        (* a+b*c/sqrt(x)=d->b*c/sqrt(x)=d-a *)
neuper@37969
   360
     Thm("sqrt_isolate_l_add4",num_str @{thm sqrt_isolate_l_add4}),
neuper@37950
   361
        (* a+c/sqrt(x)=d -> c/sqrt(x) = d-a *)
neuper@37969
   362
     Thm("sqrt_isolate_l_add5",num_str @{thm sqrt_isolate_l_add5}),
neuper@37950
   363
        (* a+b*c/f*sqrt(x)=d->b*c/f*sqrt(x)=d-a *)
neuper@37969
   364
     Thm("sqrt_isolate_l_add6",num_str @{thm sqrt_isolate_l_add6}),
neuper@37950
   365
        (* a+c/f*sqrt(x)=d -> c/f*sqrt(x) = d-a *)
neuper@37969
   366
   (*Thm("sqrt_isolate_l_div",num_str @{thm sqrt_isolate_l_div}),*)
neuper@37950
   367
        (* b*sqrt(x) = d sqrt(x) d/b *)
neuper@37969
   368
     Thm("sqrt_square_equation_left_1",num_str @{thm sqrt_square_equation_left_1}),
neuper@37950
   369
	      (* sqrt(x)=b -> x=b^2 *)
neuper@37969
   370
     Thm("sqrt_square_equation_left_2",num_str @{thm sqrt_square_equation_left_2}),
neuper@37950
   371
	      (* a*sqrt(x)=b -> a^2*x=b^2*)
neuper@37969
   372
     Thm("sqrt_square_equation_left_3",num_str @{thm sqrt_square_equation_left_3}),   
neuper@37950
   373
	      (* c/sqrt(x)=b -> c^2/x=b^2 *)
neuper@37969
   374
     Thm("sqrt_square_equation_left_4",num_str @{thm sqrt_square_equation_left_4}),   
neuper@37950
   375
	      (* c*d/sqrt(x)=b -> c^2*d^2/x=b^2 *)
neuper@37969
   376
     Thm("sqrt_square_equation_left_5",num_str @{thm sqrt_square_equation_left_5}),   
neuper@37950
   377
	      (* c/d*sqrt(x)=b -> c^2/d^2x=b^2 *)
neuper@37969
   378
     Thm("sqrt_square_equation_left_6",num_str @{thm sqrt_square_equation_left_6})  
neuper@37950
   379
	      (* c*d/g*sqrt(x)=b -> c^2*d^2/g^2x=b^2 *)
neuper@37950
   380
    ],
neuper@37950
   381
    scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37950
   382
   }:rls);
neuper@37950
   383
neuper@37967
   384
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37950
   385
			[("l_sqrt_isolate",l_sqrt_isolate)
neuper@37950
   386
			 ]);
neuper@37950
   387
neuper@37950
   388
(* -- right 28.8.02--*)
neuper@37950
   389
(*isolate the bound variable in an sqrt right equation; 'bdv' is a meta-constant*)
neuper@37950
   390
 val r_sqrt_isolate = prep_rls(
neuper@37950
   391
     Rls {id = "r_sqrt_isolate", preconds = [], 
neuper@37950
   392
	  rew_ord = ("termlessI",termlessI), 
neuper@37950
   393
          erls = RootEq_erls, srls = Erls, calc = [], 
neuper@37950
   394
     rules = [
neuper@37969
   395
     Thm("sqrt_square_1",num_str @{thm sqrt_square_1}),
neuper@37950
   396
                           (* (sqrt a)^^^2 -> a *)
neuper@37969
   397
     Thm("sqrt_square_2",num_str @{thm sqrt_square_2}), 
neuper@37950
   398
                           (* sqrt (a^^^2) -> a *)
neuper@37969
   399
     Thm("sqrt_times_root_1",num_str @{thm sqrt_times_root_1}),
neuper@37950
   400
           (* sqrt a sqrt b -> sqrt(ab) *)
neuper@37969
   401
     Thm("sqrt_times_root_2",num_str @{thm sqrt_times_root_2}),
neuper@37950
   402
       (* a sqrt b sqrt c -> a sqrt(bc) *)
neuper@37969
   403
     Thm("sqrt_isolate_r_add1",num_str @{thm sqrt_isolate_r_add1}),
neuper@37950
   404
       (* a= d+e*sqrt(x) -> a-d=e*sqrt(x) *)
neuper@37969
   405
     Thm("sqrt_isolate_r_add2",num_str @{thm sqrt_isolate_r_add2}),
neuper@37950
   406
       (* a= d+  sqrt(x) -> a-d=  sqrt(x) *)
neuper@37969
   407
     Thm("sqrt_isolate_r_add3",num_str @{thm sqrt_isolate_r_add3}),
neuper@37950
   408
       (* a=d+e*g/sqrt(x)->a-d=e*g/sqrt(x)*)
neuper@37969
   409
     Thm("sqrt_isolate_r_add4",num_str @{thm sqrt_isolate_r_add4}),
neuper@37950
   410
       (* a= d+g/sqrt(x) -> a-d=g/sqrt(x) *)
neuper@37969
   411
     Thm("sqrt_isolate_r_add5",num_str @{thm sqrt_isolate_r_add5}),
neuper@37950
   412
       (* a=d+e*g/h*sqrt(x)->a-d=e*g/h*sqrt(x)*)
neuper@37969
   413
     Thm("sqrt_isolate_r_add6",num_str @{thm sqrt_isolate_r_add6}),
neuper@37950
   414
       (* a= d+g/h*sqrt(x) -> a-d=g/h*sqrt(x) *)
neuper@37969
   415
   (*Thm("sqrt_isolate_r_div",num_str @{thm sqrt_isolate_r_div}),*)
neuper@37950
   416
       (* a=e*sqrt(x) -> a/e = sqrt(x) *)
neuper@37969
   417
     Thm("sqrt_square_equation_right_1",num_str @{thm sqrt_square_equation_right_1}),
neuper@37950
   418
	      (* a=sqrt(x) ->a^2=x *)
neuper@37969
   419
     Thm("sqrt_square_equation_right_2",num_str @{thm sqrt_square_equation_right_2}),
neuper@37950
   420
	      (* a=c*sqrt(x) ->a^2=c^2*x *)
neuper@37969
   421
     Thm("sqrt_square_equation_right_3",num_str @{thm sqrt_square_equation_right_3}),
neuper@37950
   422
	      (* a=c/sqrt(x) ->a^2=c^2/x *)
neuper@37969
   423
     Thm("sqrt_square_equation_right_4",num_str @{thm sqrt_square_equation_right_4}), 
neuper@37950
   424
	      (* a=c*d/sqrt(x) ->a^2=c^2*d^2/x *)
neuper@37969
   425
     Thm("sqrt_square_equation_right_5",num_str @{thm sqrt_square_equation_right_5}),
neuper@37950
   426
	      (* a=c/e*sqrt(x) ->a^2=c^2/e^2x *)
neuper@37969
   427
     Thm("sqrt_square_equation_right_6",num_str @{thm sqrt_square_equation_right_6})
neuper@37950
   428
	      (* a=c*d/g*sqrt(x) ->a^2=c^2*d^2/g^2*x *)
neuper@37950
   429
    ],
neuper@37950
   430
    scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37950
   431
   }:rls);
neuper@37950
   432
neuper@37967
   433
ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37950
   434
			[("r_sqrt_isolate",r_sqrt_isolate)
neuper@37950
   435
			 ]);
neuper@37950
   436
neuper@37950
   437
val rooteq_simplify = prep_rls(
neuper@37950
   438
  Rls {id = "rooteq_simplify", 
neuper@37950
   439
       preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37950
   440
       erls = RootEq_erls, srls = Erls, calc = [], 
neuper@37950
   441
       (*asm_thm = [("sqrt_square_1","")],*)
neuper@37969
   442
       rules = [Thm  ("real_assoc_1",num_str @{thm real_assoc_1}),
neuper@37950
   443
                             (* a+(b+c) = a+b+c *)
neuper@37969
   444
                Thm  ("real_assoc_2",num_str @{thm real_assoc_2}),
neuper@37950
   445
                             (* a*(b*c) = a*b*c *)
neuper@37950
   446
                Calc ("op +",eval_binop "#add_"),
neuper@37950
   447
                Calc ("op -",eval_binop "#sub_"),
neuper@37950
   448
                Calc ("op *",eval_binop "#mult_"),
neuper@37950
   449
                Calc ("HOL.divide", eval_cancel "#divide_"),
neuper@37950
   450
                Calc ("Root.sqrt",eval_sqrt "#sqrt_"),
neuper@37950
   451
                Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37969
   452
                Thm("real_plus_binom_pow2",num_str @{thm real_plus_binom_pow2}),
neuper@37969
   453
                Thm("real_minus_binom_pow2",num_str @{thm real_minus_binom_pow2}),
neuper@37969
   454
                Thm("realpow_mul",num_str @{thm realpow_mul}),    
neuper@37950
   455
                     (* (a * b)^n = a^n * b^n*)
neuper@37969
   456
                Thm("sqrt_times_root_1",num_str @{thm sqrt_times_root_1}), 
neuper@37950
   457
                     (* sqrt b * sqrt c = sqrt(b*c) *)
neuper@37969
   458
                Thm("sqrt_times_root_2",num_str @{thm sqrt_times_root_2}),
neuper@37950
   459
                     (* a * sqrt a * sqrt b = a * sqrt(a*b) *)
neuper@37969
   460
                Thm("sqrt_square_2",num_str @{thm sqrt_square_2}),
neuper@37950
   461
                            (* sqrt (a^^^2) = a *)
neuper@37969
   462
                Thm("sqrt_square_1",num_str @{thm sqrt_square_1}) 
neuper@37950
   463
                            (* sqrt a ^^^ 2 = a *)
neuper@37950
   464
                ],
neuper@37950
   465
       scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37950
   466
    }:rls);
neuper@37967
   467
  ruleset' := overwritelthy @{theory} (!ruleset',
neuper@37950
   468
                          [("rooteq_simplify",rooteq_simplify)
neuper@37950
   469
                           ]);
neuper@37950
   470
  
neuper@37950
   471
(*-------------------------Problem-----------------------*)
neuper@37950
   472
(*
neuper@37950
   473
(get_pbt ["root","univariate","equation"]);
neuper@37950
   474
show_ptyps(); 
neuper@37950
   475
*)
neuper@37950
   476
(* ---------root----------- *)
neuper@37950
   477
store_pbt
neuper@37953
   478
 (prep_pbt (theory "RootEq") "pbl_equ_univ_root" [] e_pblID
neuper@37950
   479
 (["root","univariate","equation"],
neuper@37950
   480
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   481
   ("#Where" ,["(lhs e_) is_rootTerm_in  (v_::real) | " ^
neuper@37950
   482
	       "(rhs e_) is_rootTerm_in  (v_::real)"]),
neuper@37950
   483
   ("#Find"  ,["solutions v_i_"]) 
neuper@37950
   484
  ],
neuper@37950
   485
  RootEq_prls, SOME "solve (e_::bool, v_)",
neuper@37950
   486
  []));
neuper@37950
   487
(* ---------sqrt----------- *)
neuper@37950
   488
store_pbt
neuper@37953
   489
 (prep_pbt (theory "RootEq") "pbl_equ_univ_root_sq" [] e_pblID
neuper@37950
   490
 (["sq","root","univariate","equation"],
neuper@37950
   491
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   492
   ("#Where" ,["( ((lhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   493
               "  ((lhs e_) is_normSqrtTerm_in (v_::real))   )  |" ^
neuper@37950
   494
	       "( ((rhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   495
               "  ((rhs e_) is_normSqrtTerm_in (v_::real))   )"]),
neuper@37950
   496
   ("#Find"  ,["solutions v_i_"]) 
neuper@37950
   497
  ],
neuper@37950
   498
  RootEq_prls,  SOME "solve (e_::bool, v_)",
neuper@37950
   499
  [["RootEq","solve_sq_root_equation"]]));
neuper@37950
   500
(* ---------normalize----------- *)
neuper@37950
   501
store_pbt
neuper@37953
   502
 (prep_pbt (theory "RootEq") "pbl_equ_univ_root_norm" [] e_pblID
neuper@37950
   503
 (["normalize","root","univariate","equation"],
neuper@37950
   504
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   505
   ("#Where" ,["( ((lhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   506
               "  Not((lhs e_) is_normSqrtTerm_in (v_::real)))  | " ^
neuper@37950
   507
	       "( ((rhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   508
               "  Not((rhs e_) is_normSqrtTerm_in (v_::real)))"]),
neuper@37950
   509
   ("#Find"  ,["solutions v_i_"]) 
neuper@37950
   510
  ],
neuper@37950
   511
  RootEq_prls,  SOME "solve (e_::bool, v_)",
neuper@37950
   512
  [["RootEq","norm_sq_root_equation"]]));
neuper@37950
   513
neuper@37950
   514
(*-------------------------methods-----------------------*)
neuper@37950
   515
(* ---- root 20.8.02 ---*)
neuper@37950
   516
store_met
neuper@37953
   517
 (prep_met (theory "RootEq") "met_rooteq" [] e_metID
neuper@37950
   518
 (["RootEq"],
neuper@37950
   519
   [],
neuper@37950
   520
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37950
   521
    crls=RootEq_crls, nrls=norm_Poly(*,
neuper@37950
   522
    asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37950
   523
(*-- normalize 20.10.02 --*)
neuper@37950
   524
store_met
neuper@37953
   525
 (prep_met (theory "RootEq") "met_rooteq_norm" [] e_metID
neuper@37950
   526
 (["RootEq","norm_sq_root_equation"],
neuper@37950
   527
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   528
    ("#Where" ,["( ((lhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   529
               "  Not((lhs e_) is_normSqrtTerm_in (v_::real)))  | " ^
neuper@37950
   530
	       "( ((rhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   531
               "  Not((rhs e_) is_normSqrtTerm_in (v_::real)))"]),
neuper@37950
   532
    ("#Find"  ,["solutions v_i_"])
neuper@37950
   533
   ],
neuper@37950
   534
   {rew_ord'="termlessI",
neuper@37950
   535
    rls'=RootEq_erls,
neuper@37950
   536
    srls=e_rls,
neuper@37950
   537
    prls=RootEq_prls,
neuper@37950
   538
    calc=[],
neuper@37950
   539
    crls=RootEq_crls, nrls=norm_Poly(*,
neuper@37950
   540
    asm_rls=[],
neuper@37950
   541
    asm_thm=[("sqrt_square_1","")]*)},
neuper@37950
   542
   "Script Norm_sq_root_equation  (e_::bool) (v_::real)  =                " ^
neuper@37950
   543
    "(let e_ = ((Repeat(Try (Rewrite     makex1_x            False))) @@  " ^
neuper@37950
   544
    "           (Try (Repeat (Rewrite_Set expand_rootbinoms  False))) @@  " ^ 
neuper@37950
   545
    "           (Try (Rewrite_Set rooteq_simplify              True)) @@  " ^ 
neuper@37950
   546
    "           (Try (Repeat (Rewrite_Set make_rooteq        False))) @@  " ^
neuper@37950
   547
    "           (Try (Rewrite_Set rooteq_simplify              True))) e_ " ^
neuper@37950
   548
    " in ((SubProblem (RootEq_,[univariate,equation],                     " ^
neuper@37950
   549
    "      [no_met]) [bool_ e_, real_ v_])))"
neuper@37950
   550
   ));
neuper@37950
   551
neuper@37950
   552
store_met
neuper@37953
   553
 (prep_met (theory "RootEq") "met_rooteq_sq" [] e_metID
neuper@37950
   554
 (["RootEq","solve_sq_root_equation"],
neuper@37950
   555
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   556
    ("#Where" ,["( ((lhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   557
                "  ((lhs e_) is_normSqrtTerm_in (v_::real))   )  |" ^
neuper@37950
   558
	        "( ((rhs e_) is_sqrtTerm_in (v_::real)) &" ^
neuper@37950
   559
                "  ((rhs e_) is_normSqrtTerm_in (v_::real))   )"]),
neuper@37950
   560
    ("#Find"  ,["solutions v_i_"])
neuper@37950
   561
   ],
neuper@37950
   562
   {rew_ord'="termlessI",
neuper@37950
   563
    rls'=RootEq_erls,
neuper@37950
   564
    srls = rooteq_srls,
neuper@37950
   565
    prls = RootEq_prls,
neuper@37950
   566
    calc = [],
neuper@37950
   567
    crls=RootEq_crls, nrls=norm_Poly},
neuper@37950
   568
"Script Solve_sq_root_equation  (e_::bool) (v_::real)  =             " ^
neuper@37950
   569
"(let e_ = " ^
neuper@37950
   570
"  ((Try (Rewrite_Set_Inst [(bdv,v_::real)] sqrt_isolate    True)) @@ " ^
neuper@37950
   571
"  (Try (Rewrite_Set                       rooteq_simplify True)) @@ " ^
neuper@37950
   572
"  (Try (Repeat (Rewrite_Set expand_rootbinoms           False))) @@ " ^
neuper@37950
   573
"  (Try (Repeat (Rewrite_Set make_rooteq                 False))) @@ " ^
neuper@37950
   574
"  (Try (Rewrite_Set rooteq_simplify                       True))) e_;" ^
neuper@37950
   575
" (L_::bool list) =                                                   " ^
neuper@37950
   576
"    (if (((lhs e_) is_sqrtTerm_in v_) | ((rhs e_) is_sqrtTerm_in v_))" ^
neuper@37950
   577
" then (SubProblem (RootEq_,[normalize,root,univariate,equation],          " ^
neuper@37950
   578
"       [no_met]) [bool_ e_, real_ v_])                                    " ^
neuper@37950
   579
" else (SubProblem (RootEq_,[univariate,equation],                         " ^
neuper@37950
   580
"        [no_met]) [bool_ e_, real_ v_]))                                  " ^
neuper@37950
   581
" in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37950
   582
 ));
neuper@37950
   583
neuper@37950
   584
(*-- right 28.08.02 --*)
neuper@37950
   585
store_met
neuper@37953
   586
 (prep_met (theory "RootEq") "met_rooteq_sq_right" [] e_metID
neuper@37950
   587
 (["RootEq","solve_right_sq_root_equation"],
neuper@37950
   588
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   589
    ("#Where" ,["(rhs e_) is_sqrtTerm_in v_"]),
neuper@37950
   590
    ("#Find"  ,["solutions v_i_"])
neuper@37950
   591
   ],
neuper@37950
   592
   {rew_ord'="termlessI",
neuper@37950
   593
    rls'=RootEq_erls,
neuper@37950
   594
    srls=e_rls,
neuper@37950
   595
    prls=RootEq_prls,
neuper@37950
   596
    calc=[],
neuper@37950
   597
    crls=RootEq_crls, nrls=norm_Poly},
neuper@37950
   598
  "Script Solve_right_sq_root_equation  (e_::bool) (v_::real)  =            " ^
neuper@37950
   599
   "(let e_ = " ^
neuper@37950
   600
   "    ((Try (Rewrite_Set_Inst [(bdv,v_::real)] r_sqrt_isolate  False)) @@ " ^
neuper@37950
   601
   "    (Try (Rewrite_Set                       rooteq_simplify False)) @@  " ^ 
neuper@37950
   602
   "    (Try (Repeat (Rewrite_Set expand_rootbinoms            False))) @@  " ^
neuper@37950
   603
   "    (Try (Repeat (Rewrite_Set make_rooteq                  False))) @@  " ^
neuper@37950
   604
   "    (Try (Rewrite_Set rooteq_simplify                       False))) e_ " ^
neuper@37950
   605
   " in if ((rhs e_) is_sqrtTerm_in v_)                                     " ^ 
neuper@37950
   606
   " then (SubProblem (RootEq_,[normalize,root,univariate,equation],        " ^
neuper@37950
   607
   "       [no_met]) [bool_ e_, real_ v_])                                  " ^
neuper@37950
   608
   " else ((SubProblem (RootEq_,[univariate,equation],                      " ^
neuper@37950
   609
   "        [no_met]) [bool_ e_, real_ v_])))"
neuper@37950
   610
 ));
neuper@37950
   611
neuper@37950
   612
(*-- left 28.08.02 --*)
neuper@37950
   613
store_met
neuper@37953
   614
 (prep_met (theory "RootEq") "met_rooteq_sq_left" [] e_metID
neuper@37950
   615
 (["RootEq","solve_left_sq_root_equation"],
neuper@37950
   616
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37950
   617
    ("#Where" ,["(lhs e_) is_sqrtTerm_in v_"]),
neuper@37950
   618
    ("#Find"  ,["solutions v_i_"])
neuper@37950
   619
   ],
neuper@37950
   620
   {rew_ord'="termlessI",
neuper@37950
   621
    rls'=RootEq_erls,
neuper@37950
   622
    srls=e_rls,
neuper@37950
   623
    prls=RootEq_prls,
neuper@37950
   624
    calc=[],
neuper@37950
   625
    crls=RootEq_crls, nrls=norm_Poly},
neuper@37950
   626
    "Script Solve_left_sq_root_equation  (e_::bool) (v_::real)  =          " ^
neuper@37950
   627
    "(let e_ =                                                             " ^
neuper@37950
   628
    "  ((Try (Rewrite_Set_Inst [(bdv,v_::real)] l_sqrt_isolate  False)) @@ " ^
neuper@37950
   629
    "  (Try (Rewrite_Set                       rooteq_simplify False)) @@  " ^
neuper@37950
   630
    "  (Try (Repeat (Rewrite_Set expand_rootbinoms            False))) @@  " ^
neuper@37950
   631
    "  (Try (Repeat (Rewrite_Set make_rooteq                  False))) @@  " ^
neuper@37950
   632
    "  (Try (Rewrite_Set rooteq_simplify                       False))) e_ " ^
neuper@37950
   633
    " in if ((lhs e_) is_sqrtTerm_in v_)                                   " ^ 
neuper@37950
   634
    " then (SubProblem (RootEq_,[normalize,root,univariate,equation],      " ^
neuper@37950
   635
    "       [no_met]) [bool_ e_, real_ v_])                                " ^
neuper@37950
   636
    " else ((SubProblem (RootEq_,[univariate,equation],                    " ^
neuper@37950
   637
    "        [no_met]) [bool_ e_, real_ v_])))"
neuper@37950
   638
   ));
neuper@37950
   639
neuper@37950
   640
calclist':= overwritel (!calclist', 
neuper@37950
   641
   [("is_rootTerm_in", ("RootEq.is'_rootTerm'_in", 
neuper@37950
   642
			eval_is_rootTerm_in"")),
neuper@37950
   643
    ("is_sqrtTerm_in", ("RootEq.is'_sqrtTerm'_in", 
neuper@37950
   644
			eval_is_sqrtTerm_in"")),
neuper@37950
   645
    ("is_normSqrtTerm_in", ("RootEq.is_normSqrtTerm_in", 
neuper@37950
   646
				 eval_is_normSqrtTerm_in""))
neuper@37950
   647
    ]);(*("", ("", "")),*)
neuper@37950
   648
*}
neuper@37950
   649
neuper@37906
   650
end