src/Tools/isac/Knowledge/EqSystem.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/EqSystem.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
(* tools for systems of equations over the reals
neuper@37906
     2
   author: Walther Neuper 050905, 08:51
neuper@37906
     3
   (c) due to copyright terms
neuper@37906
     4
neuper@37947
     5
use"Knowledge/EqSystem.ML";
neuper@37906
     6
use"EqSystem.ML";
neuper@37906
     7
neuper@37906
     8
remove_thy"EqSystem";
neuper@37947
     9
use_thy"Knowledge/Isac";
neuper@37906
    10
*)
neuper@37906
    11
neuper@37906
    12
(** interface isabelle -- isac **)
neuper@37906
    13
neuper@37906
    14
theory' := overwritel (!theory', [("EqSystem.thy",EqSystem.thy)]);
neuper@37906
    15
neuper@37906
    16
(** eval functions **)
neuper@37906
    17
neuper@37906
    18
(*certain variables of a given list occur _all_ in a term
neuper@37906
    19
  args: all: ..variables, which are under consideration (eg. the bound vars)
neuper@37906
    20
        vs:  variables which must be in t, 
neuper@37906
    21
             and none of the others in all must be in t
neuper@37906
    22
        t: the term under consideration
neuper@37906
    23
 *)
neuper@37906
    24
fun occur_exactly_in vs all t =
neuper@37906
    25
    let fun occurs_in' a b = occurs_in b a
neuper@37906
    26
    in foldl and_ (true, map (occurs_in' t) vs)
neuper@37906
    27
       andalso not (foldl or_ (false, map (occurs_in' t) (all \\ vs)))
neuper@37906
    28
    end;
neuper@37906
    29
neuper@37906
    30
(*("occur_exactly_in", ("EqSystem.occur'_exactly'_in", 
neuper@37906
    31
			eval_occur_exactly_in "#eval_occur_exactly_in_"))*)
neuper@37906
    32
fun eval_occur_exactly_in _ "EqSystem.occur'_exactly'_in"
neuper@37906
    33
			  (p as (Const ("EqSystem.occur'_exactly'_in",_) 
neuper@37906
    34
				       $ vs $ all $ t)) _ =
neuper@37906
    35
    if occur_exactly_in (isalist2list vs) (isalist2list all) t
neuper@37926
    36
    then SOME ((term2str p) ^ " = True",
neuper@37906
    37
	       Trueprop $ (mk_equality (p, HOLogic.true_const)))
neuper@37926
    38
    else SOME ((term2str p) ^ " = False",
neuper@37906
    39
	       Trueprop $ (mk_equality (p, HOLogic.false_const)))
neuper@37926
    40
  | eval_occur_exactly_in _ _ _ _ = NONE;
neuper@37906
    41
neuper@37906
    42
calclist':= 
neuper@37906
    43
overwritel (!calclist', 
neuper@37906
    44
	    [("occur_exactly_in", 
neuper@37906
    45
	      ("EqSystem.occur'_exactly'_in", 
neuper@37906
    46
	       eval_occur_exactly_in "#eval_occur_exactly_in_"))
neuper@37906
    47
    ]);
neuper@37906
    48
neuper@37906
    49
neuper@37906
    50
(** rewrite order 'ord_simplify_System' **)
neuper@37906
    51
neuper@37906
    52
(* order wrt. several linear (i.e. without exponents) variables "c","c_2",..
neuper@37906
    53
   which leaves the monomials containing c, c_2,... at the end of an Integral
neuper@37906
    54
   and puts the c, c_2,... rightmost within a monomial.
neuper@37906
    55
neuper@37906
    56
   WN050906 this is a quick and dirty adaption of ord_make_polynomial_in,
neuper@37906
    57
   which was most adequate, because it uses size_of_term*)
neuper@37906
    58
(**)
neuper@37906
    59
local (*. for simplify_System .*)
neuper@37906
    60
(**)
neuper@37906
    61
open Term;  (* for type order = EQUAL | LESS | GREATER *)
neuper@37906
    62
neuper@37906
    63
fun pr_ord EQUAL = "EQUAL"
neuper@37906
    64
  | pr_ord LESS  = "LESS"
neuper@37906
    65
  | pr_ord GREATER = "GREATER";
neuper@37906
    66
neuper@37906
    67
fun dest_hd' (Const (a, T)) = (((a, 0), T), 0)
neuper@37906
    68
  | dest_hd' (Free (ccc, T)) =
neuper@37906
    69
    (case explode ccc of
neuper@37906
    70
	"c"::[] => ((("|||||||||||||||||||||", 0), T), 1)(*greatest string WN*)
neuper@37906
    71
      | "c"::"_"::_ => ((("|||||||||||||||||||||", 0), T), 1)
neuper@37906
    72
      | _ => (((ccc, 0), T), 1))
neuper@37906
    73
  | dest_hd' (Var v) = (v, 2)
neuper@37906
    74
  | dest_hd' (Bound i) = ((("", i), dummyT), 3)
neuper@37906
    75
  | dest_hd' (Abs (_, T, _)) = ((("", 0), T), 4);
neuper@37906
    76
neuper@37906
    77
fun size_of_term' (Free (ccc, _)) =
neuper@37906
    78
    (case explode ccc of (*WN0510 hack for the bound variables*)
neuper@37906
    79
	"c"::[] => 1000
neuper@37906
    80
      | "c"::"_"::is => 1000 * ((str2int o implode) is)
neuper@37906
    81
      | _ => 1)
neuper@37906
    82
  | size_of_term' (Abs (_,_,body)) = 1 + size_of_term' body
neuper@37906
    83
  | size_of_term' (f$t) = size_of_term' f  +  size_of_term' t
neuper@37906
    84
  | size_of_term' _ = 1;
neuper@37906
    85
neuper@37906
    86
fun term_ord' pr thy (Abs (_, T, t), Abs(_, U, u)) =       (* ~ term.ML *)
neuper@37906
    87
      (case term_ord' pr thy (t, u) of EQUAL => typ_ord (T, U) | ord => ord)
neuper@37906
    88
  | term_ord' pr thy (t, u) =
neuper@37906
    89
      (if pr then 
neuper@37906
    90
	 let
neuper@37906
    91
	   val (f, ts) = strip_comb t and (g, us) = strip_comb u;
neuper@37906
    92
	   val _=writeln("t= f@ts= \""^
neuper@37938
    93
	      ((Syntax.string_of_term (thy2ctxt thy)) f)^"\" @ \"["^
neuper@37906
    94
	      (commas(map(string_of_cterm o cterm_of(sign_of thy)) ts))^"]\"");
neuper@37906
    95
	   val _=writeln("u= g@us= \""^
neuper@37938
    96
	      ((Syntax.string_of_term (thy2ctxt thy)) g)^"\" @ \"["^
neuper@37906
    97
	      (commas(map(string_of_cterm o cterm_of(sign_of thy)) us))^"]\"");
neuper@37906
    98
	   val _=writeln("size_of_term(t,u)= ("^
neuper@37906
    99
	      (string_of_int(size_of_term' t))^", "^
neuper@37906
   100
	      (string_of_int(size_of_term' u))^")");
neuper@37906
   101
	   val _=writeln("hd_ord(f,g)      = "^((pr_ord o hd_ord)(f,g)));
neuper@37906
   102
	   val _=writeln("terms_ord(ts,us) = "^
neuper@37906
   103
			   ((pr_ord o terms_ord str false)(ts,us)));
neuper@37906
   104
	   val _=writeln("-------");
neuper@37906
   105
	 in () end
neuper@37906
   106
       else ();
neuper@37906
   107
	 case int_ord (size_of_term' t, size_of_term' u) of
neuper@37906
   108
	   EQUAL =>
neuper@37906
   109
	     let val (f, ts) = strip_comb t and (g, us) = strip_comb u in
neuper@37906
   110
	       (case hd_ord (f, g) of EQUAL => (terms_ord str pr) (ts, us) 
neuper@37906
   111
	     | ord => ord)
neuper@37906
   112
	     end
neuper@37906
   113
	 | ord => ord)
neuper@37906
   114
and hd_ord (f, g) =                                        (* ~ term.ML *)
neuper@37906
   115
  prod_ord (prod_ord indexname_ord typ_ord) int_ord (dest_hd' f, 
neuper@37906
   116
						     dest_hd' g)
neuper@37906
   117
and terms_ord str pr (ts, us) = 
neuper@37906
   118
    list_ord (term_ord' pr (assoc_thy "Isac.thy"))(ts, us);
neuper@37906
   119
(**)
neuper@37906
   120
in
neuper@37906
   121
(**)
neuper@37906
   122
(*WN0510 for preliminary use in eval_order_system, see case-study mat-eng.tex
neuper@37906
   123
fun ord_simplify_System_rev (pr:bool) thy subst tu = 
neuper@37906
   124
    (term_ord' pr thy (Library.swap tu) = LESS);*)
neuper@37906
   125
neuper@37906
   126
(*for the rls's*)
neuper@37906
   127
fun ord_simplify_System (pr:bool) thy subst tu = 
neuper@37906
   128
    (term_ord' pr thy tu = LESS);
neuper@37906
   129
(**)
neuper@37906
   130
end;
neuper@37906
   131
(**)
neuper@37906
   132
rew_ord' := overwritel (!rew_ord',
neuper@37906
   133
[("ord_simplify_System", ord_simplify_System false thy)
neuper@37906
   134
 ]);
neuper@37906
   135
neuper@37906
   136
neuper@37906
   137
(** rulesets **)
neuper@37906
   138
neuper@37906
   139
(*.adapted from 'order_add_mult_in' by just replacing the rew_ord.*)
neuper@37906
   140
val order_add_mult_System = 
neuper@37906
   141
  Rls{id = "order_add_mult_System", preconds = [], 
neuper@37906
   142
      rew_ord = ("ord_simplify_System",
neuper@37906
   143
		 ord_simplify_System false Integrate.thy),
neuper@37906
   144
      erls = e_rls,srls = Erls, calc = [],
neuper@37906
   145
      rules = [Thm ("real_mult_commute",num_str real_mult_commute),
neuper@37906
   146
	       (* z * w = w * z *)
neuper@37906
   147
	       Thm ("real_mult_left_commute",num_str real_mult_left_commute),
neuper@37906
   148
	       (*z1.0 * (z2.0 * z3.0) = z2.0 * (z1.0 * z3.0)*)
neuper@37906
   149
	       Thm ("real_mult_assoc",num_str real_mult_assoc),		
neuper@37906
   150
	       (*z1.0 * z2.0 * z3.0 = z1.0 * (z2.0 * z3.0)*)
neuper@37906
   151
	       Thm ("real_add_commute",num_str real_add_commute),	
neuper@37906
   152
	       (*z + w = w + z*)
neuper@37906
   153
	       Thm ("real_add_left_commute",num_str real_add_left_commute),
neuper@37906
   154
	       (*x + (y + z) = y + (x + z)*)
neuper@37906
   155
	       Thm ("real_add_assoc",num_str real_add_assoc)	               
neuper@37906
   156
	       (*z1.0 + z2.0 + z3.0 = z1.0 + (z2.0 + z3.0)*)
neuper@37906
   157
	       ], 
neuper@37906
   158
      scr = EmptyScr}:rls;
neuper@37906
   159
neuper@37906
   160
(*.adapted from 'norm_Rational' by
neuper@37906
   161
  #1 using 'ord_simplify_System' in 'order_add_mult_System'
neuper@37906
   162
  #2 NOT using common_nominator_p                          .*)
neuper@37906
   163
val norm_System_noadd_fractions = 
neuper@37906
   164
  Rls {id = "norm_System_noadd_fractions", preconds = [], 
neuper@37906
   165
       rew_ord = ("dummy_ord",dummy_ord), 
neuper@37906
   166
       erls = norm_rat_erls, srls = Erls, calc = [],
neuper@37906
   167
       rules = [(*sequence given by operator precedence*)
neuper@37906
   168
		Rls_ discard_minus,
neuper@37906
   169
		Rls_ powers,
neuper@37906
   170
		Rls_ rat_mult_divide,
neuper@37906
   171
		Rls_ expand,
neuper@37906
   172
		Rls_ reduce_0_1_2,
neuper@37906
   173
		Rls_ (*order_add_mult #1*) order_add_mult_System,
neuper@37906
   174
		Rls_ collect_numerals,
neuper@37906
   175
		(*Rls_ add_fractions_p, #2*)
neuper@37906
   176
		Rls_ cancel_p
neuper@37906
   177
		],
neuper@37906
   178
       scr = Script ((term_of o the o (parse thy)) 
neuper@37906
   179
			 "empty_script")
neuper@37906
   180
       }:rls;
neuper@37906
   181
(*.adapted from 'norm_Rational' by
neuper@37906
   182
  *1* using 'ord_simplify_System' in 'order_add_mult_System'.*)
neuper@37906
   183
val norm_System = 
neuper@37906
   184
  Rls {id = "norm_System", preconds = [], 
neuper@37906
   185
       rew_ord = ("dummy_ord",dummy_ord), 
neuper@37906
   186
       erls = norm_rat_erls, srls = Erls, calc = [],
neuper@37906
   187
       rules = [(*sequence given by operator precedence*)
neuper@37906
   188
		Rls_ discard_minus,
neuper@37906
   189
		Rls_ powers,
neuper@37906
   190
		Rls_ rat_mult_divide,
neuper@37906
   191
		Rls_ expand,
neuper@37906
   192
		Rls_ reduce_0_1_2,
neuper@37906
   193
		Rls_ (*order_add_mult *1*) order_add_mult_System,
neuper@37906
   194
		Rls_ collect_numerals,
neuper@37906
   195
		Rls_ add_fractions_p,
neuper@37906
   196
		Rls_ cancel_p
neuper@37906
   197
		],
neuper@37906
   198
       scr = Script ((term_of o the o (parse thy)) 
neuper@37906
   199
			 "empty_script")
neuper@37906
   200
       }:rls;
neuper@37906
   201
neuper@37906
   202
(*.simplify an equational system BEFORE solving it such that parentheses are
neuper@37906
   203
   ( ((u0*v0)*w0) + ( ((u1*v1)*w1) * c + ... +((u4*v4)*w4) * c_4 ) )
neuper@37906
   204
ATTENTION: works ONLY for bound variables c, c_1, c_2, c_3, c_4 :ATTENTION
neuper@37906
   205
   This is a copy from 'make_ratpoly_in' with respective reductions:
neuper@37906
   206
   *0* expand the term, ie. distribute * and / over +
neuper@37906
   207
   *1* ord_simplify_System instead of termlessI
neuper@37906
   208
   *2* no add_fractions_p (= common_nominator_p_rls !)
neuper@37906
   209
   *3* discard_parentheses only for (.*(.*.))
neuper@37906
   210
   analoguous to simplify_Integral                                       .*)
neuper@37906
   211
val simplify_System_parenthesized = 
neuper@37906
   212
  Seq {id = "simplify_System_parenthesized", preconds = []:term list, 
neuper@37906
   213
       rew_ord = ("dummy_ord", dummy_ord),
neuper@37906
   214
      erls = Atools_erls, srls = Erls, calc = [],
neuper@37906
   215
      rules = [Thm ("real_add_mult_distrib",num_str real_add_mult_distrib),
neuper@37906
   216
 	       (*"(?z1.0 + ?z2.0) * ?w = ?z1.0 * ?w + ?z2.0 * ?w"*)
neuper@37906
   217
	       Thm ("real_add_divide_distrib",num_str real_add_divide_distrib),
neuper@37906
   218
 	       (*"(?x + ?y) / ?z = ?x / ?z + ?y / ?z"*)
neuper@37906
   219
	       (*^^^^^ *0* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*)
neuper@37906
   220
	       Rls_ norm_Rational_noadd_fractions(**2**),
neuper@37906
   221
	       Rls_ (*order_add_mult_in*) norm_System_noadd_fractions (**1**),
neuper@37906
   222
	       Thm ("sym_real_mult_assoc", num_str (real_mult_assoc RS sym))
neuper@37906
   223
	       (*Rls_ discard_parentheses *3**),
neuper@37906
   224
	       Rls_ collect_bdv, (*from make_polynomial_in WN051031 welldone?*)
neuper@37906
   225
	       Rls_ separate_bdv2,
neuper@37906
   226
	       Calc ("HOL.divide"  ,eval_cancel "#divide_")
neuper@37906
   227
	       ],
neuper@37906
   228
      scr = EmptyScr}:rls;      
neuper@37906
   229
neuper@37906
   230
(*.simplify an equational system AFTER solving it;
neuper@37906
   231
   This is a copy of 'make_ratpoly_in' with the differences
neuper@37906
   232
   *1* ord_simplify_System instead of termlessI           .*)
neuper@37906
   233
(*TODO.WN051031 ^^^^^^^^^^ should be in EACH rls contained *)
neuper@37906
   234
val simplify_System = 
neuper@37906
   235
  Seq {id = "simplify_System", preconds = []:term list, 
neuper@37906
   236
       rew_ord = ("dummy_ord", dummy_ord),
neuper@37906
   237
      erls = Atools_erls, srls = Erls, calc = [],
neuper@37906
   238
      rules = [Rls_ norm_Rational,
neuper@37906
   239
	       Rls_ (*order_add_mult_in*) norm_System (**1**),
neuper@37906
   240
	       Rls_ discard_parentheses,
neuper@37906
   241
	       Rls_ collect_bdv, (*from make_polynomial_in WN051031 welldone?*)
neuper@37906
   242
	       Rls_ separate_bdv2,
neuper@37906
   243
	       Calc ("HOL.divide"  ,eval_cancel "#divide_")
neuper@37906
   244
	       ],
neuper@37906
   245
      scr = EmptyScr}:rls;      
neuper@37906
   246
(*
neuper@37906
   247
val simplify_System = 
neuper@37906
   248
    append_rls "simplify_System" simplify_System_parenthesized
neuper@37906
   249
	       [Thm ("sym_real_add_assoc", num_str (real_add_assoc RS sym))];
neuper@37906
   250
*)
neuper@37906
   251
neuper@37906
   252
val isolate_bdvs = 
neuper@37906
   253
    Rls {id="isolate_bdvs", preconds = [], 
neuper@37906
   254
	 rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   255
	 erls = append_rls "erls_isolate_bdvs" e_rls 
neuper@37906
   256
			   [(Calc ("EqSystem.occur'_exactly'_in", 
neuper@37906
   257
				   eval_occur_exactly_in 
neuper@37906
   258
				       "#eval_occur_exactly_in_"))
neuper@37906
   259
			    ], 
neuper@37906
   260
			   srls = Erls, calc = [],
neuper@37906
   261
	      rules = [Thm ("commute_0_equality",
neuper@37906
   262
			    num_str commute_0_equality),
neuper@37906
   263
		       Thm ("separate_bdvs_add", num_str separate_bdvs_add),
neuper@37906
   264
		       Thm ("separate_bdvs_mult", num_str separate_bdvs_mult)],
neuper@37906
   265
	      scr = EmptyScr};
neuper@37906
   266
val isolate_bdvs_4x4 = 
neuper@37906
   267
    Rls {id="isolate_bdvs_4x4", preconds = [], 
neuper@37906
   268
	 rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   269
	 erls = append_rls 
neuper@37906
   270
		    "erls_isolate_bdvs_4x4" e_rls 
neuper@37906
   271
		    [Calc ("EqSystem.occur'_exactly'_in", 
neuper@37906
   272
			   eval_occur_exactly_in "#eval_occur_exactly_in_"),
neuper@37906
   273
		     Calc ("Atools.ident",eval_ident "#ident_"),
neuper@37906
   274
		     Calc ("Atools.some'_occur'_in", 
neuper@37906
   275
			   eval_some_occur_in "#some_occur_in_"),
neuper@37906
   276
                     Thm ("not_true",num_str not_true),
neuper@37906
   277
		     Thm ("not_false",num_str not_false)
neuper@37906
   278
			    ], 
neuper@37906
   279
	 srls = Erls, calc = [],
neuper@37906
   280
	 rules = [Thm ("commute_0_equality",
neuper@37906
   281
		       num_str commute_0_equality),
neuper@37906
   282
		  Thm ("separate_bdvs0", num_str separate_bdvs0),
neuper@37906
   283
		  Thm ("separate_bdvs_add1", num_str separate_bdvs_add1),
neuper@37906
   284
		  Thm ("separate_bdvs_add1", num_str separate_bdvs_add2),
neuper@37906
   285
		  Thm ("separate_bdvs_mult", num_str separate_bdvs_mult)],
neuper@37906
   286
	      scr = EmptyScr};
neuper@37906
   287
neuper@37906
   288
(*.order the equations in a system such, that a triangular system (if any)
neuper@37906
   289
   appears as [..c_4 = .., ..., ..., ..c_1 + ..c_2 + ..c_3 ..c_4 = ..].*)
neuper@37906
   290
val order_system = 
neuper@37906
   291
    Rls {id="order_system", preconds = [], 
neuper@37906
   292
	 rew_ord = ("ord_simplify_System", 
neuper@37906
   293
		    ord_simplify_System false thy), 
neuper@37906
   294
	 erls = Erls, srls = Erls, calc = [],
neuper@37906
   295
	 rules = [Thm ("order_system_NxN", num_str order_system_NxN)
neuper@37906
   296
		  ],
neuper@37906
   297
	 scr = EmptyScr};
neuper@37906
   298
neuper@37906
   299
val prls_triangular = 
neuper@37906
   300
    Rls {id="prls_triangular", preconds = [], 
neuper@37906
   301
	 rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   302
	 erls = Rls {id="erls_prls_triangular", preconds = [], 
neuper@37906
   303
		     rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   304
		     erls = Erls, srls = Erls, calc = [],
neuper@37906
   305
		     rules = [(*for precond nth_Cons_ ...*)
neuper@37906
   306
			      Calc ("op <",eval_equ "#less_"),
neuper@37906
   307
			      Calc ("op +", eval_binop "#add_")
neuper@37906
   308
			      (*immediately repeated rewrite pushes
neuper@37906
   309
					    '+' into precondition !*)
neuper@37906
   310
			      ],
neuper@37906
   311
		     scr = EmptyScr}, 
neuper@37906
   312
	 srls = Erls, calc = [],
neuper@37906
   313
	 rules = [Thm ("nth_Cons_",num_str nth_Cons_),
neuper@37906
   314
		  Calc ("op +", eval_binop "#add_"),
neuper@37906
   315
		  Thm ("nth_Nil_",num_str nth_Nil_),
neuper@37906
   316
		  Thm ("tl_Cons",num_str tl_Cons),
neuper@37906
   317
		  Thm ("tl_Nil",num_str tl_Nil),
neuper@37906
   318
		  Calc ("EqSystem.occur'_exactly'_in", 
neuper@37906
   319
			eval_occur_exactly_in 
neuper@37906
   320
			    "#eval_occur_exactly_in_")
neuper@37906
   321
		  ],
neuper@37906
   322
	 scr = EmptyScr};
neuper@37906
   323
neuper@37906
   324
(*WN060914 quickly created for 4x4; 
neuper@37906
   325
 more similarity to prls_triangular desirable*)
neuper@37906
   326
val prls_triangular4 = 
neuper@37906
   327
    Rls {id="prls_triangular4", preconds = [], 
neuper@37906
   328
	 rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   329
	 erls = Rls {id="erls_prls_triangular4", preconds = [], 
neuper@37906
   330
		     rew_ord = ("e_rew_ord", e_rew_ord), 
neuper@37906
   331
		     erls = Erls, srls = Erls, calc = [],
neuper@37906
   332
		     rules = [(*for precond nth_Cons_ ...*)
neuper@37906
   333
			      Calc ("op <",eval_equ "#less_"),
neuper@37906
   334
			      Calc ("op +", eval_binop "#add_")
neuper@37906
   335
			      (*immediately repeated rewrite pushes
neuper@37906
   336
					    '+' into precondition !*)
neuper@37906
   337
			      ],
neuper@37906
   338
		     scr = EmptyScr}, 
neuper@37906
   339
	 srls = Erls, calc = [],
neuper@37906
   340
	 rules = [Thm ("nth_Cons_",num_str nth_Cons_),
neuper@37906
   341
		  Calc ("op +", eval_binop "#add_"),
neuper@37906
   342
		  Thm ("nth_Nil_",num_str nth_Nil_),
neuper@37906
   343
		  Thm ("tl_Cons",num_str tl_Cons),
neuper@37906
   344
		  Thm ("tl_Nil",num_str tl_Nil),
neuper@37906
   345
		  Calc ("EqSystem.occur'_exactly'_in", 
neuper@37906
   346
			eval_occur_exactly_in 
neuper@37906
   347
			    "#eval_occur_exactly_in_")
neuper@37906
   348
		  ],
neuper@37906
   349
	 scr = EmptyScr};
neuper@37906
   350
neuper@37906
   351
ruleset' := 
neuper@37906
   352
overwritelthy thy 
neuper@37906
   353
	      (!ruleset', 
neuper@37906
   354
[("simplify_System_parenthesized", prep_rls simplify_System_parenthesized),
neuper@37906
   355
 ("simplify_System", prep_rls simplify_System),
neuper@37906
   356
 ("isolate_bdvs", prep_rls isolate_bdvs),
neuper@37906
   357
 ("isolate_bdvs_4x4", prep_rls isolate_bdvs_4x4),
neuper@37906
   358
 ("order_system", prep_rls order_system),
neuper@37906
   359
 ("order_add_mult_System", prep_rls order_add_mult_System),
neuper@37906
   360
 ("norm_System_noadd_fractions", prep_rls norm_System_noadd_fractions),
neuper@37906
   361
 ("norm_System", prep_rls norm_System)
neuper@37906
   362
 ]);
neuper@37906
   363
neuper@37906
   364
neuper@37906
   365
(** problems **)
neuper@37906
   366
neuper@37906
   367
store_pbt
neuper@37906
   368
 (prep_pbt EqSystem.thy "pbl_equsys" [] e_pblID
neuper@37906
   369
 (["system"],
neuper@37906
   370
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   371
   ("#Find"  ,["solution ss___"](*___ is copy-named*))
neuper@37906
   372
  ],
neuper@37906
   373
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
neuper@37926
   374
  SOME "solveSystem es_ vs_", 
neuper@37906
   375
  []));
neuper@37906
   376
store_pbt
neuper@37906
   377
 (prep_pbt EqSystem.thy "pbl_equsys_lin" [] e_pblID
neuper@37906
   378
 (["linear", "system"],
neuper@37906
   379
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   380
   (*TODO.WN050929 check linearity*)
neuper@37906
   381
   ("#Find"  ,["solution ss___"])
neuper@37906
   382
  ],
neuper@37906
   383
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
neuper@37926
   384
  SOME "solveSystem es_ vs_", 
neuper@37906
   385
  []));
neuper@37906
   386
store_pbt
neuper@37906
   387
 (prep_pbt EqSystem.thy "pbl_equsys_lin_2x2" [] e_pblID
neuper@37906
   388
 (["2x2", "linear", "system"],
neuper@37906
   389
  (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   390
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   391
   ("#Where"  ,["length_ (es_:: bool list) = 2", "length_ vs_ = 2"]),
neuper@37906
   392
   ("#Find"  ,["solution ss___"])
neuper@37906
   393
  ],
neuper@37906
   394
  append_rls "prls_2x2_linear_system" e_rls 
neuper@37906
   395
			     [Thm ("length_Cons_",num_str length_Cons_),
neuper@37906
   396
			      Thm ("length_Nil_",num_str length_Nil_),
neuper@37906
   397
			      Calc ("op +", eval_binop "#add_"),
neuper@37906
   398
			      Calc ("op =",eval_equal "#equal_")
neuper@37906
   399
			      ], 
neuper@37926
   400
  SOME "solveSystem es_ vs_", 
neuper@37906
   401
  []));
neuper@37906
   402
store_pbt
neuper@37906
   403
 (prep_pbt EqSystem.thy "pbl_equsys_lin_2x2_tri" [] e_pblID
neuper@37906
   404
 (["triangular", "2x2", "linear", "system"],
neuper@37906
   405
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   406
   ("#Where"  ,
neuper@37906
   407
    ["(tl vs_) from_ vs_ occur_exactly_in (nth_ 1 (es_::bool list))",
neuper@37906
   408
     "    vs_  from_ vs_ occur_exactly_in (nth_ 2 (es_::bool list))"]),
neuper@37906
   409
   ("#Find"  ,["solution ss___"])
neuper@37906
   410
  ],
neuper@37906
   411
  prls_triangular, 
neuper@37926
   412
  SOME "solveSystem es_ vs_", 
neuper@37906
   413
  [["EqSystem","top_down_substitution","2x2"]]));
neuper@37906
   414
store_pbt
neuper@37906
   415
 (prep_pbt EqSystem.thy "pbl_equsys_lin_2x2_norm" [] e_pblID
neuper@37906
   416
 (["normalize", "2x2", "linear", "system"],
neuper@37906
   417
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   418
   ("#Find"  ,["solution ss___"])
neuper@37906
   419
  ],
neuper@37906
   420
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
neuper@37926
   421
  SOME "solveSystem es_ vs_", 
neuper@37906
   422
  [["EqSystem","normalize","2x2"]]));
neuper@37906
   423
store_pbt
neuper@37906
   424
 (prep_pbt EqSystem.thy "pbl_equsys_lin_3x3" [] e_pblID
neuper@37906
   425
 (["3x3", "linear", "system"],
neuper@37906
   426
  (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   427
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   428
   ("#Where"  ,["length_ (es_:: bool list) = 3", "length_ vs_ = 3"]),
neuper@37906
   429
   ("#Find"  ,["solution ss___"])
neuper@37906
   430
  ],
neuper@37906
   431
  append_rls "prls_3x3_linear_system" e_rls 
neuper@37906
   432
			     [Thm ("length_Cons_",num_str length_Cons_),
neuper@37906
   433
			      Thm ("length_Nil_",num_str length_Nil_),
neuper@37906
   434
			      Calc ("op +", eval_binop "#add_"),
neuper@37906
   435
			      Calc ("op =",eval_equal "#equal_")
neuper@37906
   436
			      ], 
neuper@37926
   437
  SOME "solveSystem es_ vs_", 
neuper@37906
   438
  []));
neuper@37906
   439
store_pbt
neuper@37906
   440
 (prep_pbt EqSystem.thy "pbl_equsys_lin_4x4" [] e_pblID
neuper@37906
   441
 (["4x4", "linear", "system"],
neuper@37906
   442
  (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   443
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   444
   ("#Where"  ,["length_ (es_:: bool list) = 4", "length_ vs_ = 4"]),
neuper@37906
   445
   ("#Find"  ,["solution ss___"])
neuper@37906
   446
  ],
neuper@37906
   447
  append_rls "prls_4x4_linear_system" e_rls 
neuper@37906
   448
			     [Thm ("length_Cons_",num_str length_Cons_),
neuper@37906
   449
			      Thm ("length_Nil_",num_str length_Nil_),
neuper@37906
   450
			      Calc ("op +", eval_binop "#add_"),
neuper@37906
   451
			      Calc ("op =",eval_equal "#equal_")
neuper@37906
   452
			      ], 
neuper@37926
   453
  SOME "solveSystem es_ vs_", 
neuper@37906
   454
  []));
neuper@37906
   455
store_pbt
neuper@37906
   456
 (prep_pbt EqSystem.thy "pbl_equsys_lin_4x4_tri" [] e_pblID
neuper@37906
   457
 (["triangular", "4x4", "linear", "system"],
neuper@37906
   458
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   459
   ("#Where" , (*accepts missing variables up to diagional form*)
neuper@37906
   460
    ["(nth_ 1 (vs_::real list)) occurs_in (nth_ 1 (es_::bool list))",
neuper@37906
   461
     "(nth_ 2 (vs_::real list)) occurs_in (nth_ 2 (es_::bool list))",
neuper@37906
   462
     "(nth_ 3 (vs_::real list)) occurs_in (nth_ 3 (es_::bool list))",
neuper@37906
   463
     "(nth_ 4 (vs_::real list)) occurs_in (nth_ 4 (es_::bool list))"
neuper@37906
   464
     ]),
neuper@37906
   465
   ("#Find"  ,["solution ss___"])
neuper@37906
   466
  ],
neuper@37906
   467
  append_rls "prls_tri_4x4_lin_sys" prls_triangular
neuper@37906
   468
	     [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
neuper@37926
   469
  SOME "solveSystem es_ vs_", 
neuper@37906
   470
  [["EqSystem","top_down_substitution","4x4"]]));
neuper@37906
   471
neuper@37906
   472
store_pbt
neuper@37906
   473
 (prep_pbt EqSystem.thy "pbl_equsys_lin_4x4_norm" [] e_pblID
neuper@37906
   474
 (["normalize", "4x4", "linear", "system"],
neuper@37906
   475
  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   476
   (*length_ is checked 1 level above*)
neuper@37906
   477
   ("#Find"  ,["solution ss___"])
neuper@37906
   478
  ],
neuper@37906
   479
  append_rls "e_rls" e_rls [(*for preds in where_*)], 
neuper@37926
   480
  SOME "solveSystem es_ vs_", 
neuper@37906
   481
  [["EqSystem","normalize","4x4"]]));
neuper@37906
   482
neuper@37906
   483
neuper@37906
   484
(* show_ptyps();
neuper@37906
   485
   *)
neuper@37906
   486
neuper@37906
   487
(** methods **)
neuper@37906
   488
neuper@37906
   489
store_met
neuper@37906
   490
    (prep_met EqSystem.thy "met_eqsys" [] e_metID
neuper@37906
   491
	      (["EqSystem"],
neuper@37906
   492
	       [],
neuper@37906
   493
	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
neuper@37906
   494
		srls = Erls, prls = Erls, crls = Erls, nrls = Erls},
neuper@37906
   495
	       "empty_script"
neuper@37906
   496
	       ));
neuper@37906
   497
store_met
neuper@37906
   498
    (prep_met EqSystem.thy "met_eqsys_topdown" [] e_metID
neuper@37906
   499
	      (["EqSystem","top_down_substitution"],
neuper@37906
   500
	       [],
neuper@37906
   501
	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
neuper@37906
   502
		srls = Erls, prls = Erls, crls = Erls, nrls = Erls},
neuper@37906
   503
	       "empty_script"
neuper@37906
   504
	       ));
neuper@37906
   505
store_met
neuper@37906
   506
    (prep_met EqSystem.thy "met_eqsys_topdown_2x2" [] e_metID
neuper@37906
   507
	 (["EqSystem","top_down_substitution","2x2"],
neuper@37906
   508
	  [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   509
	   ("#Where"  ,
neuper@37906
   510
	    ["(tl vs_) from_ vs_ occur_exactly_in (nth_ 1 (es_::bool list))",
neuper@37906
   511
	     "    vs_  from_ vs_ occur_exactly_in (nth_ 2 (es_::bool list))"]),
neuper@37906
   512
	   ("#Find"  ,["solution ss___"])
neuper@37906
   513
	   ],
neuper@37906
   514
	  {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
neuper@37906
   515
	   srls = append_rls "srls_top_down_2x2" e_rls
neuper@37906
   516
				  [Thm ("hd_thm",num_str hd_thm),
neuper@37906
   517
				   Thm ("tl_Cons",num_str tl_Cons),
neuper@37906
   518
				   Thm ("tl_Nil",num_str tl_Nil)
neuper@37906
   519
				   ], 
neuper@37906
   520
	   prls = prls_triangular, crls = Erls, nrls = Erls},
neuper@37906
   521
"Script SolveSystemScript (es_::bool list) (vs_::real list) =                \
neuper@37906
   522
\  (let e1__ = Take (hd es_);                                                \
neuper@37906
   523
\       e1__ = ((Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   524
\                                  isolate_bdvs False))     @@               \
neuper@37906
   525
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   526
\                                  simplify_System False))) e1__;            \
neuper@37906
   527
\       e2__ = Take (hd (tl es_));                                           \
neuper@37906
   528
\       e2__ = ((Substitute [e1__]) @@                                       \
neuper@37906
   529
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   530
\                                  simplify_System_parenthesized False)) @@  \
neuper@37906
   531
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   532
\                                  isolate_bdvs False))     @@               \
neuper@37906
   533
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   534
\                                  simplify_System False))) e2__;            \
neuper@37906
   535
\       es__ = Take [e1__, e2__]                                             \
neuper@37906
   536
\   in (Try (Rewrite_Set order_system False)) es__)"
neuper@37906
   537
(*---------------------------------------------------------------------------
neuper@37906
   538
  this script does NOT separate the equations as abolve, 
neuper@37906
   539
  but it does not yet work due to preliminary script-interpreter,
neuper@37906
   540
  see eqsystem.sml 'script [EqSystem,top_down_substitution,2x2] Vers.2'
neuper@37906
   541
neuper@37906
   542
"Script SolveSystemScript (es_::bool list) (vs_::real list) =         \
neuper@37906
   543
\  (let es__ = Take es_;                                              \
neuper@37906
   544
\       e1__ = hd es__;                                               \
neuper@37906
   545
\       e2__ = hd (tl es__);                                          \
neuper@37906
   546
\       es__ = [e1__, Substitute [e1__] e2__]                         \
neuper@37906
   547
\   in ((Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   548
\                                  simplify_System_parenthesized False)) @@   \
neuper@37906
   549
\       (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))] \
neuper@37906
   550
\                              isolate_bdvs False))              @@   \
neuper@37906
   551
\       (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   552
\                                  simplify_System False))) es__)"
neuper@37906
   553
---------------------------------------------------------------------------*)
neuper@37906
   554
	  ));
neuper@37906
   555
store_met
neuper@37906
   556
    (prep_met EqSystem.thy "met_eqsys_norm" [] e_metID
neuper@37906
   557
	      (["EqSystem","normalize"],
neuper@37906
   558
	       [],
neuper@37906
   559
	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
neuper@37906
   560
		srls = Erls, prls = Erls, crls = Erls, nrls = Erls},
neuper@37906
   561
	       "empty_script"
neuper@37906
   562
	       ));
neuper@37906
   563
store_met
neuper@37906
   564
    (prep_met EqSystem.thy "met_eqsys_norm_2x2" [] e_metID
neuper@37906
   565
	      (["EqSystem","normalize","2x2"],
neuper@37906
   566
	       [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   567
		("#Find"  ,["solution ss___"])],
neuper@37906
   568
	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
neuper@37906
   569
		srls = append_rls "srls_normalize_2x2" e_rls
neuper@37906
   570
				  [Thm ("hd_thm",num_str hd_thm),
neuper@37906
   571
				   Thm ("tl_Cons",num_str tl_Cons),
neuper@37906
   572
				   Thm ("tl_Nil",num_str tl_Nil)
neuper@37906
   573
				   ], 
neuper@37906
   574
		prls = Erls, crls = Erls, nrls = Erls},
neuper@37906
   575
"Script SolveSystemScript (es_::bool list) (vs_::real list) =                \
neuper@37906
   576
\  (let es__ = ((Try (Rewrite_Set norm_Rational False)) @@ \
neuper@37906
   577
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   578
\                                  simplify_System_parenthesized False)) @@ \
neuper@37906
   579
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   580
\                                                    isolate_bdvs False)) @@ \
neuper@37906
   581
\               (Try (Rewrite_Set_Inst [(bdv_1, hd vs_),(bdv_2, hd (tl vs_))]\
neuper@37906
   582
\                                  simplify_System_parenthesized False)) @@ \
neuper@37906
   583
\               (Try (Rewrite_Set order_system False))) es_                  \
neuper@37906
   584
\   in (SubProblem (EqSystem_,[linear,system],[no_met])                      \
neuper@37906
   585
\                  [bool_list_ es__, real_list_ vs_]))"
neuper@37906
   586
	       ));
neuper@37906
   587
neuper@37906
   588
(*this is for nth_ only*)
neuper@37906
   589
val srls = Rls {id="srls_normalize_4x4", 
neuper@37906
   590
		preconds = [], 
neuper@37906
   591
		rew_ord = ("termlessI",termlessI), 
neuper@37906
   592
		erls = append_rls "erls_in_srls_IntegrierenUnd.." e_rls
neuper@37906
   593
				  [(*for asm in nth_Cons_ ...*)
neuper@37906
   594
				   Calc ("op <",eval_equ "#less_"),
neuper@37906
   595
				   (*2nd nth_Cons_ pushes n+-1 into asms*)
neuper@37906
   596
				   Calc("op +", eval_binop "#add_")
neuper@37906
   597
				   ], 
neuper@37906
   598
		srls = Erls, calc = [],
neuper@37906
   599
		rules = [Thm ("nth_Cons_",num_str nth_Cons_),
neuper@37906
   600
			 Calc("op +", eval_binop "#add_"),
neuper@37906
   601
			 Thm ("nth_Nil_",num_str nth_Nil_)],
neuper@37906
   602
		scr = EmptyScr};
neuper@37906
   603
store_met
neuper@37906
   604
    (prep_met EqSystem.thy "met_eqsys_norm_4x4" [] e_metID
neuper@37906
   605
	      (["EqSystem","normalize","4x4"],
neuper@37906
   606
	       [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   607
		("#Find"  ,["solution ss___"])],
neuper@37906
   608
	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
neuper@37906
   609
		srls = append_rls "srls_normalize_4x4" srls
neuper@37906
   610
				  [Thm ("hd_thm",num_str hd_thm),
neuper@37906
   611
				   Thm ("tl_Cons",num_str tl_Cons),
neuper@37906
   612
				   Thm ("tl_Nil",num_str tl_Nil)
neuper@37906
   613
				   ], 
neuper@37906
   614
		prls = Erls, crls = Erls, nrls = Erls},
neuper@37906
   615
(*GOON met ["EqSystem","normalize","4x4"] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*)
neuper@37906
   616
"Script SolveSystemScript (es_::bool list) (vs_::real list) =                \
neuper@37906
   617
\  (let es__ =                                                               \
neuper@37906
   618
\     ((Try (Rewrite_Set norm_Rational False)) @@                            \
neuper@37906
   619
\      (Repeat (Rewrite commute_0_equality False)) @@                        \
neuper@37906
   620
\      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 vs_),(bdv_2, nth_ 2 vs_ ),     \
neuper@37906
   621
\                              (bdv_3, nth_ 3 vs_),(bdv_3, nth_ 4 vs_ )]     \
neuper@37906
   622
\                             simplify_System_parenthesized False))    @@    \
neuper@37906
   623
\      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 vs_),(bdv_2, nth_ 2 vs_ ),     \
neuper@37906
   624
\                              (bdv_3, nth_ 3 vs_),(bdv_3, nth_ 4 vs_ )]     \
neuper@37906
   625
\                             isolate_bdvs_4x4 False))                 @@    \
neuper@37906
   626
\      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 vs_),(bdv_2, nth_ 2 vs_ ),     \
neuper@37906
   627
\                              (bdv_3, nth_ 3 vs_),(bdv_3, nth_ 4 vs_ )]     \
neuper@37906
   628
\                             simplify_System_parenthesized False))    @@    \
neuper@37906
   629
\      (Try (Rewrite_Set order_system False)))                           es_ \
neuper@37906
   630
\   in (SubProblem (EqSystem_,[linear,system],[no_met])                      \
neuper@37906
   631
\                  [bool_list_ es__, real_list_ vs_]))"
neuper@37906
   632
));
neuper@37906
   633
store_met
neuper@37906
   634
(prep_met EqSystem.thy "met_eqsys_topdown_4x4" [] e_metID
neuper@37906
   635
	  (["EqSystem","top_down_substitution","4x4"],
neuper@37906
   636
	   [("#Given" ,["equalities es_", "solveForVars vs_"]),
neuper@37906
   637
	    ("#Where" , (*accepts missing variables up to diagonal form*)
neuper@37906
   638
	     ["(nth_ 1 (vs_::real list)) occurs_in (nth_ 1 (es_::bool list))",
neuper@37906
   639
	      "(nth_ 2 (vs_::real list)) occurs_in (nth_ 2 (es_::bool list))",
neuper@37906
   640
	      "(nth_ 3 (vs_::real list)) occurs_in (nth_ 3 (es_::bool list))",
neuper@37906
   641
	      "(nth_ 4 (vs_::real list)) occurs_in (nth_ 4 (es_::bool list))"
neuper@37906
   642
	      ]),
neuper@37906
   643
	    ("#Find"  ,["solution ss___"])
neuper@37906
   644
	    ],
neuper@37906
   645
	   {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
neuper@37906
   646
	    srls = append_rls "srls_top_down_4x4" srls [], 
neuper@37906
   647
	    prls = append_rls "prls_tri_4x4_lin_sys" prls_triangular
neuper@37906
   648
			      [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
neuper@37906
   649
	    crls = Erls, nrls = Erls},
neuper@37906
   650
(*FIXXXXME.WN060916: this script works ONLY for exp 7.79 @@@@@@@@@@@@@@@@@@@@*)
neuper@37906
   651
"Script SolveSystemScript (es_::bool list) (vs_::real list) =                 \
neuper@37906
   652
\  (let e1_ = nth_ 1 es_;                                              \
neuper@37906
   653
\       e2_ = Take (nth_ 2 es_);                                              \
neuper@37906
   654
\       e2_ = ((Substitute [e1_]) @@                                          \
neuper@37906
   655
\               (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 vs_),(bdv_2,nth_ 2 vs_),\
neuper@37906
   656
\                                       (bdv_3,nth_ 3 vs_),(bdv_4,nth_ 4 vs_)]\
neuper@37906
   657
\                                  simplify_System_parenthesized False)) @@   \
neuper@37906
   658
\               (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 vs_),(bdv_2,nth_ 2 vs_),\
neuper@37906
   659
\                                       (bdv_3,nth_ 3 vs_),(bdv_4,nth_ 4 vs_)]\
neuper@37906
   660
\                                  isolate_bdvs False))                  @@   \
neuper@37906
   661
\               (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 vs_),(bdv_2,nth_ 2 vs_),\
neuper@37906
   662
\                                       (bdv_3,nth_ 3 vs_),(bdv_4,nth_ 4 vs_)]\
neuper@37906
   663
\                                  norm_Rational False)))             e2_     \
neuper@37906
   664
\   in [e1_, e2_, nth_ 3 es_, nth_ 4 es_])"
neuper@37906
   665
));
neuper@37906
   666
neuper@37906
   667
(* show_mets();
neuper@37906
   668
   *)
neuper@37906
   669
neuper@37906
   670
(*
neuper@37947
   671
use"Knowledge/EqSystem.ML";
neuper@37906
   672
use"EqSystem.ML";
neuper@37906
   673
*)