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

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