src/Tools/isac/Knowledge/EqSystem.thy
branchisac-update-Isa09-2
changeset 37997 8721c71fe3a3
parent 37995 fac82f29f143
child 37998 6d9fb5475156
equal deleted inserted replaced
37996:eb7d9cbaa3ef 37997:8721c71fe3a3
     2    author: Walther Neuper
     2    author: Walther Neuper
     3    050826,
     3    050826,
     4    (c) due to copyright terms
     4    (c) due to copyright terms
     5 *)
     5 *)
     6 
     6 
     7 theory EqSystem imports Rational Root begin
     7 theory EqSystem imports Integrate Rational Root begin
     8 
     8 
     9 consts
     9 consts
    10 
    10 
    11   occur'_exactly'_in :: 
    11   occur'_exactly'_in :: 
    12    "[real list, real list, 'a] => bool" ("_ from'_ _ occur'_exactly'_in _")
    12    "[real list, real list, 'a] => bool" ("_ from'_ _ occur'_exactly'_in _")
    13 
    13 
    14   (*descriptions in the related problems*)
    14   (*descriptions in the related problems*)
    15   solveForVars       :: real list => toreall
    15   solveForVars       :: "real list => toreall"
    16   solution           :: bool list => toreall
    16   solution           :: "bool list => toreall"
    17 
    17 
    18   (*the CAS-command, eg. "solveSystem [x+y=1,y=2] [x,y]"*)
    18   (*the CAS-command, eg. "solveSystem [x+y=1,y=2] [x,y]"*)
    19   solveSystem        :: "[bool list, real list] => bool list"
    19   solveSystem        :: "[bool list, real list] => bool list"
    20 
    20 
    21   (*Script-names*)
    21   (*Script-names*)
   127       | _ => 1)
   127       | _ => 1)
   128   | size_of_term' (Abs (_,_,body)) = 1 + size_of_term' body
   128   | size_of_term' (Abs (_,_,body)) = 1 + size_of_term' body
   129   | size_of_term' (f$t) = size_of_term' f  +  size_of_term' t
   129   | size_of_term' (f$t) = size_of_term' f  +  size_of_term' t
   130   | size_of_term' _ = 1;
   130   | size_of_term' _ = 1;
   131 
   131 
   132 fun Term_Ord.term_ord' pr thy (Abs (_, T, t), Abs(_, U, u)) =       (* ~ term.ML *)
   132 fun term_ord' pr thy (Abs (_, T, t), Abs(_, U, u)) =       (* ~ term.ML *)
   133       (case Term_Ord.term_ord' pr thy (t, u) of EQUAL => Term_Ord.typ_ord (T, U) | ord => ord)
   133       (case term_ord' pr thy (t, u) of EQUAL => Term_Ord.typ_ord (T, U) | ord => ord)
   134   | Term_Ord.term_ord' pr thy (t, u) =
   134   | term_ord' pr thy (t, u) =
   135       (if pr then 
   135       (if pr then 
   136 	 let
   136 	 let
   137 	   val (f, ts) = strip_comb t and (g, us) = strip_comb u;
   137 	   val (f, ts) = strip_comb t and (g, us) = strip_comb u;
   138 	   val _=writeln("t= f@ts= \""^
   138 	   val _=writeln("t= f@ts= \""^
   139 	      ((Syntax.string_of_term (thy2ctxt thy)) f)^"\" @ \"["^
   139 	      ((Syntax.string_of_term (thy2ctxt thy)) f)^"\" @ \"["^
   176 end;
   176 end;
   177 (**)
   177 (**)
   178 rew_ord' := overwritel (!rew_ord',
   178 rew_ord' := overwritel (!rew_ord',
   179 [("ord_simplify_System", ord_simplify_System false thy)
   179 [("ord_simplify_System", ord_simplify_System false thy)
   180  ]);
   180  ]);
   181 
   181 *}
   182 
   182 ML {*
   183 (** rulesets **)
   183 (** rulesets **)
   184 
   184 
   185 (*.adapted from 'order_add_mult_in' by just replacing the rew_ord.*)
   185 (*.adapted from 'order_add_mult_in' by just replacing the rew_ord.*)
   186 val order_add_mult_System = 
   186 val order_add_mult_System = 
   187   Rls{id = "order_add_mult_System", preconds = [], 
   187   Rls{id = "order_add_mult_System", preconds = [], 
   200 	       (*x + (y + z) = y + (x + z)*)
   200 	       (*x + (y + z) = y + (x + z)*)
   201 	       Thm ("add_assoc",num_str @{thm add_assoc})	               
   201 	       Thm ("add_assoc",num_str @{thm add_assoc})	               
   202 	       (*z1.0 + z2.0 + z3.0 = z1.0 + (z2.0 + z3.0)*)
   202 	       (*z1.0 + z2.0 + z3.0 = z1.0 + (z2.0 + z3.0)*)
   203 	       ], 
   203 	       ], 
   204       scr = EmptyScr}:rls;
   204       scr = EmptyScr}:rls;
   205 
   205 *}
       
   206 ML {*
   206 (*.adapted from 'norm_Rational' by
   207 (*.adapted from 'norm_Rational' by
   207   #1 using 'ord_simplify_System' in 'order_add_mult_System'
   208   #1 using 'ord_simplify_System' in 'order_add_mult_System'
   208   #2 NOT using common_nominator_p                          .*)
   209   #2 NOT using common_nominator_p                          .*)
   209 val norm_System_noadd_fractions = 
   210 val norm_System_noadd_fractions = 
   210   Rls {id = "norm_System_noadd_fractions", preconds = [], 
   211   Rls {id = "norm_System_noadd_fractions", preconds = [], 
   222 		Rls_ cancel_p
   223 		Rls_ cancel_p
   223 		],
   224 		],
   224        scr = Script ((term_of o the o (parse thy)) 
   225        scr = Script ((term_of o the o (parse thy)) 
   225 			 "empty_script")
   226 			 "empty_script")
   226        }:rls;
   227        }:rls;
       
   228 *}
       
   229 ML {*
   227 (*.adapted from 'norm_Rational' by
   230 (*.adapted from 'norm_Rational' by
   228   *1* using 'ord_simplify_System' in 'order_add_mult_System'.*)
   231   *1* using 'ord_simplify_System' in 'order_add_mult_System'.*)
   229 val norm_System = 
   232 val norm_System = 
   230   Rls {id = "norm_System", preconds = [], 
   233   Rls {id = "norm_System", preconds = [], 
   231        rew_ord = ("dummy_ord",dummy_ord), 
   234        rew_ord = ("dummy_ord",dummy_ord), 
   242 		Rls_ cancel_p
   245 		Rls_ cancel_p
   243 		],
   246 		],
   244        scr = Script ((term_of o the o (parse thy)) 
   247        scr = Script ((term_of o the o (parse thy)) 
   245 			 "empty_script")
   248 			 "empty_script")
   246        }:rls;
   249        }:rls;
   247 
   250 *}
       
   251 ML {*
   248 (*.simplify an equational system BEFORE solving it such that parentheses are
   252 (*.simplify an equational system BEFORE solving it such that parentheses are
   249    ( ((u0*v0)*w0) + ( ((u1*v1)*w1) * c + ... +((u4*v4)*w4) * c_4 ) )
   253    ( ((u0*v0)*w0) + ( ((u1*v1)*w1) * c + ... +((u4*v4)*w4) * c_4 ) )
   250 ATTENTION: works ONLY for bound variables c, c_1, c_2, c_3, c_4 :ATTENTION
   254 ATTENTION: works ONLY for bound variables c, c_1, c_2, c_3, c_4 :ATTENTION
   251    This is a copy from 'make_ratpoly_in' with respective reductions:
   255    This is a copy from 'make_ratpoly_in' with respective reductions:
   252    *0* expand the term, ie. distribute * and / over +
   256    *0* expand the term, ie. distribute * and / over +
   271 	       Rls_ collect_bdv, (*from make_polynomial_in WN051031 welldone?*)
   275 	       Rls_ collect_bdv, (*from make_polynomial_in WN051031 welldone?*)
   272 	       Rls_ separate_bdv2,
   276 	       Rls_ separate_bdv2,
   273 	       Calc ("HOL.divide"  ,eval_cancel "#divide_e")
   277 	       Calc ("HOL.divide"  ,eval_cancel "#divide_e")
   274 	       ],
   278 	       ],
   275       scr = EmptyScr}:rls;      
   279       scr = EmptyScr}:rls;      
   276 
   280 *}
       
   281 ML {*
   277 (*.simplify an equational system AFTER solving it;
   282 (*.simplify an equational system AFTER solving it;
   278    This is a copy of 'make_ratpoly_in' with the differences
   283    This is a copy of 'make_ratpoly_in' with the differences
   279    *1* ord_simplify_System instead of termlessI           .*)
   284    *1* ord_simplify_System instead of termlessI           .*)
   280 (*TODO.WN051031 ^^^^^^^^^^ should be in EACH rls contained *)
   285 (*TODO.WN051031 ^^^^^^^^^^ should be in EACH rls contained *)
   281 val simplify_System = 
   286 val simplify_System = 
   294 val simplify_System = 
   299 val simplify_System = 
   295     append_rls "simplify_System" simplify_System_parenthesized
   300     append_rls "simplify_System" simplify_System_parenthesized
   296 	       [Thm ("sym_add_assoc",
   301 	       [Thm ("sym_add_assoc",
   297                       num_str (@{thm add_assoc} RS @{thm sym}))];
   302                       num_str (@{thm add_assoc} RS @{thm sym}))];
   298 *)
   303 *)
   299 
   304 *}
       
   305 ML {*
   300 val isolate_bdvs = 
   306 val isolate_bdvs = 
   301     Rls {id="isolate_bdvs", preconds = [], 
   307     Rls {id="isolate_bdvs", preconds = [], 
   302 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   308 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   303 	 erls = append_rls "erls_isolate_bdvs" e_rls 
   309 	 erls = append_rls "erls_isolate_bdvs" e_rls 
   304 			   [(Calc ("EqSystem.occur'_exactly'_in", 
   310 			   [(Calc ("EqSystem.occur'_exactly'_in", 
   305 				   eval_occur_exactly_in 
   311 				   eval_occur_exactly_in 
   306 				       "#eval_occur_exactly_in_"))
   312 				       "#eval_occur_exactly_in_"))
   307 			    ], 
   313 			    ], 
   308 			   srls = Erls, calc = [],
   314 			   srls = Erls, calc = [],
   309 	      rules = [Thm ("commute_0_equality",
   315 	      rules = 
   310 			    num_str @{commute_0_equality),
   316              [Thm ("commute_0_equality", num_str @{thm commute_0_equality}),
   311 		       Thm ("separate_bdvs_add", num_str @{thm separate_bdvs_add}),
   317 	      Thm ("separate_bdvs_add", num_str @{thm separate_bdvs_add}),
   312 		       Thm ("separate_bdvs_mult", num_str @{thm separate_bdvs_mult})],
   318 	      Thm ("separate_bdvs_mult", num_str @{thm separate_bdvs_mult})],
   313 	      scr = EmptyScr};
   319 	      scr = EmptyScr};
       
   320 *}
       
   321 ML {*
   314 val isolate_bdvs_4x4 = 
   322 val isolate_bdvs_4x4 = 
   315     Rls {id="isolate_bdvs_4x4", preconds = [], 
   323     Rls {id="isolate_bdvs_4x4", preconds = [], 
   316 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   324 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   317 	 erls = append_rls 
   325 	 erls = append_rls 
   318 		    "erls_isolate_bdvs_4x4" e_rls 
   326 		    "erls_isolate_bdvs_4x4" e_rls 
   323 			   eval_some_occur_in "#some_occur_in_"),
   331 			   eval_some_occur_in "#some_occur_in_"),
   324                      Thm ("not_true",num_str @{thm not_true}),
   332                      Thm ("not_true",num_str @{thm not_true}),
   325 		     Thm ("not_false",num_str @{thm not_false})
   333 		     Thm ("not_false",num_str @{thm not_false})
   326 			    ], 
   334 			    ], 
   327 	 srls = Erls, calc = [],
   335 	 srls = Erls, calc = [],
   328 	 rules = [Thm ("commute_0_equality",
   336 	 rules = [Thm ("commute_0_equality", num_str @{thm commute_0_equality}),
   329 		       num_str @{commute_0_equality),
       
   330 		  Thm ("separate_bdvs0", num_str @{thm separate_bdvs0}),
   337 		  Thm ("separate_bdvs0", num_str @{thm separate_bdvs0}),
   331 		  Thm ("separate_bdvs_add1", num_str @{thm separate_bdvs_add1}),
   338 		  Thm ("separate_bdvs_add1", num_str @{thm separate_bdvs_add1}),
   332 		  Thm ("separate_bdvs_add1", num_str @{thm separate_bdvs_add2}),
   339 		  Thm ("separate_bdvs_add1", num_str @{thm separate_bdvs_add2}),
   333 		  Thm ("separate_bdvs_mult", num_str @{thm separate_bdvs_mult})
   340 		  Thm ("separate_bdvs_mult", num_str @{thm separate_bdvs_mult})
   334                  ], scr = EmptyScr};
   341                  ], scr = EmptyScr};
       
   342 
       
   343 *}
       
   344 ML {*
   335 
   345 
   336 (*.order the equations in a system such, that a triangular system (if any)
   346 (*.order the equations in a system such, that a triangular system (if any)
   337    appears as [..c_4 = .., ..., ..., ..c_1 + ..c_2 + ..c_3 ..c_4 = ..].*)
   347    appears as [..c_4 = .., ..., ..., ..c_1 + ..c_2 + ..c_3 ..c_4 = ..].*)
   338 val order_system = 
   348 val order_system = 
   339     Rls {id="order_system", preconds = [], 
   349     Rls {id="order_system", preconds = [], 
   348     Rls {id="prls_triangular", preconds = [], 
   358     Rls {id="prls_triangular", preconds = [], 
   349 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   359 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   350 	 erls = Rls {id="erls_prls_triangular", preconds = [], 
   360 	 erls = Rls {id="erls_prls_triangular", preconds = [], 
   351 		     rew_ord = ("e_rew_ord", e_rew_ord), 
   361 		     rew_ord = ("e_rew_ord", e_rew_ord), 
   352 		     erls = Erls, srls = Erls, calc = [],
   362 		     erls = Erls, srls = Erls, calc = [],
   353 		     rules = [(*for precond nth_Cons_ ...*)
   363 		     rules = [(*for precond NTH_CONS ...*)
   354 			      Calc ("op <",eval_equ "#less_"),
   364 			      Calc ("op <",eval_equ "#less_"),
   355 			      Calc ("op +", eval_binop "#add_")
   365 			      Calc ("op +", eval_binop "#add_")
   356 			      (*immediately repeated rewrite pushes
   366 			      (*immediately repeated rewrite pushes
   357 					    '+' into precondition !*)
   367 					    '+' into precondition !*)
   358 			      ],
   368 			      ],
   359 		     scr = EmptyScr}, 
   369 		     scr = EmptyScr}, 
   360 	 srls = Erls, calc = [],
   370 	 srls = Erls, calc = [],
   361 	 rules = [Thm ("nth_Cons_",num_str @{thm nth_Cons_}),
   371 	 rules = [Thm ("NTH_CONS",num_str @{thm NTH_CONS}),
   362 		  Calc ("op +", eval_binop "#add_"),
   372 		  Calc ("op +", eval_binop "#add_"),
   363 		  Thm ("nth_Nil_",num_str @{thm nth_Nil_}),
   373 		  Thm ("NTH_NIL",num_str @{thm NTH_NIL}),
   364 		  Thm ("tl_Cons",num_str @{thm tl_Cons}),
   374 		  Thm ("tl_Cons",num_str @{thm tl_Cons}),
   365 		  Thm ("tl_Nil",num_str @{thm tl_Nil}),
   375 		  Thm ("tl_Nil",num_str @{thm tl_Nil}),
   366 		  Calc ("EqSystem.occur'_exactly'_in", 
   376 		  Calc ("EqSystem.occur'_exactly'_in", 
   367 			eval_occur_exactly_in 
   377 			eval_occur_exactly_in 
   368 			    "#eval_occur_exactly_in_")
   378 			    "#eval_occur_exactly_in_")
   369 		  ],
   379 		  ],
   370 	 scr = EmptyScr};
   380 	 scr = EmptyScr};
       
   381 *}
       
   382 ML {*
   371 
   383 
   372 (*WN060914 quickly created for 4x4; 
   384 (*WN060914 quickly created for 4x4; 
   373  more similarity to prls_triangular desirable*)
   385  more similarity to prls_triangular desirable*)
   374 val prls_triangular4 = 
   386 val prls_triangular4 = 
   375     Rls {id="prls_triangular4", preconds = [], 
   387     Rls {id="prls_triangular4", preconds = [], 
   376 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   388 	 rew_ord = ("e_rew_ord", e_rew_ord), 
   377 	 erls = Rls {id="erls_prls_triangular4", preconds = [], 
   389 	 erls = Rls {id="erls_prls_triangular4", preconds = [], 
   378 		     rew_ord = ("e_rew_ord", e_rew_ord), 
   390 		     rew_ord = ("e_rew_ord", e_rew_ord), 
   379 		     erls = Erls, srls = Erls, calc = [],
   391 		     erls = Erls, srls = Erls, calc = [],
   380 		     rules = [(*for precond nth_Cons_ ...*)
   392 		     rules = [(*for precond NTH_CONS ...*)
   381 			      Calc ("op <",eval_equ "#less_"),
   393 			      Calc ("op <",eval_equ "#less_"),
   382 			      Calc ("op +", eval_binop "#add_")
   394 			      Calc ("op +", eval_binop "#add_")
   383 			      (*immediately repeated rewrite pushes
   395 			      (*immediately repeated rewrite pushes
   384 					    '+' into precondition !*)
   396 					    '+' into precondition !*)
   385 			      ],
   397 			      ],
   386 		     scr = EmptyScr}, 
   398 		     scr = EmptyScr}, 
   387 	 srls = Erls, calc = [],
   399 	 srls = Erls, calc = [],
   388 	 rules = [Thm ("nth_Cons_",num_str @{thm nth_Cons_}),
   400 	 rules = [Thm ("NTH_CONS",num_str @{thm NTH_CONS}),
   389 		  Calc ("op +", eval_binop "#add_"),
   401 		  Calc ("op +", eval_binop "#add_"),
   390 		  Thm ("nth_Nil_",num_str @{thm thm nth_Nil_}),
   402 		  Thm ("NTH_NIL",num_str @{thm NTH_NIL}),
   391 		  Thm ("tl_Cons",num_str @{thm tl_Cons}),
   403 		  Thm ("tl_Cons",num_str @{thm tl_Cons}),
   392 		  Thm ("tl_Nil",num_str @{thm tl_Nil}),
   404 		  Thm ("tl_Nil",num_str @{thm tl_Nil}),
   393 		  Calc ("EqSystem.occur'_exactly'_in", 
   405 		  Calc ("EqSystem.occur'_exactly'_in", 
   394 			eval_occur_exactly_in 
   406 			eval_occur_exactly_in 
   395 			    "#eval_occur_exactly_in_")
   407 			    "#eval_occur_exactly_in_")
   396 		  ],
   408 		  ],
   397 	 scr = EmptyScr};
   409 	 scr = EmptyScr};
       
   410 *}
       
   411 ML {*
   398 
   412 
   399 ruleset' := 
   413 ruleset' := 
   400 overwritelthy @{theory} 
   414 overwritelthy @{theory} 
   401 	      (!ruleset', 
   415 	      (!ruleset', 
   402 [("simplify_System_parenthesized", prep_rls simplify_System_parenthesized),
   416 [("simplify_System_parenthesized", prep_rls simplify_System_parenthesized),
   406  ("order_system", prep_rls order_system),
   420  ("order_system", prep_rls order_system),
   407  ("order_add_mult_System", prep_rls order_add_mult_System),
   421  ("order_add_mult_System", prep_rls order_add_mult_System),
   408  ("norm_System_noadd_fractions", prep_rls norm_System_noadd_fractions),
   422  ("norm_System_noadd_fractions", prep_rls norm_System_noadd_fractions),
   409  ("norm_System", prep_rls norm_System)
   423  ("norm_System", prep_rls norm_System)
   410  ]);
   424  ]);
       
   425 *}
       
   426 ML {*
   411 
   427 
   412 
   428 
   413 (** problems **)
   429 (** problems **)
   414 
   430 
   415 store_pbt
   431 store_pbt
   416  (prep_pbt thy "pbl_equsys" [] e_pblID
   432  (prep_pbt thy "pbl_equsys" [] e_pblID
   417  (["system"],
   433  (["system"],
   418   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   434   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   419    ("#Find"  ,["solution ss___"](*___ is copy-named*))
   435    ("#Find"  ,["solution ss'''"](*''' is copy-named*))
   420   ],
   436   ],
   421   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   437   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   422   SOME "solveSystem es_ v_s", 
   438   SOME "solveSystem e_s v_s", 
   423   []));
   439   []));
   424 store_pbt
   440 store_pbt
   425  (prep_pbt thy "pbl_equsys_lin" [] e_pblID
   441  (prep_pbt thy "pbl_equsys_lin" [] e_pblID
   426  (["linear", "system"],
   442  (["linear", "system"],
   427   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   443   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   428    (*TODO.WN050929 check linearity*)
   444    (*TODO.WN050929 check linearity*)
   429    ("#Find"  ,["solution ss___"])
   445    ("#Find"  ,["solution ss'''"])
   430   ],
   446   ],
   431   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   447   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   432   SOME "solveSystem es_ v_s", 
   448   SOME "solveSystem e_s v_s", 
   433   []));
   449   []));
   434 store_pbt
   450 store_pbt
   435  (prep_pbt thy "pbl_equsys_lin_2x2" [] e_pblID
   451  (prep_pbt thy "pbl_equsys_lin_2x2" [] e_pblID
   436  (["2x2", "linear", "system"],
   452  (["2x2", "linear", "system"],
   437   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   453   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   438   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   454   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   439    ("#Where"  ,["length_ (es_:: bool list) = 2", "length_ v_s = 2"]),
   455    ("#Where"  ,["LENGTH (e_s:: bool list) = 2", "LENGTH v_s = 2"]),
   440    ("#Find"  ,["solution ss___"])
   456    ("#Find"  ,["solution ss'''"])
   441   ],
   457   ],
   442   append_rls "prls_2x2_linear_system" e_rls 
   458   append_rls "prls_2x2_linear_system" e_rls 
   443 			     [Thm ("length_Cons_",num_str @{thm length_Cons_}),
   459 			     [Thm ("LENGTH_CONS",num_str @{thm LENGTH_CONS}),
   444 			      Thm ("length_Nil_",num_str @{thm length_Nil_}),
   460 			      Thm ("LENGTH_NIL",num_str @{thm LENGTH_NIL}),
   445 			      Calc ("op +", eval_binop "#add_"),
   461 			      Calc ("op +", eval_binop "#add_"),
   446 			      Calc ("op =",eval_equal "#equal_")
   462 			      Calc ("op =",eval_equal "#equal_")
   447 			      ], 
   463 			      ], 
   448   SOME "solveSystem es_ v_s", 
   464   SOME "solveSystem e_s v_s", 
   449   []));
   465   []));
       
   466 *}
       
   467 ML {*
   450 store_pbt
   468 store_pbt
   451  (prep_pbt thy "pbl_equsys_lin_2x2_tri" [] e_pblID
   469  (prep_pbt thy "pbl_equsys_lin_2x2_tri" [] e_pblID
   452  (["triangular", "2x2", "linear", "system"],
   470  (["triangular", "2x2", "linear", "system"],
   453   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   471   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   454    ("#Where"  ,
   472    ("#Where"  ,
   455     ["(tl v_s) from_ v_s occur_exactly_in (nth_ 1 (es_::bool list))",
   473     ["(tl v_s) from_ v_s occur_exactly_in (NTH 1 (e_s::bool list))",
   456      "    v_s  from_ v_s occur_exactly_in (nth_ 2 (es_::bool list))"]),
   474      "    v_s  from_ v_s occur_exactly_in (NTH 2 (e_s::bool list))"]),
   457    ("#Find"  ,["solution ss___"])
   475    ("#Find"  ,["solution ss'''"])
   458   ],
   476   ],
   459   prls_triangular, 
   477   prls_triangular, 
   460   SOME "solveSystem es_ v_s", 
   478   SOME "solveSystem e_s v_s", 
   461   [["EqSystem","top_down_substitution","2x2"]]));
   479   [["EqSystem","top_down_substitution","2x2"]]));
   462 store_pbt
   480 store_pbt
   463  (prep_pbt thy "pbl_equsys_lin_2x2_norm" [] e_pblID
   481  (prep_pbt thy "pbl_equsys_lin_2x2_norm" [] e_pblID
   464  (["normalize", "2x2", "linear", "system"],
   482  (["normalize", "2x2", "linear", "system"],
   465   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   483   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   466    ("#Find"  ,["solution ss___"])
   484    ("#Find"  ,["solution ss'''"])
   467   ],
   485   ],
   468   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   486   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   469   SOME "solveSystem es_ v_s", 
   487   SOME "solveSystem e_s v_s", 
   470   [["EqSystem","normalize","2x2"]]));
   488   [["EqSystem","normalize","2x2"]]));
   471 store_pbt
   489 store_pbt
   472  (prep_pbt thy "pbl_equsys_lin_3x3" [] e_pblID
   490  (prep_pbt thy "pbl_equsys_lin_3x3" [] e_pblID
   473  (["3x3", "linear", "system"],
   491  (["3x3", "linear", "system"],
   474   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   492   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   475   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   493   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   476    ("#Where"  ,["length_ (es_:: bool list) = 3", "length_ v_s = 3"]),
   494    ("#Where"  ,["LENGTH (e_s:: bool list) = 3", "LENGTH v_s = 3"]),
   477    ("#Find"  ,["solution ss___"])
   495    ("#Find"  ,["solution ss'''"])
   478   ],
   496   ],
   479   append_rls "prls_3x3_linear_system" e_rls 
   497   append_rls "prls_3x3_linear_system" e_rls 
   480 			     [Thm ("length_Cons_",num_str @{thm length_Cons_}),
   498 			     [Thm ("LENGTH_CONS",num_str @{thm LENGTH_CONS}),
   481 			      Thm ("length_Nil_",num_str @{thm length_Nil_}),
   499 			      Thm ("LENGTH_NIL",num_str @{thm LENGTH_NIL}),
   482 			      Calc ("op +", eval_binop "#add_"),
   500 			      Calc ("op +", eval_binop "#add_"),
   483 			      Calc ("op =",eval_equal "#equal_")
   501 			      Calc ("op =",eval_equal "#equal_")
   484 			      ], 
   502 			      ], 
   485   SOME "solveSystem es_ v_s", 
   503   SOME "solveSystem e_s v_s", 
   486   []));
   504   []));
   487 store_pbt
   505 store_pbt
   488  (prep_pbt thy "pbl_equsys_lin_4x4" [] e_pblID
   506  (prep_pbt thy "pbl_equsys_lin_4x4" [] e_pblID
   489  (["4x4", "linear", "system"],
   507  (["4x4", "linear", "system"],
   490   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   508   (*~~~~~~~~~~~~~~~~~~~~~~~~~*)
   491   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   509   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   492    ("#Where"  ,["length_ (es_:: bool list) = 4", "length_ v_s = 4"]),
   510    ("#Where"  ,["LENGTH (e_s:: bool list) = 4", "LENGTH v_s = 4"]),
   493    ("#Find"  ,["solution ss___"])
   511    ("#Find"  ,["solution ss'''"])
   494   ],
   512   ],
   495   append_rls "prls_4x4_linear_system" e_rls 
   513   append_rls "prls_4x4_linear_system" e_rls 
   496 			     [Thm ("length_Cons_",num_str @{thm length_Cons_}),
   514 			     [Thm ("LENGTH_CONS",num_str @{thm LENGTH_CONS}),
   497 			      Thm ("length_Nil_",num_str @{thm length_Nil_}),
   515 			      Thm ("LENGTH_NIL",num_str @{thm LENGTH_NIL}),
   498 			      Calc ("op +", eval_binop "#add_"),
   516 			      Calc ("op +", eval_binop "#add_"),
   499 			      Calc ("op =",eval_equal "#equal_")
   517 			      Calc ("op =",eval_equal "#equal_")
   500 			      ], 
   518 			      ], 
   501   SOME "solveSystem es_ v_s", 
   519   SOME "solveSystem e_s v_s", 
   502   []));
   520   []));
       
   521 *}
       
   522 ML {*
   503 store_pbt
   523 store_pbt
   504  (prep_pbt thy "pbl_equsys_lin_4x4_tri" [] e_pblID
   524  (prep_pbt thy "pbl_equsys_lin_4x4_tri" [] e_pblID
   505  (["triangular", "4x4", "linear", "system"],
   525  (["triangular", "4x4", "linear", "system"],
   506   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   526   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   507    ("#Where" , (*accepts missing variables up to diagional form*)
   527    ("#Where" , (*accepts missing variables up to diagional form*)
   508     ["(nth_ 1 (v_s::real list)) occurs_in (nth_ 1 (es_::bool list))",
   528     ["(NTH 1 (v_s::real list)) occurs_in (NTH 1 (e_s::bool list))",
   509      "(nth_ 2 (v_s::real list)) occurs_in (nth_ 2 (es_::bool list))",
   529      "(NTH 2 (v_s::real list)) occurs_in (NTH 2 (e_s::bool list))",
   510      "(nth_ 3 (v_s::real list)) occurs_in (nth_ 3 (es_::bool list))",
   530      "(NTH 3 (v_s::real list)) occurs_in (NTH 3 (e_s::bool list))",
   511      "(nth_ 4 (v_s::real list)) occurs_in (nth_ 4 (es_::bool list))"
   531      "(NTH 4 (v_s::real list)) occurs_in (NTH 4 (e_s::bool list))"
   512      ]),
   532      ]),
   513    ("#Find"  ,["solution ss___"])
   533    ("#Find"  ,["solution ss'''"])
   514   ],
   534   ],
   515   append_rls "prls_tri_4x4_lin_sys" prls_triangular
   535   append_rls "prls_tri_4x4_lin_sys" prls_triangular
   516 	     [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
   536 	     [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
   517   SOME "solveSystem es_ v_s", 
   537   SOME "solveSystem e_s v_s", 
   518   [["EqSystem","top_down_substitution","4x4"]]));
   538   [["EqSystem","top_down_substitution","4x4"]]));
   519 
   539 *}
       
   540 ML {*
   520 store_pbt
   541 store_pbt
   521  (prep_pbt thy "pbl_equsys_lin_4x4_norm" [] e_pblID
   542  (prep_pbt thy "pbl_equsys_lin_4x4_norm" [] e_pblID
   522  (["normalize", "4x4", "linear", "system"],
   543  (["normalize", "4x4", "linear", "system"],
   523   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   544   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   524    (*length_ is checked 1 level above*)
   545    (*LENGTH is checked 1 level above*)
   525    ("#Find"  ,["solution ss___"])
   546    ("#Find"  ,["solution ss'''"])
   526   ],
   547   ],
   527   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   548   append_rls "e_rls" e_rls [(*for preds in where_*)], 
   528   SOME "solveSystem es_ v_s", 
   549   SOME "solveSystem e_s v_s", 
   529   [["EqSystem","normalize","4x4"]]));
   550   [["EqSystem","normalize","4x4"]]));
   530 
   551 
   531 
   552 
   532 (* show_ptyps();
   553 (* show_ptyps();
   533    *)
   554    *)
   534 
   555 
       
   556 *}
       
   557 ML {*
   535 (** methods **)
   558 (** methods **)
   536 
   559 
   537 store_met
   560 store_met
   538     (prep_met thy "met_eqsys" [] e_metID
   561     (prep_met thy "met_eqsys" [] e_metID
   539 	      (["EqSystem"],
   562 	      (["EqSystem"],
   548 	       [],
   571 	       [],
   549 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   572 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   550 		srls = Erls, prls = Erls, crls = Erls, nrls = Erls},
   573 		srls = Erls, prls = Erls, crls = Erls, nrls = Erls},
   551 	       "empty_script"
   574 	       "empty_script"
   552 	       ));
   575 	       ));
       
   576 *}
       
   577 ML {*
   553 store_met
   578 store_met
   554     (prep_met thy "met_eqsys_topdown_2x2" [] e_metID
   579     (prep_met thy "met_eqsys_topdown_2x2" [] e_metID
   555 	 (["EqSystem","top_down_substitution","2x2"],
   580 	 (["EqSystem","top_down_substitution","2x2"],
   556 	  [("#Given" ,["equalities es_", "solveForVars v_s"]),
   581 	  [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   557 	   ("#Where"  ,
   582 	   ("#Where"  ,
   558 	    ["(tl v_s) from_ v_s occur_exactly_in (nth_ 1 (es_::bool list))",
   583 	    ["(tl v_s) from_ v_s occur_exactly_in (NTH 1 (e_s::bool list))",
   559 	     "    v_s  from_ v_s occur_exactly_in (nth_ 2 (es_::bool list))"]),
   584 	     "    v_s  from_ v_s occur_exactly_in (NTH 2 (e_s::bool list))"]),
   560 	   ("#Find"  ,["solution ss___"])
   585 	   ("#Find"  ,["solution ss'''"])
   561 	   ],
   586 	   ],
   562 	  {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
   587 	  {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
   563 	   srls = append_rls "srls_top_down_2x2" e_rls
   588 	   srls = append_rls "srls_top_down_2x2" e_rls
   564 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   589 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   565 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   590 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   566 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   591 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   567 				   ], 
   592 				   ], 
   568 	   prls = prls_triangular, crls = Erls, nrls = Erls},
   593 	   prls = prls_triangular, crls = Erls, nrls = Erls},
   569 "Script SolveSystemScript (es_::bool list) (v_s::real list) =                " ^
   594 "Script SolveSystemScript (e_s::bool list) (v_s::real list) =                " ^
   570 "  (let e1__ = Take (hd es_);                                                " ^
   595 "  (let e_1 = Take (hd e_s);                                                " ^
   571 "       e1__ = ((Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   596 "       e_1 = ((Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   572 "                                  isolate_bdvs False))     @@               " ^
   597 "                                  isolate_bdvs False))     @@               " ^
   573 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   598 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   574 "                                  simplify_System False))) e1__;            " ^
   599 "                                  simplify_System False))) e_1;            " ^
   575 "       e2__ = Take (hd (tl es_));                                           " ^
   600 "       e_2 = Take (hd (tl e_s));                                           " ^
   576 "       e2__ = ((Substitute [e1__]) @@                                       " ^
   601 "       e_2 = ((Substitute [e_1]) @@                                       " ^
   577 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   602 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   578 "                                  simplify_System_parenthesized False)) @@  " ^
   603 "                                  simplify_System_parenthesized False)) @@  " ^
   579 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   604 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   580 "                                  isolate_bdvs False))     @@               " ^
   605 "                                  isolate_bdvs False))     @@               " ^
   581 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   606 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   582 "                                  simplify_System False))) e2__;            " ^
   607 "                                  simplify_System False))) e_2;            " ^
   583 "       es__ = Take [e1__, e2__]                                             " ^
   608 "       e__s = Take [e_1, e_2]                                             " ^
   584 "   in (Try (Rewrite_Set order_system False)) es__)"
   609 "   in (Try (Rewrite_Set order_system False)) e__s)"
   585 (*---------------------------------------------------------------------------
   610 (*---------------------------------------------------------------------------
   586   this script does NOT separate the equations as abolve, 
   611   this script does NOT separate the equations as above, 
   587   but it does not yet work due to preliminary script-interpreter,
   612   but it does not yet work due to preliminary script-interpreter,
   588   see eqsystem.sml 'script [EqSystem,top_down_substitution,2x2] Vers.2'
   613   see eqsystem.sml 'script [EqSystem,top_down_substitution,2x2] Vers.2'
   589 
   614 
   590 "Script SolveSystemScript (es_::bool list) (v_s::real list) =         " ^
   615 "Script SolveSystemScript (e_s::bool list) (v_s::real list) =         " ^
   591 "  (let es__ = Take es_;                                              " ^
   616 "  (let e__s = Take e_s;                                              " ^
   592 "       e1__ = hd es__;                                               " ^
   617 "       e_1 = hd e__s;                                               " ^
   593 "       e2__ = hd (tl es__);                                          " ^
   618 "       e_2 = hd (tl e__s);                                          " ^
   594 "       es__ = [e1__, Substitute [e1__] e2__]                         " ^
   619 "       e__s = [e_1, Substitute [e_1] e_2]                         " ^
   595 "   in ((Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   620 "   in ((Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   596 "                                  simplify_System_parenthesized False)) @@ " ^
   621 "                                  simplify_System_parenthesized False)) @@ " ^
   597 "       (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))] " ^
   622 "       (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))] " ^
   598 "                              isolate_bdvs False))              @@   " ^
   623 "                              isolate_bdvs False))              @@   " ^
   599 "       (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   624 "       (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   600 "                                  simplify_System False))) es__)"
   625 "                                  simplify_System False))) e__s)"
   601 ---------------------------------------------------------------------------*)
   626 ---------------------------------------------------------------------------*)
   602 	  ));
   627 	  ));
       
   628 *}
       
   629 ML {*
   603 store_met
   630 store_met
   604     (prep_met thy "met_eqsys_norm" [] e_metID
   631     (prep_met thy "met_eqsys_norm" [] e_metID
   605 	      (["EqSystem","normalize"],
   632 	      (["EqSystem","normalize"],
   606 	       [],
   633 	       [],
   607 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   634 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   609 	       "empty_script"
   636 	       "empty_script"
   610 	       ));
   637 	       ));
   611 store_met
   638 store_met
   612     (prep_met thy "met_eqsys_norm_2x2" [] e_metID
   639     (prep_met thy "met_eqsys_norm_2x2" [] e_metID
   613 	      (["EqSystem","normalize","2x2"],
   640 	      (["EqSystem","normalize","2x2"],
   614 	       [("#Given" ,["equalities es_", "solveForVars v_s"]),
   641 	       [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   615 		("#Find"  ,["solution ss___"])],
   642 		("#Find"  ,["solution ss'''"])],
   616 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   643 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   617 		srls = append_rls "srls_normalize_2x2" e_rls
   644 		srls = append_rls "srls_normalize_2x2" e_rls
   618 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   645 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   619 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   646 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   620 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   647 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   621 				   ], 
   648 				   ], 
   622 		prls = Erls, crls = Erls, nrls = Erls},
   649 		prls = Erls, crls = Erls, nrls = Erls},
   623 "Script SolveSystemScript (es_::bool list) (v_s::real list) =                " ^
   650 "Script SolveSystemScript (e_s::bool list) (v_s::real list) =                " ^
   624 "  (let es__ = ((Try (Rewrite_Set norm_Rational False)) @@                   " ^
   651 "  (let e__s = ((Try (Rewrite_Set norm_Rational False)) @@                   " ^
   625 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   652 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   626 "                                  simplify_System_parenthesized False)) @@  " ^
   653 "                                  simplify_System_parenthesized False)) @@  " ^
   627 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   654 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   628 "                                                    isolate_bdvs False)) @@ " ^
   655 "                                                    isolate_bdvs False)) @@ " ^
   629 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   656 "               (Try (Rewrite_Set_Inst [(bdv_1, hd v_s),(bdv_2, hd (tl v_s))]" ^
   630 "                                  simplify_System_parenthesized False)) @@  " ^
   657 "                                  simplify_System_parenthesized False)) @@  " ^
   631 "               (Try (Rewrite_Set order_system False))) es_                  " ^
   658 "               (Try (Rewrite_Set order_system False))) e_s                  " ^
   632 "   in (SubProblem (EqSystem_,[linear,system],[no_met])                      " ^
   659 "   in (SubProblem (EqSystem_,[linear,system],[no_met])                      " ^
   633 "                  [BOOL_LIST es__, REAL_LIST v_s]))"
   660 "                  [BOOL_LIST e__s, REAL_LIST v_s]))"
   634 	       ));
   661 	       ));
   635 
   662 
   636 (*this is for nth_ only*)
   663 (*this is for NTH only*)
   637 val srls = Rls {id="srls_normalize_4x4", 
   664 val srls = Rls {id="srls_normalize_4x4", 
   638 		preconds = [], 
   665 		preconds = [], 
   639 		rew_ord = ("termlessI",termlessI), 
   666 		rew_ord = ("termlessI",termlessI), 
   640 		erls = append_rls "erls_in_srls_IntegrierenUnd.." e_rls
   667 		erls = append_rls "erls_in_srls_IntegrierenUnd.." e_rls
   641 				  [(*for asm in nth_Cons_ ...*)
   668 				  [(*for asm in NTH_CONS ...*)
   642 				   Calc ("op <",eval_equ "#less_"),
   669 				   Calc ("op <",eval_equ "#less_"),
   643 				   (*2nd nth_Cons_ pushes n+-1 into asms*)
   670 				   (*2nd NTH_CONS pushes n+-1 into asms*)
   644 				   Calc("op +", eval_binop "#add_")
   671 				   Calc("op +", eval_binop "#add_")
   645 				   ], 
   672 				   ], 
   646 		srls = Erls, calc = [],
   673 		srls = Erls, calc = [],
   647 		rules = [Thm ("nth_Cons_",num_str @{thm nth_Cons_}),
   674 		rules = [Thm ("NTH_CONS",num_str @{thm NTH_CONS}),
   648 			 Calc("op +", eval_binop "#add_"),
   675 			 Calc("op +", eval_binop "#add_"),
   649 			 Thm ("nth_Nil_",num_str @{thm nth_Nil_})],
   676 			 Thm ("NTH_NIL",num_str @{thm NTH_NIL})],
   650 		scr = EmptyScr};
   677 		scr = EmptyScr};
   651 store_met
   678 store_met
   652     (prep_met thy "met_eqsys_norm_4x4" [] e_metID
   679     (prep_met thy "met_eqsys_norm_4x4" [] e_metID
   653 	      (["EqSystem","normalize","4x4"],
   680 	      (["EqSystem","normalize","4x4"],
   654 	       [("#Given" ,["equalities es_", "solveForVars v_s"]),
   681 	       [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   655 		("#Find"  ,["solution ss___"])],
   682 		("#Find"  ,["solution ss'''"])],
   656 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   683 	       {rew_ord'="tless_true", rls' = Erls, calc = [], 
   657 		srls = append_rls "srls_normalize_4x4" srls
   684 		srls = append_rls "srls_normalize_4x4" srls
   658 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   685 				  [Thm ("hd_thm",num_str @{thm hd_thm}),
   659 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   686 				   Thm ("tl_Cons",num_str @{thm tl_Cons}),
   660 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   687 				   Thm ("tl_Nil",num_str @{thm tl_Nil})
   661 				   ], 
   688 				   ], 
   662 		prls = Erls, crls = Erls, nrls = Erls},
   689 		prls = Erls, crls = Erls, nrls = Erls},
   663 (*GOON met ["EqSystem","normalize","4x4"] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*)
   690 (*GOON met ["EqSystem","normalize","4x4"] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*)
   664 "Script SolveSystemScript (es_::bool list) (v_s::real list) =                " ^
   691 "Script SolveSystemScript (e_s::bool list) (v_s::real list) =                " ^
   665 "  (let es__ =                                                               " ^
   692 "  (let e__s =                                                               " ^
   666 "     ((Try (Rewrite_Set norm_Rational False)) @@                            " ^
   693 "     ((Try (Rewrite_Set norm_Rational False)) @@                            " ^
   667 "      (Repeat (Rewrite commute_0_equality False)) @@                        " ^
   694 "      (Repeat (Rewrite commute_0_equality False)) @@                        " ^
   668 "      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 v_s),(bdv_2, nth_ 2 v_s ),     " ^
   695 "      (Try (Rewrite_Set_Inst [(bdv_1, NTH 1 v_s),(bdv_2, NTH 2 v_s ),     " ^
   669 "                              (bdv_3, nth_ 3 v_s),(bdv_3, nth_ 4 v_s )]     " ^
   696 "                              (bdv_3, NTH 3 v_s),(bdv_3, NTH 4 v_s )]     " ^
   670 "                             simplify_System_parenthesized False))    @@    " ^
   697 "                             simplify_System_parenthesized False))    @@    " ^
   671 "      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 v_s),(bdv_2, nth_ 2 v_s ),     " ^
   698 "      (Try (Rewrite_Set_Inst [(bdv_1, NTH 1 v_s),(bdv_2, NTH 2 v_s ),     " ^
   672 "                              (bdv_3, nth_ 3 v_s),(bdv_3, nth_ 4 v_s )]     " ^
   699 "                              (bdv_3, NTH 3 v_s),(bdv_3, NTH 4 v_s )]     " ^
   673 "                             isolate_bdvs_4x4 False))                 @@    " ^
   700 "                             isolate_bdvs_4x4 False))                 @@    " ^
   674 "      (Try (Rewrite_Set_Inst [(bdv_1, nth_ 1 v_s),(bdv_2, nth_ 2 v_s ),     " ^
   701 "      (Try (Rewrite_Set_Inst [(bdv_1, NTH 1 v_s),(bdv_2, NTH 2 v_s ),     " ^
   675 "                              (bdv_3, nth_ 3 v_s),(bdv_3, nth_ 4 v_s )]     " ^
   702 "                              (bdv_3, NTH 3 v_s),(bdv_3, NTH 4 v_s )]     " ^
   676 "                             simplify_System_parenthesized False))    @@    " ^
   703 "                             simplify_System_parenthesized False))    @@    " ^
   677 "      (Try (Rewrite_Set order_system False)))                           es_ " ^
   704 "      (Try (Rewrite_Set order_system False)))                           e_s " ^
   678 "   in (SubProblem (EqSystem_,[linear,system],[no_met])                      " ^
   705 "   in (SubProblem (EqSystem_,[linear,system],[no_met])                      " ^
   679 "                  [BOOL_LIST es__, REAL_LIST v_s]))"
   706 "                  [BOOL_LIST e__s, REAL_LIST v_s]))"
   680 ));
   707 ));
   681 store_met
   708 store_met
   682 (prep_met thy "met_eqsys_topdown_4x4" [] e_metID
   709 (prep_met thy "met_eqsys_topdown_4x4" [] e_metID
   683 	  (["EqSystem","top_down_substitution","4x4"],
   710 	  (["EqSystem","top_down_substitution","4x4"],
   684 	   [("#Given" ,["equalities es_", "solveForVars v_s"]),
   711 	   [("#Given" ,["equalities e_s", "solveForVars v_s"]),
   685 	    ("#Where" , (*accepts missing variables up to diagonal form*)
   712 	    ("#Where" , (*accepts missing variables up to diagonal form*)
   686 	     ["(nth_ 1 (v_s::real list)) occurs_in (nth_ 1 (es_::bool list))",
   713 	     ["(NTH 1 (v_s::real list)) occurs_in (NTH 1 (e_s::bool list))",
   687 	      "(nth_ 2 (v_s::real list)) occurs_in (nth_ 2 (es_::bool list))",
   714 	      "(NTH 2 (v_s::real list)) occurs_in (NTH 2 (e_s::bool list))",
   688 	      "(nth_ 3 (v_s::real list)) occurs_in (nth_ 3 (es_::bool list))",
   715 	      "(NTH 3 (v_s::real list)) occurs_in (NTH 3 (e_s::bool list))",
   689 	      "(nth_ 4 (v_s::real list)) occurs_in (nth_ 4 (es_::bool list))"
   716 	      "(NTH 4 (v_s::real list)) occurs_in (NTH 4 (e_s::bool list))"
   690 	      ]),
   717 	      ]),
   691 	    ("#Find"  ,["solution ss___"])
   718 	    ("#Find"  ,["solution ss'''"])
   692 	    ],
   719 	    ],
   693 	   {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
   720 	   {rew_ord'="ord_simplify_System", rls' = Erls, calc = [], 
   694 	    srls = append_rls "srls_top_down_4x4" srls [], 
   721 	    srls = append_rls "srls_top_down_4x4" srls [], 
   695 	    prls = append_rls "prls_tri_4x4_lin_sys" prls_triangular
   722 	    prls = append_rls "prls_tri_4x4_lin_sys" prls_triangular
   696 			      [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
   723 			      [Calc ("Atools.occurs'_in",eval_occurs_in "")], 
   697 	    crls = Erls, nrls = Erls},
   724 	    crls = Erls, nrls = Erls},
   698 (*FIXXXXME.WN060916: this script works ONLY for exp 7.79 @@@@@@@@@@@@@@@@@@@@*)
   725 (*FIXXXXME.WN060916: this script works ONLY for exp 7.79 @@@@@@@@@@@@@@@@@@@@*)
   699 "Script SolveSystemScript (es_::bool list) (v_s::real list) =                " ^
   726 "Script SolveSystemScript (e_s::bool list) (v_s::real list) =                " ^
   700 "  (let e1_ = nth_ 1 es_;                                                    " ^
   727 "  (let e_1 = NTH 1 e_s;                                                    " ^
   701 "       e2_ = Take (nth_ 2 es_);                                             " ^
   728 "       e_2 = Take (NTH 2 e_s);                                             " ^
   702 "       e2_ = ((Substitute [e1_]) @@                                         " ^
   729 "       e_2 = ((Substitute [e_1]) @@                                         " ^
   703 "              (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 v_s),(bdv_2,nth_ 2 v_s)," ^
   730 "              (Try (Rewrite_Set_Inst [(bdv_1,NTH 1 v_s),(bdv_2,NTH 2 v_s)," ^
   704 "                                      (bdv_3,nth_ 3 v_s),(bdv_4,nth_ 4 v_s)]" ^
   731 "                                      (bdv_3,NTH 3 v_s),(bdv_4,NTH 4 v_s)]" ^
   705 "                                 simplify_System_parenthesized False)) @@   " ^
   732 "                                 simplify_System_parenthesized False)) @@   " ^
   706 "              (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 v_s),(bdv_2,nth_ 2 v_s)," ^
   733 "              (Try (Rewrite_Set_Inst [(bdv_1,NTH 1 v_s),(bdv_2,NTH 2 v_s)," ^
   707 "                                      (bdv_3,nth_ 3 v_s),(bdv_4,nth_ 4 v_s)]" ^
   734 "                                      (bdv_3,NTH 3 v_s),(bdv_4,NTH 4 v_s)]" ^
   708 "                                 isolate_bdvs False))                  @@   " ^
   735 "                                 isolate_bdvs False))                  @@   " ^
   709 "              (Try (Rewrite_Set_Inst [(bdv_1,nth_ 1 v_s),(bdv_2,nth_ 2 v_s)," ^
   736 "              (Try (Rewrite_Set_Inst [(bdv_1,NTH 1 v_s),(bdv_2,NTH 2 v_s)," ^
   710 "                                      (bdv_3,nth_ 3 v_s),(bdv_4,nth_ 4 v_s)]" ^
   737 "                                      (bdv_3,NTH 3 v_s),(bdv_4,NTH 4 v_s)]" ^
   711 "                                 norm_Rational False)))             e2_     " ^
   738 "                                 norm_Rational False)))             e_2     " ^
   712 "    in [e1_, e2_, nth_ 3 es_, nth_ 4 es_])"
   739 "    in [e_1, e_2, NTH 3 e_s, NTH 4 e_s])"
   713 ));
   740 ));
   714 *}
   741 *}
   715 
   742 
   716 end
   743 end