src/Tools/isac/Knowledge/Test.thy
author Walther Neuper <neuper@ist.tugraz.at>
Fri, 27 Aug 2010 14:56:54 +0200
branchisac-update-Isa09-2
changeset 37954 4022d670753c
parent 37947 22235e4dbe5f
child 37965 9c11005c33b8
permissions -rw-r--r--
updated syntax of all thys, semantic check until Atools.thy
neuper@37954
     1
(* some tests are based on specficially simple scripts etc.
neuper@37954
     2
   Author: Walther Neuper 2003
neuper@37954
     3
   (c) due to copyright terms
neuper@37954
     4
*) 
neuper@37906
     5
neuper@37954
     6
theory Test imports Atools + Rational + Root + Poly + 
neuper@37906
     7
 
neuper@37906
     8
consts
neuper@37906
     9
neuper@37906
    10
(*"cancel":: [real, real] => real    (infixl "'/'/'/" 70) ...divide 2002*)
neuper@37906
    11
neuper@37906
    12
  Expand'_binomtest
neuper@37954
    13
             :: "['y,  
neuper@37954
    14
		    'y] => 'y"
neuper@37954
    15
               ("((Script Expand'_binomtest (_ =))//  
neuper@37954
    16
                   (_))" 9)
neuper@37906
    17
neuper@37906
    18
  Solve'_univar'_err
neuper@37954
    19
             :: "[bool,real,bool,  
neuper@37954
    20
		    bool list] => bool list"
neuper@37954
    21
               ("((Script Solve'_univar'_err (_ _ _ =))//  
neuper@37954
    22
                   (_))" 9)
neuper@37906
    23
  
neuper@37906
    24
  Solve'_linear
neuper@37954
    25
             :: "[bool,real,  
neuper@37954
    26
		    bool list] => bool list"
neuper@37954
    27
               ("((Script Solve'_linear (_ _ =))//  
neuper@37954
    28
                   (_))" 9)
neuper@37906
    29
neuper@37906
    30
(*17.9.02 aus SqRoot.thy------------------------------vvv---*)
neuper@37906
    31
neuper@37906
    32
  "is'_root'_free" :: 'a => bool           ("is'_root'_free _" 10)
neuper@37906
    33
  "contains'_root" :: 'a => bool           ("contains'_root _" 10)
neuper@37906
    34
neuper@37906
    35
  Solve'_root'_equation 
neuper@37954
    36
             :: "[bool,real,  
neuper@37954
    37
		    bool list] => bool list"
neuper@37954
    38
               ("((Script Solve'_root'_equation (_ _ =))//  
neuper@37954
    39
                   (_))" 9)
neuper@37906
    40
neuper@37906
    41
  Solve'_plain'_square 
neuper@37954
    42
             :: "[bool,real,  
neuper@37954
    43
		    bool list] => bool list"
neuper@37954
    44
               ("((Script Solve'_plain'_square (_ _ =))//  
neuper@37954
    45
                   (_))" 9)
neuper@37906
    46
neuper@37906
    47
  Norm'_univar'_equation 
neuper@37954
    48
             :: "[bool,real,  
neuper@37954
    49
		    bool] => bool"
neuper@37954
    50
               ("((Script Norm'_univar'_equation (_ _ =))//  
neuper@37954
    51
                   (_))" 9)
neuper@37906
    52
neuper@37906
    53
  STest'_simplify
neuper@37954
    54
             :: "['z,  
neuper@37954
    55
		    'z] => 'z"
neuper@37954
    56
               ("((Script STest'_simplify (_ =))//  
neuper@37954
    57
                   (_))" 9)
neuper@37906
    58
neuper@37906
    59
(*17.9.02 aus SqRoot.thy------------------------------^^^---*)  
neuper@37906
    60
neuper@37954
    61
axioms (*TODO: prove as theorems*)
neuper@37906
    62
neuper@37906
    63
  radd_mult_distrib2      "(k::real) * (m + n) = k * m + k * n"
neuper@37906
    64
  rdistr_right_assoc      "(k::real) + l * n + m * n = k + (l + m) * n"
neuper@37906
    65
  rdistr_right_assoc_p    "l * n + (m * n + (k::real)) = (l + m) * n + k"
neuper@37906
    66
  rdistr_div_right        "((k::real) + l) / n = k / n + l / n"
neuper@37906
    67
  rcollect_right
neuper@37906
    68
          "[| l is_const; m is_const |] ==> (l::real)*n + m*n = (l + m) * n"
neuper@37906
    69
  rcollect_one_left
neuper@37906
    70
          "m is_const ==> (n::real) + m * n = (1 + m) * n"
neuper@37906
    71
  rcollect_one_left_assoc
neuper@37906
    72
          "m is_const ==> (k::real) + n + m * n = k + (1 + m) * n"
neuper@37906
    73
  rcollect_one_left_assoc_p
neuper@37906
    74
          "m is_const ==> n + (m * n + (k::real)) = (1 + m) * n + k"
neuper@37906
    75
neuper@37906
    76
  rtwo_of_the_same        "a + a = 2 * a"
neuper@37906
    77
  rtwo_of_the_same_assoc  "(x + a) + a = x + 2 * a"
neuper@37906
    78
  rtwo_of_the_same_assoc_p"a + (a + x) = 2 * a + x"
neuper@37906
    79
neuper@37906
    80
  rcancel_den             "not(a=0) ==> a * (b / a) = b"
neuper@37906
    81
  rcancel_const           "[| a is_const; b is_const |] ==> a*(x/b) = a/b*x"
neuper@37906
    82
  rshift_nominator        "(a::real) * b / c = a / c * b"
neuper@37906
    83
neuper@37906
    84
  exp_pow                 "(a ^^^ b) ^^^ c = a ^^^ (b * c)"
neuper@37906
    85
  rsqare                  "(a::real) * a = a ^^^ 2"
neuper@37906
    86
  power_1                 "(a::real) ^^^ 1 = a"
neuper@37906
    87
  rbinom_power_2          "((a::real) + b)^^^ 2 = a^^^ 2 + 2*a*b + b^^^ 2"
neuper@37906
    88
neuper@37906
    89
  rmult_1                 "1 * k = (k::real)"
neuper@37906
    90
  rmult_1_right           "k * 1 = (k::real)"
neuper@37906
    91
  rmult_0                 "0 * k = (0::real)"
neuper@37906
    92
  rmult_0_right           "k * 0 = (0::real)"
neuper@37906
    93
  radd_0                  "0 + k = (k::real)"
neuper@37906
    94
  radd_0_right            "k + 0 = (k::real)"
neuper@37906
    95
neuper@37906
    96
  radd_real_const_eq
neuper@37906
    97
          "[| a is_const; c is_const; d is_const |] ==> a/d + c/d = (a+c)/(d::real)"
neuper@37906
    98
  radd_real_const
neuper@37906
    99
          "[| a is_const; b is_const; c is_const; d is_const |] ==> a/b + c/d = (a*d + b*c)/(b*(d::real))"  
neuper@37906
   100
  
neuper@37906
   101
(*for AC-operators*)
neuper@37906
   102
  radd_commute            "(m::real) + (n::real) = n + m"
neuper@37906
   103
  radd_left_commute       "(x::real) + (y + z) = y + (x + z)"
neuper@37906
   104
  radd_assoc              "(m::real) + n + k = m + (n + k)"
neuper@37906
   105
  rmult_commute           "(m::real) * n = n * m"
neuper@37906
   106
  rmult_left_commute      "(x::real) * (y * z) = y * (x * z)"
neuper@37906
   107
  rmult_assoc             "(m::real) * n * k = m * (n * k)"
neuper@37906
   108
neuper@37906
   109
(*for equations: 'bdv' is a meta-constant*)
neuper@37906
   110
  risolate_bdv_add       "((k::real) + bdv = m) = (bdv = m + (-1)*k)"
neuper@37906
   111
  risolate_bdv_mult_add  "((k::real) + n*bdv = m) = (n*bdv = m + (-1)*k)"
neuper@37906
   112
  risolate_bdv_mult      "((n::real) * bdv = m) = (bdv = m / n)"
neuper@37906
   113
neuper@37906
   114
  rnorm_equation_add
neuper@37906
   115
      "~(b =!= 0) ==> (a = b) = (a + (-1)*b = 0)"
neuper@37906
   116
neuper@37906
   117
(*17.9.02 aus SqRoot.thy------------------------------vvv---*) 
neuper@37906
   118
  root_ge0            "0 <= a ==> 0 <= sqrt a"
neuper@37906
   119
  (*should be dropped with better simplification in eval_rls ...*)
neuper@37906
   120
  root_add_ge0
neuper@37906
   121
	"[| 0 <= a; 0 <= b |] ==> (0 <= sqrt a + sqrt b) = True"
neuper@37906
   122
  root_ge0_1
neuper@37906
   123
	"[| 0<=a; 0<=b; 0<=c |] ==> (0 <= a * sqrt b + sqrt c) = True"
neuper@37906
   124
  root_ge0_2
neuper@37906
   125
	"[| 0<=a; 0<=b; 0<=c |] ==> (0 <= sqrt a + b * sqrt c) = True"
neuper@37906
   126
neuper@37906
   127
neuper@37906
   128
  rroot_square_inv         "(sqrt a)^^^ 2 = a"
neuper@37906
   129
  rroot_times_root         "sqrt a * sqrt b = sqrt(a*b)"
neuper@37906
   130
  rroot_times_root_assoc   "(a * sqrt b) * sqrt c = a * sqrt(b*c)"
neuper@37906
   131
  rroot_times_root_assoc_p "sqrt b * (sqrt c * a)= sqrt(b*c) * a"
neuper@37906
   132
neuper@37906
   133
neuper@37906
   134
(*for root-equations*)
neuper@37906
   135
  square_equation_left
neuper@37906
   136
          "[| 0 <= a; 0 <= b |] ==> (((sqrt a)=b)=(a=(b^^^ 2)))"
neuper@37906
   137
  square_equation_right
neuper@37906
   138
          "[| 0 <= a; 0 <= b |] ==> ((a=(sqrt b))=((a^^^ 2)=b))"
neuper@37906
   139
  (*causes frequently non-termination:*)
neuper@37906
   140
  square_equation  
neuper@37906
   141
          "[| 0 <= a; 0 <= b |] ==> ((a=b)=((a^^^ 2)=b^^^ 2))"
neuper@37906
   142
  
neuper@37906
   143
  risolate_root_add        "(a+  sqrt c = d) = (  sqrt c = d + (-1)*a)"
neuper@37906
   144
  risolate_root_mult       "(a+b*sqrt c = d) = (b*sqrt c = d + (-1)*a)"
neuper@37906
   145
  risolate_root_div        "(a * sqrt c = d) = (  sqrt c = d / a)"
neuper@37906
   146
neuper@37906
   147
(*for polynomial equations of degree 2; linear case in RatArith*)
neuper@37906
   148
  mult_square		"(a*bdv^^^2 = b) = (bdv^^^2 = b / a)"
neuper@37906
   149
  constant_square       "(a + bdv^^^2 = b) = (bdv^^^2 = b + -1*a)"
neuper@37906
   150
  constant_mult_square  "(a + b*bdv^^^2 = c) = (b*bdv^^^2 = c + -1*a)"
neuper@37906
   151
neuper@37906
   152
  square_equality 
neuper@37906
   153
	     "0 <= a ==> (x^^^2 = a) = ((x=sqrt a) | (x=-1*sqrt a))"
neuper@37906
   154
  square_equality_0
neuper@37906
   155
	     "(x^^^2 = 0) = (x = 0)"
neuper@37906
   156
neuper@37906
   157
(*isolate root on the LEFT hand side of the equation
neuper@37906
   158
  otherwise shuffling from left to right would not terminate*)  
neuper@37906
   159
neuper@37906
   160
  rroot_to_lhs
neuper@37906
   161
          "is_root_free a ==> (a = sqrt b) = (a + (-1)*sqrt b = 0)"
neuper@37906
   162
  rroot_to_lhs_mult
neuper@37906
   163
          "is_root_free a ==> (a = c*sqrt b) = (a + (-1)*c*sqrt b = 0)"
neuper@37906
   164
  rroot_to_lhs_add_mult
neuper@37906
   165
          "is_root_free a ==> (a = d+c*sqrt b) = (a + (-1)*c*sqrt b = d)"
neuper@37906
   166
(*17.9.02 aus SqRoot.thy------------------------------^^^---*)  
neuper@37906
   167
neuper@37954
   168
ML {*
neuper@37954
   169
(** evaluation of numerals and predicates **)
neuper@37954
   170
neuper@37954
   171
(*does a term contain a root ?*)
neuper@37954
   172
fun eval_root_free (thmid:string) _ (t as (Const(op0,t0) $ arg)) thy = 
neuper@37954
   173
  if strip_thy op0 <> "is'_root'_free" 
neuper@37954
   174
    then raise error ("eval_root_free: wrong "^op0)
neuper@37954
   175
  else if const_in (strip_thy op0) arg
neuper@37954
   176
	 then SOME (mk_thmid thmid "" 
neuper@37954
   177
		    ((Syntax.string_of_term (thy2ctxt thy)) arg) "", 
neuper@37954
   178
		    Trueprop $ (mk_equality (t, false_as_term)))
neuper@37954
   179
       else SOME (mk_thmid thmid "" 
neuper@37954
   180
		  ((Syntax.string_of_term (thy2ctxt thy)) arg) "", 
neuper@37954
   181
		  Trueprop $ (mk_equality (t, true_as_term)))
neuper@37954
   182
  | eval_root_free _ _ _ _ = NONE; 
neuper@37954
   183
neuper@37954
   184
(*does a term contain a root ?*)
neuper@37954
   185
fun eval_contains_root (thmid:string) _ 
neuper@37954
   186
		       (t as (Const("Test.contains'_root",t0) $ arg)) thy = 
neuper@37954
   187
    if member op = (ids_of arg) "sqrt"
neuper@37954
   188
    then SOME (mk_thmid thmid "" 
neuper@37954
   189
			((Syntax.string_of_term (thy2ctxt thy)) arg) "", 
neuper@37954
   190
	       Trueprop $ (mk_equality (t, true_as_term)))
neuper@37954
   191
    else SOME (mk_thmid thmid "" 
neuper@37954
   192
			((Syntax.string_of_term (thy2ctxt thy)) arg) "", 
neuper@37954
   193
	       Trueprop $ (mk_equality (t, false_as_term)))
neuper@37954
   194
  | eval_contains_root _ _ _ _ = NONE; 
neuper@37954
   195
  
neuper@37954
   196
calclist':= overwritel (!calclist', 
neuper@37954
   197
   [("is_root_free", ("Test.is'_root'_free", 
neuper@37954
   198
		      eval_root_free"#is_root_free_")),
neuper@37954
   199
    ("contains_root", ("Test.contains'_root",
neuper@37954
   200
		       eval_contains_root"#contains_root_"))
neuper@37954
   201
    ]);
neuper@37954
   202
neuper@37954
   203
(** term order **)
neuper@37954
   204
fun term_order (_:subst) tu = (term_ordI [] tu = LESS);
neuper@37954
   205
neuper@37954
   206
(** rule sets **)
neuper@37954
   207
neuper@37954
   208
val testerls = 
neuper@37954
   209
  Rls {id = "testerls", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37954
   210
      erls = e_rls, srls = Erls, 
neuper@37954
   211
      calc = [], 
neuper@37954
   212
      rules = [Thm ("refl",num_str refl),
neuper@37954
   213
	       Thm ("le_refl",num_str le_refl),
neuper@37954
   214
	       Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37954
   215
	       Thm ("not_true",num_str not_true),
neuper@37954
   216
	       Thm ("not_false",num_str not_false),
neuper@37954
   217
	       Thm ("and_true",and_true),
neuper@37954
   218
	       Thm ("and_false",and_false),
neuper@37954
   219
	       Thm ("or_true",or_true),
neuper@37954
   220
	       Thm ("or_false",or_false),
neuper@37954
   221
	       Thm ("and_commute",num_str and_commute),
neuper@37954
   222
	       Thm ("or_commute",num_str or_commute),
neuper@37954
   223
neuper@37954
   224
	       Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37954
   225
	       Calc ("Tools.matches",eval_matches ""),
neuper@37954
   226
    
neuper@37954
   227
	       Calc ("op +",eval_binop "#add_"),
neuper@37954
   228
	       Calc ("op *",eval_binop "#mult_"),
neuper@37954
   229
	       Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37954
   230
		    
neuper@37954
   231
	       Calc ("op <",eval_equ "#less_"),
neuper@37954
   232
	       Calc ("op <=",eval_equ "#less_equal_"),
neuper@37954
   233
	     	    
neuper@37954
   234
	       Calc ("Atools.ident",eval_ident "#ident_")],
neuper@37954
   235
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   236
      "empty_script")
neuper@37954
   237
      }:rls;      
neuper@37954
   238
neuper@37954
   239
(*.for evaluation of conditions in rewrite rules.*)
neuper@37954
   240
(*FIXXXXXXME 10.8.02: handle like _simplify*)
neuper@37954
   241
val tval_rls =  
neuper@37954
   242
  Rls{id = "tval_rls", preconds = [], 
neuper@37954
   243
      rew_ord = ("sqrt_right",sqrt_right false (theory "Pure")), 
neuper@37954
   244
      erls=testerls,srls = e_rls, 
neuper@37954
   245
      calc=[],
neuper@37954
   246
      rules = [Thm ("refl",num_str refl),
neuper@37954
   247
	       Thm ("le_refl",num_str le_refl),
neuper@37954
   248
	       Thm ("radd_left_cancel_le",num_str radd_left_cancel_le),
neuper@37954
   249
	       Thm ("not_true",num_str not_true),
neuper@37954
   250
	       Thm ("not_false",num_str not_false),
neuper@37954
   251
	       Thm ("and_true",and_true),
neuper@37954
   252
	       Thm ("and_false",and_false),
neuper@37954
   253
	       Thm ("or_true",or_true),
neuper@37954
   254
	       Thm ("or_false",or_false),
neuper@37954
   255
	       Thm ("and_commute",num_str and_commute),
neuper@37954
   256
	       Thm ("or_commute",num_str or_commute),
neuper@37954
   257
neuper@37954
   258
	       Thm ("real_diff_minus",num_str real_diff_minus),
neuper@37954
   259
neuper@37954
   260
	       Thm ("root_ge0",num_str root_ge0),
neuper@37954
   261
	       Thm ("root_add_ge0",num_str root_add_ge0),
neuper@37954
   262
	       Thm ("root_ge0_1",num_str root_ge0_1),
neuper@37954
   263
	       Thm ("root_ge0_2",num_str root_ge0_2),
neuper@37954
   264
neuper@37954
   265
	       Calc ("Atools.is'_const",eval_const "#is_const_"),
neuper@37954
   266
	       Calc ("Test.is'_root'_free",eval_root_free "#is_root_free_"),
neuper@37954
   267
	       Calc ("Tools.matches",eval_matches ""),
neuper@37954
   268
	       Calc ("Test.contains'_root",
neuper@37954
   269
		     eval_contains_root"#contains_root_"),
neuper@37954
   270
    
neuper@37954
   271
	       Calc ("op +",eval_binop "#add_"),
neuper@37954
   272
	       Calc ("op *",eval_binop "#mult_"),
neuper@37954
   273
	       Calc ("Root.sqrt",eval_sqrt "#sqrt_"),
neuper@37954
   274
	       Calc ("Atools.pow" ,eval_binop "#power_"),
neuper@37954
   275
		    
neuper@37954
   276
	       Calc ("op <",eval_equ "#less_"),
neuper@37954
   277
	       Calc ("op <=",eval_equ "#less_equal_"),
neuper@37954
   278
	     	    
neuper@37954
   279
	       Calc ("Atools.ident",eval_ident "#ident_")],
neuper@37954
   280
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   281
      "empty_script")
neuper@37954
   282
      }:rls;      
neuper@37954
   283
neuper@37954
   284
neuper@37954
   285
ruleset' := overwritelthy thy (!ruleset',
neuper@37954
   286
  [("testerls", prep_rls testerls)
neuper@37954
   287
   ]);
neuper@37954
   288
neuper@37954
   289
neuper@37954
   290
(*make () dissappear*)   
neuper@37954
   291
val rearrange_assoc =
neuper@37954
   292
  Rls{id = "rearrange_assoc", preconds = [], 
neuper@37954
   293
      rew_ord = ("e_rew_ord",e_rew_ord), 
neuper@37954
   294
      erls = e_rls, srls = e_rls, calc = [], (*asm_thm=[],*)
neuper@37954
   295
      rules = 
neuper@37954
   296
      [Thm ("sym_radd_assoc",num_str (radd_assoc RS sym)),
neuper@37954
   297
       Thm ("sym_rmult_assoc",num_str (rmult_assoc RS sym))],
neuper@37954
   298
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   299
      "empty_script")
neuper@37954
   300
      }:rls;      
neuper@37954
   301
neuper@37954
   302
val ac_plus_times =
neuper@37954
   303
  Rls{id = "ac_plus_times", preconds = [], rew_ord = ("term_order",term_order),
neuper@37954
   304
      erls = e_rls, srls = e_rls, calc = [], (*asm_thm=[],*)
neuper@37954
   305
      rules = 
neuper@37954
   306
      [Thm ("radd_commute",radd_commute),
neuper@37954
   307
       Thm ("radd_left_commute",radd_left_commute),
neuper@37954
   308
       Thm ("radd_assoc",radd_assoc),
neuper@37954
   309
       Thm ("rmult_commute",rmult_commute),
neuper@37954
   310
       Thm ("rmult_left_commute",rmult_left_commute),
neuper@37954
   311
       Thm ("rmult_assoc",rmult_assoc)],
neuper@37954
   312
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   313
      "empty_script")
neuper@37954
   314
      }:rls;      
neuper@37954
   315
neuper@37954
   316
(*todo: replace by Rewrite("rnorm_equation_add",num_str rnorm_equation_add)*)
neuper@37954
   317
val norm_equation =
neuper@37954
   318
  Rls{id = "norm_equation", preconds = [], rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37954
   319
      erls = tval_rls, srls = e_rls, calc = [], (*asm_thm=[],*)
neuper@37954
   320
      rules = [Thm ("rnorm_equation_add",num_str rnorm_equation_add)
neuper@37954
   321
	       ],
neuper@37954
   322
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   323
      "empty_script")
neuper@37954
   324
      }:rls;      
neuper@37954
   325
neuper@37954
   326
(** rule sets **)
neuper@37954
   327
neuper@37954
   328
val STest_simplify =     (*   vv--- not changed to real by parse*)
neuper@37954
   329
  "Script STest_simplify (t_::'z) =                           " ^
neuper@37954
   330
  "(Repeat" ^
neuper@37954
   331
  "    ((Try (Repeat (Rewrite real_diff_minus False))) @@        " ^
neuper@37954
   332
  "     (Try (Repeat (Rewrite radd_mult_distrib2 False))) @@  " ^
neuper@37954
   333
  "     (Try (Repeat (Rewrite rdistr_right_assoc False))) @@  " ^
neuper@37954
   334
  "     (Try (Repeat (Rewrite rdistr_right_assoc_p False))) @@" ^
neuper@37954
   335
  "     (Try (Repeat (Rewrite rdistr_div_right False))) @@    " ^
neuper@37954
   336
  "     (Try (Repeat (Rewrite rbinom_power_2 False))) @@      " ^
neuper@37954
   337
	
neuper@37954
   338
  "     (Try (Repeat (Rewrite radd_commute False))) @@        " ^
neuper@37954
   339
  "     (Try (Repeat (Rewrite radd_left_commute False))) @@   " ^
neuper@37954
   340
  "     (Try (Repeat (Rewrite radd_assoc False))) @@          " ^
neuper@37954
   341
  "     (Try (Repeat (Rewrite rmult_commute False))) @@       " ^
neuper@37954
   342
  "     (Try (Repeat (Rewrite rmult_left_commute False))) @@  " ^
neuper@37954
   343
  "     (Try (Repeat (Rewrite rmult_assoc False))) @@         " ^
neuper@37954
   344
	
neuper@37954
   345
  "     (Try (Repeat (Rewrite radd_real_const_eq False))) @@   " ^
neuper@37954
   346
  "     (Try (Repeat (Rewrite radd_real_const False))) @@   " ^
neuper@37954
   347
  "     (Try (Repeat (Calculate plus))) @@   " ^
neuper@37954
   348
  "     (Try (Repeat (Calculate times))) @@   " ^
neuper@37954
   349
  "     (Try (Repeat (Calculate divide_))) @@" ^
neuper@37954
   350
  "     (Try (Repeat (Calculate power_))) @@  " ^
neuper@37954
   351
	
neuper@37954
   352
  "     (Try (Repeat (Rewrite rcollect_right False))) @@   " ^
neuper@37954
   353
  "     (Try (Repeat (Rewrite rcollect_one_left False))) @@   " ^
neuper@37954
   354
  "     (Try (Repeat (Rewrite rcollect_one_left_assoc False))) @@   " ^
neuper@37954
   355
  "     (Try (Repeat (Rewrite rcollect_one_left_assoc_p False))) @@   " ^
neuper@37954
   356
	
neuper@37954
   357
  "     (Try (Repeat (Rewrite rshift_nominator False))) @@   " ^
neuper@37954
   358
  "     (Try (Repeat (Rewrite rcancel_den False))) @@   " ^
neuper@37954
   359
  "     (Try (Repeat (Rewrite rroot_square_inv False))) @@   " ^
neuper@37954
   360
  "     (Try (Repeat (Rewrite rroot_times_root False))) @@   " ^
neuper@37954
   361
  "     (Try (Repeat (Rewrite rroot_times_root_assoc_p False))) @@   " ^
neuper@37954
   362
  "     (Try (Repeat (Rewrite rsqare False))) @@   " ^
neuper@37954
   363
  "     (Try (Repeat (Rewrite power_1 False))) @@   " ^
neuper@37954
   364
  "     (Try (Repeat (Rewrite rtwo_of_the_same False))) @@   " ^
neuper@37954
   365
  "     (Try (Repeat (Rewrite rtwo_of_the_same_assoc_p False))) @@   " ^
neuper@37954
   366
	
neuper@37954
   367
  "     (Try (Repeat (Rewrite rmult_1 False))) @@   " ^
neuper@37954
   368
  "     (Try (Repeat (Rewrite rmult_1_right False))) @@   " ^
neuper@37954
   369
  "     (Try (Repeat (Rewrite rmult_0 False))) @@   " ^
neuper@37954
   370
  "     (Try (Repeat (Rewrite rmult_0_right False))) @@   " ^
neuper@37954
   371
  "     (Try (Repeat (Rewrite radd_0 False))) @@   " ^
neuper@37954
   372
  "     (Try (Repeat (Rewrite radd_0_right False)))) " ^
neuper@37954
   373
  " t_)";
neuper@37954
   374
neuper@37954
   375
neuper@37954
   376
(* expects * distributed over + *)
neuper@37954
   377
val Test_simplify =
neuper@37954
   378
  Rls{id = "Test_simplify", preconds = [], 
neuper@37954
   379
      rew_ord = ("sqrt_right",sqrt_right false (theory "Pure")),
neuper@37954
   380
      erls = tval_rls, srls = e_rls, 
neuper@37954
   381
      calc=[(*since 040209 filled by prep_rls*)],
neuper@37954
   382
      (*asm_thm = [],*)
neuper@37954
   383
      rules = [
neuper@37954
   384
	       Thm ("real_diff_minus",num_str real_diff_minus),
neuper@37954
   385
	       Thm ("radd_mult_distrib2",num_str radd_mult_distrib2),
neuper@37954
   386
	       Thm ("rdistr_right_assoc",num_str rdistr_right_assoc),
neuper@37954
   387
	       Thm ("rdistr_right_assoc_p",num_str rdistr_right_assoc_p),
neuper@37954
   388
	       Thm ("rdistr_div_right",num_str rdistr_div_right),
neuper@37954
   389
	       Thm ("rbinom_power_2",num_str rbinom_power_2),	       
neuper@37954
   390
neuper@37954
   391
               Thm ("radd_commute",num_str radd_commute), 
neuper@37954
   392
	       Thm ("radd_left_commute",num_str radd_left_commute),
neuper@37954
   393
	       Thm ("radd_assoc",num_str radd_assoc),
neuper@37954
   394
	       Thm ("rmult_commute",num_str rmult_commute),
neuper@37954
   395
	       Thm ("rmult_left_commute",num_str rmult_left_commute),
neuper@37954
   396
	       Thm ("rmult_assoc",num_str rmult_assoc),
neuper@37954
   397
neuper@37954
   398
	       Thm ("radd_real_const_eq",num_str radd_real_const_eq),
neuper@37954
   399
	       Thm ("radd_real_const",num_str radd_real_const),
neuper@37954
   400
	       (* these 2 rules are invers to distr_div_right wrt. termination.
neuper@37954
   401
		  thus they MUST be done IMMEDIATELY before calc *)
neuper@37954
   402
	       Calc ("op +", eval_binop "#add_"), 
neuper@37954
   403
	       Calc ("op *", eval_binop "#mult_"),
neuper@37954
   404
	       Calc ("HOL.divide", eval_cancel "#divide_"),
neuper@37954
   405
	       Calc ("Atools.pow", eval_binop "#power_"),
neuper@37954
   406
neuper@37954
   407
	       Thm ("rcollect_right",num_str rcollect_right),
neuper@37954
   408
	       Thm ("rcollect_one_left",num_str rcollect_one_left),
neuper@37954
   409
	       Thm ("rcollect_one_left_assoc",num_str rcollect_one_left_assoc),
neuper@37954
   410
	       Thm ("rcollect_one_left_assoc_p",num_str rcollect_one_left_assoc_p),
neuper@37954
   411
neuper@37954
   412
	       Thm ("rshift_nominator",num_str rshift_nominator),
neuper@37954
   413
	       Thm ("rcancel_den",num_str rcancel_den),
neuper@37954
   414
	       Thm ("rroot_square_inv",num_str rroot_square_inv),
neuper@37954
   415
	       Thm ("rroot_times_root",num_str rroot_times_root),
neuper@37954
   416
	       Thm ("rroot_times_root_assoc_p",num_str rroot_times_root_assoc_p),
neuper@37954
   417
	       Thm ("rsqare",num_str rsqare),
neuper@37954
   418
	       Thm ("power_1",num_str power_1),
neuper@37954
   419
	       Thm ("rtwo_of_the_same",num_str rtwo_of_the_same),
neuper@37954
   420
	       Thm ("rtwo_of_the_same_assoc_p",num_str rtwo_of_the_same_assoc_p),
neuper@37954
   421
neuper@37954
   422
	       Thm ("rmult_1",num_str rmult_1),
neuper@37954
   423
	       Thm ("rmult_1_right",num_str rmult_1_right),
neuper@37954
   424
	       Thm ("rmult_0",num_str rmult_0),
neuper@37954
   425
	       Thm ("rmult_0_right",num_str rmult_0_right),
neuper@37954
   426
	       Thm ("radd_0",num_str radd_0),
neuper@37954
   427
	       Thm ("radd_0_right",num_str radd_0_right)
neuper@37954
   428
	       ],
neuper@37954
   429
      scr = Script ((term_of o the o (parse thy)) "empty_script")
neuper@37954
   430
		    (*since 040209 filled by prep_rls: STest_simplify*)
neuper@37954
   431
      }:rls;      
neuper@37954
   432
neuper@37954
   433
neuper@37954
   434
neuper@37954
   435
neuper@37954
   436
neuper@37954
   437
(** rule sets **)
neuper@37954
   438
neuper@37954
   439
neuper@37954
   440
neuper@37954
   441
(*isolate the root in a root-equation*)
neuper@37954
   442
val isolate_root =
neuper@37954
   443
  Rls{id = "isolate_root", preconds = [], rew_ord = ("e_rew_ord",e_rew_ord), 
neuper@37954
   444
      erls=tval_rls,srls = e_rls, calc=[],(*asm_thm = [], *)
neuper@37954
   445
      rules = [Thm ("rroot_to_lhs",num_str rroot_to_lhs),
neuper@37954
   446
	       Thm ("rroot_to_lhs_mult",num_str rroot_to_lhs_mult),
neuper@37954
   447
	       Thm ("rroot_to_lhs_add_mult",num_str rroot_to_lhs_add_mult),
neuper@37954
   448
	       Thm ("risolate_root_add",num_str risolate_root_add),
neuper@37954
   449
	       Thm ("risolate_root_mult",num_str risolate_root_mult),
neuper@37954
   450
	       Thm ("risolate_root_div",num_str risolate_root_div)       ],
neuper@37954
   451
      scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   452
      "empty_script")
neuper@37954
   453
      }:rls;
neuper@37954
   454
neuper@37954
   455
(*isolate the bound variable in an equation; 'bdv' is a meta-constant*)
neuper@37954
   456
val isolate_bdv =
neuper@37954
   457
    Rls{id = "isolate_bdv", preconds = [], rew_ord = ("e_rew_ord",e_rew_ord),
neuper@37954
   458
	erls=tval_rls,srls = e_rls, calc=[],(*asm_thm = [], *)
neuper@37954
   459
	rules = 
neuper@37954
   460
	[Thm ("risolate_bdv_add",num_str risolate_bdv_add),
neuper@37954
   461
	 Thm ("risolate_bdv_mult_add",num_str risolate_bdv_mult_add),
neuper@37954
   462
	 Thm ("risolate_bdv_mult",num_str risolate_bdv_mult),
neuper@37954
   463
	 Thm ("mult_square",num_str mult_square),
neuper@37954
   464
	 Thm ("constant_square",num_str constant_square),
neuper@37954
   465
	 Thm ("constant_mult_square",num_str constant_mult_square)
neuper@37954
   466
	 ],
neuper@37954
   467
	scr = Script ((term_of o the o (parse thy)) 
neuper@37954
   468
			  "empty_script")
neuper@37954
   469
	}:rls;      
neuper@37954
   470
neuper@37954
   471
neuper@37954
   472
neuper@37954
   473
neuper@37954
   474
(* association list for calculate_, calculate
neuper@37954
   475
   "op +" etc. not usable in scripts *)
neuper@37954
   476
val calclist = 
neuper@37954
   477
    [
neuper@37954
   478
     (*as Tools.ML*)
neuper@37954
   479
     ("Vars"    ,("Tools.Vars"    ,eval_var "#Vars_")),
neuper@37954
   480
     ("matches",("Tools.matches",eval_matches "#matches_")),
neuper@37954
   481
     ("lhs"    ,("Tools.lhs"    ,eval_lhs "")),
neuper@37954
   482
     (*aus Atools.ML*)
neuper@37954
   483
     ("PLUS"    ,("op +"        ,eval_binop "#add_")),
neuper@37954
   484
     ("TIMES"   ,("op *"        ,eval_binop "#mult_")),
neuper@37954
   485
     ("DIVIDE" ,("HOL.divide"  ,eval_cancel "#divide_")),
neuper@37954
   486
     ("POWER"  ,("Atools.pow"  ,eval_binop "#power_")),
neuper@37954
   487
     ("is_const",("Atools.is'_const",eval_const "#is_const_")),
neuper@37954
   488
     ("le"      ,("op <"        ,eval_equ "#less_")),
neuper@37954
   489
     ("leq"     ,("op <="       ,eval_equ "#less_equal_")),
neuper@37954
   490
     ("ident"   ,("Atools.ident",eval_ident "#ident_")),
neuper@37954
   491
     (*von hier (ehem.SqRoot*)
neuper@37954
   492
     ("sqrt"    ,("Root.sqrt"   ,eval_sqrt "#sqrt_")),
neuper@37954
   493
     ("Test.is_root_free",("is'_root'_free", eval_root_free"#is_root_free_")),
neuper@37954
   494
     ("Test.contains_root",("contains'_root",
neuper@37954
   495
			    eval_contains_root"#contains_root_"))
neuper@37954
   496
     ];
neuper@37954
   497
neuper@37954
   498
ruleset' := overwritelthy thy (!ruleset',
neuper@37954
   499
  [("Test_simplify", prep_rls Test_simplify),
neuper@37954
   500
   ("tval_rls", prep_rls tval_rls),
neuper@37954
   501
   ("isolate_root", prep_rls isolate_root),
neuper@37954
   502
   ("isolate_bdv", prep_rls isolate_bdv),
neuper@37954
   503
   ("matches", 
neuper@37954
   504
    prep_rls (append_rls "matches" testerls 
neuper@37954
   505
			 [Calc ("Tools.matches",eval_matches "#matches_")]))
neuper@37954
   506
   ]);
neuper@37954
   507
neuper@37954
   508
(** problem types **)
neuper@37954
   509
store_pbt
neuper@37954
   510
 (prep_pbt (theory "Test") "pbl_test" [] e_pblID
neuper@37954
   511
 (["test"],
neuper@37954
   512
  [],
neuper@37954
   513
  e_rls, NONE, []));
neuper@37954
   514
store_pbt
neuper@37954
   515
 (prep_pbt (theory "Test") "pbl_test_equ" [] e_pblID
neuper@37954
   516
 (["equation","test"],
neuper@37954
   517
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   518
   ("#Where" ,["matches (?a = ?b) e_"]),
neuper@37954
   519
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   520
  ],
neuper@37954
   521
  assoc_rls "matches",
neuper@37954
   522
  SOME "solve (e_::bool, v_)", []));
neuper@37954
   523
neuper@37954
   524
store_pbt
neuper@37954
   525
 (prep_pbt (theory "Test") "pbl_test_uni" [] e_pblID
neuper@37954
   526
 (["univariate","equation","test"],
neuper@37954
   527
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   528
   ("#Where" ,["matches (?a = ?b) e_"]),
neuper@37954
   529
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   530
  ],
neuper@37954
   531
  assoc_rls "matches",
neuper@37954
   532
  SOME "solve (e_::bool, v_)", []));
neuper@37954
   533
neuper@37954
   534
store_pbt
neuper@37954
   535
 (prep_pbt (theory "Test") "pbl_test_uni_lin" [] e_pblID
neuper@37954
   536
 (["linear","univariate","equation","test"],
neuper@37954
   537
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   538
   ("#Where" ,["(matches (   v_ = 0) e_) | (matches (   ?b*v_ = 0) e_) |" ^
neuper@37954
   539
	       "(matches (?a+v_ = 0) e_) | (matches (?a+?b*v_ = 0) e_)  "]),
neuper@37954
   540
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   541
  ],
neuper@37954
   542
  assoc_rls "matches", 
neuper@37954
   543
  SOME "solve (e_::bool, v_)", [["Test","solve_linear"]]));
neuper@37954
   544
neuper@37954
   545
(*25.8.01 ------
neuper@37954
   546
store_pbt
neuper@37954
   547
 (prep_pbt (theory "Test")
neuper@37954
   548
 (["(theory "Test")"],
neuper@37954
   549
  [("#Given" ,"boolTestGiven g_"),
neuper@37954
   550
   ("#Find"  ,"boolTestFind f_")
neuper@37954
   551
  ],
neuper@37954
   552
  []));
neuper@37954
   553
neuper@37954
   554
store_pbt
neuper@37954
   555
 (prep_pbt (theory "Test")
neuper@37954
   556
 (["testeq","(theory "Test")"],
neuper@37954
   557
  [("#Given" ,"boolTestGiven g_"),
neuper@37954
   558
   ("#Find"  ,"boolTestFind f_")
neuper@37954
   559
  ],
neuper@37954
   560
  []));
neuper@37954
   561
neuper@37954
   562
neuper@37954
   563
val ttt = (term_of o the o (parse (theory "Isac"))) "(matches (   v_ = 0) e_)";
neuper@37954
   564
neuper@37954
   565
 ------ 25.8.01*)
neuper@37954
   566
neuper@37954
   567
neuper@37954
   568
(** methods **)
neuper@37954
   569
store_met
neuper@37954
   570
 (prep_met (theory "Diff") "met_test" [] e_metID
neuper@37954
   571
 (["Test"],
neuper@37954
   572
   [],
neuper@37954
   573
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37954
   574
    crls=Atools_erls, nrls=e_rls(*,
neuper@37954
   575
    asm_rls=[],asm_thm=[]*)}, "empty_script"));
neuper@37954
   576
(*
neuper@37954
   577
store_met
neuper@37954
   578
 (prep_met (theory "Script")
neuper@37954
   579
 (e_metID,(*empty method*)
neuper@37954
   580
   [],
neuper@37954
   581
   {rew_ord'="e_rew_ord",rls'=tval_rls,srls=e_rls,prls=e_rls,calc=[],
neuper@37954
   582
    asm_rls=[],asm_thm=[]},
neuper@37954
   583
   "Undef"));*)
neuper@37954
   584
store_met
neuper@37954
   585
 (prep_met (theory "Test") "met_test_solvelin" [] e_metID
neuper@37954
   586
 (["Test","solve_linear"]:metID,
neuper@37954
   587
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   588
    ("#Where" ,["matches (?a = ?b) e_"]),
neuper@37954
   589
    ("#Find"  ,["solutions v_i_"])
neuper@37954
   590
    ],
neuper@37954
   591
   {rew_ord'="e_rew_ord",rls'=tval_rls,srls=e_rls,
neuper@37954
   592
    prls=assoc_rls "matches",
neuper@37954
   593
    calc=[],
neuper@37954
   594
    crls=tval_rls, nrls=Test_simplify},
neuper@37954
   595
 "Script Solve_linear (e_::bool) (v_::real)=             " ^
neuper@37954
   596
 "(let e_ =" ^
neuper@37954
   597
 "  Repeat" ^
neuper@37954
   598
 "    (((Rewrite_Set_Inst [(bdv,v_::real)] isolate_bdv False) @@" ^
neuper@37954
   599
 "      (Rewrite_Set Test_simplify False))) e_" ^
neuper@37954
   600
 " in [e_::bool])"
neuper@37954
   601
 )
neuper@37954
   602
(*, prep_met (theory "Test") (*test for equations*)
neuper@37954
   603
 (["Test","testeq"]:metID,
neuper@37954
   604
  [("#Given" ,["boolTestGiven g_"]),
neuper@37954
   605
   ("#Find"  ,["boolTestFind f_"])
neuper@37954
   606
    ],
neuper@37954
   607
  {rew_ord'="e_rew_ord",rls'="tval_rls",asm_rls=[],
neuper@37954
   608
   asm_thm=[("square_equation_left","")]},
neuper@37954
   609
 "Script Testeq (eq_::bool) =                                         " ^
neuper@37954
   610
   "Repeat                                                            " ^
neuper@37954
   611
   " (let e_ = Try (Repeat (Rewrite rroot_square_inv False eq_));      " ^
neuper@37954
   612
   "      e_ = Try (Repeat (Rewrite square_equation_left True e_)); " ^
neuper@37954
   613
   "      e_ = Try (Repeat (Rewrite rmult_0 False e_))                " ^
neuper@37954
   614
   "   in e_) Until (is_root_free e_)" (*deleted*)
neuper@37954
   615
 )
neuper@37954
   616
, ---------27.4.02*)
neuper@37954
   617
);
neuper@37954
   618
neuper@37954
   619
neuper@37954
   620
neuper@37954
   621
neuper@37954
   622
ruleset' := overwritelthy thy (!ruleset',
neuper@37954
   623
  [("norm_equation", prep_rls norm_equation),
neuper@37954
   624
   ("ac_plus_times", prep_rls ac_plus_times),
neuper@37954
   625
   ("rearrange_assoc", prep_rls rearrange_assoc)
neuper@37954
   626
   ]);
neuper@37954
   627
neuper@37954
   628
neuper@37954
   629
fun bin_o (Const (op_,(Type ("fun",
neuper@37954
   630
	   [Type (s2,[]),Type ("fun",
neuper@37954
   631
	    [Type (s4,tl4),Type (s5,tl5)])])))) = 
neuper@37954
   632
    if (s2=s4)andalso(s4=s5)then[op_]else[]
neuper@37954
   633
    | bin_o _                                   = [];
neuper@37954
   634
neuper@37954
   635
fun bin_op (t1 $ t2) = union op = (bin_op t1) (bin_op t2)
neuper@37954
   636
  | bin_op t         =  bin_o t;
neuper@37954
   637
fun is_bin_op t = ((bin_op t)<>[]);
neuper@37954
   638
neuper@37954
   639
fun bin_op_arg1 ((Const (op_,(Type ("fun",
neuper@37954
   640
	   [Type (s2,[]),Type ("fun",
neuper@37954
   641
	    [Type (s4,tl4),Type (s5,tl5)])]))))$ arg1 $ arg2) = 
neuper@37954
   642
    arg1;
neuper@37954
   643
fun bin_op_arg2 ((Const (op_,(Type ("fun",
neuper@37954
   644
	   [Type (s2,[]),Type ("fun",
neuper@37954
   645
	    [Type (s4,tl4),Type (s5,tl5)])]))))$ arg1 $ arg2) = 
neuper@37954
   646
    arg2;
neuper@37954
   647
neuper@37954
   648
neuper@37954
   649
exception NO_EQUATION_TERM;
neuper@37954
   650
fun is_equation ((Const ("op =",(Type ("fun",
neuper@37954
   651
		 [Type (_,[]),Type ("fun",
neuper@37954
   652
		  [Type (_,[]),Type ("bool",[])])])))) $ _ $ _) 
neuper@37954
   653
                  = true
neuper@37954
   654
  | is_equation _ = false;
neuper@37954
   655
fun equ_lhs ((Const ("op =",(Type ("fun",
neuper@37954
   656
		 [Type (_,[]),Type ("fun",
neuper@37954
   657
		  [Type (_,[]),Type ("bool",[])])])))) $ l $ r) 
neuper@37954
   658
              = l
neuper@37954
   659
  | equ_lhs _ = raise NO_EQUATION_TERM;
neuper@37954
   660
fun equ_rhs ((Const ("op =",(Type ("fun",
neuper@37954
   661
		 [Type (_,[]),Type ("fun",
neuper@37954
   662
		  [Type (_,[]),Type ("bool",[])])])))) $ l $ r) 
neuper@37954
   663
              = r
neuper@37954
   664
  | equ_rhs _ = raise NO_EQUATION_TERM;
neuper@37954
   665
neuper@37954
   666
neuper@37954
   667
fun atom (Const (_,Type (_,[])))           = true
neuper@37954
   668
  | atom (Free  (_,Type (_,[])))           = true
neuper@37954
   669
  | atom (Var   (_,Type (_,[])))           = true
neuper@37954
   670
(*| atom (_     (_,"?DUMMY"   ))           = true ..ML-error *)
neuper@37954
   671
  | atom((Const ("Bin.integ_of_bin",_)) $ _) = true
neuper@37954
   672
  | atom _                                 = false;
neuper@37954
   673
neuper@37954
   674
fun varids (Const  (s,Type (_,[])))         = [strip_thy s]
neuper@37954
   675
  | varids (Free   (s,Type (_,[])))         = if is_no s then []
neuper@37954
   676
					      else [strip_thy s]
neuper@37954
   677
  | varids (Var((s,_),Type (_,[])))         = [strip_thy s]
neuper@37954
   678
(*| varids (_      (s,"?DUMMY"   ))         =   ..ML-error *)
neuper@37954
   679
  | varids((Const ("Bin.integ_of_bin",_)) $ _)= [](*8.01: superfluous?*)
neuper@37954
   680
  | varids (Abs(a,T,t)) = union op = [a] (varids t)
neuper@37954
   681
  | varids (t1 $ t2) = union op = (varids t1) (varids t2)
neuper@37954
   682
  | varids _         = [];
neuper@37954
   683
(*> val t = term_of (hd (parse Diophant.thy "x"));
neuper@37954
   684
val t = Free ("x","?DUMMY") : term
neuper@37954
   685
> varids t;
neuper@37954
   686
val it = [] : string list          [] !!! *)
neuper@37954
   687
neuper@37954
   688
neuper@37954
   689
fun bin_ops_only ((Const op_) $ t1 $ t2) = 
neuper@37954
   690
    if(is_bin_op (Const op_))
neuper@37954
   691
    then(bin_ops_only t1)andalso(bin_ops_only t2)
neuper@37954
   692
    else false
neuper@37954
   693
  | bin_ops_only t =
neuper@37954
   694
    if atom t then true else bin_ops_only t;
neuper@37954
   695
neuper@37954
   696
fun polynomial opl t bdVar = (* bdVar TODO *)
neuper@37954
   697
    subset op = (bin_op t, opl) andalso (bin_ops_only t);
neuper@37954
   698
neuper@37954
   699
fun poly_equ opl bdVar t = is_equation t (* bdVar TODO *) 
neuper@37954
   700
    andalso polynomial opl (equ_lhs t) bdVar 
neuper@37954
   701
    andalso polynomial opl (equ_rhs t) bdVar
neuper@37954
   702
    andalso (subset op = (varids bdVar, varids (equ_lhs t)) orelse
neuper@37954
   703
             subset op = (varids bdVar, varids (equ_lhs t)));
neuper@37954
   704
neuper@37954
   705
(*fun max is =
neuper@37954
   706
    let fun max_ m [] = m 
neuper@37954
   707
	  | max_ m (i::is) = if m<i then max_ i is else max_ m is;
neuper@37954
   708
    in max_ (hd is) is end;
neuper@37954
   709
> max [1,5,3,7,4,2];
neuper@37954
   710
val it = 7 : int  *)
neuper@37954
   711
neuper@37954
   712
fun max (a,b) = if a < b then b else a;
neuper@37954
   713
neuper@37954
   714
fun degree addl mul bdVar t =
neuper@37954
   715
let
neuper@37954
   716
fun deg _ _ v (Const  (s,Type (_,[])))         = if v=strip_thy s then 1 else 0
neuper@37954
   717
  | deg _ _ v (Free   (s,Type (_,[])))         = if v=strip_thy s then 1 else 0
neuper@37954
   718
  | deg _ _ v (Var((s,_),Type (_,[])))         = if v=strip_thy s then 1 else 0
neuper@37954
   719
(*| deg _ _ v (_     (s,"?DUMMY"   ))          =   ..ML-error *) 
neuper@37954
   720
  | deg _ _ v((Const ("Bin.integ_of_bin",_)) $ _ )= 0 
neuper@37954
   721
  | deg addl mul v (h $ t1 $ t2) =
neuper@37954
   722
    if subset op = (bin_op h, addl)
neuper@37954
   723
    then max (deg addl mul v t1  ,deg addl mul v t2)
neuper@37954
   724
    else (*mul!*)(deg addl mul v t1)+(deg addl mul v t2)
neuper@37954
   725
in if polynomial (addl @ [mul]) t bdVar
neuper@37954
   726
   then SOME (deg addl mul (id_of bdVar) t) else (NONE:int option)
neuper@37954
   727
end;
neuper@37954
   728
fun degree_ addl mul bdVar t = (* do not export *)
neuper@37954
   729
    let fun opt (SOME i)= i
neuper@37954
   730
	  | opt  NONE   = 0
neuper@37954
   731
in opt (degree addl mul bdVar t) end;
neuper@37954
   732
neuper@37954
   733
neuper@37954
   734
fun linear addl mul t bdVar = (degree_ addl mul bdVar t)<2;
neuper@37954
   735
neuper@37954
   736
fun linear_equ addl mul bdVar t =
neuper@37954
   737
    if is_equation t 
neuper@37954
   738
    then let val degl = degree_ addl mul bdVar (equ_lhs t);
neuper@37954
   739
	     val degr = degree_ addl mul bdVar (equ_rhs t)
neuper@37954
   740
	 in if (degl>0 orelse degr>0)andalso max(degl,degr)<2
neuper@37954
   741
		then true else false
neuper@37954
   742
	 end
neuper@37954
   743
    else false;
neuper@37954
   744
(* strip_thy op_  before *)
neuper@37954
   745
fun is_div_op (dv,(Const (op_,(Type ("fun",
neuper@37954
   746
	   [Type (s2,[]),Type ("fun",
neuper@37954
   747
	    [Type (s4,tl4),Type (s5,tl5)])])))) )= (dv = strip_thy op_)
neuper@37954
   748
  | is_div_op _ = false;
neuper@37954
   749
neuper@37954
   750
fun is_denom bdVar div_op t =
neuper@37954
   751
    let fun is bool[v]dv (Const  (s,Type(_,[])))= bool andalso(if v=strip_thy s then true else false)
neuper@37954
   752
	  | is bool[v]dv (Free   (s,Type(_,[])))= bool andalso(if v=strip_thy s then true else false) 
neuper@37954
   753
	  | is bool[v]dv (Var((s,_),Type(_,[])))= bool andalso(if v=strip_thy s then true else false)
neuper@37954
   754
	  | is bool[v]dv((Const ("Bin.integ_of_bin",_)) $ _) = false
neuper@37954
   755
	  | is bool[v]dv (h$n$d) = 
neuper@37954
   756
	      if is_div_op(dv,h) 
neuper@37954
   757
	      then (is false[v]dv n)orelse(is true[v]dv d)
neuper@37954
   758
	      else (is bool [v]dv n)orelse(is bool[v]dv d)
neuper@37954
   759
in is false (varids bdVar) (strip_thy div_op) t end;
neuper@37954
   760
neuper@37954
   761
neuper@37954
   762
fun rational t div_op bdVar = 
neuper@37954
   763
    is_denom bdVar div_op t andalso bin_ops_only t;
neuper@37954
   764
neuper@37954
   765
neuper@37954
   766
neuper@37954
   767
(** problem types **)
neuper@37954
   768
neuper@37954
   769
store_pbt
neuper@37954
   770
 (prep_pbt (theory "Test") "pbl_test_uni_plain2" [] e_pblID
neuper@37954
   771
 (["plain_square","univariate","equation","test"],
neuper@37954
   772
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   773
   ("#Where" ,["(matches (?a + ?b*v_ ^^^2 = 0) e_) |" ^
neuper@37954
   774
	       "(matches (     ?b*v_ ^^^2 = 0) e_) |" ^
neuper@37954
   775
	       "(matches (?a +    v_ ^^^2 = 0) e_) |" ^
neuper@37954
   776
	       "(matches (        v_ ^^^2 = 0) e_)"]),
neuper@37954
   777
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   778
  ],
neuper@37954
   779
  assoc_rls "matches", 
neuper@37954
   780
  SOME "solve (e_::bool, v_)", [["Test","solve_plain_square"]]));
neuper@37954
   781
(*
neuper@37954
   782
 val e_ = (term_of o the o (parse thy)) "e_::bool";
neuper@37954
   783
 val ve = (term_of o the o (parse thy)) "4 + 3*x^^^2 = 0";
neuper@37954
   784
 val env = [(e_,ve)];
neuper@37954
   785
neuper@37954
   786
 val pre = (term_of o the o (parse thy))
neuper@37954
   787
	      "(matches (a + b*v_ ^^^2 = 0, e_::bool)) |" ^
neuper@37954
   788
	      "(matches (    b*v_ ^^^2 = 0, e_::bool)) |" ^
neuper@37954
   789
	      "(matches (a +   v_ ^^^2 = 0, e_::bool)) |" ^
neuper@37954
   790
	      "(matches (      v_ ^^^2 = 0, e_::bool))";
neuper@37954
   791
 val prei = subst_atomic env pre;
neuper@37954
   792
 val cpre = (cterm_of thy) prei;
neuper@37954
   793
neuper@37954
   794
 val SOME (ct,_) = rewrite_set_ thy false tval_rls cpre;
neuper@37954
   795
val ct = "True | False | False | False" : cterm 
neuper@37954
   796
neuper@37954
   797
> val SOME (ct,_) = rewrite_ thy sqrt_right tval_rls false or_false ct;
neuper@37954
   798
> val SOME (ct,_) = rewrite_ thy sqrt_right tval_rls false or_false ct;
neuper@37954
   799
> val SOME (ct,_) = rewrite_ thy sqrt_right tval_rls false or_false ct;
neuper@37954
   800
val ct = "True" : cterm
neuper@37954
   801
neuper@37954
   802
*)
neuper@37954
   803
neuper@37954
   804
store_pbt
neuper@37954
   805
 (prep_pbt (theory "Test") "pbl_test_uni_poly" [] e_pblID
neuper@37954
   806
 (["polynomial","univariate","equation","test"],
neuper@37954
   807
  [("#Given" ,["equality (v_ ^^^2 + p_ * v_ + q__ = 0)","solveFor v_"]),
neuper@37954
   808
   ("#Where" ,["False"]),
neuper@37954
   809
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   810
  ],
neuper@37954
   811
  e_rls, SOME "solve (e_::bool, v_)", []));
neuper@37954
   812
neuper@37954
   813
store_pbt
neuper@37954
   814
 (prep_pbt (theory "Test") "pbl_test_uni_poly_deg2" [] e_pblID
neuper@37954
   815
 (["degree_two","polynomial","univariate","equation","test"],
neuper@37954
   816
  [("#Given" ,["equality (v_ ^^^2 + p_ * v_ + q__ = 0)","solveFor v_"]),
neuper@37954
   817
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   818
  ],
neuper@37954
   819
  e_rls, SOME "solve (v_ ^^^2 + p_ * v_ + q__ = 0, v_)", []));
neuper@37954
   820
neuper@37954
   821
store_pbt
neuper@37954
   822
 (prep_pbt (theory "Test") "pbl_test_uni_poly_deg2_pq" [] e_pblID
neuper@37954
   823
 (["pq_formula","degree_two","polynomial","univariate","equation","test"],
neuper@37954
   824
  [("#Given" ,["equality (v_ ^^^2 + p_ * v_ + q__ = 0)","solveFor v_"]),
neuper@37954
   825
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   826
  ],
neuper@37954
   827
  e_rls, SOME "solve (v_ ^^^2 + p_ * v_ + q__ = 0, v_)", []));
neuper@37954
   828
neuper@37954
   829
store_pbt
neuper@37954
   830
 (prep_pbt (theory "Test") "pbl_test_uni_poly_deg2_abc" [] e_pblID
neuper@37954
   831
 (["abc_formula","degree_two","polynomial","univariate","equation","test"],
neuper@37954
   832
  [("#Given" ,["equality (a_ * x ^^^2 + b_ * x + c_ = 0)","solveFor v_"]),
neuper@37954
   833
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   834
  ],
neuper@37954
   835
  e_rls, SOME "solve (a_ * x ^^^2 + b_ * x + c_ = 0, v_)", []));
neuper@37954
   836
neuper@37954
   837
store_pbt
neuper@37954
   838
 (prep_pbt (theory "Test") "pbl_test_uni_root" [] e_pblID
neuper@37954
   839
 (["squareroot","univariate","equation","test"],
neuper@37954
   840
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   841
   ("#Where" ,["contains_root (e_::bool)"]),
neuper@37954
   842
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   843
  ],
neuper@37954
   844
  append_rls "contains_root" e_rls [Calc ("Test.contains'_root",
neuper@37954
   845
			  eval_contains_root "#contains_root_")], 
neuper@37954
   846
  SOME "solve (e_::bool, v_)", [["Test","square_equation"]]));
neuper@37954
   847
neuper@37954
   848
store_pbt
neuper@37954
   849
 (prep_pbt (theory "Test") "pbl_test_uni_norm" [] e_pblID
neuper@37954
   850
 (["normalize","univariate","equation","test"],
neuper@37954
   851
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   852
   ("#Where" ,[]),
neuper@37954
   853
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   854
  ],
neuper@37954
   855
  e_rls, SOME "solve (e_::bool, v_)", [["Test","norm_univar_equation"]]));
neuper@37954
   856
neuper@37954
   857
store_pbt
neuper@37954
   858
 (prep_pbt (theory "Test") "pbl_test_uni_roottest" [] e_pblID
neuper@37954
   859
 (["sqroot-test","univariate","equation","test"],
neuper@37954
   860
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   861
   (*("#Where" ,["contains_root (e_::bool)"]),*)
neuper@37954
   862
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
   863
  ],
neuper@37954
   864
  e_rls, SOME "solve (e_::bool, v_)", []));
neuper@37954
   865
neuper@37954
   866
(*
neuper@37954
   867
(#ppc o get_pbt) ["sqroot-test","univariate","equation"];
neuper@37954
   868
  *)
neuper@37954
   869
neuper@37954
   870
neuper@37954
   871
store_met
neuper@37954
   872
 (prep_met (theory "Test")  "met_test_sqrt" [] e_metID
neuper@37954
   873
(*root-equation, version for tests before 8.01.01*)
neuper@37954
   874
 (["Test","sqrt-equ-test"]:metID,
neuper@37954
   875
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   876
   ("#Where" ,["contains_root (e_::bool)"]),
neuper@37954
   877
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   878
   ],
neuper@37954
   879
  {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
   880
   srls =append_rls "srls_contains_root" e_rls 
neuper@37954
   881
		    [Calc ("Test.contains'_root",eval_contains_root "")],
neuper@37954
   882
   prls =append_rls "prls_contains_root" e_rls 
neuper@37954
   883
		    [Calc ("Test.contains'_root",eval_contains_root "")],
neuper@37954
   884
   calc=[],
neuper@37954
   885
   crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
   886
   asm_thm=[("square_equation_left",""),
neuper@37954
   887
	    ("square_equation_right","")]*)},
neuper@37954
   888
 "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
   889
 "(let e_ = " ^
neuper@37954
   890
 "   ((While (contains_root e_) Do" ^
neuper@37954
   891
 "      ((Rewrite square_equation_left True) @@" ^
neuper@37954
   892
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
   893
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
   894
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
   895
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
   896
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
   897
 "    (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
   898
 "    (Rewrite_Set_Inst [(bdv,v_::real)] isolate_bdv False) @@" ^
neuper@37954
   899
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
   900
 "   e_" ^
neuper@37954
   901
 " in [e_::bool])"
neuper@37954
   902
  ));
neuper@37954
   903
neuper@37954
   904
store_met
neuper@37954
   905
 (prep_met (theory "Test")  "met_test_sqrt2" [] e_metID
neuper@37954
   906
(*root-equation ... for test-*.sml until 8.01*)
neuper@37954
   907
 (["Test","squ-equ-test2"]:metID,
neuper@37954
   908
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   909
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   910
   ],
neuper@37954
   911
  {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
   912
   srls = append_rls "srls_contains_root" e_rls 
neuper@37954
   913
		     [Calc ("Test.contains'_root",eval_contains_root"")],
neuper@37954
   914
   prls=e_rls,calc=[],
neuper@37954
   915
   crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
   916
   asm_thm=[("square_equation_left",""),
neuper@37954
   917
	    ("square_equation_right","")]*)},
neuper@37954
   918
 "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
   919
 "(let e_ = " ^
neuper@37954
   920
 "   ((While (contains_root e_) Do" ^
neuper@37954
   921
 "      ((Rewrite square_equation_left True) @@" ^
neuper@37954
   922
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
   923
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
   924
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
   925
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
   926
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
   927
 "    (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
   928
 "    (Rewrite_Set_Inst [(bdv,v_::real)] isolate_bdv False) @@" ^
neuper@37954
   929
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
   930
 "   e_;" ^
neuper@37954
   931
 "  (L_::bool list) = Tac subproblem_equation_dummy;          " ^
neuper@37954
   932
 "  L_ = Tac solve_equation_dummy                             " ^
neuper@37954
   933
 "  in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
   934
  ));
neuper@37954
   935
neuper@37954
   936
store_met
neuper@37954
   937
 (prep_met (theory "Test") "met_test_squ_sub" [] e_metID
neuper@37954
   938
(*tests subproblem fixed linear*)
neuper@37954
   939
 (["Test","squ-equ-test-subpbl1"]:metID,
neuper@37954
   940
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   941
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   942
   ],
neuper@37954
   943
  {rew_ord'="e_rew_ord",rls'=tval_rls,srls=e_rls,prls=e_rls,calc=[],
neuper@37954
   944
    crls=tval_rls, nrls=Test_simplify},
neuper@37954
   945
  "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
   946
   " (let e_ = ((Try (Rewrite_Set norm_equation False)) @@              " ^
neuper@37954
   947
   "            (Try (Rewrite_Set Test_simplify False))) e_;              " ^
neuper@37954
   948
   "(L_::bool list) = (SubProblem (Test_,[linear,univariate,equation,test]," ^
neuper@37954
   949
   "                    [Test,solve_linear]) [bool_ e_, real_ v_])" ^
neuper@37954
   950
   "in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
   951
  ));
neuper@37954
   952
neuper@37954
   953
store_met
neuper@37954
   954
 (prep_met (theory "Test") "met_test_squ_sub2" [] e_metID
neuper@37954
   955
 (*tests subproblem fixed degree 2*)
neuper@37954
   956
 (["Test","squ-equ-test-subpbl2"]:metID,
neuper@37954
   957
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   958
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   959
   ],
neuper@37954
   960
  {rew_ord'="e_rew_ord",rls'=tval_rls,srls=e_rls,prls=e_rls,calc=[],
neuper@37954
   961
    crls=tval_rls, nrls=e_rls(*,
neuper@37954
   962
   asm_rls=[],asm_thm=[("square_equation_left",""),
neuper@37954
   963
	    ("square_equation_right","")]*)},
neuper@37954
   964
   "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
   965
   " (let e_ = Try (Rewrite_Set norm_equation False) e_;              " ^
neuper@37954
   966
   "(L_::bool list) = (SubProblem (Test_,[linear,univariate,equation,test]," ^
neuper@37954
   967
   "                    [Test,solve_by_pq_formula]) [bool_ e_, real_ v_])" ^
neuper@37954
   968
   "in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
   969
   )); 
neuper@37954
   970
neuper@37954
   971
store_met
neuper@37954
   972
 (prep_met (theory "Test") "met_test_squ_nonterm" [] e_metID
neuper@37954
   973
 (*root-equation: see foils..., but notTerminating*)
neuper@37954
   974
 (["Test","square_equation...notTerminating"]:metID,
neuper@37954
   975
  [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
   976
   ("#Find"  ,["solutions v_i_"])
neuper@37954
   977
   ],
neuper@37954
   978
  {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
   979
   srls = append_rls "srls_contains_root" e_rls 
neuper@37954
   980
		     [Calc ("Test.contains'_root",eval_contains_root"")],
neuper@37954
   981
   prls=e_rls,calc=[],
neuper@37954
   982
    crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
   983
   asm_thm=[("square_equation_left",""),
neuper@37954
   984
	    ("square_equation_right","")]*)},
neuper@37954
   985
 "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
   986
 "(let e_ = " ^
neuper@37954
   987
 "   ((While (contains_root e_) Do" ^
neuper@37954
   988
 "      ((Rewrite square_equation_left True) @@" ^
neuper@37954
   989
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
   990
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
   991
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
   992
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
   993
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
   994
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
   995
 "   e_;" ^
neuper@37954
   996
 "  (L_::bool list) =                                        " ^
neuper@37954
   997
 "    (SubProblem (Test_,[linear,univariate,equation,test]," ^
neuper@37954
   998
 "                 [Test,solve_linear]) [bool_ e_, real_ v_])" ^
neuper@37954
   999
 "in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
  1000
  ));
neuper@37954
  1001
neuper@37954
  1002
store_met
neuper@37954
  1003
 (prep_met (theory "Test")  "met_test_eq1" [] e_metID
neuper@37954
  1004
(*root-equation1:*)
neuper@37954
  1005
 (["Test","square_equation1"]:metID,
neuper@37954
  1006
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
  1007
    ("#Find"  ,["solutions v_i_"])
neuper@37954
  1008
    ],
neuper@37954
  1009
   {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
  1010
   srls = append_rls "srls_contains_root" e_rls 
neuper@37954
  1011
		     [Calc ("Test.contains'_root",eval_contains_root"")],
neuper@37954
  1012
   prls=e_rls,calc=[],
neuper@37954
  1013
    crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
  1014
   asm_thm=[("square_equation_left",""),
neuper@37954
  1015
	    ("square_equation_right","")]*)},
neuper@37954
  1016
 "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
  1017
 "(let e_ = " ^
neuper@37954
  1018
 "   ((While (contains_root e_) Do" ^
neuper@37954
  1019
 "      ((Rewrite square_equation_left True) @@" ^
neuper@37954
  1020
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
  1021
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
  1022
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
  1023
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
  1024
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
  1025
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
  1026
 "   e_;" ^
neuper@37954
  1027
 "  (L_::bool list) = (SubProblem (Test_,[linear,univariate,equation,test]," ^
neuper@37954
  1028
 "                    [Test,solve_linear]) [bool_ e_, real_ v_])" ^
neuper@37954
  1029
 "  in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
  1030
  ));
neuper@37954
  1031
neuper@37954
  1032
store_met
neuper@37954
  1033
 (prep_met (theory "Test") "met_test_squ2" [] e_metID
neuper@37954
  1034
 (*root-equation2*)
neuper@37954
  1035
 (["Test","square_equation2"]:metID,
neuper@37954
  1036
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
  1037
    ("#Find"  ,["solutions v_i_"])
neuper@37954
  1038
    ],
neuper@37954
  1039
   {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
  1040
   srls = append_rls "srls_contains_root" e_rls 
neuper@37954
  1041
		     [Calc ("Test.contains'_root",eval_contains_root"")],
neuper@37954
  1042
   prls=e_rls,calc=[],
neuper@37954
  1043
    crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
  1044
   asm_thm=[("square_equation_left",""),
neuper@37954
  1045
	    ("square_equation_right","")]*)},
neuper@37954
  1046
 "Script Solve_root_equation (e_::bool) (v_::real)  =  " ^
neuper@37954
  1047
 "(let e_ = " ^
neuper@37954
  1048
 "   ((While (contains_root e_) Do" ^
neuper@37954
  1049
 "      (((Rewrite square_equation_left True) Or " ^
neuper@37954
  1050
 "        (Rewrite square_equation_right True)) @@" ^
neuper@37954
  1051
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
  1052
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
  1053
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
  1054
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
  1055
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
  1056
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
  1057
 "   e_;" ^
neuper@37954
  1058
 "  (L_::bool list) = (SubProblem (Test_,[plain_square,univariate,equation,test]," ^
neuper@37954
  1059
 "                    [Test,solve_plain_square]) [bool_ e_, real_ v_])" ^
neuper@37954
  1060
 "  in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
  1061
  ));
neuper@37954
  1062
neuper@37954
  1063
store_met
neuper@37954
  1064
 (prep_met (theory "Test") "met_test_squeq" [] e_metID
neuper@37954
  1065
 (*root-equation*)
neuper@37954
  1066
 (["Test","square_equation"]:metID,
neuper@37954
  1067
   [("#Given" ,["equality e_","solveFor v_"]),
neuper@37954
  1068
    ("#Find"  ,["solutions v_i_"])
neuper@37954
  1069
    ],
neuper@37954
  1070
   {rew_ord'="e_rew_ord",rls'=tval_rls,
neuper@37954
  1071
   srls = append_rls "srls_contains_root" e_rls 
neuper@37954
  1072
		     [Calc ("Test.contains'_root",eval_contains_root"")],
neuper@37954
  1073
   prls=e_rls,calc=[],
neuper@37954
  1074
    crls=tval_rls, nrls=e_rls(*,asm_rls=[],
neuper@37954
  1075
   asm_thm=[("square_equation_left",""),
neuper@37954
  1076
	    ("square_equation_right","")]*)},
neuper@37954
  1077
 "Script Solve_root_equation (e_::bool) (v_::real) =  " ^
neuper@37954
  1078
 "(let e_ = " ^
neuper@37954
  1079
 "   ((While (contains_root e_) Do" ^
neuper@37954
  1080
 "      (((Rewrite square_equation_left True) Or" ^
neuper@37954
  1081
 "        (Rewrite square_equation_right True)) @@" ^
neuper@37954
  1082
 "       (Try (Rewrite_Set Test_simplify False)) @@" ^
neuper@37954
  1083
 "       (Try (Rewrite_Set rearrange_assoc False)) @@" ^
neuper@37954
  1084
 "       (Try (Rewrite_Set isolate_root False)) @@" ^
neuper@37954
  1085
 "       (Try (Rewrite_Set Test_simplify False)))) @@" ^
neuper@37954
  1086
 "    (Try (Rewrite_Set norm_equation False)) @@" ^
neuper@37954
  1087
 "    (Try (Rewrite_Set Test_simplify False)))" ^
neuper@37954
  1088
 "   e_;" ^
neuper@37954
  1089
 "  (L_::bool list) = (SubProblem (Test_,[univariate,equation,test]," ^
neuper@37954
  1090
 "                    [no_met]) [bool_ e_, real_ v_])" ^
neuper@37954
  1091
 "  in Check_elementwise L_ {(v_::real). Assumptions})"
neuper@37954
  1092
  ) ); (*#######*)
neuper@37954
  1093
neuper@37954
  1094
store_met
neuper@37954
  1095
 (prep_met (theory "Test") "met_test_eq_plain" [] e_metID
neuper@37954
  1096
 (*solve_plain_square*)
neuper@37954
  1097
 (["Test","solve_plain_square"]:metID,
neuper@37954
  1098
   [("#Given",["equality e_","solveFor v_"]),
neuper@37954
  1099
   ("#Where" ,["(matches (?a + ?b*v_ ^^^2 = 0) e_) |" ^
neuper@37954
  1100
	       "(matches (     ?b*v_ ^^^2 = 0) e_) |" ^
neuper@37954
  1101
	       "(matches (?a +    v_ ^^^2 = 0) e_) |" ^
neuper@37954
  1102
	       "(matches (        v_ ^^^2 = 0) e_)"]), 
neuper@37954
  1103
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
  1104
   ],
neuper@37954
  1105
   {rew_ord'="e_rew_ord",rls'=tval_rls,calc=[],srls=e_rls,
neuper@37954
  1106
    prls = assoc_rls "matches",
neuper@37954
  1107
    crls=tval_rls, nrls=e_rls(*,
neuper@37954
  1108
    asm_rls=[],asm_thm=[]*)},
neuper@37954
  1109
  "Script Solve_plain_square (e_::bool) (v_::real) =           " ^
neuper@37954
  1110
   " (let e_ = ((Try (Rewrite_Set isolate_bdv False)) @@         " ^
neuper@37954
  1111
   "            (Try (Rewrite_Set Test_simplify False)) @@     " ^
neuper@37954
  1112
   "            ((Rewrite square_equality_0 False) Or        " ^
neuper@37954
  1113
   "             (Rewrite square_equality True)) @@            " ^
neuper@37954
  1114
   "            (Try (Rewrite_Set tval_rls False))) e_             " ^
neuper@37954
  1115
   "  in ((Or_to_List e_)::bool list))"
neuper@37954
  1116
 ));
neuper@37954
  1117
neuper@37954
  1118
store_met
neuper@37954
  1119
 (prep_met (theory "Test") "met_test_norm_univ" [] e_metID
neuper@37954
  1120
 (["Test","norm_univar_equation"]:metID,
neuper@37954
  1121
   [("#Given",["equality e_","solveFor v_"]),
neuper@37954
  1122
   ("#Where" ,[]), 
neuper@37954
  1123
   ("#Find"  ,["solutions v_i_"]) 
neuper@37954
  1124
   ],
neuper@37954
  1125
   {rew_ord'="e_rew_ord",rls'=tval_rls,srls = e_rls,prls=e_rls,
neuper@37954
  1126
   calc=[],
neuper@37954
  1127
    crls=tval_rls, nrls=e_rls(*,asm_rls=[],asm_thm=[]*)},
neuper@37954
  1128
  "Script Norm_univar_equation (e_::bool) (v_::real) =      " ^
neuper@37954
  1129
   " (let e_ = ((Try (Rewrite rnorm_equation_add False)) @@   " ^
neuper@37954
  1130
   "            (Try (Rewrite_Set Test_simplify False))) e_   " ^
neuper@37954
  1131
   "  in (SubProblem (Test_,[univariate,equation,test],         " ^
neuper@37954
  1132
   "                    [no_met]) [bool_ e_, real_ v_]))"
neuper@37954
  1133
 ));
neuper@37954
  1134
neuper@37954
  1135
neuper@37954
  1136
neuper@37954
  1137
(*17.9.02 aus SqRoot.ML------------------------------^^^---*)  
neuper@37954
  1138
neuper@37954
  1139
(*8.4.03  aus Poly.ML--------------------------------vvv---
neuper@37954
  1140
  make_polynomial  ---> make_poly
neuper@37954
  1141
  ^-- for user          ^-- for systest _ONLY_*)  
neuper@37954
  1142
neuper@37954
  1143
local (*. for make_polytest .*)
neuper@37954
  1144
neuper@37954
  1145
open Term;  (* for type order = EQUAL | LESS | GREATER *)
neuper@37954
  1146
neuper@37954
  1147
fun pr_ord EQUAL = "EQUAL"
neuper@37954
  1148
  | pr_ord LESS  = "LESS"
neuper@37954
  1149
  | pr_ord GREATER = "GREATER";
neuper@37954
  1150
neuper@37954
  1151
fun dest_hd' (Const (a, T)) =                          (* ~ term.ML *)
neuper@37954
  1152
  (case a of
neuper@37954
  1153
     "Atools.pow" => ((("|||||||||||||", 0), T), 0)           (*WN greatest *)
neuper@37954
  1154
   | _ => (((a, 0), T), 0))
neuper@37954
  1155
  | dest_hd' (Free (a, T)) = (((a, 0), T), 1)
neuper@37954
  1156
  | dest_hd' (Var v) = (v, 2)
neuper@37954
  1157
  | dest_hd' (Bound i) = ((("", i), dummyT), 3)
neuper@37954
  1158
  | dest_hd' (Abs (_, T, _)) = ((("", 0), T), 4);
neuper@37954
  1159
(* RL *)
neuper@37954
  1160
fun get_order_pow (t $ (Free(order,_))) = 
neuper@37954
  1161
    	(case int_of_str (order) of
neuper@37954
  1162
	             SOME d => d
neuper@37954
  1163
		   | NONE   => 0)
neuper@37954
  1164
  | get_order_pow _ = 0;
neuper@37954
  1165
neuper@37954
  1166
fun size_of_term' (Const(str,_) $ t) =
neuper@37954
  1167
  if "Atools.pow"=str then 1000 + size_of_term' t else 1 + size_of_term' t(*WN*)
neuper@37954
  1168
  | size_of_term' (Abs (_,_,body)) = 1 + size_of_term' body
neuper@37954
  1169
  | size_of_term' (f$t) = size_of_term' f  +  size_of_term' t
neuper@37954
  1170
  | size_of_term' _ = 1;
neuper@37954
  1171
neuper@37954
  1172
fun term_ord' pr thy (Abs (_, T, t), Abs(_, U, u)) =       (* ~ term.ML *)
neuper@37954
  1173
      (case term_ord' pr thy (t, u) of EQUAL => typ_ord (T, U) | ord => ord)
neuper@37954
  1174
  | term_ord' pr thy (t, u) =
neuper@37954
  1175
      (if pr then 
neuper@37954
  1176
	 let
neuper@37954
  1177
	   val (f, ts) = strip_comb t and (g, us) = strip_comb u;
neuper@37954
  1178
	   val _=writeln("t= f@ts= " ^ "" ^
neuper@37954
  1179
	      ((Syntax.string_of_term (thy2ctxt thy)) f)^ "\" @ " ^ "[" ^
neuper@37954
  1180
	      (commas(map(Syntax.string_of_term (thy2ctxt thy)) ts)) ^ "]""");
neuper@37954
  1181
	   val _=writeln("u= g@us= " ^ "" ^
neuper@37954
  1182
	      ((Syntax.string_of_term (thy2ctxt thy)) g) ^ "\" @ " ^ "[" ^
neuper@37954
  1183
	      (commas(map(Syntax.string_of_term (thy2ctxt thy)) us))^"]""");
neuper@37954
  1184
	   val _=writeln("size_of_term(t,u)= ("^
neuper@37954
  1185
	      (string_of_int(size_of_term' t)) ^ ", " ^
neuper@37954
  1186
	      (string_of_int(size_of_term' u)) ^ ")");
neuper@37954
  1187
	   val _=writeln("hd_ord(f,g)      = " ^ ((pr_ord o hd_ord)(f,g)));
neuper@37954
  1188
	   val _=writeln("terms_ord(ts,us) = " ^
neuper@37954
  1189
			   ((pr_ord o terms_ord str false)(ts,us)));
neuper@37954
  1190
	   val _=writeln("-------");
neuper@37954
  1191
	 in () end
neuper@37954
  1192
       else ();
neuper@37954
  1193
	 case int_ord (size_of_term' t, size_of_term' u) of
neuper@37954
  1194
	   EQUAL =>
neuper@37954
  1195
	     let val (f, ts) = strip_comb t and (g, us) = strip_comb u in
neuper@37954
  1196
	       (case hd_ord (f, g) of EQUAL => (terms_ord str pr) (ts, us) 
neuper@37954
  1197
	     | ord => ord)
neuper@37954
  1198
	     end
neuper@37954
  1199
	 | ord => ord)
neuper@37954
  1200
and hd_ord (f, g) =                                        (* ~ term.ML *)
neuper@37954
  1201
  prod_ord (prod_ord indexname_ord typ_ord) int_ord (dest_hd' f, dest_hd' g)
neuper@37954
  1202
and terms_ord str pr (ts, us) = 
neuper@37954
  1203
    list_ord (term_ord' pr (assoc_thy "Isac.thy"))(ts, us);
neuper@37954
  1204
in
neuper@37954
  1205
neuper@37954
  1206
fun ord_make_polytest (pr:bool) thy (_:subst) tu = 
neuper@37954
  1207
    (term_ord' pr thy(***) tu = LESS );
neuper@37954
  1208
neuper@37954
  1209
end;(*local*)
neuper@37954
  1210
neuper@37954
  1211
rew_ord' := overwritel (!rew_ord',
neuper@37954
  1212
[("termlessI", termlessI),
neuper@37954
  1213
 ("ord_make_polytest", ord_make_polytest false thy)
neuper@37954
  1214
 ]);
neuper@37954
  1215
neuper@37954
  1216
(*WN060510 this was a preparation for prep_rls ...
neuper@37954
  1217
val scr_make_polytest = 
neuper@37954
  1218
"Script Expand_binomtest t_ =" ^
neuper@37954
  1219
"(Repeat                       " ^
neuper@37954
  1220
"((Try (Repeat (Rewrite real_diff_minus         False))) @@ " ^ 
neuper@37954
  1221
neuper@37954
  1222
" (Try (Repeat (Rewrite real_add_mult_distrib   False))) @@ " ^	 
neuper@37954
  1223
" (Try (Repeat (Rewrite real_add_mult_distrib2  False))) @@ " ^	
neuper@37954
  1224
" (Try (Repeat (Rewrite real_diff_mult_distrib  False))) @@ " ^	
neuper@37954
  1225
" (Try (Repeat (Rewrite real_diff_mult_distrib2 False))) @@ " ^	
neuper@37954
  1226
neuper@37954
  1227
" (Try (Repeat (Rewrite real_mult_1             False))) @@ " ^		   
neuper@37954
  1228
" (Try (Repeat (Rewrite real_mult_0             False))) @@ " ^		   
neuper@37954
  1229
" (Try (Repeat (Rewrite real_add_zero_left      False))) @@ " ^	 
neuper@37954
  1230
neuper@37954
  1231
" (Try (Repeat (Rewrite real_mult_commute       False))) @@ " ^		
neuper@37954
  1232
" (Try (Repeat (Rewrite real_mult_left_commute  False))) @@ " ^	
neuper@37954
  1233
" (Try (Repeat (Rewrite real_mult_assoc         False))) @@ " ^		
neuper@37954
  1234
" (Try (Repeat (Rewrite real_add_commute        False))) @@ " ^		
neuper@37954
  1235
" (Try (Repeat (Rewrite real_add_left_commute   False))) @@ " ^	 
neuper@37954
  1236
" (Try (Repeat (Rewrite real_add_assoc          False))) @@ " ^	 
neuper@37954
  1237
neuper@37954
  1238
" (Try (Repeat (Rewrite sym_realpow_twoI        False))) @@ " ^	 
neuper@37954
  1239
" (Try (Repeat (Rewrite realpow_plus_1          False))) @@ " ^	 
neuper@37954
  1240
" (Try (Repeat (Rewrite sym_real_mult_2         False))) @@ " ^		
neuper@37954
  1241
" (Try (Repeat (Rewrite real_mult_2_assoc       False))) @@ " ^		
neuper@37954
  1242
neuper@37954
  1243
" (Try (Repeat (Rewrite real_num_collect        False))) @@ " ^		
neuper@37954
  1244
" (Try (Repeat (Rewrite real_num_collect_assoc  False))) @@ " ^	
neuper@37954
  1245
neuper@37954
  1246
" (Try (Repeat (Rewrite real_one_collect        False))) @@ " ^		
neuper@37954
  1247
" (Try (Repeat (Rewrite real_one_collect_assoc  False))) @@ " ^   
neuper@37954
  1248
neuper@37954
  1249
" (Try (Repeat (Calculate plus  ))) @@ " ^
neuper@37954
  1250
" (Try (Repeat (Calculate times ))) @@ " ^
neuper@37954
  1251
" (Try (Repeat (Calculate power_)))) " ^  
neuper@37954
  1252
" t_)";
neuper@37954
  1253
-----------------------------------------------------*)
neuper@37954
  1254
neuper@37954
  1255
val make_polytest =
neuper@37954
  1256
  Rls{id = "make_polytest", preconds = []:term list, 
neuper@37954
  1257
      rew_ord = ("ord_make_polytest", ord_make_polytest false (theory "Poly")),
neuper@37954
  1258
      erls = testerls, srls = Erls,
neuper@37954
  1259
      calc = [("PLUS"  , ("op +", eval_binop "#add_")), 
neuper@37954
  1260
	      ("TIMES" , ("op *", eval_binop "#mult_")),
neuper@37954
  1261
	      ("POWER", ("Atools.pow", eval_binop "#power_"))
neuper@37954
  1262
	      ],
neuper@37954
  1263
      (*asm_thm = [],*)
neuper@37954
  1264
      rules = [Thm ("real_diff_minus",num_str real_diff_minus),
neuper@37954
  1265
	       (*"a - b = a + (-1) * b"*)
neuper@37954
  1266
	       Thm ("real_add_mult_distrib" ,num_str real_add_mult_distrib),
neuper@37954
  1267
	       (*"(z1.0 + z2.0) * w = z1.0 * w + z2.0 * w"*)
neuper@37954
  1268
	       Thm ("real_add_mult_distrib2",num_str real_add_mult_distrib2),
neuper@37954
  1269
	       (*"w * (z1.0 + z2.0) = w * z1.0 + w * z2.0"*)
neuper@37954
  1270
	       Thm ("real_diff_mult_distrib" ,num_str real_diff_mult_distrib),
neuper@37954
  1271
	       (*"(z1.0 - z2.0) * w = z1.0 * w - z2.0 * w"*)
neuper@37954
  1272
	       Thm ("real_diff_mult_distrib2",num_str real_diff_mult_distrib2),
neuper@37954
  1273
	       (*"w * (z1.0 - z2.0) = w * z1.0 - w * z2.0"*)
neuper@37954
  1274
	       Thm ("real_mult_1",num_str real_mult_1),                 
neuper@37954
  1275
	       (*"1 * z = z"*)
neuper@37954
  1276
	       Thm ("real_mult_0",num_str real_mult_0),        
neuper@37954
  1277
	       (*"0 * z = 0"*)
neuper@37954
  1278
	       Thm ("real_add_zero_left",num_str real_add_zero_left),
neuper@37954
  1279
	       (*"0 + z = z"*)
neuper@37954
  1280
neuper@37954
  1281
	       (*AC-rewriting*)
neuper@37954
  1282
	       Thm ("real_mult_commute",num_str real_mult_commute),
neuper@37954
  1283
	       (* z * w = w * z *)
neuper@37954
  1284
	       Thm ("real_mult_left_commute",num_str real_mult_left_commute),
neuper@37954
  1285
	       (*z1.0 * (z2.0 * z3.0) = z2.0 * (z1.0 * z3.0)*)
neuper@37954
  1286
	       Thm ("real_mult_assoc",num_str real_mult_assoc),		
neuper@37954
  1287
	       (*z1.0 * z2.0 * z3.0 = z1.0 * (z2.0 * z3.0)*)
neuper@37954
  1288
	       Thm ("real_add_commute",num_str real_add_commute),	
neuper@37954
  1289
	       (*z + w = w + z*)
neuper@37954
  1290
	       Thm ("real_add_left_commute",num_str real_add_left_commute),
neuper@37954
  1291
	       (*x + (y + z) = y + (x + z)*)
neuper@37954
  1292
	       Thm ("real_add_assoc",num_str real_add_assoc),	               
neuper@37954
  1293
	       (*z1.0 + z2.0 + z3.0 = z1.0 + (z2.0 + z3.0)*)
neuper@37954
  1294
neuper@37954
  1295
	       Thm ("sym_realpow_twoI",num_str (realpow_twoI RS sym)),	
neuper@37954
  1296
	       (*"r1 * r1 = r1 ^^^ 2"*)
neuper@37954
  1297
	       Thm ("realpow_plus_1",num_str realpow_plus_1),		
neuper@37954
  1298
	       (*"r * r ^^^ n = r ^^^ (n + 1)"*)
neuper@37954
  1299
	       Thm ("sym_real_mult_2",num_str (real_mult_2 RS sym)),	
neuper@37954
  1300
	       (*"z1 + z1 = 2 * z1"*)
neuper@37954
  1301
	       Thm ("real_mult_2_assoc",num_str real_mult_2_assoc),	
neuper@37954
  1302
	       (*"z1 + (z1 + k) = 2 * z1 + k"*)
neuper@37954
  1303
neuper@37954
  1304
	       Thm ("real_num_collect",num_str real_num_collect), 
neuper@37954
  1305
	       (*"[| l is_const; m is_const |]==>l * n + m * n = (l + m) * n"*)
neuper@37954
  1306
	       Thm ("real_num_collect_assoc",num_str real_num_collect_assoc),
neuper@37954
  1307
	       (*"[| l is_const; m is_const |] ==>  
neuper@37954
  1308
				l * n + (m * n + k) =  (l + m) * n + k"*)
neuper@37954
  1309
	       Thm ("real_one_collect",num_str real_one_collect),	
neuper@37954
  1310
	       (*"m is_const ==> n + m * n = (1 + m) * n"*)
neuper@37954
  1311
	       Thm ("real_one_collect_assoc",num_str real_one_collect_assoc), 
neuper@37954
  1312
	       (*"m is_const ==> k + (n + m * n) = k + (1 + m) * n"*)
neuper@37954
  1313
neuper@37954
  1314
	       Calc ("op +", eval_binop "#add_"), 
neuper@37954
  1315
	       Calc ("op *", eval_binop "#mult_"),
neuper@37954
  1316
	       Calc ("Atools.pow", eval_binop "#power_")
neuper@37954
  1317
	       ],
neuper@37954
  1318
      scr = EmptyScr(*Script ((term_of o the o (parse thy)) 
neuper@37954
  1319
      scr_make_polytest)*)
neuper@37954
  1320
      }:rls;      
neuper@37954
  1321
(*WN060510 this was done before 'fun prep_rls' ...
neuper@37954
  1322
val scr_expand_binomtest =
neuper@37954
  1323
"Script Expand_binomtest t_ =" ^
neuper@37954
  1324
"(Repeat                       " ^
neuper@37954
  1325
"((Try (Repeat (Rewrite real_plus_binom_pow2    False))) @@ " ^
neuper@37954
  1326
" (Try (Repeat (Rewrite real_plus_binom_times   False))) @@ " ^
neuper@37954
  1327
" (Try (Repeat (Rewrite real_minus_binom_pow2   False))) @@ " ^
neuper@37954
  1328
" (Try (Repeat (Rewrite real_minus_binom_times  False))) @@ " ^
neuper@37954
  1329
" (Try (Repeat (Rewrite real_plus_minus_binom1  False))) @@ " ^
neuper@37954
  1330
" (Try (Repeat (Rewrite real_plus_minus_binom2  False))) @@ " ^
neuper@37954
  1331
neuper@37954
  1332
" (Try (Repeat (Rewrite real_mult_1             False))) @@ " ^
neuper@37954
  1333
" (Try (Repeat (Rewrite real_mult_0             False))) @@ " ^
neuper@37954
  1334
" (Try (Repeat (Rewrite real_add_zero_left      False))) @@ " ^
neuper@37954
  1335
neuper@37954
  1336
" (Try (Repeat (Calculate plus  ))) @@ " ^
neuper@37954
  1337
" (Try (Repeat (Calculate times ))) @@ " ^
neuper@37954
  1338
" (Try (Repeat (Calculate power_))) @@ " ^
neuper@37954
  1339
neuper@37954
  1340
" (Try (Repeat (Rewrite sym_realpow_twoI        False))) @@ " ^
neuper@37954
  1341
" (Try (Repeat (Rewrite realpow_plus_1          False))) @@ " ^
neuper@37954
  1342
" (Try (Repeat (Rewrite sym_real_mult_2         False))) @@ " ^
neuper@37954
  1343
" (Try (Repeat (Rewrite real_mult_2_assoc       False))) @@ " ^
neuper@37954
  1344
neuper@37954
  1345
" (Try (Repeat (Rewrite real_num_collect        False))) @@ " ^
neuper@37954
  1346
" (Try (Repeat (Rewrite real_num_collect_assoc  False))) @@ " ^
neuper@37954
  1347
neuper@37954
  1348
" (Try (Repeat (Rewrite real_one_collect        False))) @@ " ^
neuper@37954
  1349
" (Try (Repeat (Rewrite real_one_collect_assoc  False))) @@ " ^ 
neuper@37954
  1350
neuper@37954
  1351
" (Try (Repeat (Calculate plus  ))) @@ " ^
neuper@37954
  1352
" (Try (Repeat (Calculate times ))) @@ " ^
neuper@37954
  1353
" (Try (Repeat (Calculate power_)))) " ^  
neuper@37954
  1354
" t_)";
neuper@37954
  1355
------------------------------------------------------*)
neuper@37954
  1356
neuper@37954
  1357
val expand_binomtest =
neuper@37954
  1358
  Rls{id = "expand_binomtest", preconds = [], 
neuper@37954
  1359
      rew_ord = ("termlessI",termlessI),
neuper@37954
  1360
      erls = testerls, srls = Erls,
neuper@37954
  1361
      calc = [("PLUS"  , ("op +", eval_binop "#add_")), 
neuper@37954
  1362
	      ("TIMES" , ("op *", eval_binop "#mult_")),
neuper@37954
  1363
	      ("POWER", ("Atools.pow", eval_binop "#power_"))
neuper@37954
  1364
	      ],
neuper@37954
  1365
      (*asm_thm = [],*)
neuper@37954
  1366
      rules = [Thm ("real_plus_binom_pow2"  ,num_str real_plus_binom_pow2),     
neuper@37954
  1367
	       (*"(a + b) ^^^ 2 = a ^^^ 2 + 2 * a * b + b ^^^ 2"*)
neuper@37954
  1368
	       Thm ("real_plus_binom_times" ,num_str real_plus_binom_times),    
neuper@37954
  1369
	      (*"(a + b)*(a + b) = ...*)
neuper@37954
  1370
	       Thm ("real_minus_binom_pow2" ,num_str real_minus_binom_pow2),   
neuper@37954
  1371
	       (*"(a - b) ^^^ 2 = a ^^^ 2 - 2 * a * b + b ^^^ 2"*)
neuper@37954
  1372
	       Thm ("real_minus_binom_times",num_str real_minus_binom_times),   
neuper@37954
  1373
	       (*"(a - b)*(a - b) = ...*)
neuper@37954
  1374
	       Thm ("real_plus_minus_binom1",num_str real_plus_minus_binom1),   
neuper@37954
  1375
		(*"(a + b) * (a - b) = a ^^^ 2 - b ^^^ 2"*)
neuper@37954
  1376
	       Thm ("real_plus_minus_binom2",num_str real_plus_minus_binom2),   
neuper@37954
  1377
		(*"(a - b) * (a + b) = a ^^^ 2 - b ^^^ 2"*)
neuper@37954
  1378
	       (*RL 020915*)
neuper@37954
  1379
	       Thm ("real_pp_binom_times",num_str real_pp_binom_times), 
neuper@37954
  1380
		(*(a + b)*(c + d) = a*c + a*d + b*c + b*d*)
neuper@37954
  1381
               Thm ("real_pm_binom_times",num_str real_pm_binom_times), 
neuper@37954
  1382
		(*(a + b)*(c - d) = a*c - a*d + b*c - b*d*)
neuper@37954
  1383
               Thm ("real_mp_binom_times",num_str real_mp_binom_times), 
neuper@37954
  1384
		(*(a - b)*(c p d) = a*c + a*d - b*c - b*d*)
neuper@37954
  1385
               Thm ("real_mm_binom_times",num_str real_mm_binom_times), 
neuper@37954
  1386
		(*(a - b)*(c p d) = a*c - a*d - b*c + b*d*)
neuper@37954
  1387
	       Thm ("realpow_multI",num_str realpow_multI),                
neuper@37954
  1388
		(*(a*b)^^^n = a^^^n * b^^^n*)
neuper@37954
  1389
	       Thm ("real_plus_binom_pow3",num_str real_plus_binom_pow3),
neuper@37954
  1390
	        (* (a + b)^^^3 = a^^^3 + 3*a^^^2*b + 3*a*b^^^2 + b^^^3 *)
neuper@37954
  1391
	       Thm ("real_minus_binom_pow3",num_str real_minus_binom_pow3),
neuper@37954
  1392
	        (* (a - b)^^^3 = a^^^3 - 3*a^^^2*b + 3*a*b^^^2 - b^^^3 *)
neuper@37954
  1393
neuper@37954
  1394
neuper@37954
  1395
             (*  Thm ("real_add_mult_distrib" ,num_str real_add_mult_distrib),	
neuper@37954
  1396
		(*"(z1.0 + z2.0) * w = z1.0 * w + z2.0 * w"*)
neuper@37954
  1397
	       Thm ("real_add_mult_distrib2",num_str real_add_mult_distrib2),	
neuper@37954
  1398
	       (*"w * (z1.0 + z2.0) = w * z1.0 + w * z2.0"*)
neuper@37954
  1399
	       Thm ("real_diff_mult_distrib" ,num_str real_diff_mult_distrib),	
neuper@37954
  1400
	       (*"(z1.0 - z2.0) * w = z1.0 * w - z2.0 * w"*)
neuper@37954
  1401
	       Thm ("real_diff_mult_distrib2",num_str real_diff_mult_distrib2),	
neuper@37954
  1402
	       (*"w * (z1.0 - z2.0) = w * z1.0 - w * z2.0"*)
neuper@37954
  1403
	       *)
neuper@37954
  1404
	       
neuper@37954
  1405
	       Thm ("real_mult_1",num_str real_mult_1),              (*"1 * z = z"*)
neuper@37954
  1406
	       Thm ("real_mult_0",num_str real_mult_0),              (*"0 * z = 0"*)
neuper@37954
  1407
	       Thm ("real_add_zero_left",num_str real_add_zero_left),(*"0 + z = z"*)
neuper@37954
  1408
neuper@37954
  1409
	       Calc ("op +", eval_binop "#add_"), 
neuper@37954
  1410
	       Calc ("op *", eval_binop "#mult_"),
neuper@37954
  1411
	       Calc ("Atools.pow", eval_binop "#power_"),
neuper@37954
  1412
               (*	       
neuper@37954
  1413
	        Thm ("real_mult_commute",num_str real_mult_commute),		(*AC-rewriting*)
neuper@37954
  1414
	       Thm ("real_mult_left_commute",num_str real_mult_left_commute),	(**)
neuper@37954
  1415
	       Thm ("real_mult_assoc",num_str real_mult_assoc),			(**)
neuper@37954
  1416
	       Thm ("real_add_commute",num_str real_add_commute),		(**)
neuper@37954
  1417
	       Thm ("real_add_left_commute",num_str real_add_left_commute),	(**)
neuper@37954
  1418
	       Thm ("real_add_assoc",num_str real_add_assoc),	                (**)
neuper@37954
  1419
	       *)
neuper@37954
  1420
	       
neuper@37954
  1421
	       Thm ("sym_realpow_twoI",num_str (realpow_twoI RS sym)),		
neuper@37954
  1422
	       (*"r1 * r1 = r1 ^^^ 2"*)
neuper@37954
  1423
	       Thm ("realpow_plus_1",num_str realpow_plus_1),			
neuper@37954
  1424
	       (*"r * r ^^^ n = r ^^^ (n + 1)"*)
neuper@37954
  1425
	       (*Thm ("sym_real_mult_2",num_str (real_mult_2 RS sym)),		
neuper@37954
  1426
	       (*"z1 + z1 = 2 * z1"*)*)
neuper@37954
  1427
	       Thm ("real_mult_2_assoc",num_str real_mult_2_assoc),		
neuper@37954
  1428
	       (*"z1 + (z1 + k) = 2 * z1 + k"*)
neuper@37954
  1429
neuper@37954
  1430
	       Thm ("real_num_collect",num_str real_num_collect), 
neuper@37954
  1431
	       (*"[| l is_const; m is_const |] ==> l * n + m * n = (l + m) * n"*)
neuper@37954
  1432
	       Thm ("real_num_collect_assoc",num_str real_num_collect_assoc),	
neuper@37954
  1433
	       (*"[| l is_const; m is_const |] ==>  l * n + (m * n + k) =  (l + m) * n + k"*)
neuper@37954
  1434
	       Thm ("real_one_collect",num_str real_one_collect),		
neuper@37954
  1435
	       (*"m is_const ==> n + m * n = (1 + m) * n"*)
neuper@37954
  1436
	       Thm ("real_one_collect_assoc",num_str real_one_collect_assoc), 
neuper@37954
  1437
	       (*"m is_const ==> k + (n + m * n) = k + (1 + m) * n"*)
neuper@37954
  1438
neuper@37954
  1439
	       Calc ("op +", eval_binop "#add_"), 
neuper@37954
  1440
	       Calc ("op *", eval_binop "#mult_"),
neuper@37954
  1441
	       Calc ("Atools.pow", eval_binop "#power_")
neuper@37954
  1442
	       ],
neuper@37954
  1443
      scr = EmptyScr
neuper@37954
  1444
(*Script ((term_of o the o (parse thy)) scr_expand_binomtest)*)
neuper@37954
  1445
      }:rls;      
neuper@37954
  1446
neuper@37954
  1447
neuper@37954
  1448
ruleset' := overwritelthy thy (!ruleset',
neuper@37954
  1449
   [("make_polytest", prep_rls make_polytest),
neuper@37954
  1450
    ("expand_binomtest", prep_rls expand_binomtest)
neuper@37954
  1451
    ]);
neuper@37954
  1452
*}
neuper@37906
  1453
neuper@37906
  1454
end