Test_Isac works again, perfectly ..
authorWalther Neuper <neuper@ist.tugraz.at>
Mon, 16 Sep 2013 12:20:00 +0200
changeset 521052786cc9704c8
parent 52104 83166e7c7e52
child 52106 7f3760f39bdc
Test_Isac works again, perfectly ..

# the same tests works as in 8df4b6196660 (the *child* of "Test_Isac works...")
# ..EXCEPT those marked with "exception Div raised"
# for general state of tests see Test_Isac section {* history of tests *}.
src/Tools/isac/Knowledge/Integrate.thy
src/Tools/isac/Knowledge/RatEq.thy
src/Tools/isac/Knowledge/Rational.thy
src/Tools/isac/Knowledge/Test.thy
src/Tools/isac/ProgLang/rewrite.sml
src/Tools/isac/ProgLang/termC.sml
test/Tools/isac/Interpret/inform.sml
test/Tools/isac/Interpret/solve.sml
test/Tools/isac/Knowledge/build_thydata.sml
test/Tools/isac/Knowledge/eqsystem.sml
test/Tools/isac/Knowledge/partial_fractions.sml
test/Tools/isac/Knowledge/rational.sml
test/Tools/isac/Knowledge/rlang.sml
test/Tools/isac/Knowledge/simplify.sml
test/Tools/isac/ProgLang/rewrite.sml
test/Tools/isac/ProgLang/scrtools.sml
test/Tools/isac/Test_Isac.thy
test/Tools/isac/Test_Some.thy
     1.1 --- a/src/Tools/isac/Knowledge/Integrate.thy	Mon Sep 16 11:28:43 2013 +0200
     1.2 +++ b/src/Tools/isac/Knowledge/Integrate.thy	Mon Sep 16 12:20:00 2013 +0200
     1.3 @@ -175,7 +175,7 @@
     1.4  Rls {id = "norm_Rational_rls_noadd_fractions", preconds = [], 
     1.5       rew_ord = ("dummy_ord",dummy_ord), 
     1.6       erls = norm_rat_erls, srls = Erls, calc = [], errpatts = [],
     1.7 -     rules = [(*Rls_ common_nominator_p_rls,!!!*)
     1.8 +     rules = [(*Rls_ add_fractions_p_rls,!!!*)
     1.9  	      Rls_ (*rat_mult_div_pow original corrected WN051028*)
    1.10  		  (Rls {id = "rat_mult_div_pow", preconds = [], 
    1.11  		       rew_ord = ("dummy_ord",dummy_ord), 
     2.1 --- a/src/Tools/isac/Knowledge/RatEq.thy	Mon Sep 16 11:28:43 2013 +0200
     2.2 +++ b/src/Tools/isac/Knowledge/RatEq.thy	Mon Sep 16 12:20:00 2013 +0200
     2.3 @@ -221,7 +221,7 @@
     2.4     "Script Solve_rat_equation  (e_e::bool) (v_v::real) =                   " ^
     2.5      "(let e_e = ((Repeat(Try (Rewrite_Set RatEq_simplify      True))) @@  " ^
     2.6      "           (Repeat(Try (Rewrite_Set norm_Rational      False))) @@  " ^
     2.7 -    "           (Repeat(Try (Rewrite_Set common_nominator_p False))) @@  " ^
     2.8 +    "           (Repeat(Try (Rewrite_Set add_fractions_p False))) @@  " ^
     2.9      "           (Repeat(Try (Rewrite_Set RatEq_eliminate     True)))) e_e;" ^
    2.10      " (L_L::bool list) = (SubProblem (RatEq',[univariate,equation], [no_met])" ^
    2.11      "                    [BOOL e_e, REAL v_v])                     " ^
     3.1 --- a/src/Tools/isac/Knowledge/Rational.thy	Mon Sep 16 11:28:43 2013 +0200
     3.2 +++ b/src/Tools/isac/Knowledge/Rational.thy	Mon Sep 16 12:20:00 2013 +0200
     3.3 @@ -1,77 +1,125 @@
     3.4 -(* rationals, i.e. fractions of multivariate polynomials over the real field
     3.5 +(* rationals, fractions of multivariate polynomials over the real field
     3.6     author: isac team
     3.7 -   Copyright (c) isac team 2002
     3.8 +   Copyright (c) isac team 2002, 2013
     3.9     Use is subject to license terms.
    3.10  
    3.11     depends on Poly (and not on Atools), because 
    3.12     fractions with _normalized_ polynomials are canceled, added, etc.
    3.13 -
    3.14 -   ATTENTION WN130616: WITH Unsynchronized.ref Rational.thy TAKES ~1MIN FOR EVALUATION
    3.15  *)
    3.16  
    3.17  theory Rational 
    3.18  imports Poly "~~/src/Tools/isac/Knowledge/GCD_Poly_ML"
    3.19  begin
    3.20  
    3.21 +section {* Constants for evaluation by "Calc" *}
    3.22  consts
    3.23  
    3.24    is'_expanded    :: "real => bool" ("_ is'_expanded")     (*RL->Poly.thy*)
    3.25    is'_ratpolyexp  :: "real => bool" ("_ is'_ratpolyexp") 
    3.26    get_denominator :: "real => real"
    3.27    get_numerator   :: "real => real"
    3.28 -  
    3.29  
    3.30 -axioms(*axiomatization where*) (*.not contained in Isabelle2002,
    3.31 -          stated as axioms, TODO?: prove as theorems*)
    3.32 +ML {*
    3.33 +(*.the expression contains + - * ^ / only ?.*)
    3.34 +fun is_ratpolyexp (Free _) = true
    3.35 +  | is_ratpolyexp (Const ("Groups.plus_class.plus",_) $ Free _ $ Free _) = true
    3.36 +  | is_ratpolyexp (Const ("Groups.minus_class.minus",_) $ Free _ $ Free _) = true
    3.37 +  | is_ratpolyexp (Const ("Groups.times_class.times",_) $ Free _ $ Free _) = true
    3.38 +  | is_ratpolyexp (Const ("Atools.pow",_) $ Free _ $ Free _) = true
    3.39 +  | is_ratpolyexp (Const ("Fields.inverse_class.divide",_) $ Free _ $ Free _) = true
    3.40 +  | is_ratpolyexp (Const ("Groups.plus_class.plus",_) $ t1 $ t2) = 
    3.41 +               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
    3.42 +  | is_ratpolyexp (Const ("Groups.minus_class.minus",_) $ t1 $ t2) = 
    3.43 +               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
    3.44 +  | is_ratpolyexp (Const ("Groups.times_class.times",_) $ t1 $ t2) = 
    3.45 +               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
    3.46 +  | is_ratpolyexp (Const ("Atools.pow",_) $ t1 $ t2) = 
    3.47 +               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
    3.48 +  | is_ratpolyexp (Const ("Fields.inverse_class.divide",_) $ t1 $ t2) = 
    3.49 +               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
    3.50 +  | is_ratpolyexp _ = false;
    3.51  
    3.52 -  mult_cross:      "[| b ~= 0; d ~= 0 |] ==> (a / b = c / d) = (a * d = b * c)" (*and*)
    3.53 -  mult_cross1:     "   b ~= 0            ==> (a / b = c    ) = (a     = b * c)" (*and*)
    3.54 -  mult_cross2:     "           d ~= 0    ==> (a     = c / d) = (a * d =     c)" (*and*)
    3.55 +(*("is_ratpolyexp", ("Rational.is'_ratpolyexp", eval_is_ratpolyexp ""))*)
    3.56 +fun eval_is_ratpolyexp (thmid:string) _ 
    3.57 +		       (t as (Const("Rational.is'_ratpolyexp", _) $ arg)) thy =
    3.58 +    if is_ratpolyexp arg
    3.59 +    then SOME (mk_thmid thmid "" (term_to_string''' thy arg) "", 
    3.60 +	         Trueprop $ (mk_equality (t, @{term True})))
    3.61 +    else SOME (mk_thmid thmid "" (term_to_string''' thy arg) "", 
    3.62 +	         Trueprop $ (mk_equality (t, @{term False})))
    3.63 +  | eval_is_ratpolyexp _ _ _ _ = NONE; 
    3.64 +
    3.65 +(*("get_denominator", ("Rational.get_denominator", eval_get_denominator ""))*)
    3.66 +fun eval_get_denominator (thmid:string) _ 
    3.67 +		      (t as Const ("Rational.get_denominator", _) $
    3.68 +              (Const ("Fields.inverse_class.divide", _) $ num $
    3.69 +                denom)) thy = 
    3.70 +      SOME (mk_thmid thmid "" (term_to_string''' thy denom) "", 
    3.71 +	            Trueprop $ (mk_equality (t, denom)))
    3.72 +  | eval_get_denominator _ _ _ _ = NONE; 
    3.73 +
    3.74 +(*("get_numerator", ("Rational.get_numerator", eval_get_numerator ""))*)
    3.75 +fun eval_get_numerator (thmid:string) _ 
    3.76 +      (t as Const ("Rational.get_numerator", _) $
    3.77 +          (Const ("Fields.inverse_class.divide", _) $num
    3.78 +            $denom )) thy = 
    3.79 +    SOME (mk_thmid thmid "" (term_to_string''' thy num) "", 
    3.80 +	    Trueprop $ (mk_equality (t, num)))
    3.81 +  | eval_get_numerator _ _ _ _ = NONE; 
    3.82 +*}
    3.83 +
    3.84 +section {* Theorems for rewriting *}
    3.85 +
    3.86 +axiomatization (* naming due to Isabelle2002, but not contained in Isabelle2002; 
    3.87 +                  many thms are due to RL and can be removed with updating the equation solver;
    3.88 +                  TODO: replace by equivalent thms in recent Isabelle201x *) 
    3.89 +where
    3.90 +  mult_cross:      "[| b ~= 0; d ~= 0 |] ==> (a / b = c / d) = (a * d = b * c)" and
    3.91 +  mult_cross1:     "   b ~= 0            ==> (a / b = c    ) = (a     = b * c)" and
    3.92 +  mult_cross2:     "           d ~= 0    ==> (a     = c / d) = (a * d =     c)" and
    3.93                    
    3.94 -  add_minus:       "a + b - b = a"(*RL->Poly.thy*) (*and*)
    3.95 -  add_minus1:      "a - b + b = a"(*RL->Poly.thy*) (*and*)
    3.96 +  add_minus:       "a + b - b = a"(*RL->Poly.thy*) and
    3.97 +  add_minus1:      "a - b + b = a"(*RL->Poly.thy*) and
    3.98                    
    3.99 -  rat_mult:        "a / b * (c / d) = a * c / (b * d)"(*?Isa02*)  (*and*)
   3.100 -  rat_mult2:       "a / b *  c      = a * c /  b     "(*?Isa02*) (*and*)
   3.101 +  rat_mult:        "a / b * (c / d) = a * c / (b * d)"(*?Isa02*)  and
   3.102 +  rat_mult2:       "a / b *  c      = a * c /  b     "(*?Isa02*) and
   3.103  
   3.104 -  rat_mult_poly_l: "c is_polyexp ==> c * (a / b) = c * a /  b" (*and*)
   3.105 -  rat_mult_poly_r: "c is_polyexp ==> (a / b) * c = a * c /  b" (*and*)
   3.106 +  rat_mult_poly_l: "c is_polyexp ==> c * (a / b) = c * a /  b" and
   3.107 +  rat_mult_poly_r: "c is_polyexp ==> (a / b) * c = a * c /  b" and
   3.108  
   3.109  (*real_times_divide1_eq .. Isa02*) 
   3.110 -  real_times_divide_1_eq:  "-1    * (c / d) =-1 * c /      d " (*and*)
   3.111 -  real_times_divide_num:   "a is_const ==> 
   3.112 -	          	   a     * (c / d) = a * c /      d " (*and*)
   3.113 +  real_times_divide_1_eq:  "-1 * (c / d) = -1 * c / d " and
   3.114 +  real_times_divide_num:   "a is_const ==> a * (c / d) = a * c / d " and
   3.115  
   3.116 -  real_mult_div_cancel2:   "k ~= 0 ==> m * k / (n * k) = m / n" (*and*)
   3.117 +  real_mult_div_cancel2:   "k ~= 0 ==> m * k / (n * k) = m / n" and
   3.118  (*real_mult_div_cancel1:   "k ~= 0 ==> k * m / (k * n) = m / n"..Isa02*)
   3.119  			  
   3.120 -  real_divide_divide1:     "y ~= 0 ==> (u / v) / (y / z) = (u / v) * (z / y)" (*and*)
   3.121 -  real_divide_divide1_mg:  "y ~= 0 ==> (u / v) / (y / z) = (u * z) / (y * v)" (*and*)
   3.122 +  real_divide_divide1:     "y ~= 0 ==> (u / v) / (y / z) = (u / v) * (z / y)" and
   3.123 +  real_divide_divide1_mg:  "y ~= 0 ==> (u / v) / (y / z) = (u * z) / (y * v)" and
   3.124  (*real_divide_divide2_eq:  "x / y / z = x / (y * z)"..Isa02*)
   3.125  			  
   3.126 -  rat_power:               "(a / b)^^^n = (a^^^n) / (b^^^n)" (*and*)
   3.127 -
   3.128 +  rat_power:               "(a / b)^^^n = (a^^^n) / (b^^^n)" and
   3.129  
   3.130    rat_add:         "[| a is_const; b is_const; c is_const; d is_const |] ==> 
   3.131 -	           a / c + b / d = (a * d + b * c) / (c * d)" (*and*)
   3.132 +	           a / c + b / d = (a * d + b * c) / (c * d)" and
   3.133    rat_add_assoc:   "[| a is_const; b is_const; c is_const; d is_const |] ==> 
   3.134 -	           a / c +(b / d + e) = (a * d + b * c)/(d * c) + e" (*and*)
   3.135 +	           a / c +(b / d + e) = (a * d + b * c)/(d * c) + e" and
   3.136    rat_add1:        "[| a is_const; b is_const; c is_const |] ==> 
   3.137 -	           a / c + b / c = (a + b) / c" (*and*)
   3.138 +	           a / c + b / c = (a + b) / c" and
   3.139    rat_add1_assoc:   "[| a is_const; b is_const; c is_const |] ==> 
   3.140 -	           a / c + (b / c + e) = (a + b) / c + e" (*and*)
   3.141 +	           a / c + (b / c + e) = (a + b) / c + e" and
   3.142    rat_add2:        "[| a is_const; b is_const; c is_const |] ==> 
   3.143 -	           a / c + b = (a + b * c) / c" (*and*)
   3.144 +	           a / c + b = (a + b * c) / c" and
   3.145    rat_add2_assoc:  "[| a is_const; b is_const; c is_const |] ==> 
   3.146 -	           a / c + (b + e) = (a + b * c) / c + e" (*and*)
   3.147 +	           a / c + (b + e) = (a + b * c) / c + e" and
   3.148    rat_add3:        "[| a is_const; b is_const; c is_const |] ==> 
   3.149 -	           a + b / c = (a * c + b) / c" (*and*)
   3.150 +	           a + b / c = (a * c + b) / c" and
   3.151    rat_add3_assoc:   "[| a is_const; b is_const; c is_const |] ==> 
   3.152  	           a + (b / c + e) = (a * c + b) / c + e"
   3.153  
   3.154  section {* Cancellation and addition of fractions *}
   3.155 -subsection {* Auxiliary functions and data *}
   3.156 -subsubsection {* Conversion term <--> poly *}
   3.157 +subsection {* Conversion term <--> poly *}
   3.158 +subsubsection {* Convert a term to the internal representation of a multivariate polynomial *}
   3.159  ML {*
   3.160  fun monom_of_term  vs (c, es) (Free (id, _)) =
   3.161      if is_numeral id 
   3.162 @@ -118,9 +166,12 @@
   3.163    in 
   3.164      case poly_of_term vs t of SOME _ => true | NONE => false
   3.165    end
   3.166 -val is_expanded = is_poly
   3.167 +val is_expanded = is_poly   (* TODO: check names *)
   3.168 +val is_polynomial = is_poly (* TODO: check names *)
   3.169 +*}
   3.170  
   3.171 -(* convert internal representation of a multivariate polynomial to a term*)
   3.172 +subsubsection {* Convert internal representation of a multivariate polynomial to a term *}
   3.173 +ML {*
   3.174  fun term_of_es _ _ _ [] = [] (*assumes same length for vs and es*)
   3.175    | term_of_es baseT expT (_ :: vs) (0 :: es) =
   3.176      [] @ term_of_es baseT expT vs es
   3.177 @@ -147,149 +198,8 @@
   3.178    in foldl (HOLogic.mk_binop "Groups.plus_class.plus") (hd monos, tl monos) end
   3.179  *}
   3.180  
   3.181 -text {*calculate in rationals: gcd, lcm, etc.
   3.182 -      (c) Stefan Karnel 2002
   3.183 -      Institute for Mathematics D and Institute for Software Technology, 
   3.184 -      TU-Graz SS 2002 *}
   3.185 -
   3.186 -text {* Remark on notions in the documentation below:
   3.187 -    referring to the remark on 'polynomials' in Poly.sml we use
   3.188 -    [2] 'polynomial' normalform (Polynom)
   3.189 -    [3] 'expanded_term' normalform (Ausmultiplizierter Term),
   3.190 -    where normalform [2] is a special case of [3], i.e. [3] implies [2].
   3.191 -    Instead of 
   3.192 -      'fraction with numerator and nominator both in normalform [2]'
   3.193 -      'fraction with numerator and nominator both in normalform [3]' 
   3.194 -    we say: 
   3.195 -      'fraction in normalform [2]'
   3.196 -      'fraction in normalform [3]' 
   3.197 -    or
   3.198 -      'fraction [2]'
   3.199 -      'fraction [3]'.
   3.200 -    a 'simple fraction' is a term with '/' as outmost operator and
   3.201 -    numerator and nominator in normalform [2] or [3].
   3.202 -*}
   3.203 -
   3.204 -ML {* 
   3.205 -val thy = @{theory};
   3.206 -
   3.207 -signature RATIONALI =
   3.208 -sig
   3.209 -  type mv_monom
   3.210 -  type mv_poly 
   3.211 -  val add_fraction_p_ : theory -> term -> (term * term list) option       
   3.212 -  val calculate_Rational : rls
   3.213 -  val calc_rat_erls:rls
   3.214 -  val cancel_p : rls   
   3.215 -  val cancel_p_ : theory -> term -> (term * term list) option
   3.216 -  val check_fraction : term -> (term * term) option              
   3.217 -  val check_frac_sum : term -> ((term * term) * (term * term)) option
   3.218 -  val common_nominator_p : rls              
   3.219 -  val common_nominator_p_ : theory -> term -> (term * term list) option
   3.220 -  val eval_is_expanded : string -> 'a -> term -> theory -> 
   3.221 -			 (string * term) option                    
   3.222 -  val expanded2polynomial : term -> term option
   3.223 -  val factout_p_ : theory -> term -> (term * term list) option
   3.224 -  val is_expanded : term -> bool
   3.225 -  val is_polynomial : term -> bool
   3.226 -
   3.227 -  val mv_gcd : (int * int list) list -> mv_poly -> mv_poly
   3.228 -  val mv_lcm : mv_poly -> mv_poly -> mv_poly
   3.229 -
   3.230 -  val norm_expanded_rat_ : theory -> term -> (term * term list) option
   3.231 -(*WN0602.2.6.pull into struct !!!
   3.232 -  val norm_Rational : rls(*.normalizes an arbitrary rational term without
   3.233 -                           roots into a simple and canceled fraction
   3.234 -                           with normalform [2].*)
   3.235 -*)
   3.236 -(*val norm_rational_p : 19.10.02 missing FIXXXXXXXXXXXXME
   3.237 -      rls               (*.normalizes an rational term [2] without
   3.238 -                           roots into a simple and canceled fraction
   3.239 -                           with normalform [2].*)
   3.240 -*)
   3.241 -  val norm_rational_ : theory -> term -> (term * term list) option
   3.242 -  val polynomial2expanded : term -> term option
   3.243 -  val rational_erls : 
   3.244 -      rls             (*.evaluates an arbitrary rational term with numerals.*)
   3.245 -
   3.246 -(*WN0210???SK: fehlen Funktionen, die exportiert werden sollen ? *)
   3.247 -end (* sig *)
   3.248 -
   3.249 -(*.**************************************************************************
   3.250 -survey on the functions
   3.251 -~~~~~~~~~~~~~~~~~~~~~~~
   3.252 - [2] 'polynomial'   :rls               | [3]'expanded_term':rls
   3.253 ---------------------:------------------+-------------------:-----------------
   3.254 - factout_p_         :                  | factout_          :
   3.255 - cancel_p_          :                  | cancel_           :
   3.256 -                    :cancel_p          |                   :cancel
   3.257 ---------------------:------------------+-------------------:-----------------
   3.258 - common_nominator_p_:                  | common_nominator_ :
   3.259 -                    :common_nominator_p|                   :common_nominator
   3.260 - add_fraction_p_    :                  | add_fraction_     :
   3.261 ---------------------:------------------+-------------------:-----------------
   3.262 -???SK                 :norm_rational_p   |                   :norm_rational
   3.263 -
   3.264 -This survey shows only the principal functions for reuse, and the identifiers 
   3.265 -of the rls exported. The list below shows some more useful functions.
   3.266 -
   3.267 -
   3.268 -conversion from Isabelle-term to internal representation
   3.269 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   3.270 -
   3.271 -... BITTE FORTSETZEN ...
   3.272 -
   3.273 -polynomial2expanded = ...
   3.274 -expanded2polynomial = ...
   3.275 -
   3.276 -remark: polynomial2expanded o expanded2polynomial = I, 
   3.277 -        where 'o' is function chaining, and 'I' is identity WN0210???SK
   3.278 -
   3.279 -functions for greatest common divisor and canceling
   3.280 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   3.281 -################################################################################
   3.282 -##   search Isabelle2009-2/src/HOL/Multivariate_Analysis
   3.283 -##   Amine Chaieb, Robert Himmelmann, John Harrison.
   3.284 -################################################################################
   3.285 -mv_gcd
   3.286 -factout_
   3.287 -factout_p_
   3.288 -cancel_
   3.289 -cancel_p_
   3.290 -
   3.291 -functions for least common multiple and addition of fractions
   3.292 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   3.293 -mv_lcm
   3.294 -common_nominator_
   3.295 -common_nominator_p_
   3.296 -add_fraction_       (*.add 2 or more fractions.*)
   3.297 -add_fraction_p_     (*.add 2 or more fractions.*)
   3.298 -
   3.299 -functions for normalform of rationals
   3.300 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   3.301 -WN0210???SK interne Funktionen f"ur norm_rational: 
   3.302 -          schaffen diese SML-Funktionen wirklich ganz allgemeine Terme ?
   3.303 -
   3.304 -norm_rational_
   3.305 -norm_expanded_rat_
   3.306 -
   3.307 -**************************************************************************.*)
   3.308 -
   3.309 -
   3.310 -(*##*)
   3.311 -structure RationalI : RATIONALI = 
   3.312 -struct 
   3.313 -(*##*)
   3.314 -
   3.315 -infix mem ins union; (*WN100819 updating to Isabelle2009-2*)
   3.316 -fun x mem [] = false
   3.317 -  | x mem (y :: ys) = x = y orelse x mem ys;
   3.318 -
   3.319 -
   3.320 -
   3.321 -val is_expanded = is_poly
   3.322 -val is_polynomial = is_poly
   3.323 -
   3.324 +subsection {* Apply gcd_poly for cancelling and adding fractions as terms *}
   3.325 +ML {*
   3.326  fun mk_noteq_0 baseT t = 
   3.327    Const ("HOL.Not", HOLogic.boolT --> HOLogic.boolT) $ 
   3.328      (Const ("HOL.eq", [baseT, baseT] ---> HOLogic.boolT) $ t $ Free ("0", HOLogic.realT))
   3.329 @@ -297,7 +207,10 @@
   3.330  fun mk_asms baseT ts =
   3.331    let val as' = filter_out is_num ts (* asm like "2 ~= 0" is needless *)
   3.332    in map (mk_noteq_0 baseT) as' end
   3.333 +*}
   3.334  
   3.335 +subsubsection {* Factor out gcd for cancellation *}
   3.336 +ML {*
   3.337  fun check_fraction t =
   3.338    let val Const ("Fields.inverse_class.divide", _) $ numerator $ denominator = t
   3.339    in SOME (numerator, denominator) end
   3.340 @@ -334,13 +247,15 @@
   3.341                        (HOLogic.mk_binop "Groups.times_class.times"
   3.342                          (term_of_poly baseT expT vs a', ct),
   3.343                         HOLogic.mk_binop "Groups.times_class.times" (b't, ct))
   3.344 -                  val asm = mk_asms baseT [b't, ct]
   3.345 -                in SOME (t', asm) end
   3.346 +                in SOME (t', mk_asms baseT [b't, ct]) end
   3.347              end
   3.348          | _ => NONE : (term * term list) option
   3.349        end
   3.350    end
   3.351 +*}
   3.352  
   3.353 +subsubsection {* Cancel a fraction *}
   3.354 +ML {*
   3.355  (* cancel a term by the gcd ("" denote terms with internal algebraic structure)
   3.356    cancel_p_ :: theory \<Rightarrow> term  \<Rightarrow> (term \<times> term list) option
   3.357    cancel_p_ thy "a / b" = SOME ("a' / b'", ["b' \<noteq> 0"])
   3.358 @@ -382,7 +297,10 @@
   3.359          | _ => NONE : (term * term list) option
   3.360        end
   3.361    end
   3.362 +*}
   3.363  
   3.364 +subsubsection {* Factor out to a common denominator for addition *}
   3.365 +ML {*
   3.366  (* addition of fractions allows (at most) one non-fraction (a monomial) *)
   3.367  fun check_frac_sum 
   3.368      (Const ("Groups.plus_class.plus", _) $ 
   3.369 @@ -440,10 +358,14 @@
   3.370        end
   3.371    end
   3.372  
   3.373 +*}
   3.374 +
   3.375 +subsubsection {* Addition of at least one fraction within a sum *}
   3.376 +ML {*
   3.377  (* add fractions
   3.378    assumes: is a term with outmost "+" and at least one outmost "/" in respective summands
   3.379    NOTE: the case "(_ + _) + _" need not be considered due to iterated addition.*)
   3.380 -fun add_fraction_p_ (thy: theory) t =
   3.381 +fun add_fraction_p_ (_: theory) t =
   3.382    case check_frac_sum t of 
   3.383      NONE => NONE
   3.384    | SOME ((n1, d1), (n2, d2)) =>
   3.385 @@ -463,2512 +385,71 @@
   3.386            in SOME (t', mk_asms baseT [denom]) end
   3.387        | _ => NONE : (term * term list) option
   3.388      end
   3.389 +*}
   3.390  
   3.391 -fun (x ins xs) = if x mem xs then xs else x :: xs;
   3.392 -fun xs union [] = xs
   3.393 -  | [] union ys = ys
   3.394 -  | (x :: xs) union ys = xs union (x ins ys);
   3.395 +section {* Embed cancellation and addition into rewriting *}
   3.396 +ML {* val thy = @{theory} *}
   3.397 +subsection {* Rulesets and predicate for embedding *}
   3.398 +ML {*
   3.399 +(* evaluates conditions in calculate_Rational *)
   3.400 +val calc_rat_erls =
   3.401 +  prep_rls
   3.402 +    (Rls {id = "calc_rat_erls", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
   3.403 +      erls = e_rls, srls = Erls, calc = [], errpatts = [],
   3.404 +      rules = 
   3.405 +        [Calc ("HOL.eq", eval_equal "#equal_"),
   3.406 +        Calc ("Atools.is'_const", eval_const "#is_const_"),
   3.407 +        Thm ("not_true", num_str @{thm not_true}),
   3.408 +        Thm ("not_false", num_str @{thm not_false})], 
   3.409 +      scr = EmptyScr});
   3.410  
   3.411 -(*. gcd of integers .*)
   3.412 -(* die gcd Funktion von Isabelle funktioniert nicht richtig !!! *)
   3.413 -fun gcd_int a b = if b=0 then a
   3.414 -		  else gcd_int b (a mod b);
   3.415 +(* simplifies expressions with numerals;
   3.416 +   does NOT rearrange the term by AC-rewriting; thus terms with variables 
   3.417 +   need to have constants to be commuted together respectively           *)
   3.418 +val calculate_Rational =
   3.419 +  prep_rls (merge_rls "calculate_Rational"
   3.420 +    (Rls {id = "divide", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
   3.421 +      erls = calc_rat_erls, srls = Erls,
   3.422 +      calc = [], errpatts = [],
   3.423 +      rules = 
   3.424 +        [Calc ("Fields.inverse_class.divide", eval_cancel "#divide_e"),
   3.425  
   3.426 -(*. univariate polynomials (uv) .*)
   3.427 -(*. univariate polynomials are represented as a list 
   3.428 -    of the coefficent in reverse maximum degree order .*)
   3.429 -(*. 5 * x^5 + 4 * x^3 + 2 * x^2 + x + 19 => [19,1,2,4,0,5] .*)
   3.430 -type uv_poly = int list;
   3.431 -
   3.432 -(*. adds two uv polynomials .*)
   3.433 -fun uv_mod_add_poly ([]:uv_poly,p2:uv_poly) = p2:uv_poly 
   3.434 -  | uv_mod_add_poly (p1,[]) = p1
   3.435 -  | uv_mod_add_poly (x::p1,y::p2) = (x+y)::(uv_mod_add_poly(p1,p2)); 
   3.436 -
   3.437 -(*. multiplies a uv polynomial with a skalar s .*)
   3.438 -fun uv_mod_smul_poly ([]:uv_poly,s:int) = []:uv_poly 
   3.439 -  | uv_mod_smul_poly (x::p,s) = (x*s)::(uv_mod_smul_poly(p,s)); 
   3.440 -
   3.441 -(*. calculates the remainder of a polynomial divided by a skalar s .*)
   3.442 -fun uv_mod_rem_poly ([]:uv_poly,s) = []:uv_poly 
   3.443 -  | uv_mod_rem_poly (x::p,s) = (x mod s)::(uv_mod_smul_poly(p,s)); 
   3.444 -
   3.445 -(*. calculates the degree of a uv polynomial .*)
   3.446 -fun uv_mod_deg ([]:uv_poly) = 0  
   3.447 -  | uv_mod_deg p = length(p)-1;
   3.448 -
   3.449 -(*. calculates the remainder of x/p and represents it as 
   3.450 -    value between -p/2 and p/2 .*)
   3.451 -fun uv_mod_mod2(x,p)=
   3.452 -    let
   3.453 -	val y=(x mod p);
   3.454 -    in
   3.455 -	if (y)>(p div 2) then (y)-p else 
   3.456 -	    (
   3.457 -	     if (y)<(~p div 2) then p+(y) else (y)
   3.458 -	     )
   3.459 -    end;
   3.460 -
   3.461 -(*.calculates the remainder for each element of a integer list divided by p.*)  
   3.462 -fun uv_mod_list_modp [] p = [] 
   3.463 -  | uv_mod_list_modp (x::xs) p = (uv_mod_mod2(x,p))::(uv_mod_list_modp xs p);
   3.464 -
   3.465 -(*. appends an integer at the end of a integer list .*)
   3.466 -fun uv_mod_null (p1:int list,0) = p1 
   3.467 -  | uv_mod_null (p1:int list,n1:int) = uv_mod_null(p1,n1-1) @ [0];
   3.468 -
   3.469 -(*. uv polynomial division, result is (quotient, remainder) .*)
   3.470 -(*. only for uv_mod_divides .*)
   3.471 -(* FIXME: Division von x^9+x^5+1 durch x-1000 funktioniert nicht,
   3.472 -   integer zu klein  *)
   3.473 -fun uv_mod_pdiv (p1:uv_poly) ([]:uv_poly) = 
   3.474 -    error ("RATIONALS_UV_MOD_PDIV_EXCEPTION: division by zero")
   3.475 -  | uv_mod_pdiv p1 [x] = 
   3.476 -    let
   3.477 -	val xs= Unsynchronized.ref  [];
   3.478 -    in
   3.479 -	if x<>0 then 
   3.480 -	    (
   3.481 -	     xs:=(uv_mod_rem_poly(p1,x));
   3.482 -	     while length(!xs)>0 andalso hd(!xs)=0 do xs:=tl(!xs)
   3.483 -	     )
   3.484 -	else error ("RATIONALS_UV_MOD_PDIV_EXCEPTION: division by zero");
   3.485 -	([]:uv_poly,!xs:uv_poly)
   3.486 -    end
   3.487 -  | uv_mod_pdiv p1 p2 =  
   3.488 -    let
   3.489 -	val n= uv_mod_deg(p2);
   3.490 -	val m= Unsynchronized.ref (uv_mod_deg(p1));
   3.491 -	val p1'= Unsynchronized.ref  (rev(p1));
   3.492 -	val p2'=(rev(p2));
   3.493 -	val lc2=hd(p2');
   3.494 -	val q= Unsynchronized.ref  [];
   3.495 -	val c= Unsynchronized.ref  0;
   3.496 -	val output= Unsynchronized.ref  ([],[]);
   3.497 -    in
   3.498 -	(
   3.499 -	 if (!m)=0 orelse p2=[0] 
   3.500 -         then error ("RATIONALS_UV_MOD_PDIV_EXCEPTION: Division by zero") 
   3.501 -	 else
   3.502 -	     (
   3.503 -	      if (!m)<n then 
   3.504 -		  (
   3.505 -		   output:=([0],p1) 
   3.506 -		   ) 
   3.507 -	      else
   3.508 -		  (
   3.509 -		   while (!m)>=n do
   3.510 -		       (
   3.511 -			c:=hd(!p1') div hd(p2');
   3.512 -			if !c<>0 then
   3.513 -			    (
   3.514 -			     p1':=uv_mod_add_poly(!p1',uv_mod_null(uv_mod_smul_poly(p2',~(!c)),!m-n));
   3.515 -			     while length(!p1')>0 andalso hd(!p1')=0  do p1':= tl(!p1');
   3.516 -			     m:=uv_mod_deg(!p1')
   3.517 -			     )
   3.518 -			else m:=0
   3.519 -			);
   3.520 -    		   output:=(rev(!q),rev(!p1'))
   3.521 -		   )
   3.522 -	      );
   3.523 -	     !output
   3.524 -	 )
   3.525 -    end;
   3.526 -
   3.527 -(*. divides p1 by p2 in Zp .*)
   3.528 -fun uv_mod_pdivp (p1:uv_poly) (p2:uv_poly) p =  
   3.529 -    let
   3.530 -	val n=uv_mod_deg(p2);
   3.531 -	val m= Unsynchronized.ref  (uv_mod_deg(uv_mod_list_modp p1 p));
   3.532 -	val p1'= Unsynchronized.ref  (rev(p1));
   3.533 -	val p2'=(rev(uv_mod_list_modp p2 p));
   3.534 -	val lc2=hd(p2');
   3.535 -	val q= Unsynchronized.ref  [];
   3.536 -	val c= Unsynchronized.ref  0;
   3.537 -	val output= Unsynchronized.ref  ([],[]);
   3.538 -    in
   3.539 -	(
   3.540 -	 if (!m)=0 orelse p2=[0] then error ("RATIONALS_UV_MOD_PDIVP_EXCEPTION: Division by zero") 
   3.541 -	 else
   3.542 -	     (
   3.543 -	      if (!m)<n then 
   3.544 -		  (
   3.545 -		   output:=([0],p1) 
   3.546 -		   ) 
   3.547 -	      else
   3.548 -		  (
   3.549 -		   while (!m)>=n do
   3.550 -		       (
   3.551 -			c:=uv_mod_mod2(hd(!p1')*(power lc2 1), p);
   3.552 -			q:=(!c)::(!q);
   3.553 -			p1':=uv_mod_list_modp(tl(uv_mod_add_poly(uv_mod_smul_poly(!p1',lc2),
   3.554 -								  uv_mod_smul_poly(uv_mod_smul_poly(p2',hd(!p1')),~1)))) p;
   3.555 -			m:=(!m)-1
   3.556 -			);
   3.557 -		   
   3.558 -		   while !p1'<>[] andalso hd(!p1')=0 do
   3.559 -		       (
   3.560 -			p1':=tl(!p1')
   3.561 -			);
   3.562 -
   3.563 -    		   output:=(rev(uv_mod_list_modp (!q) (p)),rev(!p1'))
   3.564 -		   )
   3.565 -	      );
   3.566 -	     !output:uv_poly * uv_poly
   3.567 -	 )
   3.568 -    end;
   3.569 -
   3.570 -(*. calculates the remainder of p1/p2 .*)
   3.571 -fun uv_mod_prest (p1:uv_poly) ([]:uv_poly) = error("UV_MOD_PREST_EXCEPTION: Division by zero") 
   3.572 -  | uv_mod_prest [] p2 = []:uv_poly
   3.573 -  | uv_mod_prest p1 p2 = (#2(uv_mod_pdiv p1 p2));
   3.574 -
   3.575 -(*. calculates the remainder of p1/p2 in Zp .*)
   3.576 -fun uv_mod_prestp (p1:uv_poly) ([]:uv_poly) p= error("UV_MOD_PRESTP_EXCEPTION: Division by zero") 
   3.577 -  | uv_mod_prestp [] p2 p= []:uv_poly 
   3.578 -  | uv_mod_prestp p1 p2 p = #2(uv_mod_pdivp p1 p2 p); 
   3.579 -
   3.580 -(*. calculates the content of a uv polynomial .*)
   3.581 -fun uv_mod_cont ([]:uv_poly) = 0  
   3.582 -  | uv_mod_cont (x::p)= gcd_int x (uv_mod_cont(p));
   3.583 -
   3.584 -(*. divides each coefficient of a uv polynomial by y .*)
   3.585 -fun uv_mod_div_list (p:uv_poly,0) = error("UV_MOD_DIV_LIST_EXCEPTION: Division by zero") 
   3.586 -  | uv_mod_div_list ([],y)   = []:uv_poly
   3.587 -  | uv_mod_div_list (x::p,y) = (x div y)::uv_mod_div_list(p,y); 
   3.588 -
   3.589 -(*. calculates the primitiv part of a uv polynomial .*)
   3.590 -fun uv_mod_pp ([]:uv_poly) = []:uv_poly
   3.591 -  | uv_mod_pp p =  
   3.592 -    let
   3.593 -	val c= Unsynchronized.ref  0;
   3.594 -    in
   3.595 -	(
   3.596 -	 c:=uv_mod_cont(p);
   3.597 -	 
   3.598 -	 if !c=0 then error ("RATIONALS_UV_MOD_PP_EXCEPTION: content is 0")
   3.599 -	 else uv_mod_div_list(p,!c)
   3.600 -	)
   3.601 -    end;
   3.602 -
   3.603 -(*. gets the leading coefficient of a uv polynomial .*)
   3.604 -fun uv_mod_lc ([]:uv_poly) = 0 
   3.605 -  | uv_mod_lc p  = hd(rev(p)); 
   3.606 -
   3.607 -(*. calculates the euklidean polynomial remainder sequence in Zp .*)
   3.608 -fun uv_mod_prs_euklid_p(p1:uv_poly,p2:uv_poly,p)= 
   3.609 -    let
   3.610 -	val f = Unsynchronized.ref  [];
   3.611 -	val f'= Unsynchronized.ref  p2;
   3.612 -	val fi= Unsynchronized.ref  [];
   3.613 -    in
   3.614 -	( 
   3.615 -	 f:=p2::p1::[]; 
   3.616 - 	 while uv_mod_deg(!f')>0 do
   3.617 -	     (
   3.618 -	      f':=uv_mod_prestp (hd(tl(!f))) (hd(!f)) p;
   3.619 -	      if (!f')<>[] then 
   3.620 -		  (
   3.621 -		   fi:=(!f');
   3.622 -		   f:=(!fi)::(!f)
   3.623 -		   )
   3.624 -	      else ()
   3.625 -	      );
   3.626 -	      (!f)
   3.627 -	 
   3.628 -	 )
   3.629 -    end;
   3.630 -
   3.631 -(*. calculates the gcd of p1 and p2 in Zp .*)
   3.632 -fun uv_mod_gcd_modp ([]:uv_poly) (p2:uv_poly) p = p2:uv_poly 
   3.633 -  | uv_mod_gcd_modp p1 [] p= p1
   3.634 -  | uv_mod_gcd_modp p1 p2 p=
   3.635 -    let
   3.636 -	val p1'= Unsynchronized.ref [];
   3.637 -	val p2'= Unsynchronized.ref [];
   3.638 -	val pc= Unsynchronized.ref [];
   3.639 -	val g= Unsynchronized.ref  [];
   3.640 -	val d= Unsynchronized.ref  0;
   3.641 -	val prs= Unsynchronized.ref  [];
   3.642 -    in
   3.643 -	(
   3.644 -	 if uv_mod_deg(p1)>=uv_mod_deg(p2) then
   3.645 -	     (
   3.646 -	      p1':=uv_mod_list_modp (uv_mod_pp(p1)) p;
   3.647 -	      p2':=uv_mod_list_modp (uv_mod_pp(p2)) p
   3.648 -	      )
   3.649 -	 else 
   3.650 -	     (
   3.651 -	      p1':=uv_mod_list_modp (uv_mod_pp(p2)) p;
   3.652 -	      p2':=uv_mod_list_modp (uv_mod_pp(p1)) p
   3.653 -	      );
   3.654 -	 d:=uv_mod_mod2((gcd_int (uv_mod_cont(p1))) (uv_mod_cont(p2)), p) ;
   3.655 -	 if !d>(p div 2) then d:=(!d)-p else ();
   3.656 -	 
   3.657 -	 prs:=uv_mod_prs_euklid_p(!p1',!p2',p);
   3.658 -
   3.659 -	 if hd(!prs)=[] then pc:=hd(tl(!prs))
   3.660 -	 else pc:=hd(!prs);
   3.661 -
   3.662 -	 g:=uv_mod_smul_poly(uv_mod_pp(!pc),!d);
   3.663 -	 !g
   3.664 -	 )
   3.665 -    end;
   3.666 -
   3.667 -(*. calculates the minimum of two real values x and y .*)
   3.668 -fun uv_mod_r_min(x,y):Real.real = if x>y then y else x;
   3.669 -
   3.670 -(*. calculates the minimum of two integer values x and y .*)
   3.671 -fun uv_mod_min(x,y) = if x>y then y else x;
   3.672 -
   3.673 -(*. adds the squared values of a integer list .*)
   3.674 -fun uv_mod_add_qu [] = 0.0 
   3.675 -  | uv_mod_add_qu (x::p) =  Real.fromInt(x)*Real.fromInt(x) + uv_mod_add_qu p;
   3.676 -
   3.677 -(*. calculates the euklidean norm .*)
   3.678 -fun uv_mod_norm ([]:uv_poly) = 0.0
   3.679 -  | uv_mod_norm p = Math.sqrt(uv_mod_add_qu(p));
   3.680 -
   3.681 -(*. multipies two values a and b .*)
   3.682 -fun uv_mod_multi a b = a * b;
   3.683 -
   3.684 -(*. decides if x is a prim, the list contains all primes which are lower then x .*)
   3.685 -fun uv_mod_prim(x,[])= false 
   3.686 -  | uv_mod_prim(x,[y])=if ((x mod y) <> 0) then true
   3.687 -		else false
   3.688 -  | uv_mod_prim(x,y::ys) = if uv_mod_prim(x,[y])
   3.689 -			then 
   3.690 -			    if uv_mod_prim(x,ys) then true 
   3.691 -			    else false
   3.692 -		    else false;
   3.693 -
   3.694 -(*. gets the first prime, which is greater than p and does not divide g .*)
   3.695 -fun uv_mod_nextprime(g,p)= 
   3.696 -    let
   3.697 -	val list= Unsynchronized.ref  [2];
   3.698 -	val exit= Unsynchronized.ref  0;
   3.699 -	val i = Unsynchronized.ref 2
   3.700 -    in
   3.701 -	while (!i<p) do (* calculates the primes lower then p *)
   3.702 -	    (
   3.703 -	     if uv_mod_prim(!i,!list) then
   3.704 -		 (
   3.705 -		  if (p mod !i <> 0)
   3.706 -		      then
   3.707 -			  (
   3.708 -			   list:= (!i)::(!list);
   3.709 -			   i:= (!i)+1
   3.710 -			   )
   3.711 -		  else i:=(!i)+1
   3.712 -		  )
   3.713 -	     else i:= (!i)+1
   3.714 -		 );
   3.715 -	    i:=(p+1);
   3.716 -	    while (!exit=0) do   (* calculate next prime which does not divide g *)
   3.717 -	    (
   3.718 -	     if uv_mod_prim(!i,!list) then
   3.719 -		 (
   3.720 -		  if (g mod !i <> 0)
   3.721 -		      then
   3.722 -			  (
   3.723 -			   list:= (!i)::(!list);
   3.724 -			   exit:= (!i)
   3.725 -			   )
   3.726 -		  else i:=(!i)+1
   3.727 -		      )
   3.728 -	     else i:= (!i)+1
   3.729 -		 ); 
   3.730 -	    !exit
   3.731 -    end;
   3.732 -
   3.733 -(*. decides if p1 is a factor of p2 in Zp .*)
   3.734 -fun uv_mod_dividesp ([]:uv_poly) (p2:uv_poly) p= error("UV_MOD_DIVIDESP: Division by zero") 
   3.735 -  | uv_mod_dividesp p1 p2 p= if uv_mod_prestp p2 p1 p = [] then true else false;
   3.736 -
   3.737 -(*. decides if p1 is a factor of p2 .*)
   3.738 -fun uv_mod_divides ([]:uv_poly) (p2:uv_poly) = error("UV_MOD_DIVIDES: Division by zero")
   3.739 -  | uv_mod_divides p1 p2 = if uv_mod_prest p2 p1  = [] then true else false;
   3.740 -
   3.741 -(*. chinese remainder algorithm .*)
   3.742 -fun uv_mod_cra2(r1,r2,m1,m2)=     
   3.743 -    let 
   3.744 -	val c= Unsynchronized.ref  0;
   3.745 -	val r1'= Unsynchronized.ref  0;
   3.746 -	val d= Unsynchronized.ref  0;
   3.747 -	val a= Unsynchronized.ref  0;
   3.748 -    in
   3.749 -	(
   3.750 -	 while (uv_mod_mod2((!c)*m1,m2))<>1 do 
   3.751 -	     (
   3.752 -	      c:=(!c)+1
   3.753 -	      );
   3.754 -	 r1':= uv_mod_mod2(r1,m1);
   3.755 -	 d:=uv_mod_mod2(((r2-(!r1'))*(!c)),m2);
   3.756 -	 !r1'+(!d)*m1    
   3.757 -	 )
   3.758 -    end;
   3.759 -
   3.760 -(*. applies the chinese remainder algorithmen to the coefficients of x1 and x2 .*)
   3.761 -fun uv_mod_cra_2 ([],[],m1,m2) = [] 
   3.762 -  | uv_mod_cra_2 ([],x2,m1,m2) = error("UV_MOD_CRA_2_EXCEPTION: invalid call x1")
   3.763 -  | uv_mod_cra_2 (x1,[],m1,m2) = error("UV_MOD_CRA_2_EXCEPTION: invalid call x2")
   3.764 -  | uv_mod_cra_2 (x1::x1s,x2::x2s,m1,m2) = (uv_mod_cra2(x1,x2,m1,m2))::(uv_mod_cra_2(x1s,x2s,m1,m2));
   3.765 -
   3.766 -(*. calculates the gcd of two uv polynomials p1' and p2' with the modular algorithm .*)
   3.767 -fun uv_mod_gcd (p1':uv_poly) (p2':uv_poly) =
   3.768 -    let 
   3.769 -	val p1= Unsynchronized.ref  (uv_mod_pp(p1'));
   3.770 -	val p2= Unsynchronized.ref  (uv_mod_pp(p2'));
   3.771 -	val c=gcd_int (uv_mod_cont(p1')) (uv_mod_cont(p2'));
   3.772 -	val temp= Unsynchronized.ref  [];
   3.773 -	val cp= Unsynchronized.ref  [];
   3.774 -	val qp= Unsynchronized.ref  [];
   3.775 -	val q= Unsynchronized.ref [];
   3.776 -	val pn= Unsynchronized.ref  0;
   3.777 -	val d= Unsynchronized.ref  0;
   3.778 -	val g1= Unsynchronized.ref  0;
   3.779 -	val p= Unsynchronized.ref  0;    
   3.780 -	val m= Unsynchronized.ref  0;
   3.781 -	val exit= Unsynchronized.ref  0;
   3.782 -	val i= Unsynchronized.ref  1;
   3.783 -    in
   3.784 -	if length(!p1)>length(!p2) then ()
   3.785 -	else 
   3.786 -	    (
   3.787 -	     temp:= !p1;
   3.788 -	     p1:= !p2;
   3.789 -	     p2:= !temp
   3.790 -	     );
   3.791 -
   3.792 -	 
   3.793 -	d:=gcd_int (uv_mod_lc(!p1)) (uv_mod_lc(!p2));
   3.794 -	g1:=uv_mod_lc(!p1)*uv_mod_lc(!p2);
   3.795 -	p:=4;
   3.796 -	
   3.797 -	m:=Real.ceil(2.0 * Real.fromInt(!d) *
   3.798 -	  Real.fromInt(power 2 (uv_mod_min(uv_mod_deg(!p2),uv_mod_deg(!p1)))) *
   3.799 -	  Real.fromInt(!d) * 
   3.800 -	  uv_mod_r_min(uv_mod_norm(!p1) / Real.fromInt(abs(uv_mod_lc(!p1))),
   3.801 -	  uv_mod_norm(!p2) / Real.fromInt(abs(uv_mod_lc(!p2))))); 
   3.802 -
   3.803 -	while (!exit=0) do  
   3.804 -	    (
   3.805 -	     p:=uv_mod_nextprime(!d,!p);
   3.806 -	     cp:=(uv_mod_gcd_modp (uv_mod_list_modp(!p1) (!p)) (uv_mod_list_modp(!p2) (!p)) (!p)) ;
   3.807 -	     if abs(uv_mod_lc(!cp))<>1 then  (* leading coefficient = 1 ? *)
   3.808 -		 (
   3.809 -		  i:=1;
   3.810 -		  while (!i)<(!p) andalso (abs(uv_mod_mod2((uv_mod_lc(!cp)*(!i)),(!p)))<>1) do
   3.811 -		      (
   3.812 -		       i:=(!i)+1
   3.813 -		       );
   3.814 -		      cp:=uv_mod_list_modp (map (uv_mod_multi (!i)) (!cp)) (!p) 
   3.815 -		  )
   3.816 -	     else ();
   3.817 -
   3.818 -	     qp:= ((map (uv_mod_multi (uv_mod_mod2(!d,!p)))) (!cp));
   3.819 -
   3.820 -	     if uv_mod_deg(!qp)=0 then (q:=[1]; exit:=1) else ();
   3.821 -
   3.822 -	     pn:=(!p);
   3.823 -	     q:=(!qp);
   3.824 -
   3.825 -	     while !pn<= !m andalso !m>(!p) andalso !exit=0 do
   3.826 -		 (
   3.827 -		  p:=uv_mod_nextprime(!d,!p);
   3.828 - 		  cp:=(uv_mod_gcd_modp (uv_mod_list_modp(!p1) (!p)) (uv_mod_list_modp(!p2) (!p)) (!p)); 
   3.829 - 		  if uv_mod_lc(!cp)<>1 then  (* leading coefficient = 1 ? *)
   3.830 - 		      (
   3.831 - 		       i:=1;
   3.832 - 		       while (!i)<(!p) andalso ((uv_mod_mod2((uv_mod_lc(!q)*(!i)),(!p)))<>1) do
   3.833 - 			   (
   3.834 - 			    i:=(!i)+1
   3.835 -		           );
   3.836 -		       cp:=uv_mod_list_modp (map (uv_mod_multi (!i)) (!cp)) (!p)
   3.837 - 		      )
   3.838 - 		  else ();    
   3.839 - 		 
   3.840 -		  qp:=uv_mod_list_modp ((map (uv_mod_multi (uv_mod_mod2(!d,!p)))) (!cp)  ) (!p);
   3.841 - 		  if uv_mod_deg(!qp)>uv_mod_deg(!q) then
   3.842 - 		      (
   3.843 - 		       (*print("degree to high!!!\n")*)
   3.844 - 		       )
   3.845 - 		  else
   3.846 - 		      (
   3.847 - 		       if uv_mod_deg(!qp)=uv_mod_deg(!q) then
   3.848 - 			   (
   3.849 - 			    q:=uv_mod_cra_2(!q,!qp,!pn,!p);
   3.850 -			    pn:=(!pn) * !p;
   3.851 -			    q:=uv_mod_pp(uv_mod_list_modp (!q) (!pn)); (* found already gcd ? *)
   3.852 -			    if (uv_mod_divides (!q) (p1')) andalso (uv_mod_divides (!q) (p2')) then (exit:=1) else ()
   3.853 -		 	    )
   3.854 -		       else
   3.855 -			   (
   3.856 -			    if  uv_mod_deg(!qp)<uv_mod_deg(!q) then
   3.857 -				(
   3.858 -				 pn:= !p;
   3.859 -				 q:= !qp
   3.860 -				 )
   3.861 -			    else ()
   3.862 -			    )
   3.863 -		       )
   3.864 -		  );
   3.865 - 	     q:=uv_mod_pp(uv_mod_list_modp (!q) (!pn));
   3.866 -	     if (uv_mod_divides (!q) (p1')) andalso (uv_mod_divides (!q) (p2')) then exit:=1 else ()
   3.867 -	     );
   3.868 -	    uv_mod_smul_poly(!q,c):uv_poly
   3.869 -    end;
   3.870 -
   3.871 -(*. multivariate polynomials .*)
   3.872 -(*. multivariate polynomials are represented as a list of the pairs, 
   3.873 - first is the coefficent and the second is a list of the exponents .*)
   3.874 -(*. 5 * x^5 * y^3 + 4 * x^3 * z^2 + 2 * x^2 * y * z^3 - z - 19 
   3.875 - => [(5,[5,3,0]),(4,[3,0,2]),(2,[2,1,3]),(~1,[0,0,1]),(~19,[0,0,0])] .*)
   3.876 -
   3.877 -(*. global variables .*)
   3.878 -(*. order indicators .*)
   3.879 -val LEX_=0; (* lexicographical term order *)
   3.880 -val GGO_=1; (* greatest degree order *)
   3.881 -
   3.882 -(*. datatypes for internal representation.*)
   3.883 -type mv_monom = (int *      (*.coefficient or the monom.*)
   3.884 -		 int list); (*.list of exponents)      .*)
   3.885 -fun mv_monom2str (i, is) = "("^ int2str i^"," ^ ints2str' is ^ ")";
   3.886 -
   3.887 -type mv_poly = mv_monom list; 
   3.888 -fun mv_poly2str p = (strs2str' o (map mv_monom2str)) p;
   3.889 -
   3.890 -(*. help function for monom_greater and geq .*)
   3.891 -fun mv_mg_hlp([]) = EQUAL 
   3.892 -  | mv_mg_hlp(x::list)=if x<0 then LESS
   3.893 -		    else if x>0 then GREATER
   3.894 -			 else mv_mg_hlp(list);
   3.895 -
   3.896 -(*. adds a list of values .*)
   3.897 -fun mv_addlist([]) = 0
   3.898 -  | mv_addlist(p1) = hd(p1)+mv_addlist(tl(p1));
   3.899 -			   
   3.900 -(*. tests if the monomial M1 is greater as the monomial M2 and returns a boolean value .*)
   3.901 -(*. 2 orders are implemented LEX_/GGO_ (lexigraphical/greatest degree order) .*)
   3.902 -fun mv_monom_greater((M1x,M1l):mv_monom,(M2x,M2l):mv_monom,order)=
   3.903 -    if order=LEX_ then
   3.904 -	( 
   3.905 -	 if length(M1l)<>length(M2l) then error ("RATIONALS_MV_MONOM_GREATER_EXCEPTION: Order error")
   3.906 -	 else if (mv_mg_hlp((map op- (M1l~~M2l)))<>GREATER) then false else true
   3.907 -	     )
   3.908 -    else
   3.909 -	if order=GGO_ then
   3.910 -	    ( 
   3.911 -	     if length(M1l)<>length(M2l) then error ("RATIONALS_MV_MONOM_GREATER_EXCEPTION: Order error")
   3.912 -	     else 
   3.913 -		 if mv_addlist(M1l)=mv_addlist(M2l)  then if (mv_mg_hlp((map op- (M1l~~M2l)))<>GREATER) then false else true
   3.914 -		 else if mv_addlist(M1l)>mv_addlist(M2l) then true else false
   3.915 -	     )
   3.916 -	else error ("RATIONALS_MV_MONOM_GREATER_EXCEPTION: Wrong Order");
   3.917 -		   
   3.918 -(*. tests if the monomial X is greater as the monomial Y and returns a order value (GREATER,EQUAL,LESS) .*)
   3.919 -(*. 2 orders are implemented LEX_/GGO_ (lexigraphical/greatest degree order) .*)
   3.920 -fun mv_geq order ((x1,x):mv_monom,(x2,y):mv_monom) =
   3.921 -let 
   3.922 -    val temp= Unsynchronized.ref  EQUAL;
   3.923 -in
   3.924 -    if order=LEX_ then
   3.925 -	(
   3.926 -	 if length(x)<>length(y) then 
   3.927 -	     error ("RATIONALS_MV_GEQ_EXCEPTION: Order error")
   3.928 -	 else 
   3.929 -	     (
   3.930 -	      temp:=mv_mg_hlp((map op- (x~~y)));
   3.931 -	      if !temp=EQUAL then 
   3.932 -		  ( if x1=x2 then EQUAL 
   3.933 -		    else if x1>x2 then GREATER
   3.934 -			 else LESS
   3.935 -			     )
   3.936 -	      else (!temp)
   3.937 -	      )
   3.938 -	     )
   3.939 -    else 
   3.940 -	if order=GGO_ then 
   3.941 -	    (
   3.942 -	     if length(x)<>length(y) then 
   3.943 -	      error ("RATIONALS_MV_GEQ_EXCEPTION: Order error")
   3.944 -	     else 
   3.945 -		 if mv_addlist(x)=mv_addlist(y) then 
   3.946 -		     (mv_mg_hlp((map op- (x~~y))))
   3.947 -		 else if mv_addlist(x)>mv_addlist(y) then GREATER else LESS
   3.948 -		     )
   3.949 -	else error ("RATIONALS_MV_GEQ_EXCEPTION: Wrong Order")
   3.950 -end;
   3.951 -
   3.952 -(*. cuts the first variable from a polynomial .*)
   3.953 -fun mv_cut([]:mv_poly)=[]:mv_poly
   3.954 -  | mv_cut((x,[])::list) = error ("RATIONALS_MV_CUT_EXCEPTION: Invalid list ")
   3.955 -  | mv_cut((x,y::ys)::list)=(x,ys)::mv_cut(list);
   3.956 -	    
   3.957 -(*. leading power product .*)
   3.958 -fun mv_lpp([]:mv_poly,order)  = []
   3.959 -  | mv_lpp([(x,y)],order) = y
   3.960 -  | mv_lpp(p1,order)  = #2(hd(rev(sort (mv_geq order) p1)));
   3.961 -    
   3.962 -(*. leading monomial .*)
   3.963 -fun mv_lm([]:mv_poly,order)  = (0,[]):mv_monom
   3.964 -  | mv_lm([x],order) = x 
   3.965 -  | mv_lm(p1,order)  = hd(rev(sort (mv_geq order) p1));
   3.966 -    
   3.967 -(*. leading coefficient in term order .*)
   3.968 -fun mv_lc2([]:mv_poly,order)  = 0
   3.969 -  | mv_lc2([(x,y)],order) = x
   3.970 -  | mv_lc2(p1,order)  = #1(hd(rev(sort (mv_geq order) p1)));
   3.971 -
   3.972 -
   3.973 -(*. reverse the coefficients in mv polynomial .*)
   3.974 -fun mv_rev_to([]:mv_poly) = []:mv_poly
   3.975 -  | mv_rev_to((c,e)::xs) = (c,rev(e))::mv_rev_to(xs);
   3.976 -
   3.977 -(*. leading coefficient in reverse term order .*)
   3.978 -fun mv_lc([]:mv_poly,order)  = []:mv_poly 
   3.979 -  | mv_lc([(x,y)],order) = mv_rev_to(mv_cut(mv_rev_to([(x,y)])))
   3.980 -  | mv_lc(p1,order)  = 
   3.981 -    let
   3.982 -	val p1o= Unsynchronized.ref  (rev(sort (mv_geq order) (mv_rev_to(p1))));
   3.983 -	val lp=hd(#2(hd(!p1o)));
   3.984 -	val lc= Unsynchronized.ref  [];
   3.985 -    in
   3.986 -	(
   3.987 -	 while (length(!p1o)>0 andalso hd(#2(hd(!p1o)))=lp) do
   3.988 -	     (
   3.989 -	      lc:=hd(mv_cut([hd(!p1o)]))::(!lc);
   3.990 -	      p1o:=tl(!p1o)
   3.991 -	      );
   3.992 -	 if !lc=[] then error ("RATIONALS_MV_LC_EXCEPTION: lc is empty") else ();
   3.993 -	 mv_rev_to(!lc)
   3.994 -	 )
   3.995 -    end;
   3.996 -
   3.997 -(*. compares two powerproducts .*)
   3.998 -fun mv_monom_equal((_,xlist):mv_monom,(_,ylist):mv_monom) = (foldr and_) (((map op=) (xlist~~ylist)),true);
   3.999 -    
  3.1000 -(*. help function for mv_add .*)
  3.1001 -fun mv_madd([]:mv_poly,[]:mv_poly,order) = []:mv_poly
  3.1002 -  | mv_madd([(0,_)],p2,order) = p2
  3.1003 -  | mv_madd(p1,[(0,_)],order) = p1  
  3.1004 -  | mv_madd([],p2,order) = p2
  3.1005 -  | mv_madd(p1,[],order) = p1
  3.1006 -  | mv_madd(p1,p2,order) = 
  3.1007 -    (
  3.1008 -     if mv_monom_greater(hd(p1),hd(p2),order) 
  3.1009 -	 then hd(p1)::mv_madd(tl(p1),p2,order)
  3.1010 -     else if mv_monom_equal(hd(p1),hd(p2)) 
  3.1011 -	      then if mv_lc2(p1,order)+mv_lc2(p2,order)<>0 
  3.1012 -		       then (mv_lc2(p1,order)+mv_lc2(p2,order),mv_lpp(p1,order))::mv_madd(tl(p1),tl(p2),order)
  3.1013 -		   else mv_madd(tl(p1),tl(p2),order)
  3.1014 -	  else hd(p2)::mv_madd(p1,tl(p2),order)
  3.1015 -	      )
  3.1016 -	      
  3.1017 -(*. adds two multivariate polynomials .*)
  3.1018 -fun mv_add([]:mv_poly,p2:mv_poly,order) = p2
  3.1019 -  | mv_add(p1,[],order) = p1
  3.1020 -  | mv_add(p1,p2,order) = mv_madd(rev(sort (mv_geq order) p1),rev(sort (mv_geq order) p2), order);
  3.1021 -
  3.1022 -(*. monom multiplication .*)
  3.1023 -fun mv_mmul((x1,y1):mv_monom,(x2,y2):mv_monom)=(x1*x2,(map op+) (y1~~y2)):mv_monom;
  3.1024 -
  3.1025 -(*. deletes all monomials with coefficient 0 .*)
  3.1026 -fun mv_shorten([]:mv_poly,order) = []:mv_poly
  3.1027 -  | mv_shorten(x::xs,order)=mv_madd([x],mv_shorten(xs,order),order);
  3.1028 -
  3.1029 -(*. zeros a list .*)
  3.1030 -fun mv_null2([])=[]
  3.1031 -  | mv_null2(x::l)=0::mv_null2(l);
  3.1032 -
  3.1033 -(*. multiplies two multivariate polynomials .*)
  3.1034 -fun mv_mul([]:mv_poly,[]:mv_poly,_) = []:mv_poly
  3.1035 -  | mv_mul([],y::p2,_) = [(0,mv_null2(#2(y)))]
  3.1036 -  | mv_mul(x::p1,[],_) = [(0,mv_null2(#2(x)))] 
  3.1037 -  | mv_mul(x::p1,y::p2,order) = mv_shorten(rev(sort (mv_geq order) (mv_mmul(x,y) :: (mv_mul(p1,y::p2,order) @
  3.1038 -									    mv_mul([x],p2,order)))),order);
  3.1039 -
  3.1040 -(*. gets the maximum value of a list .*)
  3.1041 -fun mv_getmax([])=0
  3.1042 -  | mv_getmax(x::p1)= let 
  3.1043 -		       val m=mv_getmax(p1);
  3.1044 -		   in
  3.1045 -		       if m>x then m
  3.1046 -		       else x
  3.1047 -		   end;
  3.1048 -(*. calculates the maximum degree of an multivariate polynomial .*)
  3.1049 -fun mv_grad([]:mv_poly) = 0 
  3.1050 -  | mv_grad(p1:mv_poly)= mv_getmax((map mv_addlist) ((map #2) p1));
  3.1051 -
  3.1052 -(*. converts the sign of a value .*)
  3.1053 -fun mv_minus(x)=(~1) * x;
  3.1054 -
  3.1055 -(*. converts the sign of all coefficients of a polynomial .*)
  3.1056 -fun mv_minus2([]:mv_poly)=[]:mv_poly
  3.1057 -  | mv_minus2(p1)=(mv_minus(#1(hd(p1))),#2(hd(p1)))::(mv_minus2(tl(p1)));
  3.1058 -
  3.1059 -(*. searches for a negativ value in a list .*)
  3.1060 -fun mv_is_negativ([])=false
  3.1061 -  | mv_is_negativ(x::xs)=if x<0 then true else mv_is_negativ(xs);
  3.1062 -
  3.1063 -(*. division of monomials .*)
  3.1064 -fun mv_mdiv((0,[]):mv_monom,_:mv_monom)=(0,[]):mv_monom
  3.1065 -  | mv_mdiv(_,(0,[]))= error ("RATIONALS_MV_MDIV_EXCEPTION Division by 0 ")
  3.1066 -  | mv_mdiv(p1:mv_monom,p2:mv_monom)= 
  3.1067 -    let
  3.1068 -	val c= Unsynchronized.ref  (#1(p2));
  3.1069 -	val pp= Unsynchronized.ref  [];
  3.1070 -    in 
  3.1071 -	(
  3.1072 -	 if !c=0 then error("MV_MDIV_EXCEPTION Dividing by zero")
  3.1073 -	 else c:=(#1(p1) div #1(p2));
  3.1074 -	     if #1(p2)<>0 then 
  3.1075 -		 (
  3.1076 -		  pp:=(#2(mv_mmul((1,#2(p1)),(1,(map mv_minus) (#2(p2))))));
  3.1077 -		  if mv_is_negativ(!pp) then (0,!pp)
  3.1078 -		  else (!c,!pp) 
  3.1079 -		      )
  3.1080 -	     else error("MV_MDIV_EXCEPTION Dividing by empty Polynom")
  3.1081 -		 )
  3.1082 -    end;
  3.1083 -
  3.1084 -(*. prints a polynom for (internal use only) .*)
  3.1085 -fun mv_print_poly([]:mv_poly)=tracing("[]\n")
  3.1086 -  | mv_print_poly((x,y)::[])= tracing("("^Int.toString(x)^","^ints2str(y)^")\n")
  3.1087 -  | mv_print_poly((x,y)::p1) = (tracing("("^Int.toString(x)^","^ints2str(y)^"),");mv_print_poly(p1));
  3.1088 -
  3.1089 -
  3.1090 -(*. division of two multivariate polynomials .*) 
  3.1091 -fun mv_division([]:mv_poly,g:mv_poly,order)=([]:mv_poly,[]:mv_poly)
  3.1092 -  | mv_division(f,[],order)= error ("RATIONALS_MV_DIVISION_EXCEPTION Division by zero")
  3.1093 -  | mv_division(f,g,order)=
  3.1094 -    let 
  3.1095 -	val r= Unsynchronized.ref  [];
  3.1096 -	val q= Unsynchronized.ref  [];
  3.1097 -	val g'= Unsynchronized.ref  ([] : mv_monom list);
  3.1098 -	val k= Unsynchronized.ref  0;
  3.1099 -	val m= Unsynchronized.ref  (0,[0]);
  3.1100 -	val exit= Unsynchronized.ref  0;
  3.1101 -    in
  3.1102 -	r := rev(sort (mv_geq order) (mv_shorten(f,order)));
  3.1103 -	g':= rev(sort (mv_geq order) (mv_shorten(g,order)));
  3.1104 -	if #1(hd(!g'))=0 then error("RATIONALS_MV_DIVISION_EXCEPTION: Dividing by zero") else ();
  3.1105 -	if  (mv_monom_greater (hd(!g'),hd(!r),order)) then ([(0,mv_null2(#2(hd(f))))],(!r))
  3.1106 -	else
  3.1107 -	    (
  3.1108 -	     exit:=0;
  3.1109 -	     while (if (!exit)=0 then not(mv_monom_greater (hd(!g'),hd(!r),order)) else false) do
  3.1110 -		 (
  3.1111 -		  if (#1(mv_lm(!g',order)))<>0 then m:=mv_mdiv(mv_lm(!r,order),mv_lm(!g',order))
  3.1112 -		  else error ("RATIONALS_MV_DIVISION_EXCEPTION: Dividing by zero");	  
  3.1113 -		  if #1(!m)<>0 then
  3.1114 -		      ( 
  3.1115 -		       q:=(!m)::(!q);
  3.1116 -		       r:=mv_add((!r),mv_minus2(mv_mul(!g',[!m],order)),order)
  3.1117 -		       )
  3.1118 -		  else exit:=1;
  3.1119 -		  if (if length(!r)<>0 then length(!g')<>0 else false) then ()
  3.1120 -		  else (exit:=1)
  3.1121 -		  );
  3.1122 -		 (rev(!q),!r)
  3.1123 -		 )
  3.1124 -    end;
  3.1125 -
  3.1126 -(*. multiplies a polynomial with an integer .*)
  3.1127 -fun mv_skalar_mul([]:mv_poly,c) = []:mv_poly
  3.1128 -  | mv_skalar_mul((x,y)::p1,c) = ((x * c),y)::mv_skalar_mul(p1,c); 
  3.1129 -
  3.1130 -(*. inserts the a first variable into an polynomial with exponent v .*)
  3.1131 -fun mv_correct([]:mv_poly,v:int)=[]:mv_poly
  3.1132 -  | mv_correct((x,y)::list,v:int)=(x,v::y)::mv_correct(list,v);
  3.1133 -
  3.1134 -(*. multivariate case .*)
  3.1135 -
  3.1136 -(*. decides if x is a factor of y .*)
  3.1137 -fun mv_divides([]:mv_poly,[]:mv_poly)=  error("RATIONALS_MV_DIVIDES_EXCEPTION: division by zero")
  3.1138 -  | mv_divides(x,[]) =  error("RATIONALS_MV_DIVIDES_EXCEPTION: division by zero")
  3.1139 -  | mv_divides(x:mv_poly,y:mv_poly) = #2(mv_division(y,x,LEX_))=[];
  3.1140 -
  3.1141 -(*. gets the maximum of a and b .*)
  3.1142 -fun mv_max(a,b) = if a>b then a else b;
  3.1143 -
  3.1144 -(*. gets the maximum exponent of a mv polynomial in the lexicographic term order .*)
  3.1145 -fun mv_deg([]:mv_poly) = 0  
  3.1146 -  | mv_deg(p1)=
  3.1147 -    let
  3.1148 -	val p1'=mv_shorten(p1,LEX_);
  3.1149 -    in
  3.1150 -	if length(p1')=0 then 0 
  3.1151 -	else mv_max(hd(#2(hd(p1'))),mv_deg(tl(p1')))
  3.1152 -    end;
  3.1153 -
  3.1154 -(*. gets the maximum exponent of a mv polynomial in the reverse lexicographic term order .*)
  3.1155 -fun mv_deg2([]:mv_poly) = 0
  3.1156 -  | mv_deg2(p1)=
  3.1157 -    let
  3.1158 -	val p1'=mv_shorten(p1,LEX_);
  3.1159 -    in
  3.1160 -	if length(p1')=0 then 0 
  3.1161 -	else mv_max(hd(rev(#2(hd(p1')))),mv_deg2(tl(p1')))
  3.1162 -    end;
  3.1163 -
  3.1164 -(*. evaluates the mv polynomial at the value v of the main variable .*)
  3.1165 -fun mv_subs([]:mv_poly,v) = []:mv_poly
  3.1166 -  | mv_subs((c,e)::p1:mv_poly,v) = mv_skalar_mul(mv_cut([(c,e)]),power v (hd(e))) @ mv_subs(p1,v);
  3.1167 -
  3.1168 -(*. calculates the content of a uv-polynomial in mv-representation .*)
  3.1169 -fun uv_content2([]:mv_poly) = 0
  3.1170 -  | uv_content2((c,e)::p1) = (gcd_int c (uv_content2(p1)));
  3.1171 -
  3.1172 -(*. converts a uv-polynomial from mv-representation to  uv-representation .*)
  3.1173 -fun uv_to_list ([]:mv_poly)=[]:uv_poly
  3.1174 -  | uv_to_list ((c1,e1)::others) = 
  3.1175 -    let
  3.1176 -	val count= Unsynchronized.ref  0;
  3.1177 -	val max=mv_grad((c1,e1)::others); 
  3.1178 -	val help= Unsynchronized.ref  ((c1,e1)::others);
  3.1179 -	val list= Unsynchronized.ref  [];
  3.1180 -    in
  3.1181 -	if length(e1)>1 then error ("RATIONALS_TO_LIST_EXCEPTION: not univariate")
  3.1182 -	else if length(e1)=0 then [c1]
  3.1183 -	     else
  3.1184 -		 (
  3.1185 -		  count:=0;
  3.1186 -		  while (!count)<=max do
  3.1187 -		      (
  3.1188 -		       if length(!help)>0 andalso hd(#2(hd(!help)))=max-(!count) then 
  3.1189 -			   (
  3.1190 -			    list:=(#1(hd(!help)))::(!list);		       
  3.1191 -			    help:=tl(!help) 
  3.1192 -			    )
  3.1193 -		       else 
  3.1194 -			   (
  3.1195 -			    list:= 0::(!list)
  3.1196 -			    );
  3.1197 -		       count := (!count) + 1
  3.1198 -		       );
  3.1199 -		      (!list)
  3.1200 -		      )
  3.1201 -    end;
  3.1202 -
  3.1203 -(*. converts a uv-polynomial from uv-representation to mv-representation .*)
  3.1204 -fun uv_to_poly ([]:uv_poly) = []:mv_poly
  3.1205 -  | uv_to_poly p1 = 
  3.1206 -    let
  3.1207 -	val count= Unsynchronized.ref  0;
  3.1208 -	val help= Unsynchronized.ref  p1;
  3.1209 -	val list= Unsynchronized.ref  [];
  3.1210 -    in
  3.1211 -	while length(!help)>0 do
  3.1212 -	    (
  3.1213 -	     if hd(!help)=0 then ()
  3.1214 -	     else list:=(hd(!help),[!count])::(!list);
  3.1215 -	     count:=(!count)+1;
  3.1216 -	     help:=tl(!help)
  3.1217 -	     );
  3.1218 -	    (!list)
  3.1219 -    end;
  3.1220 -
  3.1221 -(*. univariate gcd calculation from polynomials in multivariate representation .*)
  3.1222 -fun uv_gcd ([]:mv_poly) p2 = p2
  3.1223 -  | uv_gcd p1 ([]:mv_poly) = p1
  3.1224 -  | uv_gcd p1 [(c,[e])] = 
  3.1225 -    let 
  3.1226 -	val list= Unsynchronized.ref  (rev(sort (mv_geq LEX_) (mv_shorten(p1,LEX_))));
  3.1227 -	val min=uv_mod_min(e,(hd(#2(hd(rev(!list))))));
  3.1228 -    in
  3.1229 -	[(gcd_int (uv_content2(p1)) c,[min])]
  3.1230 -    end
  3.1231 -  | uv_gcd [(c,[e])] p2 = 
  3.1232 -    let 
  3.1233 -	val list= Unsynchronized.ref  (rev(sort (mv_geq LEX_) (mv_shorten(p2,LEX_))));
  3.1234 -	val min=uv_mod_min(e,(hd(#2(hd(rev(!list))))));
  3.1235 -    in
  3.1236 -	[(gcd_int (uv_content2(p2)) c,[min])]
  3.1237 -    end 
  3.1238 -  | uv_gcd p11 p22 = uv_to_poly(uv_mod_gcd (uv_to_list(mv_shorten(p11,LEX_))) (uv_to_list(mv_shorten(p22,LEX_))));
  3.1239 -
  3.1240 -(*. help function for the newton interpolation .*)
  3.1241 -fun mv_newton_help ([]:mv_poly list,k:int) = []:mv_poly list
  3.1242 -  | mv_newton_help (pl:mv_poly list,k) = 
  3.1243 -    let
  3.1244 -	val x= Unsynchronized.ref  (rev(pl));
  3.1245 -	val t= Unsynchronized.ref  [];
  3.1246 -	val y= Unsynchronized.ref  [];
  3.1247 -	val n= Unsynchronized.ref  1;
  3.1248 -	val n1= Unsynchronized.ref [];
  3.1249 -    in
  3.1250 -	(
  3.1251 -	 while length(!x)>1 do 
  3.1252 -	     (
  3.1253 -	      if length(hd(!x))>0 then n1:=mv_null2(#2(hd(hd(!x))))
  3.1254 -	      else if length(hd(tl(!x)))>0 then n1:=mv_null2(#2(hd(hd(tl(!x)))))
  3.1255 -		   else n1:=[]; 
  3.1256 -	      t:= #1(mv_division(mv_add(hd(!x),mv_skalar_mul(hd(tl(!x)),~1),LEX_),[(k,!n1)],LEX_)); 
  3.1257 -	      y:=(!t)::(!y);
  3.1258 -	      x:=tl(!x)
  3.1259 -	      );
  3.1260 -	 (!y)
  3.1261 -	 )
  3.1262 -    end;
  3.1263 -    
  3.1264 -(*. help function for the newton interpolation .*)
  3.1265 -fun mv_newton_add ([]:mv_poly list) t = []:mv_poly
  3.1266 -  | mv_newton_add [x:mv_poly] t = x 
  3.1267 -  | mv_newton_add (pl:mv_poly list) t = 
  3.1268 -    let
  3.1269 -	val expos= Unsynchronized.ref  [];
  3.1270 -	val pll= Unsynchronized.ref  pl;
  3.1271 -    in
  3.1272 -	(
  3.1273 -
  3.1274 -	 while length(!pll)>0 andalso hd(!pll)=[]  do 
  3.1275 -	     ( 
  3.1276 -	      pll:=tl(!pll)
  3.1277 -	      ); 
  3.1278 -	 if length(!pll)>0 then expos:= #2(hd(hd(!pll))) else expos:=[];
  3.1279 -	 mv_add(hd(pl),
  3.1280 -		mv_mul(
  3.1281 -		       mv_add(mv_correct(mv_cut([(1,mv_null2(!expos))]),1),[(~t,mv_null2(!expos))],LEX_),
  3.1282 -		       mv_newton_add (tl(pl)) (t+1),
  3.1283 -		       LEX_
  3.1284 -		       ),
  3.1285 -		LEX_)
  3.1286 -	 )
  3.1287 -    end;
  3.1288 -
  3.1289 -(*. calculates the newton interpolation with polynomial coefficients .*)
  3.1290 -(*. step-depth is 1 and if the result is not an integerpolynomial .*)
  3.1291 -(*. this function returns [] .*)
  3.1292 -fun mv_newton ([]:(mv_poly) list) = []:mv_poly 
  3.1293 -  | mv_newton ([mp]:(mv_poly) list) = mp:mv_poly
  3.1294 -  | mv_newton pl =
  3.1295 -    let
  3.1296 -	val c= Unsynchronized.ref  pl;
  3.1297 -	val c1= Unsynchronized.ref  [];
  3.1298 -	val n=length(pl);
  3.1299 -	val k= Unsynchronized.ref  1;
  3.1300 -	val i= Unsynchronized.ref  n;
  3.1301 -	val ppl= Unsynchronized.ref  [];
  3.1302 -    in
  3.1303 -	c1:=hd(pl)::[];
  3.1304 -	c:=mv_newton_help(!c,!k);
  3.1305 -	c1:=(hd(!c))::(!c1);
  3.1306 -	while(length(!c)>1 andalso !k<n) do
  3.1307 -	    (	 
  3.1308 -	     k:=(!k)+1; 
  3.1309 -	     while  length(!c)>0 andalso hd(!c)=[] do c:=tl(!c); 	  
  3.1310 -	     if !c=[] then () else c:=mv_newton_help(!c,!k);
  3.1311 -	     ppl:= !c;
  3.1312 -	     if !c=[] then () else  c1:=(hd(!c))::(!c1)
  3.1313 -	     );
  3.1314 -	while  hd(!c1)=[] do c1:=tl(!c1);
  3.1315 -	c1:=rev(!c1);
  3.1316 -	ppl:= !c1;
  3.1317 -	mv_newton_add (!c1) 1
  3.1318 -    end;
  3.1319 -
  3.1320 -(*. sets the exponents of the first variable to zero .*)
  3.1321 -fun mv_null3([]:mv_poly)    = []:mv_poly
  3.1322 -  | mv_null3((x,y)::xs) = (x,0::tl(y))::mv_null3(xs);
  3.1323 -
  3.1324 -(*. calculates the minimum exponents of a multivariate polynomial .*)
  3.1325 -fun mv_min_pp([]:mv_poly)=[]
  3.1326 -  | mv_min_pp((c,e)::xs)=
  3.1327 -    let
  3.1328 -	val y= Unsynchronized.ref  xs;
  3.1329 -	val x= Unsynchronized.ref  [];
  3.1330 -    in
  3.1331 -	(
  3.1332 -	 x:=e;
  3.1333 -	 while length(!y)>0 do
  3.1334 -	     (
  3.1335 -	      x:=(map uv_mod_min) ((!x) ~~ (#2(hd(!y))));
  3.1336 -	      y:=tl(!y)
  3.1337 -	      );
  3.1338 -	 !x
  3.1339 -	 )
  3.1340 -    end;
  3.1341 -
  3.1342 -(*. checks if all elements of the list have value zero .*)
  3.1343 -fun list_is_null [] = true 
  3.1344 -  | list_is_null (x::xs) = (x=0 andalso list_is_null(xs)); 
  3.1345 -
  3.1346 -(* check if main variable is zero*)
  3.1347 -fun main_zero (ms : mv_poly) = (list_is_null o (map (hd o #2))) ms;
  3.1348 -
  3.1349 -(*. calculates the content of an polynomial .*)
  3.1350 -fun mv_content([]:mv_poly) = []:mv_poly
  3.1351 -  | mv_content(p1) = 
  3.1352 -    let
  3.1353 -	val list= Unsynchronized.ref  (rev(sort (mv_geq LEX_) (mv_shorten(p1,LEX_))));
  3.1354 -	val test= Unsynchronized.ref  (hd(#2(hd(!list))));
  3.1355 -	val result= Unsynchronized.ref  []; 
  3.1356 -	val min=(hd(#2(hd(rev(!list)))));
  3.1357 -    in
  3.1358 -	(
  3.1359 -	 if length(!list)>1 then
  3.1360 -	     (
  3.1361 -	      while (if length(!list)>0 then (hd(#2(hd(!list)))=(!test)) else false) do
  3.1362 -		  (
  3.1363 -		   result:=(#1(hd(!list)),tl(#2(hd(!list))))::(!result);
  3.1364 -		   
  3.1365 -		   if length(!list)<1 then list:=[]
  3.1366 -		   else list:=tl(!list) 
  3.1367 -		       
  3.1368 -		       );		  
  3.1369 -		  if length(!list)>0 then  
  3.1370 -		   ( 
  3.1371 -		    list:=mv_gcd (!result) (mv_cut(mv_content(!list))) 
  3.1372 -		    ) 
  3.1373 -		  else list:=(!result); 
  3.1374 -		  list:=mv_correct(!list,0);  
  3.1375 -		  (!list) 
  3.1376 -		  )
  3.1377 -	 else
  3.1378 -	     (
  3.1379 -	      mv_null3(!list) 
  3.1380 -	      )
  3.1381 -	     )
  3.1382 -    end
  3.1383 -
  3.1384 -(*. calculates the primitiv part of a polynomial .*)
  3.1385 -and mv_pp([]:mv_poly) = []:mv_poly
  3.1386 -  | mv_pp(p1) = let
  3.1387 -		    val cont= Unsynchronized.ref  []; 
  3.1388 -		    val pp= Unsynchronized.ref [];
  3.1389 -		in
  3.1390 -		    cont:=mv_content(p1);
  3.1391 -		    pp:=(#1(mv_division(p1,!cont,LEX_)));
  3.1392 -		    if !pp=[] 
  3.1393 -			then error("RATIONALS_MV_PP_EXCEPTION: Invalid Content ")
  3.1394 -		    else (!pp)
  3.1395 -		end
  3.1396 -
  3.1397 -(*. calculates the gcd of two multivariate polynomials with a modular approach .*)
  3.1398 -and mv_gcd ([]:mv_poly) ([]:mv_poly) :mv_poly= []:mv_poly
  3.1399 -  | mv_gcd ([]:mv_poly) (p2) :mv_poly= p2:mv_poly
  3.1400 -  | mv_gcd (p1:mv_poly) ([]) :mv_poly= p1:mv_poly
  3.1401 -  | mv_gcd ([(x,xs)]:mv_poly) ([(y,ys)]):mv_poly = 
  3.1402 -     let
  3.1403 -      val xpoly:mv_poly = [(x,xs)];
  3.1404 -      val ypoly:mv_poly = [(y,ys)];
  3.1405 -     in 
  3.1406 -	(
  3.1407 -	 if xs=ys then [((gcd_int x y),xs)]
  3.1408 -	 else [((gcd_int x y),(map uv_mod_min)(xs~~ys))]:mv_poly
  3.1409 -        )
  3.1410 -    end 
  3.1411 -  | mv_gcd (p1:mv_poly) ([(y,ys)]) :mv_poly= 
  3.1412 -	(
  3.1413 -	 [(gcd_int (uv_content2(p1)) (y),(map  uv_mod_min)(mv_min_pp(p1)~~ys))]:mv_poly
  3.1414 -	)
  3.1415 -  | mv_gcd ([(y,ys)]:mv_poly) (p2):mv_poly = 
  3.1416 -	(
  3.1417 -         [(gcd_int (uv_content2(p2)) (y),(map  uv_mod_min)(mv_min_pp(p2)~~ys))]:mv_poly
  3.1418 -        )
  3.1419 -  | mv_gcd (p1':mv_poly) (p2':mv_poly):mv_poly=
  3.1420 -    let
  3.1421 -	val vc=length(#2(hd(p1')));
  3.1422 -	val cont = 
  3.1423 -		  (
  3.1424 -                   if main_zero(mv_content(p1')) andalso 
  3.1425 -                     (main_zero(mv_content(p2'))) then
  3.1426 -                     mv_correct((mv_gcd (mv_cut(mv_content(p1'))) (mv_cut(mv_content(p2')))),0)
  3.1427 -                   else 
  3.1428 -                     mv_gcd (mv_content(p1')) (mv_content(p2'))
  3.1429 -                  );
  3.1430 -	val p1= #1(mv_division(p1',mv_content(p1'),LEX_));
  3.1431 -	val p2= #1(mv_division(p2',mv_content(p2'),LEX_)); 
  3.1432 -	val gcd= Unsynchronized.ref  [];
  3.1433 -	val candidate= Unsynchronized.ref  [];
  3.1434 -	val interpolation_list= Unsynchronized.ref  [];
  3.1435 -	val delta= Unsynchronized.ref  [];
  3.1436 -        val p1r = Unsynchronized.ref [];
  3.1437 -        val p2r = Unsynchronized.ref [];
  3.1438 -        val p1r' = Unsynchronized.ref [];
  3.1439 -        val p2r' = Unsynchronized.ref [];
  3.1440 -	val factor= Unsynchronized.ref  [];
  3.1441 -	val r= Unsynchronized.ref  0;
  3.1442 -	val gcd_r= Unsynchronized.ref  [];
  3.1443 -	val d= Unsynchronized.ref  0;
  3.1444 -	val exit= Unsynchronized.ref  0;
  3.1445 -	val current_degree= Unsynchronized.ref  99999; (*. FIXME: unlimited ! .*)
  3.1446 -    in
  3.1447 -	(
  3.1448 -	 if vc<2 then (* areUnivariate(p1',p2') *)
  3.1449 -	     (
  3.1450 -	      gcd:=uv_gcd (mv_shorten(p1',LEX_)) (mv_shorten(p2',LEX_))
  3.1451 -	      )
  3.1452 -	 else
  3.1453 -	     (
  3.1454 -	      while !exit=0 do
  3.1455 -		  (
  3.1456 -		   r:=(!r)+1;
  3.1457 -                   p1r := mv_lc(p1,LEX_);
  3.1458 -		   p2r := mv_lc(p2,LEX_);
  3.1459 -                   if main_zero(!p1r) andalso
  3.1460 -                      main_zero(!p2r) 
  3.1461 -                   then
  3.1462 -                       (
  3.1463 -                        delta := mv_correct((mv_gcd (mv_cut (!p1r)) (mv_cut (!p2r))),0)
  3.1464 -                       )
  3.1465 -                   else
  3.1466 -                       (
  3.1467 -		        delta := mv_gcd (!p1r) (!p2r)
  3.1468 -                       );
  3.1469 -		   (*if mv_shorten(mv_subs(!p1r,!r),LEX_)=[] andalso 
  3.1470 -		      mv_shorten(mv_subs(!p2r,!r),LEX_)=[] *)
  3.1471 -		   if mv_lc2(mv_shorten(mv_subs(!p1r,!r),LEX_),LEX_)=0 andalso 
  3.1472 -		      mv_lc2(mv_shorten(mv_subs(!p2r,!r),LEX_),LEX_)=0 
  3.1473 -                   then 
  3.1474 -                       (
  3.1475 -		       )
  3.1476 -		   else 
  3.1477 -		       (
  3.1478 -			gcd_r:=mv_shorten(mv_gcd (mv_shorten(mv_subs(p1,!r),LEX_)) 
  3.1479 -					         (mv_shorten(mv_subs(p2,!r),LEX_)) ,LEX_);
  3.1480 -			gcd_r:= #1(mv_division(mv_mul(mv_correct(mv_subs(!delta,!r),0),!gcd_r,LEX_),
  3.1481 -					       mv_correct(mv_lc(!gcd_r,LEX_),0),LEX_));
  3.1482 -			d:=mv_deg2(!gcd_r); (* deg(gcd_r,z) *)
  3.1483 -			if (!d < !current_degree) then 
  3.1484 -			    (
  3.1485 -			     current_degree:= !d;
  3.1486 -			     interpolation_list:=mv_correct(!gcd_r,0)::(!interpolation_list)
  3.1487 -			     )
  3.1488 -			else
  3.1489 -			    (
  3.1490 -			     if (!d = !current_degree) then
  3.1491 -				 (
  3.1492 -				  interpolation_list:=mv_correct(!gcd_r,0)::(!interpolation_list)
  3.1493 -				  )
  3.1494 -			     else () 
  3.1495 -				 )
  3.1496 -			    );
  3.1497 -		      if length(!interpolation_list)> uv_mod_min(mv_deg(p1),mv_deg(p2)) then 
  3.1498 -			  (
  3.1499 -			   candidate := mv_newton(rev(!interpolation_list));
  3.1500 -			   if !candidate=[] then ()
  3.1501 -			   else
  3.1502 -			       (
  3.1503 -				candidate:=mv_pp(!candidate);
  3.1504 -				if mv_divides(!candidate,p1) andalso mv_divides(!candidate,p2) then
  3.1505 -				    (
  3.1506 -				     gcd:= mv_mul(!candidate,cont,LEX_);
  3.1507 -				     exit:=1
  3.1508 -				     )
  3.1509 -				else ()
  3.1510 -				    );
  3.1511 -			       interpolation_list:=[mv_correct(!gcd_r,0)]
  3.1512 -			       )
  3.1513 -		      else ()
  3.1514 -			  )
  3.1515 -	     );
  3.1516 -	     (!gcd):mv_poly
  3.1517 -	     )
  3.1518 -    end;	
  3.1519 -
  3.1520 -
  3.1521 -(*. calculates the least common divisor of two polynomials .*)
  3.1522 -fun mv_lcm (p1:mv_poly) (p2:mv_poly) :mv_poly = 
  3.1523 -    (
  3.1524 -     #1(mv_division(mv_mul(p1,p2,LEX_),mv_gcd p1 p2,LEX_))
  3.1525 -     );
  3.1526 -
  3.1527 -(* gets the variables (strings) of a term *)
  3.1528 -
  3.1529 -fun get_vars(term1) = (map free2str) (vars term1); (*["a","b","c"]; *)
  3.1530 -
  3.1531 -(*. counts the negative coefficents in a polynomial .*)
  3.1532 -fun count_neg ([]:mv_poly) = 0 
  3.1533 -  | count_neg ((c,e)::xs) = if c<0 then 1+count_neg xs
  3.1534 -			  else count_neg xs;
  3.1535 -
  3.1536 -(*. help function for is_polynomial  
  3.1537 -    checks the order of the operators .*)
  3.1538 -fun test_polynomial (Const ("uminus",_) $ Free (str,_)) _ = true (*WN.13.3.03*)
  3.1539 -  | test_polynomial (t as Free(str,_)) v = true
  3.1540 -  | test_polynomial (t as Const ("Groups.times_class.times",_) $ t1 $ t2) v = if v="^" then false
  3.1541 -						     else (test_polynomial t1 "*") andalso (test_polynomial t2 "*")
  3.1542 -  | test_polynomial (t as Const ("Groups.plus_class.plus",_) $ t1 $ t2) v = if v="*" orelse v="^" then false 
  3.1543 -							  else (test_polynomial t1 " ") andalso (test_polynomial t2 " ")
  3.1544 -  | test_polynomial (t as Const ("Atools.pow",_) $ t1 $ t2) v = (test_polynomial t1 "^") andalso (test_polynomial t2 "^")
  3.1545 -  | test_polynomial _ v = false;  
  3.1546 -
  3.1547 -(*. tests if a term is a polynomial .*)  
  3.1548 -fun is_polynomial t = test_polynomial t " ";
  3.1549 -
  3.1550 -(*. help function for is_expanded 
  3.1551 -    checks the order of the operators .*)
  3.1552 -fun test_exp (t as Free(str,_)) v = true 
  3.1553 -  | test_exp (t as Const ("Groups.times_class.times",_) $ t1 $ t2) v = if v="^" then false
  3.1554 -						     else (test_exp t1 "*") andalso (test_exp t2 "*")
  3.1555 -  | test_exp (t as Const ("Groups.plus_class.plus",_) $ t1 $ t2) v = if v="*" orelse v="^" then false 
  3.1556 -							  else (test_exp t1 " ") andalso (test_exp t2 " ") 
  3.1557 -  | test_exp (t as Const ("Groups.minus_class.minus",_) $ t1 $ t2) v = if v="*" orelse v="^" then false 
  3.1558 -							  else (test_exp t1 " ") andalso (test_exp t2 " ")
  3.1559 -  | test_exp (t as Const ("Atools.pow",_) $ t1 $ t2) v = (test_exp t1 "^") andalso (test_exp t2 "^")
  3.1560 -  | test_exp  _ v = false;
  3.1561 -
  3.1562 -
  3.1563 -(*. help function for check_coeff: 
  3.1564 -    converts the term to a list of coefficients .*) 
  3.1565 -fun term2coef' (t as Free(str,_(*typ*))) v :mv_poly option = 
  3.1566 -    let
  3.1567 -	val x= Unsynchronized.ref  NONE;
  3.1568 -	val len= Unsynchronized.ref  0;
  3.1569 -	val vl= Unsynchronized.ref  [];
  3.1570 -	val vh= Unsynchronized.ref  [];
  3.1571 -	val i= Unsynchronized.ref  0;
  3.1572 -    in 
  3.1573 -	if is_numeral str then
  3.1574 -	    (
  3.1575 -	     SOME [(((the o int_of_str) str),mv_null2(v))] handle _ => NONE
  3.1576 -		 )
  3.1577 -	else (* variable *)
  3.1578 -	    (
  3.1579 -	     len:=length(v);
  3.1580 -	     vh:=v;
  3.1581 -	     while ((!len)>(!i)) do
  3.1582 -		 (
  3.1583 -		  if str=hd((!vh)) then
  3.1584 -		      (
  3.1585 -		       vl:=1::(!vl)
  3.1586 -		       )
  3.1587 -		  else 
  3.1588 -		      (
  3.1589 -		       vl:=0::(!vl)
  3.1590 -		       );
  3.1591 -		      vh:=tl(!vh);
  3.1592 -		      i:=(!i)+1    
  3.1593 -		      );		
  3.1594 -		 SOME [(1,rev(!vl))] handle _ => NONE
  3.1595 -	    )
  3.1596 -    end
  3.1597 -  | term2coef' (Const ("Groups.times_class.times",_) $ t1 $ t2) v :mv_poly option= 
  3.1598 -    let
  3.1599 -	val t1pp= Unsynchronized.ref  [];
  3.1600 -	val t2pp= Unsynchronized.ref  [];
  3.1601 -	val t1c= Unsynchronized.ref  0;
  3.1602 -	val t2c= Unsynchronized.ref  0;
  3.1603 -    in
  3.1604 -	(
  3.1605 -	 t1pp:=(#2(hd(the(term2coef' t1 v))));
  3.1606 -	 t2pp:=(#2(hd(the(term2coef' t2 v))));
  3.1607 -	 t1c:=(#1(hd(the(term2coef' t1 v))));
  3.1608 -	 t2c:=(#1(hd(the(term2coef' t2 v))));
  3.1609 -	
  3.1610 -	 SOME [( (!t1c)*(!t2c) ,( (map op+) ((!t1pp)~~(!t2pp)) ) )] handle _ => NONE 
  3.1611 -		
  3.1612 -	 )
  3.1613 -    end
  3.1614 -  | term2coef' (Const ("Atools.pow",_) $ (t1 as Free (str1,_)) $ (t2 as Free (str2,_))) v :mv_poly option= 
  3.1615 -    let
  3.1616 -	val x= Unsynchronized.ref  NONE;
  3.1617 -	val len= Unsynchronized.ref  0;
  3.1618 -	val vl= Unsynchronized.ref  [];
  3.1619 -	val vh= Unsynchronized.ref  [];
  3.1620 -	val vtemp= Unsynchronized.ref  [];
  3.1621 -	val i= Unsynchronized.ref  0;	 
  3.1622 -    in
  3.1623 -    (
  3.1624 -     if (not o is_numeral) str1 andalso is_numeral str2 then
  3.1625 -	 (
  3.1626 -	  len:=length(v);
  3.1627 -	  vh:=v;
  3.1628 -
  3.1629 -	  while ((!len)>(!i)) do
  3.1630 -	      (
  3.1631 -	       if str1=hd((!vh)) then
  3.1632 -		   (
  3.1633 -		    vl:=((the o int_of_str) str2)::(!vl)
  3.1634 -		    )
  3.1635 -	       else 
  3.1636 -		   (
  3.1637 -		    vl:=0::(!vl)
  3.1638 -		    );
  3.1639 -		   vh:=tl(!vh);
  3.1640 -		   i:=(!i)+1     
  3.1641 -		   );
  3.1642 -	      SOME [(1,rev(!vl))] handle _ => NONE
  3.1643 -	      )
  3.1644 -     else error ("RATIONALS_TERM2COEF_EXCEPTION 1: Invalid term")
  3.1645 -	 )
  3.1646 -    end
  3.1647 -  | term2coef' (Const ("Groups.plus_class.plus",_) $ t1 $ t2) v :mv_poly option= 
  3.1648 -    (
  3.1649 -     SOME ((the(term2coef' t1 v)) @ (the(term2coef' t2 v))) handle _ => NONE
  3.1650 -	 )
  3.1651 -  | term2coef' (Const ("Groups.minus_class.minus",_) $ t1 $ t2) v :mv_poly option= 
  3.1652 -    (
  3.1653 -     SOME ((the(term2coef' t1 v)) @ mv_skalar_mul((the(term2coef' t2 v)),1)) handle _ => NONE
  3.1654 -	 )
  3.1655 -  | term2coef' (term) v = error ("RATIONALS_TERM2COEF_EXCEPTION 2: Invalid term");
  3.1656 -
  3.1657 -(*. checks if all coefficients of a polynomial are positiv (except the first) .*)
  3.1658 -fun check_coeff t = (* erste Koeffizient kann <0 sein !!! *)
  3.1659 -    if count_neg(tl(the(term2coef' t (get_vars(t)))))=0 then true 
  3.1660 -    else false;
  3.1661 -
  3.1662 -(*WN.7.3.03 Hilfsfunktion f"ur term2poly'*)
  3.1663 -fun mk_monom v' p vs = 
  3.1664 -    let fun conv p (v: string) = if v'= v then p else 0
  3.1665 -    in map (conv p) vs end;
  3.1666 -(* mk_monom "y" 5 ["a","b","x","y","z"];
  3.1667 -val it = [0,0,0,5,0] : int list*)
  3.1668 -
  3.1669 -(*. this function converts the term representation into the internal representation mv_poly .*)
  3.1670 -fun term2poly' (Const ("uminus",_) $ Free (str,_)) v = (*WN.7.3.03*)
  3.1671 -    if is_numeral str 
  3.1672 -    then SOME [((the o int_of_str) ("-"^str), mk_monom "#" 0 v)]
  3.1673 -    else SOME [(~1, mk_monom str 1 v)]
  3.1674 -
  3.1675 -  | term2poly' (Free(str,_)) v :mv_poly option = 
  3.1676 -    let
  3.1677 -	val x= Unsynchronized.ref  NONE;
  3.1678 -	val len= Unsynchronized.ref  0;
  3.1679 -	val vl= Unsynchronized.ref  [];
  3.1680 -	val vh= Unsynchronized.ref  [];
  3.1681 -	val i= Unsynchronized.ref  0;
  3.1682 -    in 
  3.1683 -	if is_numeral str then
  3.1684 -	    (
  3.1685 -	     SOME [(((the o int_of_str) str),mv_null2 v)] handle _ => NONE
  3.1686 -		 )
  3.1687 -	else (* variable *)
  3.1688 -	    (
  3.1689 -	     len:=length v;
  3.1690 -	     vh:= v;
  3.1691 -	     while ((!len)>(!i)) do
  3.1692 -		 (
  3.1693 -		  if str=hd((!vh)) then
  3.1694 -		      (
  3.1695 -		       vl:=1::(!vl)
  3.1696 -		       )
  3.1697 -		  else 
  3.1698 -		      (
  3.1699 -		       vl:=0::(!vl)
  3.1700 -		       );
  3.1701 -		      vh:=tl(!vh);
  3.1702 -		      i:=(!i)+1    
  3.1703 -		      );		
  3.1704 -		 SOME [(1,rev(!vl))] handle _ => NONE
  3.1705 -	    )
  3.1706 -    end
  3.1707 -  | term2poly' (Const ("Groups.times_class.times",_) $ t1 $ t2) v :mv_poly option= 
  3.1708 -    let
  3.1709 -	val t1pp= Unsynchronized.ref  [];
  3.1710 -	val t2pp= Unsynchronized.ref  [];
  3.1711 -	val t1c= Unsynchronized.ref  0;
  3.1712 -	val t2c= Unsynchronized.ref  0;
  3.1713 -    in
  3.1714 -	(
  3.1715 -	 t1pp:=(#2(hd(the(term2poly' t1 v))));
  3.1716 -	 t2pp:=(#2(hd(the(term2poly' t2 v))));
  3.1717 -	 t1c:=(#1(hd(the(term2poly' t1 v))));
  3.1718 -	 t2c:=(#1(hd(the(term2poly' t2 v))));
  3.1719 -	
  3.1720 -	 SOME [( (!t1c)*(!t2c) ,( (map op+) ((!t1pp)~~(!t2pp)) ) )] 
  3.1721 -	 handle _ => NONE 
  3.1722 -		
  3.1723 -	 )
  3.1724 -    end
  3.1725 -  | term2poly' (Const ("Atools.pow",_) $ (t1 as Free (str1,_)) $ 
  3.1726 -		      (t2 as Free (str2,_))) v :mv_poly option= 
  3.1727 -    let
  3.1728 -	val x= Unsynchronized.ref  NONE;
  3.1729 -	val len= Unsynchronized.ref  0;
  3.1730 -	val vl= Unsynchronized.ref  [];
  3.1731 -	val vh= Unsynchronized.ref  [];
  3.1732 -	val vtemp= Unsynchronized.ref  [];
  3.1733 -	val i= Unsynchronized.ref  0;	 
  3.1734 -    in
  3.1735 -    (
  3.1736 -     if (not o is_numeral) str1 andalso is_numeral str2 then
  3.1737 -	 (
  3.1738 -	  len:=length(v);
  3.1739 -	  vh:=v;
  3.1740 -
  3.1741 -	  while ((!len)>(!i)) do
  3.1742 -	      (
  3.1743 -	       if str1=hd((!vh)) then
  3.1744 -		   (
  3.1745 -		    vl:=((the o int_of_str) str2)::(!vl)
  3.1746 -		    )
  3.1747 -	       else 
  3.1748 -		   (
  3.1749 -		    vl:=0::(!vl)
  3.1750 -		    );
  3.1751 -		   vh:=tl(!vh);
  3.1752 -		   i:=(!i)+1     
  3.1753 -		   );
  3.1754 -	      SOME [(1,rev(!vl))] handle _ => NONE
  3.1755 -	      )
  3.1756 -     else error ("RATIONALS_TERM2POLY_EXCEPTION 1: Invalid term")
  3.1757 -	 )
  3.1758 -    end
  3.1759 -  | term2poly' (Const ("Groups.plus_class.plus",_) $ t1 $ t2) v :mv_poly option = 
  3.1760 -    (
  3.1761 -     SOME ((the(term2poly' t1 v)) @ (the(term2poly' t2 v))) handle _ => NONE
  3.1762 -	 )
  3.1763 -  | term2poly' (Const ("Groups.minus_class.minus",_) $ t1 $ t2) v :mv_poly option = 
  3.1764 -    (
  3.1765 -     SOME ((the(term2poly' t1 v)) @ mv_skalar_mul((the(term2poly' t2 v)),~1)) handle _ => NONE
  3.1766 -	 )
  3.1767 -  | term2poly' (term) v = error ("RATIONALS_TERM2POLY_EXCEPTION 2: Invalid term");
  3.1768 -
  3.1769 -(*. translates an Isabelle term into internal representation.
  3.1770 -    term2poly
  3.1771 -    fn : term ->              (*normalform [2]                    *)
  3.1772 -    	 string list ->       (*for ...!!! BITTE DIE ERKLÄRUNG, 
  3.1773 -    			       DIE DU MIR LETZTES MAL GEGEBEN HAST*)
  3.1774 -    	 mv_monom list        (*internal representation           *)
  3.1775 -    		  option      (*the translation may fail with NONE*)
  3.1776 -.*)
  3.1777 -fun term2poly (t:term) v = 
  3.1778 -     if is_polynomial t then term2poly' t v
  3.1779 -     else error ("term2poly: invalid = "^(term2str t));
  3.1780 -
  3.1781 -(*. same as term2poly with automatic detection of the variables .*)
  3.1782 -fun term2polyx t = term2poly t (((map free2str) o vars) t); 
  3.1783 -
  3.1784 -(*. checks if the term is in expanded polynomial form and converts it into the internal representation .*)
  3.1785 -fun expanded2poly (t:term) v = 
  3.1786 -    (*if is_expanded t then*) term2poly' t v
  3.1787 -    (*else error ("RATIONALS_EXPANDED2POLY_EXCEPTION: Invalid Polynomial")*);
  3.1788 -
  3.1789 -(*. same as expanded2poly with automatic detection of the variables .*)
  3.1790 -fun expanded2polyx t = expanded2poly t (((map free2str) o vars) t);
  3.1791 -
  3.1792 -(*. converts a powerproduct into term representation .*)
  3.1793 -fun powerproduct2term(xs,v) =  
  3.1794 -    let
  3.1795 -	val xss= Unsynchronized.ref  xs;
  3.1796 -	val vv= Unsynchronized.ref  v;
  3.1797 -    in
  3.1798 -	(
  3.1799 -	 while hd(!xss)=0 do 
  3.1800 -	     (
  3.1801 -	      xss:=tl(!xss);
  3.1802 -	      vv:=tl(!vv)
  3.1803 -	      );
  3.1804 -	     
  3.1805 -	 if list_is_null(tl(!xss)) then 
  3.1806 -	     (
  3.1807 -	      if hd(!xss)=1 then Free(hd(!vv), HOLogic.realT)
  3.1808 -	      else
  3.1809 -		  (
  3.1810 -		   Const("Atools.pow",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1811 -		   Free(hd(!vv), HOLogic.realT) $  Free(str_of_int (hd(!xss)),HOLogic.realT)
  3.1812 -		   )
  3.1813 -	      )
  3.1814 -	 else
  3.1815 -	     (
  3.1816 -	      if hd(!xss)=1 then 
  3.1817 -		  ( 
  3.1818 -		   Const("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1819 -		   Free(hd(!vv), HOLogic.realT) $
  3.1820 -		   powerproduct2term(tl(!xss),tl(!vv))
  3.1821 -		   )
  3.1822 -	      else
  3.1823 -		  (
  3.1824 -		   Const("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1825 -		   (
  3.1826 -		    Const("Atools.pow",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1827 -		    Free(hd(!vv), HOLogic.realT) $  Free(str_of_int (hd(!xss)),HOLogic.realT)
  3.1828 -		    ) $
  3.1829 -		    powerproduct2term(tl(!xss),tl(!vv))
  3.1830 -		   )
  3.1831 -	      )
  3.1832 -	 )
  3.1833 -    end;
  3.1834 -
  3.1835 -(*. converts a monom into term representation .*)
  3.1836 -(*fun monom2term ((c,e):mv_monom, v:string list) = 
  3.1837 -    if c=0 then Free(str_of_int 0,HOLogic.realT)  
  3.1838 -    else
  3.1839 -	(
  3.1840 -	 if list_is_null(e) then
  3.1841 -	     ( 
  3.1842 -	      Free(str_of_int c,HOLogic.realT)  
  3.1843 -	      )
  3.1844 -	 else
  3.1845 -	     (
  3.1846 -	      if c=1 then 
  3.1847 -		  (
  3.1848 -		   powerproduct2term(e,v)
  3.1849 -		   )
  3.1850 -	      else
  3.1851 -		  (
  3.1852 -		   Const("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $
  3.1853 -		   Free(str_of_int c,HOLogic.realT)  $
  3.1854 -		   powerproduct2term(e,v)
  3.1855 -		   )
  3.1856 -		  )
  3.1857 -	     );*)
  3.1858 -
  3.1859 -
  3.1860 -(*fun monom2term ((i, is):mv_monom, v) = 
  3.1861 -    if list_is_null is 
  3.1862 -    then 
  3.1863 -	if i >= 0 
  3.1864 -	then Free (str_of_int i, HOLogic.realT)
  3.1865 -	else Const ("uminus", HOLogic.realT --> HOLogic.realT) $
  3.1866 -		   Free ((str_of_int o abs) i, HOLogic.realT)
  3.1867 -    else
  3.1868 -	if i > 0 
  3.1869 -	then Const ("Groups.times_class.times", [HOLogic.realT,HOLogic.realT]---> HOLogic.realT) $
  3.1870 -		   (Free (str_of_int i, HOLogic.realT)) $
  3.1871 -		   powerproduct2term(is, v)
  3.1872 -	else Const ("Groups.times_class.times", [HOLogic.realT,HOLogic.realT]---> HOLogic.realT) $
  3.1873 -		   (Const ("uminus", HOLogic.realT --> HOLogic.realT) $
  3.1874 -		   Free ((str_of_int o abs) i, HOLogic.realT)) $
  3.1875 -		   powerproduct2term(is, vs);---------------------------*)
  3.1876 -fun monom2term ((i, is) : mv_monom, vs) = 
  3.1877 -    if list_is_null is 
  3.1878 -    then Free (str_of_int i, HOLogic.realT)
  3.1879 -    else if i = 1
  3.1880 -    then powerproduct2term (is, vs)
  3.1881 -    else Const ("Groups.times_class.times", [HOLogic.realT, HOLogic.realT] ---> HOLogic.realT) $
  3.1882 -	       (Free (str_of_int i, HOLogic.realT)) $
  3.1883 -	       powerproduct2term (is, vs);
  3.1884 -    
  3.1885 -(*. converts the internal polynomial representation into an Isabelle term.*)
  3.1886 -fun poly2term' ([] : mv_poly, vs) = Free(str_of_int 0, HOLogic.realT)  
  3.1887 -  | poly2term' ([(c, e) : mv_monom], vs) = monom2term ((c, e), vs)
  3.1888 -  | poly2term' ((c, e) :: ces, vs) =  
  3.1889 -    Const("Groups.plus_class.plus", [HOLogic.realT, HOLogic.realT] ---> HOLogic.realT) $
  3.1890 -         poly2term (ces, vs) $ monom2term ((c, e), vs)
  3.1891 -and poly2term (xs, vs) = poly2term' (rev (sort (mv_geq LEX_) (xs)), vs);
  3.1892 -
  3.1893 -
  3.1894 -(*. converts a monom into term representation .*)
  3.1895 -(*. ignores the sign of the coefficients => use only for exp-poly functions .*)
  3.1896 -fun monom2term2((c,e):mv_monom, v:string list) =  
  3.1897 -    if c=0 then Free(str_of_int 0,HOLogic.realT)  
  3.1898 -    else
  3.1899 -	(
  3.1900 -	 if list_is_null(e) then
  3.1901 -	     ( 
  3.1902 -	      Free(str_of_int (abs(c)),HOLogic.realT)  
  3.1903 -	      )
  3.1904 -	 else
  3.1905 -	     (
  3.1906 -	      if abs(c)=1 then 
  3.1907 -		  (
  3.1908 -		   powerproduct2term(e,v)
  3.1909 -		   )
  3.1910 -	      else
  3.1911 -		  (
  3.1912 -		   Const("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $
  3.1913 -		   Free(str_of_int (abs(c)),HOLogic.realT)  $
  3.1914 -		   powerproduct2term(e,v)
  3.1915 -		   )
  3.1916 -		  )
  3.1917 -	     );
  3.1918 -
  3.1919 -(*. converts the expanded polynomial representation into the term representation .*)
  3.1920 -fun exp2term' ([]:mv_poly,vars) =  Free(str_of_int 0,HOLogic.realT)  
  3.1921 -  | exp2term' ([(c,e)],vars) =     monom2term((c,e),vars) 			     
  3.1922 -  | exp2term' ((c1,e1)::others,vars) =  
  3.1923 -    if c1<0 then 	
  3.1924 -	Const("Groups.minus_class.minus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $
  3.1925 -	exp2term'(others,vars) $
  3.1926 -	( 
  3.1927 -	 monom2term2((c1,e1),vars)
  3.1928 -	 ) 
  3.1929 -    else
  3.1930 -	Const("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $
  3.1931 -	exp2term'(others,vars) $
  3.1932 -	( 
  3.1933 -	 monom2term2((c1,e1),vars)
  3.1934 -	 );
  3.1935 -	
  3.1936 -(*. sorts the powerproduct by lexicographic termorder and converts them into 
  3.1937 -    a term in polynomial representation .*)
  3.1938 -fun poly2expanded (xs,vars) = exp2term'(rev(sort (mv_geq LEX_) (xs)),vars);
  3.1939 -
  3.1940 -(*. converts a polynomial into expanded form .*)
  3.1941 -fun polynomial2expanded t =  
  3.1942 -    (let 
  3.1943 -	val vars=(((map free2str) o vars) t);
  3.1944 -    in
  3.1945 -	SOME (poly2expanded (the (term2poly t vars), vars))
  3.1946 -    end) handle _ => NONE;
  3.1947 -
  3.1948 -(*. converts a polynomial into polynomial form .*)
  3.1949 -fun expanded2polynomial t =  
  3.1950 -    (let 
  3.1951 -	val vars=(((map free2str) o vars) t);
  3.1952 -    in
  3.1953 -	SOME (poly2term (the (expanded2poly t vars), vars))
  3.1954 -    end) handle _ => NONE;
  3.1955 -
  3.1956 -
  3.1957 -(*. calculates the greatest common divisor of numerator and denominator and seperates it from each .*)
  3.1958 -fun step_cancel (t as Const ("Fields.inverse_class.divide",_) $ p1 $ p2) = 
  3.1959 -    let
  3.1960 -	val p1' = Unsynchronized.ref [];
  3.1961 -	val p2' = Unsynchronized.ref [];
  3.1962 -	val p3  = Unsynchronized.ref []
  3.1963 -	val vars = rev(get_vars(p1) union get_vars(p2));
  3.1964 -    in
  3.1965 -	(
  3.1966 -         p1':= sort (mv_geq LEX_) (the (term2poly p1 vars ));
  3.1967 -       	 p2':= sort (mv_geq LEX_) (the (term2poly p2 vars ));
  3.1968 -	 p3:= sort (mv_geq LEX_) (mv_gcd (!p1') (!p2'));
  3.1969 -	 if (!p3)=[(1,mv_null2(vars))] then 
  3.1970 -	     (
  3.1971 -	      Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ p1 $ p2
  3.1972 -	      )
  3.1973 -	 else
  3.1974 -	     (
  3.1975 -
  3.1976 -	      p1':=sort (mv_geq LEX_) (#1(mv_division((!p1'),(!p3),LEX_)));
  3.1977 -	      p2':=sort (mv_geq LEX_) (#1(mv_division((!p2'),(!p3),LEX_)));
  3.1978 -	      
  3.1979 -	      if #1(hd(sort (mv_geq LEX_) (!p2'))) (*mv_lc2(!p2',LEX_)*)>0 then
  3.1980 -	      (
  3.1981 -	       Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.1982 -	       $ 
  3.1983 -	       (
  3.1984 -		Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1985 -		poly2term(!p1',vars) $ 
  3.1986 -		poly2term(!p3,vars) 
  3.1987 -		) 
  3.1988 -	       $ 
  3.1989 -	       (
  3.1990 -		Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.1991 -		poly2term(!p2',vars) $ 
  3.1992 -		poly2term(!p3,vars)
  3.1993 -		) 	
  3.1994 -	       )	
  3.1995 -	      else
  3.1996 -	      (
  3.1997 -	       p1':=mv_skalar_mul(!p1',~1);
  3.1998 -	       p2':=mv_skalar_mul(!p2',~1);
  3.1999 -	       p3:=mv_skalar_mul(!p3,~1);
  3.2000 -	       (
  3.2001 -		Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2002 -		$ 
  3.2003 -		(
  3.2004 -		 Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2005 -		 poly2term(!p1',vars) $ 
  3.2006 -		 poly2term(!p3,vars) 
  3.2007 -		 ) 
  3.2008 -		$ 
  3.2009 -		(
  3.2010 -		 Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2011 -		 poly2term(!p2',vars) $ 
  3.2012 -		 poly2term(!p3,vars)
  3.2013 -		 ) 	
  3.2014 -		)	
  3.2015 -	       )	  
  3.2016 -	      )
  3.2017 -	     )
  3.2018 -    end
  3.2019 -| step_cancel _ = error ("RATIONALS_STEP_CANCEL_EXCEPTION: Invalid fraction"); 
  3.2020 -
  3.2021 -(*. calculates the greatest common divisor of numerator and denominator and divides each through it .*)
  3.2022 -fun direct_cancel (t as Const ("Fields.inverse_class.divide",_) $ p1 $ p2) = 
  3.2023 -    let
  3.2024 -	val p1' = Unsynchronized.ref [];
  3.2025 -	val p2' = Unsynchronized.ref [];
  3.2026 -	val p3  = Unsynchronized.ref []
  3.2027 -	val vars = rev(get_vars(p1) union get_vars(p2));
  3.2028 -    in
  3.2029 -	(
  3.2030 -	 p1':=sort (mv_geq LEX_) (mv_shorten((the (term2poly p1 vars )),LEX_));
  3.2031 -	 p2':=sort (mv_geq LEX_) (mv_shorten((the (term2poly p2 vars )),LEX_));	 
  3.2032 -	 p3 :=sort (mv_geq LEX_) (mv_gcd (!p1') (!p2'));
  3.2033 -
  3.2034 -	 if (!p3)=[(1,mv_null2(vars))] then 
  3.2035 -	     (
  3.2036 -	      (Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ p1 $ p2,[])
  3.2037 -	      )
  3.2038 -	 else
  3.2039 -	     (
  3.2040 -	      p1':=sort (mv_geq LEX_) (#1(mv_division((!p1'),(!p3),LEX_)));
  3.2041 -	      p2':=sort (mv_geq LEX_) (#1(mv_division((!p2'),(!p3),LEX_)));
  3.2042 -	      if #1(hd(sort (mv_geq LEX_) (!p2'))) (*mv_lc2(!p2',LEX_)*)>0 then	      
  3.2043 -	      (
  3.2044 -	       (
  3.2045 -		Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2046 -		$ 
  3.2047 -		(
  3.2048 -		 poly2term((!p1'),vars)
  3.2049 -		 ) 
  3.2050 -		$ 
  3.2051 -		( 
  3.2052 -		 poly2term((!p2'),vars)
  3.2053 -		 ) 	
  3.2054 -		)
  3.2055 -	       ,
  3.2056 -	       if mv_grad(!p3)>0 then 
  3.2057 -		   [
  3.2058 -		    (
  3.2059 -		     Const ("HOL.Not",[bool]--->bool) $
  3.2060 -		     (
  3.2061 -		      Const("HOL.eq",[HOLogic.realT,HOLogic.realT]--->bool) $
  3.2062 -		      poly2term((!p3),vars) $
  3.2063 -		      Free("0",HOLogic.realT)
  3.2064 -		      )
  3.2065 -		     )
  3.2066 -		    ]
  3.2067 -	       else
  3.2068 -		   []
  3.2069 -		   )
  3.2070 -	      else
  3.2071 -		  (
  3.2072 -		   p1':=mv_skalar_mul(!p1',~1);
  3.2073 -		   p2':=mv_skalar_mul(!p2',~1);
  3.2074 -		   if length(!p3)> 2*(count_neg(!p3)) then () else p3 :=mv_skalar_mul(!p3,~1); 
  3.2075 -		       (
  3.2076 -			Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2077 -			$ 
  3.2078 -			(
  3.2079 -			 poly2term((!p1'),vars)
  3.2080 -			 ) 
  3.2081 -			$ 
  3.2082 -			( 
  3.2083 -			 poly2term((!p2'),vars)
  3.2084 -			 ) 	
  3.2085 -			,
  3.2086 -			if mv_grad(!p3)>0 then 
  3.2087 -			    [
  3.2088 -			     (
  3.2089 -			      Const ("HOL.Not",[bool]--->bool) $
  3.2090 -			      (
  3.2091 -			       Const("HOL.eq",[HOLogic.realT,HOLogic.realT]--->bool) $
  3.2092 -			       poly2term((!p3),vars) $
  3.2093 -			       Free("0",HOLogic.realT)
  3.2094 -			       )
  3.2095 -			      )
  3.2096 -			     ]
  3.2097 -			else
  3.2098 -			    []
  3.2099 -			    )
  3.2100 -		       )
  3.2101 -		  )
  3.2102 -	     )
  3.2103 -    end
  3.2104 -  | direct_cancel _ = error ("RATIONALS_DIRECT_CANCEL_EXCEPTION: Invalid fraction"); 
  3.2105 -
  3.2106 -(*. same es direct_cancel, this time for expanded forms (input+output).*) 
  3.2107 -fun direct_cancel_expanded (t as Const ("Fields.inverse_class.divide",_) $ p1 $ p2) =  
  3.2108 -    let
  3.2109 -	val p1' = Unsynchronized.ref [];
  3.2110 -	val p2' = Unsynchronized.ref [];
  3.2111 -	val p3  = Unsynchronized.ref []
  3.2112 -	val vars = rev(get_vars(p1) union get_vars(p2));
  3.2113 -    in
  3.2114 -	(
  3.2115 -	 p1':=sort (mv_geq LEX_) (mv_shorten((the (expanded2poly p1 vars )),LEX_));
  3.2116 -	 p2':=sort (mv_geq LEX_) (mv_shorten((the (expanded2poly p2 vars )),LEX_));	 
  3.2117 -	 p3 :=sort (mv_geq LEX_) (mv_gcd (!p1') (!p2'));
  3.2118 -
  3.2119 -	 if (!p3)=[(1,mv_null2(vars))] then 
  3.2120 -	     (
  3.2121 -	      (Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ p1 $ p2,[])
  3.2122 -	      )
  3.2123 -	 else
  3.2124 -	     (
  3.2125 -	      p1':=sort (mv_geq LEX_) (#1(mv_division((!p1'),(!p3),LEX_)));
  3.2126 -	      p2':=sort (mv_geq LEX_) (#1(mv_division((!p2'),(!p3),LEX_)));
  3.2127 -	      if #1(hd(sort (mv_geq LEX_) (!p2'))) (*mv_lc2(!p2',LEX_)*)>0 then	      
  3.2128 -	      (
  3.2129 -	       (
  3.2130 -		Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2131 -		$ 
  3.2132 -		(
  3.2133 -		 poly2expanded((!p1'),vars)
  3.2134 -		 ) 
  3.2135 -		$ 
  3.2136 -		( 
  3.2137 -		 poly2expanded((!p2'),vars)
  3.2138 -		 ) 	
  3.2139 -		)
  3.2140 -	       ,
  3.2141 -	       if mv_grad(!p3)>0 then 
  3.2142 -		   [
  3.2143 -		    (
  3.2144 -		     Const ("HOL.Not",[bool]--->bool) $
  3.2145 -		     (
  3.2146 -		      Const("HOL.eq",[HOLogic.realT,HOLogic.realT]--->bool) $
  3.2147 -		      poly2expanded((!p3),vars) $
  3.2148 -		      Free("0",HOLogic.realT)
  3.2149 -		      )
  3.2150 -		     )
  3.2151 -		    ]
  3.2152 -	       else
  3.2153 -		   []
  3.2154 -		   )
  3.2155 -	      else
  3.2156 -		  (
  3.2157 -		   p1':=mv_skalar_mul(!p1',~1);
  3.2158 -		   p2':=mv_skalar_mul(!p2',~1);
  3.2159 -		   if length(!p3)> 2*(count_neg(!p3)) then () else p3 :=mv_skalar_mul(!p3,~1); 
  3.2160 -		       (
  3.2161 -			Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2162 -			$ 
  3.2163 -			(
  3.2164 -			 poly2expanded((!p1'),vars)
  3.2165 -			 ) 
  3.2166 -			$ 
  3.2167 -			( 
  3.2168 -			 poly2expanded((!p2'),vars)
  3.2169 -			 ) 	
  3.2170 -			,
  3.2171 -			if mv_grad(!p3)>0 then 
  3.2172 -			    [
  3.2173 -			     (
  3.2174 -			      Const ("HOL.Not",[bool]--->bool) $
  3.2175 -			      (
  3.2176 -			       Const("HOL.eq",[HOLogic.realT,HOLogic.realT]--->bool) $
  3.2177 -			       poly2expanded((!p3),vars) $
  3.2178 -			       Free("0",HOLogic.realT)
  3.2179 -			       )
  3.2180 -			      )
  3.2181 -			     ]
  3.2182 -			else
  3.2183 -			    []
  3.2184 -			    )
  3.2185 -		       )
  3.2186 -		  )
  3.2187 -	     )
  3.2188 -    end
  3.2189 -  | direct_cancel_expanded _ = error ("RATIONALS_DIRECT_CANCEL_EXCEPTION: Invalid fraction"); 
  3.2190 -
  3.2191 -
  3.2192 -(*. adds two fractions .*)
  3.2193 -fun add_fract ((Const("Fields.inverse_class.divide",_) $ t11 $ t12),(Const("Fields.inverse_class.divide",_) $ t21 $ t22)) =
  3.2194 -    let
  3.2195 -	val vars=get_vars(t11) union get_vars(t12) union get_vars(t21) union get_vars(t22);
  3.2196 -	val t11'= Unsynchronized.ref  (the(term2poly t11 vars));
  3.2197 -(* stopped Test_Isac.thy ...
  3.2198 -val _= tracing"### add_fract: done t11"
  3.2199 -*)
  3.2200 -	val t12'= Unsynchronized.ref  (the(term2poly t12 vars));
  3.2201 -(* stopped Test_Isac.thy ...
  3.2202 -val _= tracing"### add_fract: done t12"
  3.2203 -*)
  3.2204 -	val t21'= Unsynchronized.ref  (the(term2poly t21 vars));
  3.2205 -(* stopped Test_Isac.thy ...
  3.2206 -val _= tracing"### add_fract: done t21"
  3.2207 -*)
  3.2208 -	val t22'= Unsynchronized.ref  (the(term2poly t22 vars));
  3.2209 -(* stopped Test_Isac.thy ...
  3.2210 -val _= tracing"### add_fract: done t22"
  3.2211 -*)
  3.2212 -	val den= Unsynchronized.ref  [];
  3.2213 -	val nom= Unsynchronized.ref  [];
  3.2214 -	val m1= Unsynchronized.ref  [];
  3.2215 -	val m2= Unsynchronized.ref  [];
  3.2216 -    in
  3.2217 -	
  3.2218 -	(
  3.2219 -	 den :=sort (mv_geq LEX_) (mv_lcm (!t12') (!t22'));
  3.2220 -tracing"### add_fract: done sort mv_lcm";
  3.2221 -	 m1  :=sort (mv_geq LEX_) (#1(mv_division(!den,!t12',LEX_)));
  3.2222 -tracing"### add_fract: done sort mv_division t12";
  3.2223 -	 m2  :=sort (mv_geq LEX_) (#1(mv_division(!den,!t22',LEX_)));
  3.2224 -tracing"### add_fract: done sort mv_division t22";
  3.2225 -	 nom :=sort (mv_geq LEX_) 
  3.2226 -		    (mv_shorten(mv_add(mv_mul(!t11',!m1,LEX_),
  3.2227 -				       mv_mul(!t21',!m2,LEX_),
  3.2228 -				       LEX_),
  3.2229 -				LEX_));
  3.2230 -tracing"### add_fract: done sort mv_add";
  3.2231 -	 (
  3.2232 -	  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2233 -	  $ 
  3.2234 -	  (
  3.2235 -	   poly2term((!nom),vars)
  3.2236 -	   ) 
  3.2237 -	  $ 
  3.2238 -	  ( 
  3.2239 -	   poly2term((!den),vars)
  3.2240 -	   )	      
  3.2241 -	  )
  3.2242 -	 )	     
  3.2243 -    end 
  3.2244 -  | add_fract (_,_) = error ("RATIONALS_ADD_FRACTION_EXCEPTION: Invalid add_fraction call");
  3.2245 -
  3.2246 -(*. adds two expanded fractions .*)
  3.2247 -fun add_fract_exp ((Const("Fields.inverse_class.divide",_) $ t11 $ t12),(Const("Fields.inverse_class.divide",_) $ t21 $ t22)) =
  3.2248 -    let
  3.2249 -	val vars=get_vars(t11) union get_vars(t12) union get_vars(t21) union get_vars(t22);
  3.2250 -	val t11'= Unsynchronized.ref  (the(expanded2poly t11 vars));
  3.2251 -	val t12'= Unsynchronized.ref  (the(expanded2poly t12 vars));
  3.2252 -	val t21'= Unsynchronized.ref  (the(expanded2poly t21 vars));
  3.2253 -	val t22'= Unsynchronized.ref  (the(expanded2poly t22 vars));
  3.2254 -	val den= Unsynchronized.ref  [];
  3.2255 -	val nom= Unsynchronized.ref  [];
  3.2256 -	val m1= Unsynchronized.ref  [];
  3.2257 -	val m2= Unsynchronized.ref  [];
  3.2258 -    in
  3.2259 -	
  3.2260 -	(
  3.2261 -	 den :=sort (mv_geq LEX_) (mv_lcm (!t12') (!t22'));
  3.2262 -	 m1  :=sort (mv_geq LEX_) (#1(mv_division(!den,!t12',LEX_)));
  3.2263 -	 m2  :=sort (mv_geq LEX_) (#1(mv_division(!den,!t22',LEX_)));
  3.2264 -	 nom :=sort (mv_geq LEX_) (mv_shorten(mv_add(mv_mul(!t11',!m1,LEX_),mv_mul(!t21',!m2,LEX_),LEX_),LEX_));
  3.2265 -	 (
  3.2266 -	  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2267 -	  $ 
  3.2268 -	  (
  3.2269 -	   poly2expanded((!nom),vars)
  3.2270 -	   ) 
  3.2271 -	  $ 
  3.2272 -	  ( 
  3.2273 -	   poly2expanded((!den),vars)
  3.2274 -	   )	      
  3.2275 -	  )
  3.2276 -	 )	     
  3.2277 -    end 
  3.2278 -  | add_fract_exp (_,_) = error ("RATIONALS_ADD_FRACTION_EXP_EXCEPTION: Invalid add_fraction call");
  3.2279 -
  3.2280 -(*. adds a list of terms .*)
  3.2281 -fun add_list_of_fractions []= (Free("0",HOLogic.realT),[])
  3.2282 -  | add_list_of_fractions [x]= direct_cancel x
  3.2283 -  | add_list_of_fractions (x::y::xs) = 
  3.2284 -    let
  3.2285 -	val (t1a,rest1)=direct_cancel(x);
  3.2286 -val _= tracing"### add_list_of_fractions xs: has done direct_cancel(x)";
  3.2287 -	val (t2a,rest2)=direct_cancel(y);
  3.2288 -val _= tracing"### add_list_of_fractions xs: has done direct_cancel(y)";
  3.2289 -	val (t3a,rest3)=(add_list_of_fractions (add_fract(t1a,t2a)::xs));
  3.2290 -val _= tracing"### add_list_of_fractions xs: has done add_list_of_fraction xs";
  3.2291 -	val (t4a,rest4)=direct_cancel(t3a);
  3.2292 -val _= tracing"### add_list_of_fractions xs: has done direct_cancel(t3a)";
  3.2293 -	val rest=rest1 union rest2 union rest3 union rest4;
  3.2294 -    in
  3.2295 -	(tracing"### add_list_of_fractions in";
  3.2296 -	 (
  3.2297 -	 (t4a,rest) 
  3.2298 -	 )
  3.2299 -	 )
  3.2300 -    end;
  3.2301 -
  3.2302 -(*. adds a list of expanded terms .*)
  3.2303 -fun add_list_of_fractions_exp []= (Free("0",HOLogic.realT),[])
  3.2304 -  | add_list_of_fractions_exp [x]= direct_cancel_expanded x
  3.2305 -  | add_list_of_fractions_exp (x::y::xs) = 
  3.2306 -    let
  3.2307 -	val (t1a,rest1)=direct_cancel_expanded(x);
  3.2308 -	val (t2a,rest2)=direct_cancel_expanded(y);
  3.2309 -	val (t3a,rest3)=(add_list_of_fractions_exp (add_fract_exp(t1a,t2a)::xs));
  3.2310 -	val (t4a,rest4)=direct_cancel_expanded(t3a);
  3.2311 -	val rest=rest1 union rest2 union rest3 union rest4;
  3.2312 -    in
  3.2313 -	(
  3.2314 -	 (t4a,rest) 
  3.2315 -	 )
  3.2316 -    end;
  3.2317 -
  3.2318 -(*. calculates the lcm of a list of mv_poly .*)
  3.2319 -fun calc_lcm ([x],var)= (x,var) 
  3.2320 -  | calc_lcm ((x::xs),var) = (mv_lcm x (#1(calc_lcm (xs,var))),var);
  3.2321 -
  3.2322 -(*. converts a list of terms to a list of mv_poly .*)
  3.2323 -fun t2d([],_)=[] 
  3.2324 -  | t2d((t as (Const("Fields.inverse_class.divide",_) $ p1 $ p2))::xs,vars)= (the(term2poly p2 vars)) :: t2d(xs,vars); 
  3.2325 -
  3.2326 -(*. same as t2d, this time for expanded forms .*)
  3.2327 -fun t2d_exp([],_)=[]  
  3.2328 -  | t2d_exp((t as (Const("Fields.inverse_class.divide",_) $ p1 $ p2))::xs,vars)= (the(expanded2poly p2 vars)) :: t2d_exp(xs,vars);
  3.2329 -
  3.2330 -(*. converts a list of fract terms to a list of their denominators .*)
  3.2331 -fun termlist2denominators [] = ([],[])
  3.2332 -  | termlist2denominators xs = 
  3.2333 -    let	
  3.2334 -	val xxs= Unsynchronized.ref  xs;
  3.2335 -	val var= Unsynchronized.ref  [];
  3.2336 -    in
  3.2337 -	var:=[];
  3.2338 -	while length(!xxs)>0 do
  3.2339 -	    (
  3.2340 -	     let 
  3.2341 -		 val (t as Const ("Fields.inverse_class.divide",_) $ p1x $ p2x)=hd(!xxs);
  3.2342 -	     in
  3.2343 -		 (
  3.2344 -		  xxs:=tl(!xxs);
  3.2345 -		  var:=((get_vars(p2x)) union (get_vars(p1x)) union (!var))
  3.2346 -		  )
  3.2347 -	     end
  3.2348 -	     );
  3.2349 -	    (t2d(xs,!var),!var)
  3.2350 -    end;
  3.2351 -
  3.2352 -(*. calculates the lcm of a list of mv_poly .*)
  3.2353 -fun calc_lcm ([x],var)= (x,var) 
  3.2354 -  | calc_lcm ((x::xs),var) = (mv_lcm x (#1(calc_lcm (xs,var))),var);
  3.2355 -
  3.2356 -(*. converts a list of terms to a list of mv_poly .*)
  3.2357 -fun t2d([],_)=[] 
  3.2358 -  | t2d((t as (Const("Fields.inverse_class.divide",_) $ p1 $ p2))::xs,vars)= (the(term2poly p2 vars)) :: t2d(xs,vars); 
  3.2359 -
  3.2360 -(*. same as t2d, this time for expanded forms .*)
  3.2361 -fun t2d_exp([],_)=[]  
  3.2362 -  | t2d_exp((t as (Const("Fields.inverse_class.divide",_) $ p1 $ p2))::xs,vars)= (the(expanded2poly p2 vars)) :: t2d_exp(xs,vars);
  3.2363 -
  3.2364 -(*. converts a list of fract terms to a list of their denominators .*)
  3.2365 -fun termlist2denominators [] = ([],[])
  3.2366 -  | termlist2denominators xs = 
  3.2367 -    let	
  3.2368 -	val xxs= Unsynchronized.ref  xs;
  3.2369 -	val var= Unsynchronized.ref  [];
  3.2370 -    in
  3.2371 -	var:=[];
  3.2372 -	while length(!xxs)>0 do
  3.2373 -	    (
  3.2374 -	     let 
  3.2375 -		 val (t as Const ("Fields.inverse_class.divide",_) $ p1x $ p2x)=hd(!xxs);
  3.2376 -	     in
  3.2377 -		 (
  3.2378 -		  xxs:=tl(!xxs);
  3.2379 -		  var:=((get_vars(p2x)) union (get_vars(p1x)) union (!var))
  3.2380 -		  )
  3.2381 -	     end
  3.2382 -	     );
  3.2383 -	    (t2d(xs,!var),!var)
  3.2384 -    end;
  3.2385 -
  3.2386 -(*. same as termlist2denminators, this time for expanded forms .*)
  3.2387 -fun termlist2denominators_exp [] = ([],[])
  3.2388 -  | termlist2denominators_exp xs = 
  3.2389 -    let	
  3.2390 -	val xxs= Unsynchronized.ref  xs;
  3.2391 -	val var= Unsynchronized.ref  [];
  3.2392 -    in
  3.2393 -	var:=[];
  3.2394 -	while length(!xxs)>0 do
  3.2395 -	    (
  3.2396 -	     let 
  3.2397 -		 val (t as Const ("Fields.inverse_class.divide",_) $ p1x $ p2x)=hd(!xxs);
  3.2398 -	     in
  3.2399 -		 (
  3.2400 -		  xxs:=tl(!xxs);
  3.2401 -		  var:=((get_vars(p2x)) union (get_vars(p1x)) union (!var))
  3.2402 -		  )
  3.2403 -	     end
  3.2404 -	     );
  3.2405 -	    (t2d_exp(xs,!var),!var)
  3.2406 -    end;
  3.2407 -
  3.2408 -(*. reduces all fractions to the least common denominator .*)
  3.2409 -fun com_den(x::xs,denom,den,var)=
  3.2410 -    let 
  3.2411 -	val (t as Const ("Fields.inverse_class.divide",_) $ p1' $ p2')=x;
  3.2412 -	val p2= sort (mv_geq LEX_) (the(term2poly p2' var));
  3.2413 -	val p3= #1(mv_division(denom,p2,LEX_));
  3.2414 -	val p1var=get_vars(p1');
  3.2415 -    in     
  3.2416 -	if length(xs)>0 then 
  3.2417 -	    if p3=[(1,mv_null2(var))] then
  3.2418 -		(
  3.2419 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT)
  3.2420 -		 $ 
  3.2421 -		 (
  3.2422 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2423 -		  $ 
  3.2424 -		  poly2term(the (term2poly p1' p1var),p1var)
  3.2425 -		  $ 
  3.2426 -		  den	
  3.2427 -		  )    
  3.2428 -		 $ 
  3.2429 -		 #1(com_den(xs,denom,den,var))
  3.2430 -		,
  3.2431 -		[]
  3.2432 -		)
  3.2433 -	    else
  3.2434 -		(
  3.2435 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2436 -		 $ 
  3.2437 -		 (
  3.2438 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2439 -		  $ 
  3.2440 -		  (
  3.2441 -		   Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2442 -		   poly2term(the (term2poly p1' p1var),p1var) $ 
  3.2443 -		   poly2term(p3,var)
  3.2444 -		   ) 
  3.2445 -		  $ 
  3.2446 -		  (
  3.2447 -		   den
  3.2448 -		   ) 	
  3.2449 -		  )
  3.2450 -		 $ 
  3.2451 -		 #1(com_den(xs,denom,den,var))
  3.2452 -		,
  3.2453 -		[]
  3.2454 -		)
  3.2455 -	else
  3.2456 -	    if p3=[(1,mv_null2(var))] then
  3.2457 -		(
  3.2458 -		 (
  3.2459 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2460 -		  $ 
  3.2461 -		  poly2term(the (term2poly p1' p1var),p1var)
  3.2462 -		  $ 
  3.2463 -		  den	
  3.2464 -		  )
  3.2465 -		 ,
  3.2466 -		 []
  3.2467 -		 )
  3.2468 -	     else
  3.2469 -		 (
  3.2470 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2471 -		  $ 
  3.2472 -		  (
  3.2473 -		   Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2474 -		   poly2term(the (term2poly p1' p1var),p1var) $ 
  3.2475 -		   poly2term(p3,var)
  3.2476 -		   ) 
  3.2477 -		  $ 
  3.2478 -		  den 	
  3.2479 -		  ,
  3.2480 -		  []
  3.2481 -		  )
  3.2482 -    end;
  3.2483 -
  3.2484 -(*. same as com_den, this time for expanded forms .*)
  3.2485 -fun com_den_exp(x::xs,denom,den,var)=
  3.2486 -    let 
  3.2487 -	val (t as Const ("Fields.inverse_class.divide",_) $ p1' $ p2')=x;
  3.2488 -	val p2= sort (mv_geq LEX_) (the(expanded2poly p2' var));
  3.2489 -	val p3= #1(mv_division(denom,p2,LEX_));
  3.2490 -	val p1var=get_vars(p1');
  3.2491 -    in     
  3.2492 -	if length(xs)>0 then 
  3.2493 -	    if p3=[(1,mv_null2(var))] then
  3.2494 -		(
  3.2495 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT)
  3.2496 -		 $ 
  3.2497 -		 (
  3.2498 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2499 -		  $ 
  3.2500 -		  poly2expanded(the(expanded2poly p1' p1var),p1var)
  3.2501 -		  $ 
  3.2502 -		  den	
  3.2503 -		  )    
  3.2504 -		 $ 
  3.2505 -		 #1(com_den_exp(xs,denom,den,var))
  3.2506 -		,
  3.2507 -		[]
  3.2508 -		)
  3.2509 -	    else
  3.2510 -		(
  3.2511 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2512 -		 $ 
  3.2513 -		 (
  3.2514 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2515 -		  $ 
  3.2516 -		  (
  3.2517 -		   Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2518 -		   poly2expanded(the(expanded2poly p1' p1var),p1var) $ 
  3.2519 -		   poly2expanded(p3,var)
  3.2520 -		   ) 
  3.2521 -		  $ 
  3.2522 -		  (
  3.2523 -		   den
  3.2524 -		   ) 	
  3.2525 -		  )
  3.2526 -		 $ 
  3.2527 -		 #1(com_den_exp(xs,denom,den,var))
  3.2528 -		,
  3.2529 -		[]
  3.2530 -		)
  3.2531 -	else
  3.2532 -	    if p3=[(1,mv_null2(var))] then
  3.2533 -		(
  3.2534 -		 (
  3.2535 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2536 -		  $ 
  3.2537 -		  poly2expanded(the(expanded2poly p1' p1var),p1var)
  3.2538 -		  $ 
  3.2539 -		  den	
  3.2540 -		  )
  3.2541 -		 ,
  3.2542 -		 []
  3.2543 -		 )
  3.2544 -	     else
  3.2545 -		 (
  3.2546 -		  Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) 
  3.2547 -		  $ 
  3.2548 -		  (
  3.2549 -		   Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2550 -		   poly2expanded(the(expanded2poly p1' p1var),p1var) $ 
  3.2551 -		   poly2expanded(p3,var)
  3.2552 -		   ) 
  3.2553 -		  $ 
  3.2554 -		  den 	
  3.2555 -		  ,
  3.2556 -		  []
  3.2557 -		  )
  3.2558 -    end;
  3.2559 -
  3.2560 -(* wird aktuell nicht mehr gebraucht, bei rückänderung schon 
  3.2561 --------------------------------------------------------------
  3.2562 -(* WN0210???SK brauch ma des überhaupt *)
  3.2563 -fun com_den2(x::xs,denom,den,var)=
  3.2564 -    let 
  3.2565 -	val (t as Const ("Fields.inverse_class.divide",_) $ p1' $ p2')=x;
  3.2566 -	val p2= sort (mv_geq LEX_) (the(term2poly p2' var));
  3.2567 -	val p3= #1(mv_division(denom,p2,LEX_));
  3.2568 -	val p1var=get_vars(p1');
  3.2569 -    in     
  3.2570 -	if length(xs)>0 then 
  3.2571 -	    if p3=[(1,mv_null2(var))] then
  3.2572 -		(
  3.2573 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2574 -		 poly2term(the(term2poly p1' p1var),p1var) $ 
  3.2575 -		 com_den2(xs,denom,den,var)
  3.2576 -		)
  3.2577 -	    else
  3.2578 -		(
  3.2579 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2580 -		 (
  3.2581 -		   let 
  3.2582 -		       val p3'=poly2term(p3,var);
  3.2583 -		       val vars= (((map free2str) o vars) p1') union (((map free2str) o vars) p3');
  3.2584 -		   in
  3.2585 -		       poly2term(sort (mv_geq LEX_) (mv_mul(the(term2poly p1' vars) ,the(term2poly p3' vars),LEX_)),vars)
  3.2586 -		   end
  3.2587 -		  ) $ 
  3.2588 -		 com_den2(xs,denom,den,var)
  3.2589 -		)
  3.2590 -	else
  3.2591 -	    if p3=[(1,mv_null2(var))] then
  3.2592 -		(
  3.2593 -		 poly2term(the(term2poly p1' p1var),p1var)
  3.2594 -		 )
  3.2595 -	     else
  3.2596 -		 (
  3.2597 -		   let 
  3.2598 -		       val p3'=poly2term(p3,var);
  3.2599 -		       val vars= (((map free2str) o vars) p1') union (((map free2str) o vars) p3');
  3.2600 -		   in
  3.2601 -		       poly2term(sort (mv_geq LEX_) (mv_mul(the(term2poly p1' vars) ,the(term2poly p3' vars),LEX_)),vars)
  3.2602 -		   end
  3.2603 -		  )
  3.2604 -    end;
  3.2605 -
  3.2606 -(* WN0210???SK brauch ma des überhaupt *)
  3.2607 -fun com_den_exp2(x::xs,denom,den,var)=
  3.2608 -    let 
  3.2609 -	val (t as Const ("Fields.inverse_class.divide",_) $ p1' $ p2')=x;
  3.2610 -	val p2= sort (mv_geq LEX_) (the(expanded2poly p2' var));
  3.2611 -	val p3= #1(mv_division(denom,p2,LEX_));
  3.2612 -	val p1var=get_vars p1';
  3.2613 -    in     
  3.2614 -	if length(xs)>0 then 
  3.2615 -	    if p3=[(1,mv_null2(var))] then
  3.2616 -		(
  3.2617 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2618 -		 poly2expanded(the (expanded2poly p1' p1var),p1var) $ 
  3.2619 -		 com_den_exp2(xs,denom,den,var)
  3.2620 -		)
  3.2621 -	    else
  3.2622 -		(
  3.2623 -		 Const ("Groups.plus_class.plus",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2624 -		 (
  3.2625 -		   let 
  3.2626 -		       val p3'=poly2expanded(p3,var);
  3.2627 -		       val vars= (((map free2str) o vars) p1') union (((map free2str) o vars) p3');
  3.2628 -		   in
  3.2629 -		       poly2expanded(sort (mv_geq LEX_) (mv_mul(the(expanded2poly p1' vars) ,the(expanded2poly p3' vars),LEX_)),vars)
  3.2630 -		   end
  3.2631 -		  ) $ 
  3.2632 -		 com_den_exp2(xs,denom,den,var)
  3.2633 -		)
  3.2634 -	else
  3.2635 -	    if p3=[(1,mv_null2(var))] then
  3.2636 -		(
  3.2637 -		 poly2expanded(the (expanded2poly p1' p1var),p1var)
  3.2638 -		 )
  3.2639 -	     else
  3.2640 -		 (
  3.2641 -		   let 
  3.2642 -		       val p3'=poly2expanded(p3,var);
  3.2643 -		       val vars= (((map free2str) o vars) p1') union (((map free2str) o vars) p3');
  3.2644 -		   in
  3.2645 -		       poly2expanded(sort (mv_geq LEX_) (mv_mul(the(expanded2poly p1' vars) ,the(expanded2poly p3' vars),LEX_)),vars)
  3.2646 -		   end
  3.2647 -		  )
  3.2648 -    end;
  3.2649 ----------------------------------------------------------*)
  3.2650 -
  3.2651 -
  3.2652 -(*. searches for an element y of a list ys, which has an gcd not 1 with x .*) 
  3.2653 -fun exists_gcd (x,[]) = false 
  3.2654 -  | exists_gcd (x,y::ys) = if mv_gcd x y = [(1,mv_null2(#2(hd(x))))] then  exists_gcd (x,ys)
  3.2655 -			   else true;
  3.2656 -
  3.2657 -(*. divides each element of the list xs with y .*)
  3.2658 -fun list_div ([],y) = [] 
  3.2659 -  | list_div (x::xs,y) = 
  3.2660 -    let
  3.2661 -	val (d,r)=mv_division(x,y,LEX_);
  3.2662 -    in
  3.2663 -	if r=[] then 
  3.2664 -	    d::list_div(xs,y)
  3.2665 -	else x::list_div(xs,y)
  3.2666 -    end;
  3.2667 -    
  3.2668 -(*. checks if x is in the list ys .*)
  3.2669 -fun in_list (x,[]) = false 
  3.2670 -  | in_list (x,y::ys) = if x=y then true
  3.2671 -			else in_list(x,ys);
  3.2672 -
  3.2673 -(*. deletes all equal elements of the list xs .*)
  3.2674 -fun kill_equal [] = [] 
  3.2675 -  | kill_equal (x::xs) = if in_list(x,xs) orelse x=[(1,mv_null2(#2(hd(x))))] then kill_equal(xs)
  3.2676 -			 else x::kill_equal(xs);
  3.2677 -
  3.2678 -(*. searches for new factors .*)
  3.2679 -fun new_factors [] = []
  3.2680 -  | new_factors (list:mv_poly list):mv_poly list = 
  3.2681 -    let
  3.2682 -	val l = kill_equal list;
  3.2683 -	val len = length(l);
  3.2684 -    in
  3.2685 -	if len>=2 then
  3.2686 -	    (
  3.2687 -	     let
  3.2688 -		 val x::y::xs=l;
  3.2689 -		 val gcd=mv_gcd x y;
  3.2690 -	     in
  3.2691 -		 if gcd=[(1,mv_null2(#2(hd(x))))] then 
  3.2692 -		     ( 
  3.2693 -		      if exists_gcd(x,xs) then new_factors (y::xs @ [x])
  3.2694 -		      else x::new_factors(y::xs)
  3.2695 -	             )
  3.2696 -		 else gcd::new_factors(kill_equal(list_div(x::y::xs,gcd)))
  3.2697 -	     end
  3.2698 -	     )
  3.2699 -	else
  3.2700 -	    if len=1 then [hd(l)]
  3.2701 -	    else []
  3.2702 -    end;
  3.2703 -
  3.2704 -(*. gets the factors of a list .*)
  3.2705 -fun get_factors x = new_factors x; 
  3.2706 -
  3.2707 -(*. multiplies the elements of the list .*)
  3.2708 -fun multi_list [] = []
  3.2709 -  | multi_list (x::xs) = if xs=[] then x
  3.2710 -			 else mv_mul(x,multi_list xs,LEX_);
  3.2711 -
  3.2712 -(*. makes a term out of the elements of the list (polynomial representation) .*)
  3.2713 -fun make_term ([],vars) = Free(str_of_int 0,HOLogic.realT) 
  3.2714 -  | make_term ((x::xs),vars) = if length(xs)=0 then poly2term(sort (mv_geq LEX_) (x),vars)
  3.2715 -			       else
  3.2716 -				   (
  3.2717 -				    Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2718 -				    poly2term(sort (mv_geq LEX_) (x),vars) $ 
  3.2719 -				    make_term(xs,vars)
  3.2720 -				    );
  3.2721 -
  3.2722 -(*. factorizes the denominator (polynomial representation) .*)				
  3.2723 -fun factorize_den (l,den,vars) = 
  3.2724 -    let
  3.2725 -	val factor_list=kill_equal( (get_factors l));
  3.2726 -	val mlist=multi_list(factor_list);
  3.2727 -	val (last,rest)=mv_division(den,multi_list(factor_list),LEX_);
  3.2728 -    in
  3.2729 -	if rest=[] then
  3.2730 -	    (
  3.2731 -	     if last=[(1,mv_null2(vars))] then make_term(factor_list,vars)
  3.2732 -	     else make_term(last::factor_list,vars)
  3.2733 -	     )
  3.2734 -	else error ("RATIONALS_FACTORIZE_DEN_EXCEPTION: Invalid factor by division")
  3.2735 -    end; 
  3.2736 -
  3.2737 -(*. makes a term out of the elements of the list (expanded polynomial representation) .*)
  3.2738 -fun make_exp ([],vars) = Free(str_of_int 0,HOLogic.realT) 
  3.2739 -  | make_exp ((x::xs),vars) = if length(xs)=0 then poly2expanded(sort (mv_geq LEX_) (x),vars)
  3.2740 -			       else
  3.2741 -				   (
  3.2742 -				    Const ("Groups.times_class.times",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2743 -				    poly2expanded(sort (mv_geq LEX_) (x),vars) $ 
  3.2744 -				    make_exp(xs,vars)
  3.2745 -				    );
  3.2746 -
  3.2747 -(*. factorizes the denominator (expanded polynomial representation) .*)	
  3.2748 -fun factorize_den_exp (l,den,vars) = 
  3.2749 -    let
  3.2750 -	val factor_list=kill_equal( (get_factors l));
  3.2751 -	val mlist=multi_list(factor_list);
  3.2752 -	val (last,rest)=mv_division(den,multi_list(factor_list),LEX_);
  3.2753 -    in
  3.2754 -	if rest=[] then
  3.2755 -	    (
  3.2756 -	     if last=[(1,mv_null2(vars))] then make_exp(factor_list,vars)
  3.2757 -	     else make_exp(last::factor_list,vars)
  3.2758 -	     )
  3.2759 -	else error ("RATIONALS_FACTORIZE_DEN_EXP_EXCEPTION: Invalid factor by division")
  3.2760 -    end; 
  3.2761 -
  3.2762 -(*. calculates the common denominator of all elements of the list and multiplies .*)
  3.2763 -(*. the nominators and denominators with the correct factor .*)
  3.2764 -(*. (polynomial representation) .*)
  3.2765 -fun step_add_list_of_fractions []=(Free("0",HOLogic.realT),[]:term list)
  3.2766 -  | step_add_list_of_fractions [x]= error ("RATIONALS_STEP_ADD_LIST_OF_FRACTIONS_EXCEPTION: Nothing to add")
  3.2767 -  | step_add_list_of_fractions (xs) = 
  3.2768 -    let
  3.2769 -        val den_list=termlist2denominators (xs); (* list of denominators *)
  3.2770 -	val (denom,var)=calc_lcm(den_list);      (* common denominator *)
  3.2771 -	val den=factorize_den(#1(den_list),denom,var); (* faktorisierter Nenner !!! *)
  3.2772 -    in
  3.2773 -	com_den(xs,denom,den,var)
  3.2774 -    end;
  3.2775 -
  3.2776 -(*. calculates the common denominator of all elements of the list and multiplies .*)
  3.2777 -(*. the nominators and denominators with the correct factor .*)
  3.2778 -(*. (expanded polynomial representation) .*)
  3.2779 -fun step_add_list_of_fractions_exp []  = (Free("0",HOLogic.realT),[]:term list)
  3.2780 -  | step_add_list_of_fractions_exp [x] = error ("RATIONALS_STEP_ADD_LIST_OF_FRACTIONS_EXP_EXCEPTION: Nothing to add")
  3.2781 -  | step_add_list_of_fractions_exp (xs)= 
  3.2782 -    let
  3.2783 -        val den_list=termlist2denominators_exp (xs); (* list of denominators *)
  3.2784 -	val (denom,var)=calc_lcm(den_list);      (* common denominator *)
  3.2785 -	val den=factorize_den_exp(#1(den_list),denom,var); (* faktorisierter Nenner !!! *)
  3.2786 -    in
  3.2787 -	com_den_exp(xs,denom,den,var)
  3.2788 -    end;
  3.2789 -
  3.2790 -(* wird aktuell nicht mehr gebraucht, bei rückänderung schon 
  3.2791 --------------------------------------------------------------
  3.2792 -(* WN0210???SK brauch ma des überhaupt *)
  3.2793 -fun step_add_list_of_fractions2 []=(Free("0",HOLogic.realT),[]:term list)
  3.2794 -  | step_add_list_of_fractions2 [x]=(x,[])
  3.2795 -  | step_add_list_of_fractions2 (xs) = 
  3.2796 -    let
  3.2797 -        val den_list=termlist2denominators (xs); (* list of denominators *)
  3.2798 -	val (denom,var)=calc_lcm(den_list);      (* common denominator *)
  3.2799 -	val den=factorize_den(#1(den_list),denom,var);  (* faktorisierter Nenner !!! *)
  3.2800 -    in
  3.2801 -	(
  3.2802 -	 Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2803 -	 com_den2(xs,denom, poly2term(denom,var)(*den*),var) $
  3.2804 -	 poly2term(denom,var)
  3.2805 -	,
  3.2806 -	[]
  3.2807 -	)
  3.2808 -    end;
  3.2809 -
  3.2810 -(* WN0210???SK brauch ma des überhaupt *)
  3.2811 -fun step_add_list_of_fractions2_exp []=(Free("0",HOLogic.realT),[]:term list)
  3.2812 -  | step_add_list_of_fractions2_exp [x]=(x,[])
  3.2813 -  | step_add_list_of_fractions2_exp (xs) = 
  3.2814 -    let
  3.2815 -        val den_list=termlist2denominators_exp (xs); (* list of denominators *)
  3.2816 -	val (denom,var)=calc_lcm(den_list);      (* common denominator *)
  3.2817 -	val den=factorize_den_exp(#1(den_list),denom,var);  (* faktorisierter Nenner !!! *)
  3.2818 -    in
  3.2819 -	(
  3.2820 -	 Const ("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2821 -	 com_den_exp2(xs,denom, poly2term(denom,var)(*den*),var) $
  3.2822 -	 poly2expanded(denom,var)
  3.2823 -	,
  3.2824 -	[]
  3.2825 -	)
  3.2826 -    end;
  3.2827 ----------------------------------------------- *)
  3.2828 -
  3.2829 -
  3.2830 -(* converts a term, which contains several terms seperated by +, into a list of these terms .*)
  3.2831 -fun term2list (t as (Const("Fields.inverse_class.divide",_) $ _ $ _)) = [t]
  3.2832 -  | term2list (t as (Const("Atools.pow",_) $ _ $ _)) = 
  3.2833 -      [Const ("Fields.inverse_class.divide", 
  3.2834 -        [HOLogic.realT,HOLogic.realT] ---> HOLogic.realT) $ 
  3.2835 -	  t $ Free("1",HOLogic.realT)
  3.2836 -     ]
  3.2837 -  | term2list (t as (Free(_,_))) = 
  3.2838 -    [Const("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2839 -	  t $  Free("1",HOLogic.realT)
  3.2840 -     ]
  3.2841 -  | term2list (t as (Const("Groups.times_class.times",_) $ _ $ _)) = 
  3.2842 -    [Const("Fields.inverse_class.divide",[HOLogic.realT,HOLogic.realT]--->HOLogic.realT) $ 
  3.2843 -	  t $ Free("1",HOLogic.realT)
  3.2844 -     ]
  3.2845 -  | term2list (Const("Groups.plus_class.plus",_) $ t1 $ t2) = term2list(t1) @ term2list(t2)
  3.2846 -  | term2list (Const("Groups.minus_class.minus",_) $ t1 $ t2) = 
  3.2847 -    error ("RATIONALS_TERM2LIST_EXCEPTION: - not implemented yet")
  3.2848 -  | term2list _ = error ("RATIONALS_TERM2LIST_EXCEPTION: invalid term");
  3.2849 -
  3.2850 -(*.factors out the gcd of nominator and denominator:
  3.2851 -   a/b = (a' * gcd)/(b' * gcd),  a,b,gcd  are poly[2].*)
  3.2852 -
  3.2853 -(*. brings the term into a normal form .*)
  3.2854 -fun norm_rational_ (thy:theory) t = 
  3.2855 -    SOME (add_list_of_fractions(term2list(t))) handle _ => NONE; 
  3.2856 -fun norm_expanded_rat_ (thy:theory) t = 
  3.2857 -    SOME (add_list_of_fractions_exp(term2list(t))) handle _ => NONE; 
  3.2858 -
  3.2859 -
  3.2860 -(*.evaluates conditions in calculate_Rational.*)
  3.2861 -(*make local with FIXX@ME result:term *term list*)
  3.2862 -val calc_rat_erls = prep_rls(
  3.2863 -  Rls {id = "calc_rat_erls", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.2864 -	 erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.2865 -	 rules = 
  3.2866 -	 [Calc ("HOL.eq",eval_equal "#equal_"),
  3.2867 -	  Calc ("Atools.is'_const",eval_const "#is_const_"),
  3.2868 -	  Thm ("not_true",num_str @{thm not_true}),
  3.2869 -	  Thm ("not_false",num_str @{thm not_false})
  3.2870 -	  ], 
  3.2871 -	 scr = EmptyScr});
  3.2872 -
  3.2873 -
  3.2874 -(*.simplifies expressions with numerals;
  3.2875 -   does NOT rearrange the term by AC-rewriting; thus terms with variables 
  3.2876 -   need to have constants to be commuted together respectively.*)
  3.2877 -val calculate_Rational = prep_rls (merge_rls "calculate_Rational"
  3.2878 -	  (Rls {id = "divide", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.2879 -	    erls = calc_rat_erls, srls = Erls,
  3.2880 -	    calc = [], errpatts = [],
  3.2881 -	    rules = 
  3.2882 -	      [Calc ("Fields.inverse_class.divide",eval_cancel "#divide_e"),
  3.2883 -	       
  3.2884 -	       Thm ("minus_divide_left",num_str (@{thm minus_divide_left} RS @{thm sym})),
  3.2885 -	         (*SYM - ?x / ?y = - (?x / ?y)  may come from subst*)
  3.2886 -	       
  3.2887 -	       Thm ("rat_add",num_str @{thm rat_add}),
  3.2888 -	         (*"[| a is_const; b is_const; c is_const; d is_const |] ==> \
  3.2889 -		           \a / c + b / d = (a * d) / (c * d) + (b * c ) / (d * c)"*)
  3.2890 -	       Thm ("rat_add1",num_str @{thm rat_add1}),
  3.2891 -	         (*"[| a is_const; b is_const; c is_const |] ==> a / c + b / c = (a + b) / c"*)
  3.2892 -	       Thm ("rat_add2",num_str @{thm rat_add2}),
  3.2893 -	         (*"[| ?a is_const; ?b is_const; ?c is_const |] ==> ?a / ?c + ?b = (?a + ?b * ?c) / ?c"*)
  3.2894 -	       Thm ("rat_add3",num_str @{thm rat_add3}),
  3.2895 -	         (*"[| a is_const; b is_const; c is_const |] ==> a + b / c = (a * c) / c + b / c"\
  3.2896 -		           .... is_const to be omitted here FIXME*)
  3.2897 -	       
  3.2898 -	       Thm ("rat_mult",num_str @{thm rat_mult}), 
  3.2899 -	         (*a / b * (c / d) = a * c / (b * d)*)
  3.2900 -	       Thm ("times_divide_eq_right",num_str @{thm times_divide_eq_right}),
  3.2901 -	         (*?x * (?y / ?z) = ?x * ?y / ?z*)
  3.2902 -	       Thm ("times_divide_eq_left",num_str @{thm times_divide_eq_left}),
  3.2903 -	         (*?y / ?z * ?x = ?y * ?x / ?z*)
  3.2904 -	       
  3.2905 -	       Thm ("real_divide_divide1",num_str @{thm real_divide_divide1}),
  3.2906 -	         (*"?y ~= 0 ==> ?u / ?v / (?y / ?z) = ?u / ?v * (?z / ?y)"*)
  3.2907 -	       Thm ("divide_divide_eq_left",num_str @{thm divide_divide_eq_left}),
  3.2908 -	         (*"?x / ?y / ?z = ?x / (?y * ?z)"*)
  3.2909 -	       
  3.2910 -	       Thm ("rat_power", num_str @{thm rat_power}),
  3.2911 -	         (*"(?a / ?b) ^^^ ?n = ?a ^^^ ?n / ?b ^^^ ?n"*)
  3.2912 -	       
  3.2913 -	       Thm ("mult_cross",num_str @{thm mult_cross}),
  3.2914 -	         (*"[| b ~= 0; d ~= 0 |] ==> (a / b = c / d) = (a * d = b * c)*)
  3.2915 -	       Thm ("mult_cross1",num_str @{thm mult_cross1}),
  3.2916 -	         (*"   b ~= 0            ==> (a / b = c    ) = (a     = b * c)*)
  3.2917 -	       Thm ("mult_cross2",num_str @{thm mult_cross2})
  3.2918 -	         (*"           d ~= 0    ==> (a     = c / d) = (a * d =     c)*)
  3.2919 -	       ], scr = EmptyScr})
  3.2920 -	  calculate_Poly);
  3.2921 +        Thm ("minus_divide_left", num_str (@{thm minus_divide_left} RS @{thm sym})),
  3.2922 +          (*SYM - ?x / ?y = - (?x / ?y)  may come from subst*)
  3.2923 +        Thm ("rat_add", num_str @{thm rat_add}),
  3.2924 +          (*"[| a is_const; b is_const; c is_const; d is_const |] ==> \
  3.2925 +          \a / c + b / d = (a * d) / (c * d) + (b * c ) / (d * c)"*)
  3.2926 +        Thm ("rat_add1", num_str @{thm rat_add1}),
  3.2927 +          (*"[| a is_const; b is_const; c is_const |] ==> a / c + b / c = (a + b) / c"*)
  3.2928 +        Thm ("rat_add2", num_str @{thm rat_add2}),
  3.2929 +          (*"[| ?a is_const; ?b is_const; ?c is_const |] ==> ?a / ?c + ?b = (?a + ?b * ?c) / ?c"*)
  3.2930 +        Thm ("rat_add3", num_str @{thm rat_add3}),
  3.2931 +          (*"[| a is_const; b is_const; c is_const |] ==> a + b / c = (a * c) / c + b / c"\
  3.2932 +          .... is_const to be omitted here FIXME*)
  3.2933 +        
  3.2934 +        Thm ("rat_mult", num_str @{thm rat_mult}), 
  3.2935 +          (*a / b * (c / d) = a * c / (b * d)*)
  3.2936 +        Thm ("times_divide_eq_right", num_str @{thm times_divide_eq_right}),
  3.2937 +          (*?x * (?y / ?z) = ?x * ?y / ?z*)
  3.2938 +        Thm ("times_divide_eq_left", num_str @{thm times_divide_eq_left}),
  3.2939 +          (*?y / ?z * ?x = ?y * ?x / ?z*)
  3.2940 +        
  3.2941 +        Thm ("real_divide_divide1", num_str @{thm real_divide_divide1}),
  3.2942 +          (*"?y ~= 0 ==> ?u / ?v / (?y / ?z) = ?u / ?v * (?z / ?y)"*)
  3.2943 +        Thm ("divide_divide_eq_left", num_str @{thm divide_divide_eq_left}),
  3.2944 +          (*"?x / ?y / ?z = ?x / (?y * ?z)"*)
  3.2945 +        
  3.2946 +        Thm ("rat_power", num_str @{thm rat_power}),
  3.2947 +          (*"(?a / ?b) ^^^ ?n = ?a ^^^ ?n / ?b ^^^ ?n"*)
  3.2948 +        
  3.2949 +        Thm ("mult_cross", num_str @{thm mult_cross}),
  3.2950 +          (*"[| b ~= 0; d ~= 0 |] ==> (a / b = c / d) = (a * d = b * c)*)
  3.2951 +        Thm ("mult_cross1", num_str @{thm mult_cross1}),
  3.2952 +          (*"   b ~= 0            ==> (a / b = c    ) = (a     = b * c)*)
  3.2953 +        Thm ("mult_cross2", num_str @{thm mult_cross2})
  3.2954 +          (*"           d ~= 0    ==> (a     = c / d) = (a * d =     c)*)], 
  3.2955 +      scr = EmptyScr})
  3.2956 +    calculate_Poly);
  3.2957  
  3.2958  (*("is_expanded", ("Rational.is'_expanded", eval_is_expanded ""))*)
  3.2959  fun eval_is_expanded (thmid:string) _ 
  3.2960 @@ -2980,309 +461,116 @@
  3.2961  	         Trueprop $ (mk_equality (t, @{term False})))
  3.2962    | eval_is_expanded _ _ _ _ = NONE; 
  3.2963  
  3.2964 +calclist':= overwritel (!calclist', 
  3.2965 +   [("is_expanded", ("Rational.is'_expanded", eval_is_expanded ""))]);
  3.2966 +
  3.2967  val rational_erls = 
  3.2968 -    merge_rls "rational_erls" calculate_Rational 
  3.2969 -	      (append_rls "is_expanded" Atools_erls 
  3.2970 -			  [Calc ("Rational.is'_expanded", eval_is_expanded "")
  3.2971 -			   ]);
  3.2972 +  merge_rls "rational_erls" calculate_Rational 
  3.2973 +    (append_rls "is_expanded" Atools_erls 
  3.2974 +      [Calc ("Rational.is'_expanded", eval_is_expanded "")]);
  3.2975 +*}
  3.2976  
  3.2977 +subsection {* Embed cancellation into rewriting *}
  3.2978 +ML {*
  3.2979 +local (* cancel_p *)
  3.2980  
  3.2981 -(*.3 'reverse-rewrite-sets' for symbolic computation on rationals:
  3.2982 - =================================================================
  3.2983 - A[2] 'cancel_p': .
  3.2984 - A[3] 'cancel': .
  3.2985 - B[2] 'common_nominator_p': transforms summands in a term [2]
  3.2986 -         to fractions with the (least) common multiple as nominator.
  3.2987 - B[3] 'norm_rational': normalizes arbitrary algebraic terms (without 
  3.2988 -         radicals and transzendental functions) to one canceled fraction,
  3.2989 -	 nominator and denominator in polynomial form.
  3.2990 +val {rules = rules, rew_ord = (_, ro), ...} = rep_rls (assoc_rls "rev_rew_p");
  3.2991  
  3.2992 -In order to meet isac's requirements for interactive and stepwise calculation,
  3.2993 -each 'reverse-rewerite-set' consists of an initialization for the interpreter 
  3.2994 -state and of 4 functions, each of which employs rewriting as much as possible.
  3.2995 -The signature of these functions are the same in each 'reverse-rewrite-set' 
  3.2996 -respectively.*)
  3.2997 +fun init_state thy eval_rls ro t =
  3.2998 +  let
  3.2999 +    val SOME (t', _) = factout_p_ thy t;
  3.3000 +    val SOME (t'', asm) = cancel_p_ thy t;
  3.3001 +    val der = reverse_deriv thy eval_rls rules ro NONE t';
  3.3002 +    val der = der @ 
  3.3003 +      [(Thm ("real_mult_div_cancel2", num_str @{thm real_mult_div_cancel2}), (t'', asm))]
  3.3004 +    val rs = (distinct_Thm o (map #1)) der
  3.3005 +  	val rs = filter_out (eq_Thms 
  3.3006 +  	  ["sym_real_add_zero_left", "sym_real_mult_0", "sym_real_mult_1"]) rs
  3.3007 +  in (t, t'', [rs(*one in order to ease locate_rule*)], der) end;
  3.3008  
  3.3009 -(* ************************************************************************* *)
  3.3010 +fun locate_rule thy eval_rls ro [rs] t r =
  3.3011 +    if member op = ((map (id_of_thm)) rs) (id_of_thm r)
  3.3012 +    then 
  3.3013 +      let val ropt = rewrite_ thy ro eval_rls true (thm_of_thm r) t;
  3.3014 +      in
  3.3015 +        case ropt of SOME ta => [(r, ta)]
  3.3016 +	      | NONE => (tracing 
  3.3017 +	          ("### locate_rule:  rewrite " ^ id_of_thm r ^ " " ^ term2str t ^ " = NONE"); []) 
  3.3018 +			end
  3.3019 +    else (tracing ("### locate_rule:  " ^ id_of_thm r ^ " not mem rrls"); [])
  3.3020 +  | locate_rule _ _ _ _ _ _ = error "locate_rule: doesnt match rev-sets in istate";
  3.3021  
  3.3022 -local(*. cancel_p
  3.3023 -------------------------
  3.3024 -cancels a single fraction consisting of two (uni- or multivariate)
  3.3025 -polynomials WN0609???SK[2] into another such a fraction; examples:
  3.3026 +fun next_rule thy eval_rls ro [rs] t =
  3.3027 +    let
  3.3028 +      val der = make_deriv thy eval_rls rs ro NONE t;
  3.3029 +    in case der of (_, r, _) :: _ => SOME r | _ => NONE end
  3.3030 +  | next_rule _ _ _ _ _ = error ("next_rule: doesnt match rev-sets in istate");
  3.3031  
  3.3032 -	   a^2 + -1*b^2         a + b
  3.3033 -        -------------------- = ---------
  3.3034 -	a^2 + -2*a*b + b^2     a + -1*b
  3.3035 -
  3.3036 -        a^2    a
  3.3037 -        --- = ---
  3.3038 -         a     1
  3.3039 -
  3.3040 -Remark: the reverse ruleset does _NOT_ work properly with other input !.*)
  3.3041 -(*WN020824 wir werden "uberlegen, wie wir ungeeignete inputs zur"uckweisen*)
  3.3042 -
  3.3043 -val {rules, rew_ord=(_,ro),...} =
  3.3044 -    rep_rls (assoc_rls "make_polynomial");
  3.3045 -(*WN060829 ... make_deriv does not terminate with 1st expl above,
  3.3046 -           see rational.sml --- investigate rulesets for cancel_p ---*)
  3.3047 -val {rules, rew_ord=(_,ro),...} =
  3.3048 -    rep_rls (assoc_rls "rev_rew_p");
  3.3049 -
  3.3050 -(*.init_state = fn : term -> istate
  3.3051 -initialzies the state of the script interpreter. The state is:
  3.3052 -
  3.3053 -type rrlsstate =      (*state for reverse rewriting*)
  3.3054 -     (term *          (*the current formula*)
  3.3055 -      term *          (*the final term*)
  3.3056 -      rule list       (*'reverse rule list' (#)*)
  3.3057 -	    list *    (*may be serveral, eg. in norm_rational*)
  3.3058 -      (rule *         (*Thm (+ Thm generated from Calc) resulting in ...*)
  3.3059 -       (term *        (*... rewrite with ...*)
  3.3060 -	term list))   (*... assumptions*)
  3.3061 -	  list);      (*derivation from given term to normalform
  3.3062 -		       in reverse order with sym_thm;
  3.3063 -                       (#) could be extracted from here by (map #1)*).*)
  3.3064 -(* val {rules, rew_ord=(_,ro),...} =
  3.3065 -       rep_rls (assoc_rls "rev_rew_p")        (*USE ALWAYS, SEE val cancel_p*);
  3.3066 -   val (thy, eval_rls, ro) =(thy, Atools_erls, ro) (*..val cancel_p*);
  3.3067 -   val t = t;
  3.3068 -   *)
  3.3069 -fun init_state thy eval_rls ro t =
  3.3070 -    let val SOME (t',_) = factout_p_ thy t
  3.3071 -        val SOME (t'',asm) = cancel_p_ thy t
  3.3072 -        val der = reverse_deriv thy eval_rls rules ro NONE t'
  3.3073 -        val der = der @ [(Thm ("real_mult_div_cancel2",
  3.3074 -			       num_str @{thm real_mult_div_cancel2}),
  3.3075 -			  (t'',asm))]
  3.3076 -        val rs = (distinct_Thm o (map #1)) der
  3.3077 -	val rs = filter_out (eq_Thms ["sym_real_add_zero_left",
  3.3078 -				      "sym_real_mult_0",
  3.3079 -				      "sym_real_mult_1"
  3.3080 -				      (*..insufficient,eg.make_Polynomial*)])rs
  3.3081 -    in (t,t'',[rs(*here only _ONE_ to ease locate_rule*)],der) end;
  3.3082 -
  3.3083 -(*.locate_rule = fn : rule list -> term -> rule
  3.3084 -		      -> (rule * (term * term list) option) list.
  3.3085 -  checks a rule R for being a cancel-rule, and if it is,
  3.3086 -  then return the list of rules (+ the terms they are rewriting to)
  3.3087 -  which need to be applied before R should be applied.
  3.3088 -  precondition: the rule is applicable to the argument-term.
  3.3089 -arguments:
  3.3090 -  rule list: the reverse rule list
  3.3091 -  -> term  : ... to which the rule shall be applied
  3.3092 -  -> rule  : ... to be applied to term
  3.3093 -value:
  3.3094 -  -> (rule           : a rule rewriting to ...
  3.3095 -      * (term        : ... the resulting term ...
  3.3096 -         * term list): ... with the assumptions ( //#0).
  3.3097 -      ) list         : there may be several such rules;
  3.3098 -		       the list is empty, if the rule has nothing to do
  3.3099 -		       with cancelation.*)
  3.3100 -(* val () = ();
  3.3101 -   *)
  3.3102 -fun locate_rule thy eval_rls ro [rs] t r =
  3.3103 -    if (id_of_thm r) mem (map (id_of_thm)) rs
  3.3104 -    then let val ropt =
  3.3105 -		 rewrite_ thy ro eval_rls true (thm_of_thm r) t;
  3.3106 -	 in case ropt of
  3.3107 -		SOME ta => [(r, ta)]
  3.3108 -	      | NONE => (tracing("### locate_rule:  rewrite "^
  3.3109 -				 (id_of_thm r)^" "^(term2str t)^" = NONE");
  3.3110 -			 []) end
  3.3111 -    else (tracing("### locate_rule:  "^(id_of_thm r)^" not mem rrls");[])
  3.3112 -  | locate_rule _ _ _ _ _ _ =
  3.3113 -    error ("locate_rule: doesnt match rev-sets in istate");
  3.3114 -
  3.3115 -(*.next_rule = fn : rule list -> term -> rule option
  3.3116 -  for a given term return the next rules to be done for cancelling.
  3.3117 -arguments:
  3.3118 -  rule list     : the reverse rule list 
  3.3119 -  term          : the term for which ...
  3.3120 -value:
  3.3121 -  -> rule option: ... this rule is appropriate for cancellation;
  3.3122 -		  there may be no such rule (if the term is canceled already.*)
  3.3123 -(* val thy = thy;
  3.3124 -   val Rrls {rew_ord=(_,ro),...} = cancel;
  3.3125 -   val ([rs],t) = (rss,f);
  3.3126 -   next_rule thy eval_rls ro [rs] t;(*eval fun next_rule ... before!*)
  3.3127 -
  3.3128 -   val (thy, [rs]) = (thy, revsets);
  3.3129 -   val Rrls {rew_ord=(_,ro),...} = cancel;
  3.3130 -   nex [rs] t;
  3.3131 -   *)
  3.3132 -fun next_rule thy eval_rls ro [rs] t =
  3.3133 -    let val der = make_deriv thy eval_rls rs ro NONE t;
  3.3134 -    in case der of
  3.3135 -(* val (_,r,_)::_ = der;
  3.3136 -   *)
  3.3137 -	   (_,r,_)::_ => SOME r
  3.3138 -	 | _ => NONE
  3.3139 -    end
  3.3140 -  | next_rule _ _ _ _ _ =
  3.3141 -    error ("next_rule: doesnt match rev-sets in istate");
  3.3142 -
  3.3143 -(*.val attach_form = f : rule list -> term -> term
  3.3144 -			 -> (rule * (term * term list)) list
  3.3145 -  checks an input term TI, if it may belong to a current cancellation, by
  3.3146 -  trying to derive it from the given term TG.
  3.3147 -arguments:
  3.3148 -  term   : TG, the last one in the cancellation agreed upon by user + math-eng
  3.3149 -  -> term: TI, the next one input by the user
  3.3150 -value:
  3.3151 -  -> (rule           : the rule to be applied in order to reach TI
  3.3152 -      * (term        : ... obtained by applying the rule ...
  3.3153 -         * term list): ... and the respective assumptions.
  3.3154 -      ) list         : there may be several such rules;
  3.3155 -                       the list is empty, if the users term does not belong
  3.3156 -		       to a cancellation of the term last agreed upon.*)
  3.3157 -fun attach_form (_:rule list list) (_:term) (_:term) = (*still missing*)
  3.3158 -    []:(rule * (term * term list)) list;
  3.3159 +fun attach_form (_:rule list list) (_:term) (_:term) = 
  3.3160 +  [(*TODO*)]: (rule * (term * term list)) list;
  3.3161  
  3.3162  in
  3.3163  
  3.3164 -val cancel_p =
  3.3165 -    Rrls {id = "cancel_p", prepat=[],
  3.3166 -	  rew_ord=("ord_make_polynomial",
  3.3167 -		   ord_make_polynomial false thy),
  3.3168 -	  erls = rational_erls,
  3.3169 -	  calc = [("PLUS"    ,("Groups.plus_class.plus"        ,eval_binop "#add_")),
  3.3170 -		  ("TIMES"   ,("Groups.times_class.times"        ,eval_binop "#mult_")),
  3.3171 -		  ("DIVIDE" ,("Fields.inverse_class.divide"  ,eval_cancel "#divide_e")),
  3.3172 -		  ("POWER"  ,("Atools.pow"  ,eval_binop "#power_"))],
  3.3173 -	  errpatts = [],
  3.3174 -	  scr=Rfuns {init_state  = init_state thy Atools_erls ro,
  3.3175 -		     normal_form = cancel_p_ thy,
  3.3176 -		     locate_rule = locate_rule thy Atools_erls ro,
  3.3177 -		     next_rule   = next_rule thy Atools_erls ro,
  3.3178 -		     attach_form = attach_form}}
  3.3179 -end;(*local*)
  3.3180 +val cancel_p = 
  3.3181 +  Rrls {id = "cancel_p", prepat = [],
  3.3182 +	rew_ord=("ord_make_polynomial", ord_make_polynomial false thy),
  3.3183 +	erls = rational_erls, 
  3.3184 +	calc = 
  3.3185 +	  [("PLUS", ("Groups.plus_class.plus", eval_binop "#add_")),
  3.3186 +	  ("TIMES" , ("Groups.times_class.times", eval_binop "#mult_")),
  3.3187 +	  ("DIVIDE", ("Fields.inverse_class.divide", eval_cancel "#divide_e")),
  3.3188 +	  ("POWER", ("Atools.pow", eval_binop "#power_"))],
  3.3189 +    errpatts = [],
  3.3190 +	scr =
  3.3191 +	  Rfuns {init_state  = init_state thy Atools_erls ro,
  3.3192 +		normal_form = cancel_p_ thy, 
  3.3193 +		locate_rule = locate_rule thy Atools_erls ro,
  3.3194 +		next_rule   = next_rule thy Atools_erls ro,
  3.3195 +		attach_form = attach_form}}
  3.3196 +end; (* local cancel_p *)
  3.3197 +*}
  3.3198  
  3.3199 -local(*.ad [2] 'common_nominator_p'
  3.3200 ----------------------------------
  3.3201 -FIXME Beschreibung .*)
  3.3202 +subsection {* Embed addition into rewriting *}
  3.3203 +ML {*
  3.3204 +local (* add_fractions_p *)
  3.3205  
  3.3206 +val {rules = rules, rew_ord = (_, ro), ...} = rep_rls (assoc_rls "make_polynomial");
  3.3207 +val {rules, rew_ord=(_,ro),...} = rep_rls (assoc_rls "rev_rew_p");
  3.3208  
  3.3209 -val {rules=rules,rew_ord=(_,ro),...} =
  3.3210 -    rep_rls (assoc_rls "make_polynomial");
  3.3211 -(*WN060829 ... make_deriv does not terminate with 1st expl above,
  3.3212 -           see rational.sml --- investigate rulesets for cancel_p ---*)
  3.3213 -val {rules, rew_ord=(_,ro),...} =
  3.3214 -    rep_rls (assoc_rls "rev_rew_p");
  3.3215 -val thy = thy;
  3.3216 +fun init_state thy eval_rls ro t =
  3.3217 +  let 
  3.3218 +    val SOME (t',_) = common_nominator_p_ thy t;
  3.3219 +    val SOME (t'', asm) = add_fraction_p_ thy t;
  3.3220 +    val der = reverse_deriv thy eval_rls rules ro NONE t';
  3.3221 +    val der = der @ 
  3.3222 +      [(Thm ("real_mult_div_cancel2", num_str @{thm real_mult_div_cancel2}), (t'',asm))]
  3.3223 +    val rs = (distinct_Thm o (map #1)) der;
  3.3224 +    val rs = filter_out (eq_Thms 
  3.3225 +      ["sym_real_add_zero_left", "sym_real_mult_0", "sym_real_mult_1"]) rs;
  3.3226 +  in (t, t'', [rs(*here only _ONE_*)], der) end;
  3.3227  
  3.3228 +fun locate_rule thy eval_rls ro [rs] t r =
  3.3229 +    if member op = ((map (id_of_thm)) rs) (id_of_thm r)
  3.3230 +    then 
  3.3231 +      let val ropt = rewrite_ thy ro eval_rls true (thm_of_thm r) t;
  3.3232 +      in 
  3.3233 +        case ropt of
  3.3234 +          SOME ta => [(r, ta)]
  3.3235 +	      | NONE => 
  3.3236 +	        (tracing ("### locate_rule:  rewrite " ^ id_of_thm r ^ " " ^ term2str t ^ " = NONE");
  3.3237 +	        []) end
  3.3238 +    else (tracing ("### locate_rule:  " ^ id_of_thm r ^ " not mem rrls"); [])
  3.3239 +  | locate_rule _ _ _ _ _ _ = error "locate_rule: doesnt match rev-sets in istate";
  3.3240  
  3.3241 -(*.common_nominator_p_ = fn : theory -> term -> (term * term list) option
  3.3242 -  as defined above*)
  3.3243 -
  3.3244 -(*.init_state = fn : term -> istate
  3.3245 -initialzies the state of the interactive interpreter. The state is:
  3.3246 -
  3.3247 -type rrlsstate =      (*state for reverse rewriting*)
  3.3248 -     (term *          (*the current formula*)
  3.3249 -      term *          (*the final term*)
  3.3250 -      rule list       (*'reverse rule list' (#)*)
  3.3251 -	    list *    (*may be serveral, eg. in norm_rational*)
  3.3252 -      (rule *         (*Thm (+ Thm generated from Calc) resulting in ...*)
  3.3253 -       (term *        (*... rewrite with ...*)
  3.3254 -	term list))   (*... assumptions*)
  3.3255 -	  list);      (*derivation from given term to normalform
  3.3256 -		       in reverse order with sym_thm;
  3.3257 -                       (#) could be extracted from here by (map #1)*).*)
  3.3258 -fun init_state thy eval_rls ro t =
  3.3259 -    let val SOME (t',_) = common_nominator_p_ thy t;
  3.3260 -        val SOME (t'',asm) = add_fraction_p_ thy t;
  3.3261 -        val der = reverse_deriv thy eval_rls rules ro NONE t';
  3.3262 -        val der = der @ [(Thm ("real_mult_div_cancel2",
  3.3263 -			       num_str @{thm real_mult_div_cancel2}),
  3.3264 -			  (t'',asm))]
  3.3265 -        val rs = (distinct_Thm o (map #1)) der;
  3.3266 -	val rs = filter_out (eq_Thms ["sym_real_add_zero_left",
  3.3267 -				      "sym_real_mult_0",
  3.3268 -				      "sym_real_mult_1"]) rs;
  3.3269 -    in (t,t'',[rs(*here only _ONE_*)],der) end;
  3.3270 -
  3.3271 -(* use"knowledge/Rational.ML";
  3.3272 -   *)
  3.3273 -
  3.3274 -(*.locate_rule = fn : rule list -> term -> rule
  3.3275 -		      -> (rule * (term * term list) option) list.
  3.3276 -  checks a rule R for being a cancel-rule, and if it is,
  3.3277 -  then return the list of rules (+ the terms they are rewriting to)
  3.3278 -  which need to be applied before R should be applied.
  3.3279 -  precondition: the rule is applicable to the argument-term.
  3.3280 -arguments:
  3.3281 -  rule list: the reverse rule list
  3.3282 -  -> term  : ... to which the rule shall be applied
  3.3283 -  -> rule  : ... to be applied to term
  3.3284 -value:
  3.3285 -  -> (rule           : a rule rewriting to ...
  3.3286 -      * (term        : ... the resulting term ...
  3.3287 -         * term list): ... with the assumptions ( //#0).
  3.3288 -      ) list         : there may be several such rules;
  3.3289 -		       the list is empty, if the rule has nothing to do
  3.3290 -		       with cancelation.*)
  3.3291 -(* val () = ();
  3.3292 -   *)
  3.3293 -fun locate_rule thy eval_rls ro [rs] t r =
  3.3294 -    if (id_of_thm r) mem (map (id_of_thm)) rs
  3.3295 -    then let val ropt =
  3.3296 -		 rewrite_ thy ro eval_rls true (thm_of_thm r) t;
  3.3297 -	 in case ropt of
  3.3298 -		SOME ta => [(r, ta)]
  3.3299 -	      | NONE => (tracing("### locate_rule:  rewrite "^
  3.3300 -				 (id_of_thm r)^" "^(term2str t)^" = NONE");
  3.3301 -			 []) end
  3.3302 -    else (tracing("### locate_rule:  "^(id_of_thm r)^" not mem rrls");[])
  3.3303 -  | locate_rule _ _ _ _ _ _ =
  3.3304 -    error ("locate_rule: doesnt match rev-sets in istate");
  3.3305 -
  3.3306 -(*.next_rule = fn : rule list -> term -> rule option
  3.3307 -  for a given term return the next rules to be done for cancelling.
  3.3308 -arguments:
  3.3309 -  rule list     : the reverse rule list
  3.3310 -  term          : the term for which ...
  3.3311 -value:
  3.3312 -  -> rule option: ... this rule is appropriate for cancellation;
  3.3313 -		  there may be no such rule (if the term is canceled already.*)
  3.3314 -(* val thy = thy;
  3.3315 -   val Rrls {rew_ord=(_,ro),...} = cancel;
  3.3316 -   val ([rs],t) = (rss,f);
  3.3317 -   next_rule thy eval_rls ro [rs] t;(*eval fun next_rule ... before!*)
  3.3318 -
  3.3319 -   val (thy, [rs]) = (thy, revsets);
  3.3320 -   val Rrls {rew_ord=(_,ro),...} = cancel;
  3.3321 -   nex [rs] t;
  3.3322 -   *)
  3.3323  fun next_rule thy eval_rls ro [rs] t =
  3.3324      let val der = make_deriv thy eval_rls rs ro NONE t;
  3.3325 -    in case der of
  3.3326 -(* val (_,r,_)::_ = der;
  3.3327 -   *)
  3.3328 -	   (_,r,_)::_ => SOME r
  3.3329 -	 | _ => NONE
  3.3330 +    in 
  3.3331 +      case der of
  3.3332 +	      (_,r,_)::_ => SOME r
  3.3333 +	    | _ => NONE
  3.3334      end
  3.3335 -  | next_rule _ _ _ _ _ =
  3.3336 -    error ("next_rule: doesnt match rev-sets in istate");
  3.3337 +  | next_rule _ _ _ _ _ = error ("next_rule: doesnt match rev-sets in istate");
  3.3338  
  3.3339 -(*.val attach_form = f : rule list -> term -> term
  3.3340 -			 -> (rule * (term * term list)) list
  3.3341 -  checks an input term TI, if it may belong to a current cancellation, by
  3.3342 -  trying to derive it from the given term TG.
  3.3343 -arguments:
  3.3344 -  term   : TG, the last one in the cancellation agreed upon by user + math-eng
  3.3345 -  -> term: TI, the next one input by the user
  3.3346 -value:
  3.3347 -  -> (rule           : the rule to be applied in order to reach TI
  3.3348 -      * (term        : ... obtained by applying the rule ...
  3.3349 -         * term list): ... and the respective assumptions.
  3.3350 -      ) list         : there may be several such rules;
  3.3351 -                       the list is empty, if the users term does not belong
  3.3352 -		       to a cancellation of the term last agreed upon.*)
  3.3353 -fun attach_form (_:rule list list) (_:term) (_:term) = (*still missing*)
  3.3354 -    []:(rule * (term * term list)) list;
  3.3355 -
  3.3356 -(* if each pat* matches with the current term, the Rrls is applied
  3.3357 -   (there are no preconditions to be checked, they are @{term True}) *)
  3.3358  val pat0 = parse_patt thy "?r/?s+?u/?v :: real";
  3.3359  val pat1 = parse_patt thy "?r/?s+?u    :: real";
  3.3360  val pat2 = parse_patt thy "?r   +?u/?v :: real";
  3.3361 @@ -3291,98 +579,34 @@
  3.3362  	      ([@{term True}], pat2)];
  3.3363  in
  3.3364  
  3.3365 -(*11.02 schnelle L"osung f"ur RL: Bruch auch gek"urzt;
  3.3366 -  besser w"are: auf 1 gemeinsamen Bruchstrich, Nenner und Z"ahler unvereinfacht
  3.3367 -  dh. wie common_nominator_p_, aber auf 1 Bruchstrich*)
  3.3368 -val common_nominator_p =
  3.3369 -    Rrls {id = "common_nominator_p", prepat=prepat,
  3.3370 -	  rew_ord=("ord_make_polynomial",
  3.3371 -		   ord_make_polynomial false thy),
  3.3372 -	  erls = rational_erls,
  3.3373 -	  calc = [("PLUS"    ,("Groups.plus_class.plus"        ,eval_binop "#add_")),
  3.3374 -		  ("TIMES"   ,("Groups.times_class.times"        ,eval_binop "#mult_")),
  3.3375 -		  ("DIVIDE" ,("Fields.inverse_class.divide"  ,eval_cancel "#divide_e")),
  3.3376 -		  ("POWER"  ,("Atools.pow"  ,eval_binop "#power_"))],
  3.3377 -	  errpatts = [],
  3.3378 -	  scr=Rfuns {init_state  = init_state thy Atools_erls ro,
  3.3379 -		     normal_form = add_fraction_p_ thy, (*FIXME.WN0211*)
  3.3380 -		     locate_rule = locate_rule thy Atools_erls ro,
  3.3381 -		     next_rule   = next_rule thy Atools_erls ro,
  3.3382 -		     attach_form = attach_form}}
  3.3383 -end;(*local*)
  3.3384 +val add_fractions_p =
  3.3385 +  Rrls {id = "add_fractions_p", prepat=prepat,
  3.3386 +    rew_ord = ("ord_make_polynomial", ord_make_polynomial false thy),
  3.3387 +    erls = rational_erls,
  3.3388 +    calc = [("PLUS", ("Groups.plus_class.plus", eval_binop "#add_")),
  3.3389 +      ("TIMES", ("Groups.times_class.times", eval_binop "#mult_")),
  3.3390 +      ("DIVIDE", ("Fields.inverse_class.divide", eval_cancel "#divide_e")),
  3.3391 +      ("POWER", ("Atools.pow", eval_binop "#power_"))],
  3.3392 +    errpatts = [],
  3.3393 +    scr = Rfuns {init_state  = init_state thy Atools_erls ro,
  3.3394 +      normal_form = add_fraction_p_ thy,
  3.3395 +      locate_rule = locate_rule thy Atools_erls ro,
  3.3396 +      next_rule   = next_rule thy Atools_erls ro,
  3.3397 +      attach_form = attach_form}}
  3.3398 +end; (*local add_fractions_p *)
  3.3399 +*}
  3.3400  
  3.3401 -end; (*struct*)
  3.3402 +subsection {* Cancelling and adding all occurrences in a term /////////////////////////////*}
  3.3403 +ML {*
  3.3404 +(*copying cancel_p_rls + add her caused error in interface.sml*)
  3.3405 +*}
  3.3406  
  3.3407 -*}
  3.3408 +section {* Rulesets for general simplification *}
  3.3409  ML {* 
  3.3410 -open RationalI;
  3.3411 -(*##*)
  3.3412  
  3.3413 -(*.the expression contains + - * ^ / only ?.*)
  3.3414 -fun is_ratpolyexp (Free _) = true
  3.3415 -  | is_ratpolyexp (Const ("Groups.plus_class.plus",_) $ Free _ $ Free _) = true
  3.3416 -  | is_ratpolyexp (Const ("Groups.minus_class.minus",_) $ Free _ $ Free _) = true
  3.3417 -  | is_ratpolyexp (Const ("Groups.times_class.times",_) $ Free _ $ Free _) = true
  3.3418 -  | is_ratpolyexp (Const ("Atools.pow",_) $ Free _ $ Free _) = true
  3.3419 -  | is_ratpolyexp (Const ("Fields.inverse_class.divide",_) $ Free _ $ Free _) = true
  3.3420 -  | is_ratpolyexp (Const ("Groups.plus_class.plus",_) $ t1 $ t2) = 
  3.3421 -               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
  3.3422 -  | is_ratpolyexp (Const ("Groups.minus_class.minus",_) $ t1 $ t2) = 
  3.3423 -               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
  3.3424 -  | is_ratpolyexp (Const ("Groups.times_class.times",_) $ t1 $ t2) = 
  3.3425 -               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
  3.3426 -  | is_ratpolyexp (Const ("Atools.pow",_) $ t1 $ t2) = 
  3.3427 -               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
  3.3428 -  | is_ratpolyexp (Const ("Fields.inverse_class.divide",_) $ t1 $ t2) = 
  3.3429 -               ((is_ratpolyexp t1) andalso (is_ratpolyexp t2))
  3.3430 -  | is_ratpolyexp _ = false;
  3.3431 -
  3.3432 -(*("is_ratpolyexp", ("Rational.is'_ratpolyexp", eval_is_ratpolyexp ""))*)
  3.3433 -fun eval_is_ratpolyexp (thmid:string) _ 
  3.3434 -		       (t as (Const("Rational.is'_ratpolyexp", _) $ arg)) thy =
  3.3435 -    if is_ratpolyexp arg
  3.3436 -    then SOME (mk_thmid thmid "" (term_to_string''' thy arg) "", 
  3.3437 -	         Trueprop $ (mk_equality (t, @{term True})))
  3.3438 -    else SOME (mk_thmid thmid "" (term_to_string''' thy arg) "", 
  3.3439 -	         Trueprop $ (mk_equality (t, @{term False})))
  3.3440 -  | eval_is_ratpolyexp _ _ _ _ = NONE; 
  3.3441 -
  3.3442 -(*("get_denominator", ("Rational.get_denominator", eval_get_denominator ""))*)
  3.3443 -fun eval_get_denominator (thmid:string) _ 
  3.3444 -		      (t as Const ("Rational.get_denominator", _) $
  3.3445 -              (Const ("Fields.inverse_class.divide", _) $ num $
  3.3446 -                denom)) thy = 
  3.3447 -      SOME (mk_thmid thmid "" (term_to_string''' thy denom) "", 
  3.3448 -	            Trueprop $ (mk_equality (t, denom)))
  3.3449 -  | eval_get_denominator _ _ _ _ = NONE; 
  3.3450 -
  3.3451 -(*("get_numerator", ("Rational.get_numerator", eval_get_numerator ""))*)
  3.3452 -fun eval_get_numerator (thmid:string) _ 
  3.3453 -      (t as Const ("Rational.get_numerator", _) $
  3.3454 -          (Const ("Fields.inverse_class.divide", _) $num
  3.3455 -            $denom )) thy = 
  3.3456 -    SOME (mk_thmid thmid "" (term_to_string''' thy num) "", 
  3.3457 -	    Trueprop $ (mk_equality (t, num)))
  3.3458 -  | eval_get_numerator _ _ _ _ = NONE; 
  3.3459 -
  3.3460 -(*-------------------18.3.03 --> struct <-----------vvv--*)
  3.3461 +(*-------------------18.3.03 --> struct <-----------vvv--
  3.3462  val add_fractions_p = common_nominator_p; (*FIXXXME:eilig f"ur norm_Rational*)
  3.3463 -
  3.3464 -(*WN100906 removed in favour of discard_minus = discard_minus_ formerly 
  3.3465 -   discard binary minus, shift unary minus into -1*; 
  3.3466 -   unary minus before numerals are put into the numeral by parsing;
  3.3467 -   contains absolute minimum of thms for context in norm_Rational
  3.3468 -*** val discard_minus = prep_rls(
  3.3469 -  Rls {id = "discard_minus", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.3470 -      erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3471 -      rules =
  3.3472 -        [Thm ("real_diff_minus", num_str @{thm real_diff_minus}),
  3.3473 -	           (*"a - b = a + -1 * b"*)
  3.3474 -	         Thm ("sym_real_mult_minus1", num_str (@{thm real_mult_minus1} RS @{thm sym}))
  3.3475 -	           (*- ?z = "-1 * ?z"*)],
  3.3476 -      scr = EmptyScr
  3.3477 -      }):rls;
  3.3478 - *)
  3.3479 + -------------------18.3.03 --> struct <-----------vvv--*)
  3.3480  
  3.3481  (*erls for calculate_Rational; make local with FIXX@ME result:term *term list*)
  3.3482  val powers_erls = prep_rls(
  3.3483 @@ -3433,7 +657,7 @@
  3.3484  (*.contains absolute minimum of thms for context in norm_Rational.*)
  3.3485  val rat_mult_divide = prep_rls(
  3.3486    Rls {id = "rat_mult_divide", preconds = [], 
  3.3487 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3488 +      rew_ord = ("dummy_ord", dummy_ord), 
  3.3489        erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3490        rules = [Thm ("rat_mult",num_str @{thm rat_mult}),
  3.3491  	       (*(1)"?a / ?b * (?c / ?d) = ?a * ?c / (?b * ?d)"*)
  3.3492 @@ -3493,12 +717,11 @@
  3.3493        rules = [Calc ("Atools.is'_const",eval_const "#is_const_")
  3.3494  	       ], scr = EmptyScr}:rls);
  3.3495  
  3.3496 -(*.consists of rls containing the absolute minimum of thms.*)
  3.3497 +(* consists of rls containing the absolute minimum of thms *)
  3.3498  (*040209: this version has been used by RL for his equations,
  3.3499 -which is now replaced by MGs version below
  3.3500 -vvv OLD VERSION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
  3.3501 -val norm_Rational = prep_rls(
  3.3502 -  Rls {id = "norm_Rational", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.3503 +which is now replaced by MGs version "norm_Rational" below *)
  3.3504 +val norm_Rational_min = prep_rls(
  3.3505 +  Rls {id = "norm_Rational_min", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.3506        erls = norm_rat_erls, srls = Erls, calc = [], errpatts = [],
  3.3507        rules = [(*sequence given by operator precedence*)
  3.3508  	       Rls_ discard_minus,
  3.3509 @@ -3506,7 +729,6 @@
  3.3510  	       Rls_ rat_mult_divide,
  3.3511  	       Rls_ expand,
  3.3512  	       Rls_ reduce_0_1_2,
  3.3513 -	       (*^^^^^^^^^ from RL -- not the latest one vvvvvvvvv*)
  3.3514  	       Rls_ order_add_mult,
  3.3515  	       Rls_ collect_numerals,
  3.3516  	       Rls_ add_fractions_p,
  3.3517 @@ -3519,7 +741,7 @@
  3.3518         rew_ord = ("dummy_ord", dummy_ord),
  3.3519        erls = Atools_erls, srls = Erls,
  3.3520        calc = [], errpatts = [],
  3.3521 -      rules = [Rls_  norm_Rational, (*from RL -- not the latest one*)
  3.3522 +      rules = [Rls_  norm_Rational_min,
  3.3523  	       Rls_ discard_parentheses
  3.3524  	       ],
  3.3525        scr = EmptyScr}:rls);      
  3.3526 @@ -3543,149 +765,108 @@
  3.3527  		 (*"?a - ?b + ?b = ?a"*)
  3.3528  		 Thm ("divide_minus1",num_str @{thm divide_minus1})
  3.3529  		 (*"?x / -1 = - ?x"*)
  3.3530 -(*
  3.3531 -,
  3.3532 -		 Thm ("",num_str @{thm })
  3.3533 -*)
  3.3534  		 ]);
  3.3535  *}
  3.3536  ML {* 
  3.3537 +val add_fractions_p_rls = prep_rls(
  3.3538 +  Rls {id = "add_fractions_p_rls", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
  3.3539 +	  erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3540 +	  rules = [Rls_ add_fractions_p], 
  3.3541 +	  scr = EmptyScr});
  3.3542  
  3.3543 -(*---------vvv-------------MG ab 1.07.2003--------------vvv-----------*)
  3.3544 -
  3.3545 -(* ------------------------------------------------------------------ *)
  3.3546 -(*                  Simplifier für beliebige Buchterme                *) 
  3.3547 -(* ------------------------------------------------------------------ *)
  3.3548 -(*----------------------- norm_Rational_mg ---------------------------*)
  3.3549 -(*. description of the simplifier see MG-DA.p.56ff .*)
  3.3550 -(* ------------------------------------------------------------------- *)
  3.3551 -val common_nominator_p_rls = prep_rls(
  3.3552 -  Rls {id = "common_nominator_p_rls", preconds = [],
  3.3553 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3554 -	 erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3555 -	 rules = 
  3.3556 -	 [Rls_ common_nominator_p
  3.3557 -	  (*FIXME.WN0401 ? redesign Rrls - use exhaustively on a term ?
  3.3558 -	    FIXME.WN0510 unnecessary nesting: introduce RRls_ : rls -> rule*)
  3.3559 -	  ], 
  3.3560 -	 scr = EmptyScr});
  3.3561 -(* ------------------------------------------------------------------- *)
  3.3562  (* "Rls" causes repeated application of cancel_p to one and the same term *)
  3.3563  val cancel_p_rls = prep_rls(
  3.3564    Rls 
  3.3565      {id = "cancel_p_rls", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
  3.3566      erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3567 -    rules = 
  3.3568 -      [Rls_ cancel_p (*FIXME.WN.0401 ? redesign Rrls - use exhaustively on a term ?*)
  3.3569 -      ], 
  3.3570 +    rules = [Rls_ cancel_p], 
  3.3571  	  scr = EmptyScr});
  3.3572 -(* -------------------------------------------------------------------- *)
  3.3573 +
  3.3574  (*. makes 'normal' fractions; 'is_polyexp' inhibits double fractions;
  3.3575      used in initial part norm_Rational_mg, see example DA-M02-main.p.60.*)
  3.3576  val rat_mult_poly = prep_rls(
  3.3577 -  Rls {id = "rat_mult_poly", preconds = [],
  3.3578 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3579 -	 erls =  append_rls "e_rls-is_polyexp" e_rls
  3.3580 -	         [Calc ("Poly.is'_polyexp", eval_is_polyexp "")], 
  3.3581 -	 srls = Erls, calc = [], errpatts = [],
  3.3582 -	 rules = 
  3.3583 -	 [Thm ("rat_mult_poly_l",num_str @{thm rat_mult_poly_l}),
  3.3584 -	  (*"?c is_polyexp ==> ?c * (?a / ?b) = ?c * ?a / ?b"*)
  3.3585 -	  Thm ("rat_mult_poly_r",num_str @{thm rat_mult_poly_r})
  3.3586 -	  (*"?c is_polyexp ==> ?a / ?b * ?c = ?a * ?c / ?b"*)
  3.3587 -	  ], 
  3.3588 -	 scr = EmptyScr});
  3.3589 +  Rls {id = "rat_mult_poly", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
  3.3590 +	  erls = append_rls "e_rls-is_polyexp" e_rls [Calc ("Poly.is'_polyexp", eval_is_polyexp "")], 
  3.3591 +	  srls = Erls, calc = [], errpatts = [],
  3.3592 +	  rules = 
  3.3593 +	    [Thm ("rat_mult_poly_l",num_str @{thm rat_mult_poly_l}),
  3.3594 +	    (*"?c is_polyexp ==> ?c * (?a / ?b) = ?c * ?a / ?b"*)
  3.3595 +	    Thm ("rat_mult_poly_r",num_str @{thm rat_mult_poly_r})
  3.3596 +	    (*"?c is_polyexp ==> ?a / ?b * ?c = ?a * ?c / ?b"*) ], 
  3.3597 +	  scr = EmptyScr});
  3.3598  
  3.3599 -(* ------------------------------------------------------------------ *)
  3.3600  (*. makes 'normal' fractions; 'is_polyexp' inhibits double fractions;
  3.3601      used in looping part norm_Rational_rls, see example DA-M02-main.p.60 
  3.3602      .. WHERE THE LATTER DOES ALWAYS WORK, BECAUSE erls = e_rls, 
  3.3603      I.E. THE RESPECTIVE ASSUMPTION IS STORED AND Thm APPLIED; WN051028 
  3.3604      ... WN0609???MG.*)
  3.3605  val rat_mult_div_pow = prep_rls(
  3.3606 -  Rls {id = "rat_mult_div_pow", preconds = [], 
  3.3607 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3608 -       erls = e_rls,
  3.3609 -       (*FIXME.WN051028 append_rls "e_rls-is_polyexp" e_rls
  3.3610 -			[Calc ("Poly.is'_polyexp", eval_is_polyexp "")],
  3.3611 -         with this correction ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ we get 
  3.3612 -	 error "rational.sml.sml: diff.behav. in norm_Rational_mg 29" etc.
  3.3613 -         thus we decided to go on with this flaw*)
  3.3614 -		 srls = Erls, calc = [], errpatts = [],
  3.3615 -      rules = [Thm ("rat_mult",num_str @{thm rat_mult}),
  3.3616 -	       (*"?a / ?b * (?c / ?d) = ?a * ?c / (?b * ?d)"*)
  3.3617 -	       Thm ("rat_mult_poly_l",num_str @{thm rat_mult_poly_l}),
  3.3618 -	       (*"?c is_polyexp ==> ?c * (?a / ?b) = ?c * ?a / ?b"*)
  3.3619 -	       Thm ("rat_mult_poly_r",num_str @{thm rat_mult_poly_r}),
  3.3620 -	       (*"?c is_polyexp ==> ?a / ?b * ?c = ?a * ?c / ?b"*)
  3.3621 +  Rls {id = "rat_mult_div_pow", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.3622 +    erls = e_rls, srls = Erls, calc = [], errpatts = [],
  3.3623 +    rules = [Thm ("rat_mult", num_str @{thm rat_mult}),
  3.3624 +      (*"?a / ?b * (?c / ?d) = ?a * ?c / (?b * ?d)"*)
  3.3625 +      Thm ("rat_mult_poly_l", num_str @{thm rat_mult_poly_l}),
  3.3626 +      (*"?c is_polyexp ==> ?c * (?a / ?b) = ?c * ?a / ?b"*)
  3.3627 +      Thm ("rat_mult_poly_r", num_str @{thm rat_mult_poly_r}),
  3.3628 +      (*"?c is_polyexp ==> ?a / ?b * ?c = ?a * ?c / ?b"*)
  3.3629 +      
  3.3630 +      Thm ("real_divide_divide1_mg", num_str @{thm real_divide_divide1_mg}),
  3.3631 +      (*"y ~= 0 ==> (u / v) / (y / z) = (u * z) / (y * v)"*)
  3.3632 +      Thm ("divide_divide_eq_right", num_str @{thm divide_divide_eq_right}),
  3.3633 +      (*"?x / (?y / ?z) = ?x * ?z / ?y"*)
  3.3634 +      Thm ("divide_divide_eq_left", num_str @{thm divide_divide_eq_left}),
  3.3635 +      (*"?x / ?y / ?z = ?x / (?y * ?z)"*)
  3.3636 +      Calc ("Fields.inverse_class.divide", eval_cancel "#divide_e"),
  3.3637 +      
  3.3638 +      Thm ("rat_power", num_str @{thm rat_power})
  3.3639 +      (*"(?a / ?b) ^^^ ?n = ?a ^^^ ?n / ?b ^^^ ?n"*)
  3.3640 +      ],
  3.3641 +    scr = EmptyScr}:rls);
  3.3642  
  3.3643 -	       Thm ("real_divide_divide1_mg",
  3.3644 -                     num_str @{thm real_divide_divide1_mg}),
  3.3645 -	       (*"y ~= 0 ==> (u / v) / (y / z) = (u * z) / (y * v)"*)
  3.3646 -	       Thm ("divide_divide_eq_right",
  3.3647 -                     num_str @{thm divide_divide_eq_right}),
  3.3648 -	       (*"?x / (?y / ?z) = ?x * ?z / ?y"*)
  3.3649 -	       Thm ("divide_divide_eq_left",
  3.3650 -                     num_str @{thm divide_divide_eq_left}),
  3.3651 -	       (*"?x / ?y / ?z = ?x / (?y * ?z)"*)
  3.3652 -	       Calc ("Fields.inverse_class.divide"  ,eval_cancel "#divide_e"),
  3.3653 -	      
  3.3654 -	       Thm ("rat_power", num_str @{thm rat_power})
  3.3655 -		(*"(?a / ?b) ^^^ ?n = ?a ^^^ ?n / ?b ^^^ ?n"*)
  3.3656 -	       ],
  3.3657 -      scr = EmptyScr}:rls);
  3.3658 -(* ------------------------------------------------------------------ *)
  3.3659  val rat_reduce_1 = prep_rls(
  3.3660 -  Rls {id = "rat_reduce_1", preconds = [], 
  3.3661 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3662 -       erls = e_rls, srls = Erls, calc = [], errpatts = [], 
  3.3663 -       rules = [Thm ("divide_1",num_str @{thm divide_1}),
  3.3664 -		(*"?x / 1 = ?x"*)
  3.3665 -		Thm ("mult_1_left",num_str @{thm mult_1_left})           
  3.3666 -		(*"1 * z = z"*)
  3.3667 -		],
  3.3668 -       scr = EmptyScr}:rls);
  3.3669 -(* ------------------------------------------------------------------ *)
  3.3670 -(*. looping part of norm_Rational(*_mg*) .*)
  3.3671 -val norm_Rational_rls = prep_rls(
  3.3672 -   Rls {id = "norm_Rational_rls", preconds = [], 
  3.3673 -       rew_ord = ("dummy_ord",dummy_ord), 
  3.3674 -       erls = norm_rat_erls, srls = Erls, calc = [], errpatts = [],
  3.3675 -       rules = [Rls_ common_nominator_p_rls,
  3.3676 -		Rls_ rat_mult_div_pow,
  3.3677 -		Rls_ make_rat_poly_with_parentheses,
  3.3678 -		Rls_ cancel_p_rls,(*FIXME:cancel_p does NOT order sometimes*)
  3.3679 -		Rls_ rat_reduce_1
  3.3680 -		],
  3.3681 -       scr = EmptyScr}:rls);
  3.3682 -(* ------------------------------------------------------------------ *)
  3.3683 -(*040109 'norm_Rational'(by RL) replaced by 'norm_Rational_mg'(MG)
  3.3684 - just be renaming:*)
  3.3685 -val norm_Rational (*_mg*) = prep_rls(
  3.3686 +  Rls {id = "rat_reduce_1", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
  3.3687 +    erls = e_rls, srls = Erls, calc = [], errpatts = [], 
  3.3688 +    rules = 
  3.3689 +      [Thm ("divide_1", num_str @{thm divide_1}),
  3.3690 +      (*"?x / 1 = ?x"*)
  3.3691 +      Thm ("mult_1_left", num_str @{thm mult_1_left})           
  3.3692 +      (*"1 * z = z"*)
  3.3693 +      ],
  3.3694 +    scr = EmptyScr}:rls);
  3.3695 +
  3.3696 +(* looping part of norm_Rational *)
  3.3697 +val norm_Rational_rls = prep_rls (
  3.3698 +  Rls {id = "norm_Rational_rls", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
  3.3699 +    erls = norm_rat_erls, srls = Erls, calc = [], errpatts = [],
  3.3700 +    rules = [Rls_ add_fractions_p_rls,
  3.3701 +      Rls_ rat_mult_div_pow,
  3.3702 +      Rls_ make_rat_poly_with_parentheses,
  3.3703 +      Rls_ cancel_p_rls,
  3.3704 +      Rls_ rat_reduce_1
  3.3705 +      ],
  3.3706 +    scr = EmptyScr}:rls);
  3.3707 +
  3.3708 +val norm_Rational = prep_rls (
  3.3709    Seq 
  3.3710 -    {id = "norm_Rational"(*_mg*), preconds = [], 
  3.3711 -    rew_ord = ("dummy_ord",dummy_ord), 
  3.3712 +    {id = "norm_Rational", preconds = [], rew_ord = ("dummy_ord", dummy_ord), 
  3.3713      erls = norm_rat_erls, srls = Erls, calc = [], errpatts = [],
  3.3714      rules = [Rls_ discard_minus,
  3.3715 -      Rls_ rat_mult_poly,          (* removes double fractions like a/b/c    *)
  3.3716 -      Rls_ make_rat_poly_with_parentheses,           (*WN0510 also in(#)below*)
  3.3717 -      Rls_ cancel_p_rls,           (*FIXME.MG:cancel_p does NOT order sometim*)
  3.3718 -      Rls_ norm_Rational_rls,             (* the main rls, looping (#)       *)
  3.3719 -      Rls_ discard_parentheses1           (* mult only                       *)
  3.3720 +      Rls_ rat_mult_poly,             (* removes double fractions like a/b/c *)
  3.3721 +      Rls_ make_rat_poly_with_parentheses,
  3.3722 +      Rls_ cancel_p_rls,
  3.3723 +      Rls_ norm_Rational_rls,         (* the main rls, looping (#) *)
  3.3724 +      Rls_ discard_parentheses1       (* mult only *)
  3.3725        ],
  3.3726      scr = EmptyScr}:rls);
  3.3727 -"-------- rls norm_Rational --------------------------------------------------";
  3.3728 -(* ------------------------------------------------------------------ *)
  3.3729 -
  3.3730  *}
  3.3731 -ML {* 
  3.3732 +ML {*
  3.3733  ruleset' := overwritelthy @{theory} (!ruleset',
  3.3734    [("calculate_Rational", calculate_Rational),
  3.3735     ("calc_rat_erls",calc_rat_erls),
  3.3736     ("rational_erls", rational_erls),
  3.3737     ("cancel_p", cancel_p),
  3.3738 -   ("common_nominator_p", common_nominator_p),
  3.3739 -   ("common_nominator_p_rls", common_nominator_p_rls),
  3.3740 +   ("add_fractions_p", add_fractions_p),
  3.3741 +   ("add_fractions_p_rls", add_fractions_p_rls),
  3.3742     (*WN120410 ("discard_minus", discard_minus), is defined in Poly.thy*)
  3.3743     ("powers_erls", powers_erls),
  3.3744     ("powers", powers),
  3.3745 @@ -3701,12 +882,10 @@
  3.3746     ("cancel_p_rls", cancel_p_rls)
  3.3747     ]);
  3.3748  
  3.3749 -calclist':= overwritel (!calclist', 
  3.3750 -   [("is_expanded", ("Rational.is'_expanded", eval_is_expanded ""))
  3.3751 -    ]);
  3.3752 +*}
  3.3753  
  3.3754 -(** problems **)
  3.3755 -
  3.3756 +section {* A problem for simplification of rationals *}
  3.3757 +ML {*
  3.3758  store_pbt
  3.3759   (prep_pbt thy "pbl_simp_rat" [] e_pblID
  3.3760   (["rational","simplification"],
  3.3761 @@ -3717,9 +896,10 @@
  3.3762    append_rls "e_rls" e_rls [(*for preds in where_*)], 
  3.3763    SOME "Simplify t_t", 
  3.3764    [["simplification","of_rationals"]]));
  3.3765 +*}
  3.3766  
  3.3767 -(** methods **)
  3.3768 -
  3.3769 +section {* A methods for simplification of rationals *}
  3.3770 +ML {*
  3.3771  (*WN061025 this methods script is copied from (auto-generated) script
  3.3772    of norm_Rational in order to ease repair on inform*)
  3.3773  store_met (prep_met thy "met_simp_rat" [] e_metID (["simplification","of_rationals"],
  3.3774 @@ -3737,14 +917,13 @@
  3.3775     "    Try (Rewrite_Set make_rat_poly_with_parentheses False) @@   " ^
  3.3776     "    Try (Rewrite_Set cancel_p_rls False) @@                     " ^
  3.3777     "    (Repeat                                                     " ^
  3.3778 -   "     ((Try (Rewrite_Set common_nominator_p_rls False) @@        " ^
  3.3779 +   "     ((Try (Rewrite_Set add_fractions_p_rls False) @@        " ^
  3.3780     "       Try (Rewrite_Set rat_mult_div_pow False) @@              " ^
  3.3781     "       Try (Rewrite_Set make_rat_poly_with_parentheses False) @@" ^
  3.3782     "       Try (Rewrite_Set cancel_p_rls False) @@                  " ^
  3.3783     "       Try (Rewrite_Set rat_reduce_1 False)))) @@               " ^
  3.3784     "    Try (Rewrite_Set discard_parentheses1 False))               " ^
  3.3785     "   t_t)"));
  3.3786 +*}
  3.3787  
  3.3788 -*}
  3.3789 -ML {*"test"*}
  3.3790 -end (* theory*)
  3.3791 +end
     4.1 --- a/src/Tools/isac/Knowledge/Test.thy	Mon Sep 16 11:28:43 2013 +0200
     4.2 +++ b/src/Tools/isac/Knowledge/Test.thy	Mon Sep 16 12:20:00 2013 +0200
     4.3 @@ -585,7 +585,7 @@
     4.4  ML {*
     4.5  (** methods **)
     4.6  store_met
     4.7 - (prep_met (Thy_Info.get_theory "Diff") "met_test" [] e_metID
     4.8 + (prep_met @{theory "Diff"} "met_test" [] e_metID
     4.9   (["Test"],
    4.10     [],
    4.11     {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
    4.12 @@ -628,7 +628,6 @@
    4.13  
    4.14  *}
    4.15  ML {*
    4.16 -
    4.17  ruleset' := overwritelthy @{theory} (!ruleset',
    4.18    [("norm_equation", prep_rls norm_equation),
    4.19     ("ac_plus_times", prep_rls ac_plus_times),
    4.20 @@ -1320,7 +1319,7 @@
    4.21  
    4.22  val make_polytest =
    4.23    Rls{id = "make_polytest", preconds = []:term list, 
    4.24 -      rew_ord = ("ord_make_polytest", ord_make_polytest false (Thy_Info.get_theory "Poly")),
    4.25 +      rew_ord = ("ord_make_polytest", ord_make_polytest false @{theory "Poly"}),
    4.26        erls = testerls, srls = Erls,
    4.27        calc = [("PLUS"  , ("Groups.plus_class.plus", eval_binop "#add_")), 
    4.28  	      ("TIMES" , ("Groups.times_class.times", eval_binop "#mult_")),
     5.1 --- a/src/Tools/isac/ProgLang/rewrite.sml	Mon Sep 16 11:28:43 2013 +0200
     5.2 +++ b/src/Tools/isac/ProgLang/rewrite.sml	Mon Sep 16 12:20:00 2013 +0200
     5.3 @@ -214,9 +214,7 @@
     5.4          in scan_ chk prepat end;
     5.5      (* apply the normal_form of a rev-set *)
     5.6      fun app_rev' thy (Rrls {erls, prepat, scr = Rfuns {normal_form, ...}, ...}) t =
     5.7 -      if chk_prepat thy erls prepat t
     5.8 -      then ((*tracing("### app_rev': t = "^(term2str t));*) normal_form t)
     5.9 -      else NONE;
    5.10 +      if chk_prepat thy erls prepat t then normal_form t else NONE;
    5.11      val opt = app_rev' thy rrls t
    5.12    in
    5.13      case opt of
     6.1 --- a/src/Tools/isac/ProgLang/termC.sml	Mon Sep 16 11:28:43 2013 +0200
     6.2 +++ b/src/Tools/isac/ProgLang/termC.sml	Mon Sep 16 12:20:00 2013 +0200
     6.3 @@ -260,12 +260,12 @@
     6.4    | is_bdv_subst _ = false;
     6.5  
     6.6  fun free2str (Free (s,_)) = s
     6.7 -  | free2str t = error ("free2str not for "^ term2str t);
     6.8 +  | free2str t = error ("free2str not for " ^ term2str t);
     6.9  fun str_of_free_opt (Free (s,_)) = SOME s
    6.10    | str_of_free_opt _ = NONE
    6.11  fun free2int (t as Free (s, _)) = ((str2int s)
    6.12 -    handle _ => error ("free2int: "^term_detail2str t))
    6.13 -  | free2int t = error ("free2int: "^term_detail2str t);
    6.14 +    handle _ => error ("free2int: " ^ term_detail2str t))
    6.15 +  | free2int t = error ("free2int: " ^ term_detail2str t);
    6.16  
    6.17  (*compare Logic.unvarify_global, which rejects Free*)
    6.18  fun var2free (t as Const(s,T)) = t
     7.1 --- a/test/Tools/isac/Interpret/inform.sml	Mon Sep 16 11:28:43 2013 +0200
     7.2 +++ b/test/Tools/isac/Interpret/inform.sml	Mon Sep 16 12:20:00 2013 +0200
     7.3 @@ -493,35 +493,132 @@
     7.4  "--------- inform [rational,simplification] ----------------------";
     7.5  "--------- inform [rational,simplification] ----------------------";
     7.6  "--------- inform [rational,simplification] ----------------------";
     7.7 -states:=[];
     7.8 -CalcTree [(["Term (4/x - 3/y - 1)", "normalform N"],
     7.9 -	   ("Rational",["rational","simplification"],
    7.10 -	    ["simplification","of_rationals"]))];
    7.11 +states := [];
    7.12 +CalcTree [(["Term (a * x / (b * x) + c * x / (d * x) + e / f)", "normalform N"],
    7.13 +	("Rational", ["rational", "simplification"], ["simplification", "of_rationals"]))];
    7.14  Iterator 1; moveActiveRoot 1;
    7.15  autoCalculate 1 CompleteCalcHead;
    7.16 +
    7.17 +"--- (-1) give a preview on the calculation without any input";
    7.18 +(*
    7.19 +autoCalculate 1 CompleteCalc;
    7.20 +val ((pt, p), _) = get_calc 1;
    7.21 +show_pt pt;
    7.22 +[
    7.23 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
    7.24 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
    7.25 +(([1], Res), a / b + c / d + e / f),                             <--- (1) input arbitrary
    7.26 +(([2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
    7.27 +(([3], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))),
    7.28 +(([4], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f)), <--- (2) input next
    7.29 +(([], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f))]  <--- (3) is also final result
    7.30 +                                                                          EXAMPLE NOT OPTIMAL
    7.31 +*)
    7.32 +"--- (0) user input as the *first* step does not work, thus impdo at least 1 step";
    7.33  autoCalculate 1 (Step 1);
    7.34  autoCalculate 1 (Step 1);
    7.35 -autoCalculate 1 (Step 1);
    7.36 -autoCalculate 1 (Step 1);
    7.37 -"--- input the next formula that _should_ be presented by mat-engine";
    7.38 -appendFormula 1 "(4 * y + -3 * x) / (x * y) + -1";
    7.39 +val ((pt, p), _) = get_calc 1;
    7.40 +(*show_pt pt;
    7.41 +[
    7.42 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
    7.43 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
    7.44 +(([1], Res), a / b + c / d + e / f)] 
    7.45 +*)
    7.46 +"--- (1) input an arbitrary next formula";
    7.47 +appendFormula 1 "((a * d) + (c * b)) / (b * d) + e / f";
    7.48 +val ((pt, p), _) = get_calc 1;
    7.49 +(*show_pt pt;
    7.50 +[
    7.51 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
    7.52 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
    7.53 +(([1], Res), a / b + c / d + e / f),
    7.54 +(([2,1], Frm), a / b + c / d + e / f),
    7.55 +(([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
    7.56 +(([2,2], Res), (a * d + c * b) / (b * d) + e / f),
    7.57 +(([2], Res), (a * d + c * b) / (b * d) + e / f)] 
    7.58 +*)
    7.59  val ((pt,p),_) = get_calc 1;
    7.60 -if p = ([4], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then ()
    7.61 +if p = ([2], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then ()
    7.62  else error ("inform.sml: [rational,simplification] 1");
    7.63  
    7.64 -"--- input the next formula that would be presented by mat-engine";
    7.65 -(*autoCalculate 1 (Step 1);*)
    7.66 -appendFormula 1 "(4 * y + -3 * x + -1 * (x * y)) / (x * y)";
    7.67 -val ((pt,p),_) = get_calc 1;
    7.68 -if p = ([5], Res) andalso (length o children o (get_nd pt)) (fst p) = 0 then ()
    7.69 +"--- (2) input the next formula that would be presented by mat-engine";
    7.70 +(* generate a preview:
    7.71 +autoCalculate 1 (Step 1);
    7.72 +val ((pt, p), _) = get_calc 1;
    7.73 +show_pt pt;
    7.74 +[
    7.75 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
    7.76 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
    7.77 +(([1], Res), a / b + c / d + e / f),
    7.78 +(([2,1], Frm), a / b + c / d + e / f),
    7.79 +(([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
    7.80 +(([2,2], Res), (a * d + c * b) / (b * d) + e / f),
    7.81 +(([2], Res), (a * d + c * b) / (b * d) + e / f),
    7.82 +(([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))]   <--- input this
    7.83 +*)
    7.84 +appendFormula 1 "(b * d * e + b * c * f + a * d * f) / (b * d * f)";
    7.85 +val ((pt, p), _) = get_calc 1;
    7.86 +(*show_pt pt;
    7.87 +[
    7.88 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
    7.89 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
    7.90 +(([1], Res), a / b + c / d + e / f),
    7.91 +(([2,1], Frm), a / b + c / d + e / f),
    7.92 +(([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
    7.93 +(([2,2], Res), (a * d + c * b) / (b * d) + e / f),
    7.94 +(([2], Res), (a * d + c * b) / (b * d) + e / f),
    7.95 +(([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))] 
    7.96 +*)
    7.97 +if p = ([3], Res) andalso (length o children o (get_nd pt)) (fst p) = 0 then ()
    7.98  else error ("inform.sml: [rational,simplification] 2");
    7.99  
   7.100 -"--- input the exact final result";(*TODO: Exception- LIST "last_elem" raised*)
   7.101 -appendFormula 1 "(-3 * x + 4 * y + -1 * x * y) / (x * y)";
   7.102 -val ((pt,p),_) = get_calc 1;
   7.103 -if p = ([6], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then ()
   7.104 +"--- (3) input the exact final result";
   7.105 +appendFormula 1 "(b * d * e + b * c * f + a * d * f) / (b * d * f)";
   7.106 +val ((pt, p), _) = get_calc 1;
   7.107 +(*show_pt pt;
   7.108 +[
   7.109 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
   7.110 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
   7.111 +(([1], Res), a / b + c / d + e / f),
   7.112 +(([2,1], Frm), a / b + c / d + e / f),
   7.113 +(([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.114 +(([2,2], Res), (a * d + c * b) / (b * d) + e / f),
   7.115 +(([2], Res), (a * d + c * b) / (b * d) + e / f),
   7.116 +(([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.117 +(([4,1], Frm), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.118 +(([4,1], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))),
   7.119 +(([4,2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.120 +(([4], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))] 
   7.121 +*)
   7.122 +if p = ([4], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then ()
   7.123  else error ("inform.sml: [rational,simplification] 3");
   7.124 -show_pt pt;
   7.125 +
   7.126 +"--- (4) finish the calculation + check the postcondition (in the future)";
   7.127 +autoCalculate 1 CompleteCalc;
   7.128 +val ((pt, p), _) = get_calc 1;
   7.129 +val (t, asm) = get_obj g_result pt [];
   7.130 +if term2str t = "(a * d * f + b * c * f + b * d * e) / (b * d * f)" andalso
   7.131 +terms2str asm = "[\"b * d * f ~= 0\",\"d ~= 0\",\"b ~= 0\"," ^
   7.132 +  "\"a * x / (b * x) + c * x / (d * x) + e / f is_ratpolyexp\"]"
   7.133 +then () else error "inform [rational,simplification] changed at end";
   7.134 +(*show_pt pt;
   7.135 +[
   7.136 +(([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)),
   7.137 +(([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f),
   7.138 +(([1], Res), a / b + c / d + e / f),
   7.139 +(([2,1], Frm), a / b + c / d + e / f),
   7.140 +(([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.141 +(([2,2], Res), (a * d + c * b) / (b * d) + e / f),
   7.142 +(([2], Res), (a * d + c * b) / (b * d) + e / f),
   7.143 +(([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.144 +(([4,1], Frm), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.145 +(([4,1], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))),
   7.146 +(([4,2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.147 +(([4], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)),
   7.148 +(([5], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))),
   7.149 +(([6], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f)),
   7.150 +(([], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f))] 
   7.151 +*)
   7.152  
   7.153  "--------- Take as 1st tac, start with <NEW> (CAS input) ---------";
   7.154  "--------- Take as 1st tac, start with <NEW> (CAS input) ---------";
     8.1 --- a/test/Tools/isac/Interpret/solve.sml	Mon Sep 16 11:28:43 2013 +0200
     8.2 +++ b/test/Tools/isac/Interpret/solve.sml	Mon Sep 16 12:20:00 2013 +0200
     8.3 @@ -17,7 +17,7 @@
     8.4  "-----------------------------------------------------------------";
     8.5  "--------- interSteps on norm_Rational ---------------------------";
     8.6  (*---vvv NOT working after meNEW.04mmdd*)
     8.7 -"###### val intermediate_ptyps = !ptyps;val intermediate_mets = !mets";
     8.8 +"###### val intermediate_ptyps = !ptyps; val intermediate_mets = !mets";
     8.9  "--------- prepare pbl, met --------------------------------------";
    8.10  "-------- cancel, without detail ------------------------------";
    8.11  "-------- cancel, detail rev-rew (cancel) afterwards ----------";
    8.12 @@ -30,7 +30,7 @@
    8.13  "------ interSteps after appendFormula ---------------------------";
    8.14  (*---vvv not brought to work 0403*)
    8.15  "------ Detail_Set -----------------------------------------------";
    8.16 -"###### ptyps:= intermediate_ptyps;met:= intermediate_mets;#######";
    8.17 +"###### ptyps:= intermediate_ptyps; met:= intermediate_mets;#######";
    8.18  "-----------------------------------------------------------------";
    8.19  "-----------------------------------------------------------------";
    8.20  "-----------------------------------------------------------------";
    8.21 @@ -39,52 +39,30 @@
    8.22  "--------- interSteps on norm_Rational ---------------------------";
    8.23  "--------- interSteps on norm_Rational ---------------------------";
    8.24  "--------- interSteps on norm_Rational ---------------------------";
    8.25 - states:=[];(*exp_IsacCore_Simp_Rat_Double_No-7.xml*)
    8.26 - CalcTree [(["Term ((2/(x+3) + 2/(x - 3)) / (8*x/(x^2 - 9)))","normalform N"],
    8.27 -	    ("Rational", 
    8.28 -	     ["rational","simplification"],
    8.29 -	     ["simplification","of_rationals"]))];
    8.30 - moveActiveRoot 1;
    8.31 - autoCalculate 1 CompleteCalc; 
    8.32 - val ((pt,_),_) = get_calc 1; show_pt pt;
    8.33 -
    8.34 -(*with "Script SimplifyScript (t_::real) =       -----------------
    8.35 -       \  ((Rewrite_Set norm_Rational False) t_)"
    8.36 -case pt of Nd (PblObj _, [Nd _]) => ((*met only applies norm_Rational*))
    8.37 -	 | _ => error  "solve.sml: interSteps on norm_Rational 1";
    8.38 -interSteps 1 ([1], Res);
    8.39 -getFormulaeFromTo 1 ([1], Frm) ([1,12], Res) 99999 false;
    8.40 -interSteps 1 ([1,3], Res);
    8.41 -
    8.42 -getTactic 1 ([1,4], Res)  (*here get the tactic, and ...*);
    8.43 -interSteps 1 ([1,5], Res) (*... here get the intermediate steps above*);
    8.44 -
    8.45 -getTactic 1 ([1,5,1], Frm);
    8.46 -val ((pt,_),_) = get_calc 1; show_pt pt;
    8.47 -
    8.48 -getTactic 1 ([1,8], Res) (*Rewrite_Set "common_nominator_p" *);
    8.49 -interSteps 1 ([1,9], Res)(*TODO.WN060606 reverse rew*);
    8.50 ---------------------------------------------------------------------*)
    8.51 -
    8.52 +states := []; (*exp_IsacCore_Simp_Rat_Double_No-7.xml*)
    8.53 +CalcTree [(["Term ((2/(x+3) + 2/(x - 3)) / (8*x/(x^2 - 9)))", "normalform N"],
    8.54 +	("Rational", ["rational","simplification"], ["simplification","of_rationals"]))];
    8.55 +moveActiveRoot 1;
    8.56 +autoCalculate 1 CompleteCalc; 
    8.57 +val ((pt, _), _) = get_calc 1; show_pt pt;
    8.58  case pt of Nd (PblObj _, [Nd _, Nd _, Nd _, Nd _, Nd _, Nd _]) => ()
    8.59  	 | _ => error  "solve.sml: interSteps on norm_Rational 1";
    8.60 -(*these have been done now by the script ^^^ immediately...
    8.61 -interSteps 1 ([1], Res);
    8.62 -getFormulaeFromTo 1 ([1], Frm) ([1,12], Res) 99999 false;
    8.63 -*)
    8.64  interSteps 1 ([6], Res);
    8.65  
    8.66  getTactic 1 ([6,1], Frm)  (*here get the tactic, and ...*);
    8.67  interSteps 1 ([6,1], Res) (*... here get the intermediate steps above*);
    8.68  
    8.69 -getTactic 1 ([3,4,1], Frm);
    8.70 +getTactic 1 ([6,1,1], Frm); (*WN130909 <ERROR> syserror in getTactic </ERROR>*)
    8.71  val ((pt,_),_) = get_calc 1; show_pt pt;
    8.72  val (Form form, SOME tac, asm) = pt_extract (pt, ([6], Res));
    8.73  case (term2str form, tac, terms2strs asm) of
    8.74 -    ("1 / 2", Check_Postcond ["rational", "simplification"], 
    8.75 -     ["-36 * x + 4 * x ^^^ 3 ~= 0"]) => ()
    8.76 +    ("1 / 2", Check_Postcond ["rational", "simplification"], []) => ()
    8.77    | _ => error "solve.sml: interSteps on norm_Rational 2";
    8.78 -
    8.79 +get_obj g_res pt [];
    8.80 +val (t, asm) = get_obj g_result pt [];
    8.81 +if terms2str asm = "[\"8 * x ~= 0\",\"-9 + x ^^^ 2 ~= 0\"," ^
    8.82 +  "\"(2 / (x + 3) + 2 / (x - 3)) / (8 * x / (x ^^^ 2 - 9)) is_ratpolyexp\"]"
    8.83 +then () else error "solve.sml: interSteps on norm_Rational 2, asms";
    8.84  
    8.85  
    8.86  "###### val intermediate_ptyps = !ptyps;val intermediate_mets = !mets";
    8.87 @@ -97,54 +75,38 @@
    8.88  "--------- prepare pbl, met --------------------------------------";
    8.89  "--------- prepare pbl, met --------------------------------------";
    8.90  store_pbt
    8.91 - (prep_pbt @{theory Test} "pbl_ttestt" [] e_pblID
    8.92 - (["test"],
    8.93 -  [],
    8.94 -  e_rls, NONE, []));
    8.95 +  (prep_pbt @{theory Test} "pbl_ttestt" [] e_pblID
    8.96 +    (["test"], [], e_rls, NONE, []));
    8.97  store_pbt
    8.98 - (prep_pbt @{theory Test} "pbl_ttestt_detail" [] e_pblID
    8.99 - (["detail","test"],
   8.100 -  [("#Given" ,["realTestGiven t_t"]),
   8.101 -   ("#Find"  ,["realTestFind s_s"])
   8.102 -   ],
   8.103 -  e_rls, NONE, [["Test","test_detail"]]));
   8.104 +  (prep_pbt @{theory Test} "pbl_ttestt_detail" [] e_pblID
   8.105 +    (["detail","test"],
   8.106 +    [("#Given", ["realTestGiven t_t"]), ("#Find", ["realTestFind s_s"])],
   8.107 +    e_rls, NONE, [["Test","test_detail"]]));
   8.108  
   8.109  store_met
   8.110 - (prep_met @{theory Test} "met_detbin" [] e_metID
   8.111 - (["Test","test_detail_binom"]:metID,
   8.112 -  [("#Given" ,["realTestGiven t_t"]),
   8.113 -   ("#Find"  ,["realTestFind s_s"])
   8.114 -   ],
   8.115 -  {rew_ord' = "sqrt_right", rls' = tval_rls, calc = [], srls = e_rls, prls = e_rls,
   8.116 -   crls = tval_rls, errpats = [], nrls = e_rls(*,
   8.117 -   asm_rls=[],asm_thm=[("real_mult_div_cancel2","")]*)},
   8.118 - "Script Testterm (g_g::real) =   \
   8.119 - \(((Rewrite_Set expand_binoms False) @@\
   8.120 - \  (Rewrite_Set cancel False)) g_g)"
   8.121 - ));
   8.122 +  (prep_met @{theory Test} "met_detbin" [] e_metID
   8.123 +    (["Test", "test_detail_binom"] : metID,
   8.124 +    [("#Given", ["realTestGiven t_t"]), ("#Find", ["realTestFind s_s"])],
   8.125 +    {rew_ord' = "sqrt_right", rls' = tval_rls, calc = [], srls = e_rls, prls = e_rls,
   8.126 +      crls = tval_rls, errpats = [], nrls = e_rls},
   8.127 +    "Script Testterm (g_g::real) =" ^
   8.128 +    "(((Rewrite_Set expand_binoms False) @@" ^
   8.129 +    "(Rewrite_Set cancel_p False)) g_g)"));
   8.130  store_met
   8.131 - (prep_met @{theory Test} "met_detpoly" [] e_metID
   8.132 - (["Test","test_detail_poly"]:metID,
   8.133 -  [("#Given" ,["realTestGiven t_t"]),
   8.134 -   ("#Find"  ,["realTestFind s_s"])
   8.135 -   ],
   8.136 -  {rew_ord' = "sqrt_right", rls' = tval_rls, calc = [], srls = e_rls, prls = e_rls,
   8.137 -   crls = tval_rls, errpats = [], nrls = e_rls(*,
   8.138 -   asm_rls=[],asm_thm=[("real_mult_div_cancel2","")]*)},
   8.139 - "Script Testterm (g_g::real) =   \
   8.140 - \(((Rewrite_Set make_polynomial False) @@\
   8.141 - \  (Rewrite_Set cancel_p False)) g_g)"
   8.142 - ));
   8.143 -
   8.144 -(*---- funktionieren mit Rationals.ML: dummy-Funktionen(1)--------*)
   8.145 +  (prep_met @{theory Test} "met_detpoly" [] e_metID
   8.146 +    (["Test","test_detail_poly"] : metID,
   8.147 +    [("#Given", ["realTestGiven t_t"]), ("#Find", ["realTestFind s_s"])],
   8.148 +    {rew_ord' = "sqrt_right", rls' = tval_rls, calc = [], srls = e_rls, prls = e_rls,
   8.149 +      crls = tval_rls, errpats = [], nrls = e_rls},
   8.150 +    "Script Testterm (g_g::real) =" ^
   8.151 +    "(((Rewrite_Set make_polynomial False) @@" ^
   8.152 +    "(Rewrite_Set cancel_p False)) g_g)"));
   8.153  
   8.154  "-------- cancel, without detail ------------------------------";
   8.155  "-------- cancel, without detail ------------------------------";
   8.156  "-------- cancel, without detail ------------------------------";
   8.157 -val fmz = ["realTestGiven (((3 + x) * (3 - x)) / ((3 + x) * (3 + x)))",
   8.158 -	   "realTestFind s"];
   8.159 -val (dI',pI',mI') =
   8.160 -  ("Test",["detail","test"],["Test","test_detail_binom"]);
   8.161 +val fmz = ["realTestGiven (((3 + x) * (3 + -1*x)) / ((3 + x) * (3 + x)))", "realTestFind s"];
   8.162 +val (dI',pI',mI') = ("Test", ["detail", "test"], ["Test", "test_detail_binom"]);
   8.163  
   8.164  val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   8.165  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.166 @@ -158,13 +120,11 @@
   8.167  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.168  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.169  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.170 -(*"(3 + -1 * x) / (3 + x)"*)
   8.171 +(*WN130909: detail will be discontinued
   8.172  if nxt = ("End_Proof'",End_Proof') then ()
   8.173  else error "details.sml, changed behaviour in: without detail";
   8.174 -
   8.175 - val str = pr_ptree pr_short pt;
   8.176 - writeln str;
   8.177 -
   8.178 +*)
   8.179 +val str = pr_ptree pr_short pt;
   8.180  
   8.181  "-------- cancel, detail rev-rew (cancel) afterwards ----------";
   8.182  "-------- cancel, detail rev-rew (cancel) afterwards ----------";
   8.183 @@ -196,10 +156,10 @@
   8.184   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.185   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.186   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.187 - val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.188 + val (p,_,f,nxt,_,pt) = me nxt p [] pt;src
   8.189   (*val nxt = ("End_Detail",End_Detail)*)
   8.190   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   8.191 - (*val nxt = ("Rewrite_Set",Rewrite_Set "cancel")*)
   8.192 + (*val nxt = ("Rewrite_Set",Rewrite_Set "cancel")*)src
   8.193   val (p,_,f,nxt,_,pt) = me nxt p [] pt; (* rewrite must exist for Detail*)
   8.194   val nxt = ("Detail",Detail);"----------------------";
   8.195   val (p,_,f,nxt,_,pt) = (me nxt p [] pt) handle e => OldGoals.print_exn e;
     9.1 --- a/test/Tools/isac/Knowledge/build_thydata.sml	Mon Sep 16 11:28:43 2013 +0200
     9.2 +++ b/test/Tools/isac/Knowledge/build_thydata.sml	Mon Sep 16 12:20:00 2013 +0200
     9.3 @@ -917,8 +917,8 @@
     9.4   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","rational_erls"] 
     9.5   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","cancel_p"] 
     9.6   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","cancel"] 
     9.7 - *** insert: preserved ["IsacKnowledge","Rational","Rulesets","common_nominator_p"] 
     9.8 - *** insert: preserved ["IsacKnowledge","Rational","Rulesets","common_nominator_p_rls"] 
     9.9 + *** insert: preserved ["IsacKnowledge","Rational","Rulesets","add_fractions_p"] 
    9.10 + *** insert: preserved ["IsacKnowledge","Rational","Rulesets","add_fractions_p_rls"] 
    9.11   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","common_nominator"] 
    9.12   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","powers_erls"] 
    9.13   *** insert: preserved ["IsacKnowledge","Rational","Rulesets","powers"] 
    10.1 --- a/test/Tools/isac/Knowledge/eqsystem.sml	Mon Sep 16 11:28:43 2013 +0200
    10.2 +++ b/test/Tools/isac/Knowledge/eqsystem.sml	Mon Sep 16 12:20:00 2013 +0200
    10.3 @@ -640,17 +640,17 @@
    10.4  "----------- all systems from Biegelinie -------------------------";
    10.5  "----------- all systems from Biegelinie -------------------------";
    10.6  "----------- all systems from Biegelinie -------------------------";
    10.7 -val subst = [(str2term "bdv_1", str2term "c"),
    10.8 -	     (str2term "bdv_2", str2term "c_2"),
    10.9 -	     (str2term "bdv_3", str2term "c_3"),
   10.10 -	     (str2term "bdv_4", str2term "c_4")]; 
   10.11 +val thy = @{theory Isac}
   10.12 +val subst = 
   10.13 +  [(str2term "bdv_1", str2term "c"), (str2term "bdv_2", str2term "c_2"),
   10.14 +	(str2term "bdv_3", str2term "c_3"), (str2term "bdv_4", str2term "c_4")]; 
   10.15 +
   10.16  "------- Bsp 7.27";
   10.17  states:=[];
   10.18 -CalcTree [(["Traegerlaenge L","Streckenlast q_0","Biegelinie y",
   10.19 -	     "Randbedingungen [y 0 = 0, y L = 0, M_b 0 = 0, M_b L = 0]",
   10.20 -	     "FunktionsVariable x"],
   10.21 -	    ("Biegelinie", ["Biegelinien"],
   10.22 -		     ["IntegrierenUndKonstanteBestimmen2"]))];
   10.23 +CalcTree [(
   10.24 +  ["Traegerlaenge L","Streckenlast q_0","Biegelinie y",
   10.25 +	  "Randbedingungen [y 0 = 0, y L = 0, M_b 0 = 0, M_b L = 0]", "FunktionsVariable x"],
   10.26 +	("Biegelinie", ["Biegelinien"], ["IntegrierenUndKonstanteBestimmen2"]))];
   10.27  moveActiveRoot 1;
   10.28  (*
   10.29  trace_script := true; autoCalculate 1 CompleteCalc; trace_script := false;
   10.30 @@ -659,20 +659,24 @@
   10.31  c c_2 c_3 c_4     c c_2             1->2: c
   10.32    c_2                       c_4	  
   10.33  c c_2             c c_2 c_3 c_4     [2':c, 1:c_2, 3:c_4] -> 4:c_3*)
   10.34 -val t = str2term"[0 = c_4,                           \
   10.35 -\ 0 = c_4 + L * c_3 +(12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI),                                       \
   10.36 -\ 0 = c_2,                                           \
   10.37 -\ 0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2]";
   10.38 -val SOME (t',_) = rewrite_set_ thy false isolate_bdvs_4x4 t;
   10.39 -term2str t';
   10.40 -"[c_4 = 0,\n (12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI) =\n 0 + -1 * (c_4 + L * c_3),\n c_2 = 0, (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2 = 0]";
   10.41 +val t = str2term
   10.42 +  ("[0 = c_4, " ^
   10.43 +  "0 = c_4 + L * c_3 +(12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI), " ^
   10.44 +  "0 = c_2, " ^
   10.45 +  "0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2]");
   10.46 +val SOME (t, _) = rewrite_set_ thy false isolate_bdvs_4x4 t;
   10.47 +if term2str t =
   10.48 +"[c_4 = 0,\n (12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI) =\n -1 * (c_4 + L * c_3) + 0,\n c_2 = 0, (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2 = 0]"
   10.49 +then () else error "Bsp 7.27";
   10.50  
   10.51 -"----- 7.27 go through the rewrites in met_eqsys_norm_4x4";
   10.52 +"----- Bsp 7.27 go through the rewrites in met_eqsys_norm_4x4";
   10.53  val t = str2term "0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2";
   10.54  val NONE = rewrite_set_ thy false norm_Rational t;
   10.55  val SOME (t,_) = 
   10.56      rewrite_set_inst_ thy false subst simplify_System_parenthesized t;
   10.57 -term2str t = "0 = -1 * q_0 * L ^^^ 2 / 2 + (L * c + c_2)";
   10.58 +if term2str t = "0 = -1 * q_0 * L ^^^ 2 / 2 + (L * c + c_2)"
   10.59 +then () else error "Bsp 7.27 go through the rewrites in met_eqsys_norm_4x4";
   10.60 +
   10.61  "--- isolate_bdvs_4x4";
   10.62  (*
   10.63  val SOME (t,_) = rewrite_set_inst_ thy false subst isolate_bdvs_4x4 t;
   10.64 @@ -685,24 +689,24 @@
   10.65  
   10.66  "------- Bsp 7.28 ---------------vvvvvvvvvvvvv Momentenlinie postponed";
   10.67  states:=[];
   10.68 -CalcTree [(["Traegerlaenge L","Momentenlinie (-q_0 / L * x^3 / 6)",
   10.69 +CalcTree [((*WN130908  <ERROR> error in kernel </ERROR>*)
   10.70 +  ["Traegerlaenge L","Momentenlinie (-q_0 / L * x^^^3 / 6)",
   10.71  	    "Biegelinie y",
   10.72  	    "Randbedingungen [y L = 0, y' L = 0]",
   10.73  	    "FunktionsVariable x"],
   10.74  	   ("Biegelinie", ["vonMomentenlinieZu","Biegelinien"],
   10.75  	    ["Biegelinien", "AusMomentenlinie"]))];
   10.76 +(*
   10.77  moveActiveRoot 1;
   10.78 -(*
   10.79  trace_script := true; autoCalculate 1 CompleteCalc; trace_script := false;
   10.80  *)
   10.81  
   10.82  "------- Bsp 7.69";
   10.83  states:=[];
   10.84 -CalcTree [(["Traegerlaenge L","Streckenlast q_0","Biegelinie y",
   10.85 -	     "Randbedingungen [y 0 = 0, y L = 0, y' 0 = 0, y' L = 0]",
   10.86 -	     "FunktionsVariable x"],
   10.87 -	    ("Biegelinie", ["Biegelinien"],
   10.88 -	     ["IntegrierenUndKonstanteBestimmen2"] ))];
   10.89 +CalcTree [(
   10.90 +  ["Traegerlaenge L", "Streckenlast q_0", "Biegelinie y",
   10.91 +	  "Randbedingungen [y 0 = 0, y L = 0, y' 0 = 0, y' L = 0]", "FunktionsVariable x"],
   10.92 +	("Biegelinie", ["Biegelinien"], ["IntegrierenUndKonstanteBestimmen2"]))];
   10.93  moveActiveRoot 1;
   10.94  (*
   10.95  trace_script := true; autoCalculate 1 CompleteCalc; trace_script := false;
   10.96 @@ -711,18 +715,18 @@
   10.97  c c_2 c_3 c_4     c c_2 c_3	    1:c_3 -> 2:c c_2        2:         c c_2
   10.98        c_3                   c_4	 			   
   10.99  c c_2 c_3         c c_2 c_3 c_4     3:c_4 -> 4:c c_2 c_3    1:c_3 -> 4:c c_2*)
  10.100 -val t = str2term"[0 = c_4 + 0 / (-1 * EI),                                   \
  10.101 -\ 0 = c_4 + L * c_3 + (12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI),                                                              \
  10.102 -\ 0 = c_3 + 0 / (-1 * EI),                                                   \
  10.103 -\ 0 = c_3 + (6 * L * c_2 + 3 * L ^^^ 2 * c + -1 * L ^^^ 3 * q_0) / (-6 * EI)]";
  10.104 +val t = str2term 
  10.105 +  ("[0 = c_4 + 0 / (-1 * EI), " ^
  10.106 +  "0 = c_4 + L * c_3 + (12 * L ^^^ 2 * c_2 + 4 * L ^^^ 3 * c + -1 * L ^^^ 4 * q_0) / (-24 * EI), " ^
  10.107 +  "0 = c_3 + 0 / (-1 * EI), " ^
  10.108 +  "0 = c_3 + (6 * L * c_2 + 3 * L ^^^ 2 * c + -1 * L ^^^ 3 * q_0) / (-6 * EI)]");
  10.109  
  10.110  "------- Bsp 7.70";
  10.111  states:=[];
  10.112 -CalcTree [(["Traegerlaenge L","Streckenlast q_0","Biegelinie y",
  10.113 -	     "Randbedingungen [Q 0 = q_0 * L, M_b L = 0, y 0 = 0, y' 0 = 0]",
  10.114 -	     "FunktionsVariable x"],
  10.115 -	    ("Biegelinie", ["Biegelinien"],
  10.116 -	     ["IntegrierenUndKonstanteBestimmen2"] ))];
  10.117 +CalcTree [(
  10.118 +  ["Traegerlaenge L", "Streckenlast q_0", "Biegelinie y",
  10.119 +	  "Randbedingungen [Q 0 = q_0 * L, M_b L = 0, y 0 = 0, y' 0 = 0]", "FunktionsVariable x"],
  10.120 +	("Biegelinie", ["Biegelinien"], ["IntegrierenUndKonstanteBestimmen2"] ))];
  10.121  moveActiveRoot 1;
  10.122  (*
  10.123  trace_script := true; autoCalculate 1 CompleteCalc; trace_script := false;
  10.124 @@ -732,46 +736,46 @@
  10.125        c_3	|
  10.126            c_4   |            STOPPED.WN06? test methods @@@@@@@@@@@@@@@@@@@@@@@*)
  10.127  
  10.128 +"----- 7.70 go through the rewrites in met_eqsys_norm_4x4";
  10.129 +val t = str2term
  10.130 +  ("[L * q_0 = c, " ^
  10.131 +  "0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2, " ^
  10.132 +  "0 = c_4, " ^
  10.133 +  "0 = c_3]");
  10.134 +val SOME (t,_) = rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.135 +val SOME (t,_) = rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.136 +val SOME (t,_) = rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.137 +if term2str t = 
  10.138 +  "[L * q_0 = c, (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2 = 0, c_4 = 0,\n c_3 = 0]"
  10.139 +then () else error "7.70 go through the rewrites in met_eqsys_norm_4x4, 1";
  10.140  
  10.141 -"----- 7.70 go through the rewrites in met_eqsys_norm_4x4";
  10.142 -val t = str2term"[L * q_0 = c,                       \
  10.143 -		\ 0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2,\
  10.144 -		\ 0 = c_4,                           \
  10.145 -		\ 0 = c_3]";
  10.146 -val SOME (t,_) =
  10.147 -    rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.148 -val SOME (t,_) =
  10.149 -    rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.150 -val SOME (t,_) =
  10.151 -    rewrite_ thy e_rew_ord e_rls false (num_str @{thm commute_0_equality}) t;
  10.152 -term2str t =
  10.153 -   "[L * q_0 = c, (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2 = 0, c_4 = 0,\n c_3 = 0]";
  10.154 -val SOME (t,_) = 
  10.155 -    rewrite_set_inst_ thy false subst simplify_System_parenthesized t;
  10.156 -term2str t =
  10.157 -"[L * q_0 = c, -1 * q_0 * L ^^^ 2 / 2 + (L * c + c_2) = 0, c_4 = 0, c_3 = 0]";
  10.158 +val SOME (t,_) = rewrite_set_inst_ thy false subst simplify_System_parenthesized t;
  10.159 +if term2str t = "[L * q_0 = c, -1 * q_0 * L ^^^ 2 / 2 + (L * c + c_2) = 0, c_4 = 0, c_3 = 0]"
  10.160 +then () else error "7.70 go through the rewrites in met_eqsys_norm_4x4, 2";
  10.161 +
  10.162  val SOME (t,_) = rewrite_set_inst_ thy false subst isolate_bdvs_4x4 t;
  10.163 -term2str t =
  10.164 -   "[c = (-1 * (L * q_0) + 0) / -1,\n L * c + c_2 = -1 * (-1 * q_0 * L ^^^ 2 / 2) + 0, c_4 = 0, c_3 = 0]";
  10.165 -val SOME (t,_) = 
  10.166 -    rewrite_set_inst_ thy false subst simplify_System_parenthesized t;
  10.167 +if term2str t =
  10.168 +   "[c = (-1 * (L * q_0) + 0) / -1,\n" ^ 
  10.169 +   " L * c + c_2 = -1 * (-1 * q_0 * L ^^^ 2 / 2) + 0, c_4 = 0, c_3 = 0]"
  10.170 +then () else error "7.70 go through the rewrites in met_eqsys_norm_4x4, 3";
  10.171  
  10.172 -term2str t ="[c = L * q_0, L * c + c_2 = q_0 * L ^^^ 2 / 2, c_4 = 0, c_3 = 0]";
  10.173 -val SOME (t,_) = rewrite_set_ thy false order_system t;
  10.174 -if term2str t ="[c = L * q_0, L * c + c_2 = q_0 * L ^^^ 2 / 2, c_3 = 0, c_4 = 0]" then ()
  10.175 -else error "eqsystem.sml: exp 7.70 normalize 4x4 by rewrite changed";
  10.176 +val SOME (t,_) = rewrite_set_inst_ thy false subst simplify_System_parenthesized t;
  10.177 +if term2str t = "[c = -1 * L * q_0 / -1, L * c + c_2 = q_0 * L ^^^ 2 / 2, c_4 = 0, c_3 = 0]"
  10.178 +then () else error "7.70 go through the rewrites in met_eqsys_norm_4x4, 4";
  10.179  
  10.180 +val SOME (t, _) = rewrite_set_ thy false order_system t;
  10.181 +if term2str t = "[c = -1 * L * q_0 / -1, L * c + c_2 = q_0 * L ^^^ 2 / 2, c_3 = 0, c_4 = 0]"
  10.182 +then () else error "eqsystem.sml: exp 7.70 normalize 4x4 by rewrite changed";
  10.183  
  10.184  "----- 7.70 with met normalize: ";
  10.185 -val fmz = ["equalities                                         \
  10.186 -	    \[L * q_0 = c,                       \
  10.187 -		\ 0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2,\
  10.188 -		\ 0 = c_4,                           \
  10.189 -		\ 0 = c_3]", 
  10.190 -	    "solveForVars [c, c_2, c_3, c_4]", "solution LL"];
  10.191 -val (dI',pI',mI') =
  10.192 -  ("Biegelinie",["linear", "system"],["no_met"]);
  10.193 -val p = e_pos'; val c = []; 
  10.194 +val fmz = ["equalities" ^
  10.195 +  "[L * q_0 = c, " ^
  10.196 +  "0 = (2 * c_2 + 2 * L * c + -1 * L ^^^ 2 * q_0) / 2, " ^
  10.197 +  "0 = c_4, " ^
  10.198 +  "0 = c_3]", "solveForVars [c, c_2, c_3, c_4]", "solution LL"];
  10.199 +val (dI',pI',mI') = ("Biegelinie",["linear", "system"], ["no_met"]);
  10.200 +val p = e_pos'; val c = [];
  10.201 +
  10.202  (*============ inhibit exn WN120314 TODO: investigate type error (same as above)==
  10.203    in next but one test below the same type error.
  10.204  /-------------------------------------------------------\
  10.205 @@ -790,8 +794,9 @@
  10.206  case nxt of (_,Apply_Method ["EqSystem", "normalize", "4x4"]) => ()
  10.207  	  | _ => error "eqsystem.sml [EqSystem,normalize,4x4] specify";
  10.208  val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
  10.209 +
  10.210  "----- outcommented before Isabelle2002 --> 2011 -------------------------";
  10.211 -(*vvvWN080102 Exception- Match raised 
  10.212 +(*-----------------------------------vvvWN080102 Exception- Match raised 
  10.213    since assod Rewrite .. Rewrite'_Set
  10.214  val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
  10.215  
    11.1 --- a/test/Tools/isac/Knowledge/partial_fractions.sml	Mon Sep 16 11:28:43 2013 +0200
    11.2 +++ b/test/Tools/isac/Knowledge/partial_fractions.sml	Mon Sep 16 12:20:00 2013 +0200
    11.3 @@ -251,7 +251,7 @@
    11.4    "~ matches (?a = 0) (3 = 3 * A / 4) | ~ lhs (3 = 3 * A / 4) is_poly_in A," ^
    11.5    "A = 4,lhs (3 + -3 / 4 * A = 0) is_poly_in A,lhs (3 + -3 / 4 * A = 0) has_degree_in A = 1," ^
    11.6    "lhs (-1 + -2 * z + 8 * z ^^^ 2 = 0) has_degree_in z = 2," ^
    11.7 -  "lhs (-1 + -2 * z + 8 * z ^^^ 2 = 0) is_poly_in z,z = 1 / 2,z = -1 / 4,z ~= 0,z is_polyexp]"
    11.8 +  "lhs (-1 + -2 * z + 8 * z ^^^ 2 = 0) is_poly_in z,z = 1 / 2,z = -1 / 4,z is_polyexp]"
    11.9  then ()
   11.10    else error "autoCalculate for met_partial_fraction changed: final result"
   11.11  
    12.1 --- a/test/Tools/isac/Knowledge/rational.sml	Mon Sep 16 11:28:43 2013 +0200
    12.2 +++ b/test/Tools/isac/Knowledge/rational.sml	Mon Sep 16 12:20:00 2013 +0200
    12.3 @@ -17,33 +17,28 @@
    12.4  "-------- and app_rev ...traced down from rewrite_set_ until prepats ---------";
    12.5  "-------- fun rewrite_set_ cancel_p downto fun gcd_poly ----------------------";
    12.6  "-------- rls norm_Rational downto fun gcd_poly ------------------------------";
    12.7 +"-------- rls norm_Rational downto fun add_fraction_p_ -----------------------";
    12.8  "-------- rewrite_set_ cancel_p from: Mathematik 1 Schalk Reniets Verlag -----";
    12.9 -"-------- rewrite_set_ common_nominator_p from: Mathematik 1 Schalk ----------";
   12.10 -"-------- integration lev.1 -- lev.5: cancel_p_ & common_nominator_p_ --------";
   12.11 +"-------- rewrite_set_ add_fractions_p from: Mathematik 1 Schalk -------------";
   12.12 +"-------- integration lev.1 -- lev.5: cancel_p_ & add_fractions_p_ -----------";
   12.13  "-------- reverse rewrite ----------------------------------------------------";
   12.14  "-------- 'reverse-ruleset' cancel_p -----------------------------------------";
   12.15  "-------- investigate rls norm_Rational --------------------------------------";
   12.16  "-------- examples: rls norm_Rational ----------------------------------------";
   12.17 -"-------- numeral rationals -----------------------------";
   12.18 -"-------- cancellation ----------------------------------";
   12.19 -"-------- common denominator ----------------------------";
   12.20 -"-------- multiply and cancel ---------------------------";
   12.21 -"-------- common denominator and multiplication ---------";
   12.22 -"-------- double fractions ------------------------------";
   12.23 -"-------- crucial examples ------------------------------";
   12.24 -"-------- examples for Stefan Karnels thesis ------------";
   12.25 -"-------- me Schalk I No.186 ----------------------------";
   12.26 -"-------- interSteps ..Simp_Rat_Double_No-1.xml ---------";
   12.27 -"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ---------";
   12.28 -"-------- investigate rulesets for cancel_p -------------";
   12.29 -"-------- investigate format of factout_ and factout_p_ -";
   12.30 -"-------- how to stepwise construct Scripts -------------";
   12.31 -"----------- get_denominator ----------------------------";
   12.32 -"--------- several errpats in complicated term -------------------";
   12.33 -"--------------------------------------------------------";
   12.34 -"-------- nonterminating cancel_p, norm_Rational 2002 ---";
   12.35 -"--------------------------------------------------------";
   12.36 -"--------------------------------------------------------";
   12.37 +"-------- rational numerals --------------------------------------------------";
   12.38 +"-------- examples cancellation from: Mathematik 1 Schalk --------------------";
   12.39 +"-------- examples common denominator from: Mathematik 1 Schalk --------------";
   12.40 +"-------- examples multiply and cancel from: Mathematik 1 Schalk -------------";
   12.41 +"-------- examples common denominator and multiplication from: Schalk --------";
   12.42 +"-------- examples double fractions from: Mathematik 1 Schalk ----------------";
   12.43 +"-------- me Schalk I No.186 -------------------------------------------------";
   12.44 +"-------- interSteps ..Simp_Rat_Double_No-1.xml ------------------------------";
   12.45 +"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ------------------------------";
   12.46 +"-------- investigate rulesets for cancel_p ----------------------------------";
   12.47 +"-------- fun eval_get_denominator -------------------------------------------";
   12.48 +"-------- several errpats in complicated term --------------------------------";
   12.49 +"-----------------------------------------------------------------------------";
   12.50 +"-----------------------------------------------------------------------------";
   12.51  
   12.52  
   12.53  "-------- fun poly_of_term ---------------------------------------------------";
   12.54 @@ -227,7 +222,7 @@
   12.55      (* apply the normal_form of a rev-set *)
   12.56      fun app_rev' thy (Rrls{erls,prepat,scr=Rfuns{normal_form,...},...}) t =
   12.57        if chk_prepat thy erls prepat t
   12.58 -      then ((*tracing("### app_rev': t = "^(term2str t));*) normal_form t)
   12.59 +      then ((*tracing("### app_rev': t = "^term2str t);*) normal_form t)
   12.60        else NONE;
   12.61  (*  val opt = app_rev' thy rrls t  ..NONE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
   12.62  "~~~~~ and app_rev', args:"; val (thy, (Rrls{erls,prepat,scr=Rfuns{normal_form,...},...}), t) =
   12.63 @@ -363,6 +358,70 @@
   12.64  val b = [(~18, [0, 0]), (~9, [1, 0]), (2, [0, 2]), (1, [1, 2])]: poly
   12.65  *)
   12.66  
   12.67 +"-------- rls norm_Rational downto fun add_fraction_p_ -----------------------";
   12.68 +"-------- rls norm_Rational downto fun add_fraction_p_ -----------------------";
   12.69 +"-------- rls norm_Rational downto fun add_fraction_p_ -----------------------";
   12.70 +val thy =  @{theory Isac};
   12.71 +"----- SK060904-2a non-termination of add_fraction_p_";
   12.72 +val t = str2term (" (a + b * x) / (a + -1 * (b * x)) +  " ^
   12.73 +		         " (-1 * a + b * x) / (a + b * x)      ");
   12.74 +(* rewrite_set_ thy false norm_Rational t
   12.75 +exception Div raised*)
   12.76 +(* rewrite_set_ thy false add_fractions_p t;
   12.77 +exception Div raised*)
   12.78 +"~~~~~ fun rewrite_set_, args:"; val (thy, bool, rls, term) =
   12.79 +  (@{theory Isac}, false, add_fractions_p, t);
   12.80 +"~~~~~ and rewrite__set_, args:"; val (thy, i, _, _, (rrls as Rrls _), t) =
   12.81 +  (thy, 1, bool, [], rls, term);
   12.82 +(* app_rev thy (i+1) rrls t;
   12.83 +exception Div raised*)
   12.84 +"~~~~~ and app_rev, args:"; val (thy, i, rrls, t) = (thy, (i+1), rrls, t);
   12.85 +    fun chk_prepat thy erls [] t = true
   12.86 +      | chk_prepat thy erls prepat t =
   12.87 +        let
   12.88 +          fun chk (pres, pat) =
   12.89 +            (let 
   12.90 +              val subst: Type.tyenv * Envir.tenv =
   12.91 +                Pattern.match thy (pat, t) (Vartab.empty, Vartab.empty)
   12.92 +             in
   12.93 +              snd (eval__true thy (i + 1) (map (Envir.subst_term subst) pres) [] erls)
   12.94 +             end) handle _ => false
   12.95 +           fun scan_ f [] = false (*scan_ NEVER called by []*)
   12.96 +             | scan_ f (pp::pps) =
   12.97 +               if f pp then true else scan_ f pps;
   12.98 +        in scan_ chk prepat end;
   12.99 +    (* apply the normal_form of a rev-set *)
  12.100 +    fun app_rev' thy (Rrls{erls,prepat,scr=Rfuns{normal_form,...},...}) t =
  12.101 +      if chk_prepat thy erls prepat t
  12.102 +      then ((*tracing("### app_rev': t = "^term2str t);*) normal_form t)
  12.103 +      else NONE;
  12.104 +(*  val opt = app_rev' thy rrls t;
  12.105 +exception Div raised*)
  12.106 +(*  val opt = app_rev' thy rrls t;
  12.107 +exception Div raised*)
  12.108 +"~~~~~ and app_rev', args:"; val (thy, (Rrls{erls,prepat,scr=Rfuns{normal_form,...},...}), t) =
  12.109 +  (thy, rrls, t);
  12.110 +chk_prepat thy erls prepat t = true       = true;
  12.111 +(*normal_form t
  12.112 +exception Div raised*)
  12.113 +(* lookup Rational.thy, val add_fractions_p: normal_form = add_fraction_p_ thy*)
  12.114 +(*add_fraction_p_ thy t
  12.115 +exception Div raised*)
  12.116 +"~~~~~ fun add_fraction_p_, args:"; val ((_: theory), t) = (thy, t);
  12.117 +val SOME ((n1, d1), (n2, d2)) = check_frac_sum t;
  12.118 +term2str n1; term2str d1; term2str n2; term2str d2;
  12.119 +      val vs = t |> vars |> map str_of_free_opt (* tolerate Var in simplification *)
  12.120 +        |> filter is_some |> map the |> sort string_ord;
  12.121 +print_depth 3; (*999*)
  12.122 +val (SOME _, SOME a, SOME _, SOME b) =
  12.123 +  (poly_of_term vs n1, poly_of_term vs d1, poly_of_term vs n2, poly_of_term vs d2);
  12.124 +print_depth 3; (*999*)
  12.125 +(*
  12.126 +val a = [(1, [1, 0, 0]), (~1, [0, 1, 1])]: poly
  12.127 +val b = [(1, [1, 0, 0]), (1, [0, 1, 1])]: poly
  12.128 +            val ((a', b'), c) = gcd_poly a b
  12.129 +*)
  12.130 +
  12.131  "-------- rewrite_set_ cancel_p from: Mathematik 1 Schalk Reniets Verlag -----";
  12.132  "-------- rewrite_set_ cancel_p from: Mathematik 1 Schalk Reniets Verlag -----";
  12.133  "-------- rewrite_set_ cancel_p from: Mathematik 1 Schalk Reniets Verlag -----";
  12.134 @@ -428,7 +487,7 @@
  12.135  then () else error "rational.sml cancel Schalk 188a";
  12.136  
  12.137  val t = str2term "(8*((-1) + x))/(9*((-1) + x))";
  12.138 -val SOME (t,_) = rewrite_set_ thy false make_polynomial t;
  12.139 +val SOME (t, _) = rewrite_set_ thy false make_polynomial t;
  12.140  if (term2str t', terms2str asm) = ("8 / 9", "[]")
  12.141  then () else error "rational.sml cancel Schalk make_polynomial 1";
  12.142  
  12.143 @@ -540,14 +599,14 @@
  12.144    ("(x ^^^ 3 + y) / (1 + 5 * x + x * y ^^^ 3)", "[\"1 + 5 * x + x * y ^^^ 3 ~= 0\"]")
  12.145  then () else error "rational.sml cancel_p heuberger";
  12.146  
  12.147 -"-------- rewrite_set_ common_nominator_p from: Mathematik 1 Schalk ----------";
  12.148 -"-------- rewrite_set_ common_nominator_p from: Mathematik 1 Schalk ----------";
  12.149 -"-------- rewrite_set_ common_nominator_p from: Mathematik 1 Schalk ----------";
  12.150 +"-------- rewrite_set_ add_fractions_p from: Mathematik 1 Schalk -------------";
  12.151 +"-------- rewrite_set_ add_fractions_p from: Mathematik 1 Schalk -------------";
  12.152 +"-------- rewrite_set_ add_fractions_p from: Mathematik 1 Schalk -------------";
  12.153  (*deleted example 204 ... 236b at update Isabelle2012-->2013*)
  12.154  
  12.155 -"-------- integration lev.1 -- lev.5: cancel_p_ & common_nominator_p_ --------";
  12.156 -"-------- integration lev.1 -- lev.5: cancel_p_ & common_nominator_p_ --------";
  12.157 -"-------- integration lev.1 -- lev.5: cancel_p_ & common_nominator_p_ --------";
  12.158 +"-------- integration lev.1 -- lev.5: cancel_p_ & add_fractions_p_ -----------";
  12.159 +"-------- integration lev.1 -- lev.5: cancel_p_ & add_fractions_p_ -----------";
  12.160 +"-------- integration lev.1 -- lev.5: cancel_p_ & add_fractions_p_ -----------";
  12.161  val t = str2term ("123 = (a*x)/(b*x) + (c*x)/(d*x) + (e*x)/(f*x::real)");
  12.162  "-------- gcd_poly integration level 1: works on exact term";
  12.163  if NONE = cancel_p_ thy t then () else error "cancel_p_ works on exact fraction";
  12.164 @@ -565,7 +624,7 @@
  12.165  val SOME (t', asm) = rewrite_set_ thy false cancel_p_rls t;
  12.166  if term2str t' = "123 = a / b + c / d + e / f"
  12.167  then () else error "level 3, rewrite_set_ cancel_p_rls: changed";
  12.168 -val SOME (t', asm) = rewrite_set_ thy false common_nominator_p_rls t; (*CREATE add_fractions_p_rls*)
  12.169 +val SOME (t', asm) = rewrite_set_ thy false add_fractions_p_rls t; (*CREATE add_fractions_p_rls*)
  12.170  if term2str t' = "123 = (b * d * e * x + b * c * f * x + a * d * f * x) / (b * d * f * x)"
  12.171  then () else error "level 3, rewrite_set_ add_fractions_p_rls: changed";
  12.172  
  12.173 @@ -576,16 +635,16 @@
  12.174  (*trace_rewrite := false;
  12.175  #  rls: testrls on: 123 = a * x / (b * x) + c * x / (d * x) + e * x / (f * x) 
  12.176  ##  rls: cancel_p on: 123 = a * x / (b * x) + c * x / (d * x) + e * x / (f * x) 
  12.177 -##  rls: common_nominator_p on: 123 = a * x / (b * x) + c * x / (d * x) + e / f 
  12.178 +##  rls: add_fractions_p on: 123 = a * x / (b * x) + c * x / (d * x) + e / f 
  12.179  ##  rls: cancel_p on: 123 = (b * c * x + a * d * x) / (b * d * x) + e / f 
  12.180 -##  rls: common_nominator_p on: 123 = (b * c + a * d) / (b * d) + e / f 
  12.181 +##  rls: add_fractions_p on: 123 = (b * c + a * d) / (b * d) + e / f 
  12.182  ##  rls: cancel_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.183 -##  rls: common_nominator_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) *)
  12.184 +##  rls: add_fractions_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) *)
  12.185  if term2str t' = "123 = (b * d * e + b * c * f + a * d * f) / (b * d * f)"
  12.186  then () else error "level 4, rewrite_set_ *_p: changed";
  12.187  
  12.188  (* complicated variant *)
  12.189 -val testrls_rls = append_rls "testrls_rls" e_rls [Rls_ cancel_p_rls, Rls_ common_nominator_p_rls];
  12.190 +val testrls_rls = append_rls "testrls_rls" e_rls [Rls_ cancel_p_rls, Rls_ add_fractions_p_rls];
  12.191  val SOME (t', asm) = rewrite_set_ thy false testrls_rls t;
  12.192  (*#  rls: testrls_rls on: 123 = a * x / (b * x) + c * x / (d * x) + e * x / (f * x) 
  12.193  ##  rls: cancel_p_rls on: 123 = a * x / (b * x) + c * x / (d * x) + e * x / (f * x) 
  12.194 @@ -593,14 +652,14 @@
  12.195  ###  rls: cancel_p on: 123 = a * x / (b * x) + c * x / (d * x) + e / f 
  12.196  ###  rls: cancel_p on: 123 = a * x / (b * x) + c / d + e / f 
  12.197  ###  rls: cancel_p on: 123 = a / b + c / d + e / f 
  12.198 -##  rls: common_nominator_p_rls on: 123 = a / b + c / d + e / f 
  12.199 -###  rls: common_nominator_p on: 123 = a / b + c / d + e / f 
  12.200 -###  rls: common_nominator_p on: 123 = (b * c + a * d) / (b * d) + e / f 
  12.201 -###  rls: common_nominator_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.202 +##  rls: add_fractions_p_rls on: 123 = a / b + c / d + e / f 
  12.203 +###  rls: add_fractions_p on: 123 = a / b + c / d + e / f 
  12.204 +###  rls: add_fractions_p on: 123 = (b * c + a * d) / (b * d) + e / f 
  12.205 +###  rls: add_fractions_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.206  ##  rls: cancel_p_rls on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.207  ###  rls: cancel_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.208 -##  rls: common_nominator_p_rls on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.209 -###  rls: common_nominator_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) *)
  12.210 +##  rls: add_fractions_p_rls on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) 
  12.211 +###  rls: add_fractions_p on: 123 = (b * d * e + b * c * f + a * d * f) / (b * d * f) *)
  12.212  if term2str t' = "123 = (b * d * e + b * c * f + a * d * f) / (b * d * f)"
  12.213  then () else error "level 4, rewrite_set_ *_p_rls: changed"
  12.214  
  12.215 @@ -645,7 +704,7 @@
  12.216  then () else error "first 7 elements in revset changed"
  12.217  
  12.218  (** find the rule 'r' to apply to term 't' **)
  12.219 -(*/------- since cancel_ (accepted "-" between monomials) has been replaced by cancel_p_ 
  12.220 +(*/------- WN1309: since cancel_ (accepted "-" between monomials) has been replaced by cancel_p_ 
  12.221    for Isabelle2013, we don't get a working revset, but non-termination:
  12.222  
  12.223    val SOME (r as (Thm (str, thm))) = nex revsets t;
  12.224 @@ -717,7 +776,7 @@
  12.225  "-------- 'reverse-ruleset' cancel_p -----------------------------------------";
  12.226  "-------- 'reverse-ruleset' cancel_p -----------------------------------------";
  12.227  "-------- 'reverse-ruleset' cancel_p -----------------------------------------";
  12.228 -(*Isabelle2013: the example below shows, why "reverse rewriting" only worked for
  12.229 +(*WN130909: the example below shows, why "reverse rewriting" only worked for
  12.230    special cases.*)
  12.231  
  12.232  (*the term for which reverse rewriting is demonstrated*)
  12.233 @@ -755,7 +814,6 @@
  12.234    term2str t;
  12.235  *)                    
  12.236  
  12.237 -(*========== inhibit exn WN130824 TODO =======================================================
  12.238  "-------- examples: rls norm_Rational ----------------------------------------";
  12.239  "-------- examples: rls norm_Rational ----------------------------------------";
  12.240  "-------- examples: rls norm_Rational ----------------------------------------";
  12.241 @@ -793,7 +851,6 @@
  12.242  
  12.243  val t = str2term "1 - ((13*x)/2 - 5/2)^^^2";
  12.244  val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.245 -(*bef.040209: if term2str t' = "(-21 + (130 * x + -169 * x ^^^ 2)) / 4"then()*)
  12.246  if term2str t' = "(-21 + 130 * x + -169 * x ^^^ 2) / 4" then () 
  12.247  else error "rational.sml 5";
  12.248  
  12.249 @@ -812,801 +869,555 @@
  12.250  val t = str2term "(x^^^2/(1 - x^^^2) + 1)/(x/(1 - x) + 1) * (1 + x)";
  12.251  (*. a/b : c/d translated to a/b * d/c .*)
  12.252  val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.253 -(*if term2str t' = "1 / 1" then () else error "rational.sml 8";3.6.03*)
  12.254  if term2str t' = "1" then () else error "rational.sml 8";
  12.255  
  12.256 -(*............................vvv---TODO: sollte gehen mit poly_order *)
  12.257  (*Schalk I, p.92 Nr. 472a*)
  12.258  val t = str2term "((8*x^^^2 - 32*y^^^2)/(2*x + 4*y))/((4*x - 8*y)/(x + y))";
  12.259  val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.260  if term2str t' = "x + y" then () else error "rational.sml p.92 Nr. 472a";
  12.261  
  12.262 -(*Schalk I, p.70 Nr. 480b; a/b : c/d translated to a/b * d/c*)
  12.263 -val t = str2term ("((12*x*y/(9*x^^^2 - y^^^2))/" ^
  12.264 -		 "(1/(3*x - y)^^^2 - 1/(3*x + y)^^^2)) *" ^
  12.265 -		 "(1/(x - 5*y)^^^2 - 1/(x + 5*y)^^^2)/" ^
  12.266 -		 "(20*x*y/(x^^^2 - 25*y^^^2))");
  12.267 -(*... nicht simpl, zerlegt ...*)
  12.268 -val t = str2term ("((12*x*y/(9*x^^^2 - y^^^2))/" ^
  12.269 -		 "(1/(3*x - y)^^^2 - 1/(3*x + y)^^^2))");
  12.270 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.271 -"(-12 * (x * y ^^^ 3) + 108 * (x * (y * x ^^^ 2))) / (12 * (x * y))";
  12.272 -(*                             ~~~~~~~~~~ poly_order notwendig!*)
  12.273 -val t = str2term ("(1/(x - 5*y)^^^2 - 1/(x + 5*y)^^^2)/" ^
  12.274 -		 "(20*x*y/(x^^^2 - 25*y^^^2))");
  12.275 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.276 -if term2str t' = "1 / (x ^^^ 2 + -25 * y ^^^ 2)" then ()
  12.277 -else error "rational.sml norm_Rational 1 / (x ^^^ 2 + -25 * y ^^^ 2)";
  12.278 +(*Schalk I, p.70 Nr. 480b: SEE rational.sml --- nonterminating rls norm_Rational ---*)
  12.279  
  12.280 -"nonterm.SK6 ----- SK060904-2a non-termination of add_fraction_p_";
  12.281 -(*WN.2.6.03 from rlang.sml 56a 
  12.282 +(*WN130910 add_fractions_p exception Div raised + history:
  12.283 +### WN.2.6.03 from rlang.sml 56a 
  12.284  val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) = 4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)";
  12.285 -val NONE = rewrite_set_ thy false common_nominator_p t;
  12.286 +val NONE = rewrite_set_ thy false add_fractions_p t;
  12.287  
  12.288 -WN060831 nonterm.SK7 
  12.289 +THE ERROR ALREADY OCCURS IN THIS PART:
  12.290  val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x)";
  12.291 -val NONE = add_fraction_p_ thy t; 
  12.292 +val NONE = add_fraction_p_ thy t;
  12.293 +
  12.294 +SEE Test_Some.thy: section {* add_fractions_p downto exception Div raised ===
  12.295  *)
  12.296  
  12.297 -
  12.298 -(* ------------------------------------------------------------------- *)
  12.299 -(*---------vvv------------ MG: ab 1.7.03 ----------------vvv-----------*)
  12.300 -(*                 Simplifier fuer beliebige Buchterme                 *) 
  12.301 -(* ------------------------------------------------------------------- *)
  12.302 -(*----------------------- norm_Rational_mg ----------------------------*)
  12.303 -(* ------------------------------------------------------------------- *)
  12.304 -
  12.305 -"-------- numeral rationals -----------------------------";
  12.306 -"-------- numeral rationals -----------------------------";
  12.307 -"-------- numeral rationals -----------------------------";
  12.308 +"-------- rational numerals --------------------------------------------------";
  12.309 +"-------- rational numerals --------------------------------------------------";
  12.310 +"-------- rational numerals --------------------------------------------------";
  12.311  (*SRA Schalk I, p.40 Nr. 164b *)
  12.312  val t = str2term "(47/6 - 76/9 + 13/4)/(35/12)";
  12.313 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.314 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.315  term2str t;
  12.316 -if (term2str t) = "19 / 21" then ()
  12.317 +if term2str t = "19 / 21" then ()
  12.318  else error "rational.sml: diff.behav. in norm_Rational_mg 1";
  12.319  
  12.320  (*SRA Schalk I, p.40 Nr. 166a *)
  12.321  val t = str2term "((5/4)/(4+22/7) + 37/20)*(110/3 - 110/9 * 23/11)";
  12.322 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.323 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.324  term2str t;
  12.325 -if (term2str t) = "45 / 2" then ()
  12.326 +if term2str t = "45 / 2" then ()
  12.327  else error "rational.sml: diff.behav. in norm_Rational_mg 2";
  12.328  
  12.329 -
  12.330 -"-------- cancellation ----------------------------------";
  12.331 -"-------- cancellation ----------------------------------";
  12.332 -"-------- cancellation ----------------------------------";
  12.333 +"-------- examples cancellation from: Mathematik 1 Schalk --------------------";
  12.334 +"-------- examples cancellation from: Mathematik 1 Schalk --------------------";
  12.335 +"-------- examples cancellation from: Mathematik 1 Schalk --------------------";
  12.336  (* e190c Stefan K.*)
  12.337 -val t = str2term
  12.338 -"((1 + 9 * a ^^^ 2)*(1 + 3 * a))/((3 * a + 9 * a ^^^ 2)*(1 + 3 * a))";
  12.339 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.340 -term2str t;
  12.341 -if (term2str t) = 
  12.342 -"(1 + 9 * a ^^^ 2) / (3 * a + 9 * a ^^^ 2)"
  12.343 -then ()
  12.344 -else error "rational.sml: diff.behav. in norm_Rational_mg 3";
  12.345 +val t = str2term "((1 + 9*a^^^2) * (1 + 3*a)) / ((3*a + 9*a^^^2) * (1 + 3*a))";
  12.346 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.347 +if term2str t = "(1 + 9 * a ^^^ 2) / (3 * a + 9 * a ^^^ 2)"
  12.348 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 3";
  12.349  
  12.350  (* e192b Stefan K.*)
  12.351 -val t = str2term
  12.352 -"((x ^^^ 2)*(7 * x + (-1) * y))/((y ^^^ 2)*(7 * x + (-1) * y))";
  12.353 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.354 -term2str t;
  12.355 -if (term2str t) = 
  12.356 -"x ^^^ 2 / y ^^^ 2"
  12.357 -then ()
  12.358 -else error "rational.sml: diff.behav. in norm_Rational_mg 4";
  12.359 +val t = str2term "(x^^^2 * (7*x + (-1)*y))  /  (y^^^2 * (7*x + (-1)*y))";
  12.360 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.361 +if term2str t = "x ^^^ 2 / y ^^^ 2"
  12.362 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 4";
  12.363  
  12.364  (*SRC Schalk I, p.66 Nr. 379c *)
  12.365 -val t = str2term 
  12.366 -"(a - b)/(b - a)";
  12.367 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.368 +val t = str2term "(a - b)/(b - a)";
  12.369 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.370  term2str t;
  12.371 -if (term2str t) =
  12.372 -"-1"
  12.373 -then ()
  12.374 -else error "rational.sml: diff.behav. in norm_Rational_mg 5";
  12.375 +if term2str t = "-1"
  12.376 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 5";
  12.377  
  12.378  (*SRC Schalk I, p.66 Nr. 380b *)
  12.379 -val t = str2term 
  12.380 -"15*(3*x+3)*(4*x+9)/(12*(2*x+7)*(5*x+5))";
  12.381 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.382 -term2str t;
  12.383 -if (term2str t) =
  12.384 -"(27 + 12 * x) / (28 + 8 * x)"
  12.385 -then ()
  12.386 -else error "rational.sml: diff.behav. in norm_Rational_mg 6";
  12.387 +val t = str2term "15*(3*x + 3) * (4*x + 9)  /  (12*(2*x + 7) * (5*x + 5))";
  12.388 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.389 +if term2str t = "(27 + 12 * x) / (28 + 8 * x)"
  12.390 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 6";
  12.391  
  12.392 -(*Schalk I, p.60 Nr. 215c *)
  12.393 -(* Falsches Ergebnis: rechnet lange und cancel_p kann nicht weiter krzen!!!*)
  12.394 -(* WN060831????MG1 
  12.395 -val t = str2term "(a+b)^^^4*(x - y)/((x - y)^^^3*(a+b)^^^2)";
  12.396 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.397 -term2str t;
  12.398 -if (term2str t) =
  12.399 -"(a ^^^ 4 * x + -1 * a ^^^ 4 * y + 4 * a ^^^ 3 * b * x + -4 * a ^^^ 3 * b * y + 6 * a ^^^ 2 * b ^^^ 2 * x + -6 * a ^^^ 2 * b ^^^ 2 * y + 4 * a * b ^^^ 3 * x + -4 * a * b ^^^ 3 * y + b ^^^ 4 * x + -1 * b ^^^ 4 * y) /(a ^^^ 2 * x ^^^ 3 + -3 * a ^^^ 2 * x ^^^ 2 * y + 3 * a ^^^ 2 * x * y ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 3 + 2 * a * b * x ^^^ 3 + -6 * a * b * x ^^^ 2 * y + 6 * a * b * x * y ^^^ 2 + -2 * a * b * y ^^^ 3 + b ^^^ 2 * x ^^^ 3 + -3 * b ^^^ 2 * x ^^^ 2 * y + 3 * b ^^^ 2 * x * y ^^^ 2 + -1 * b ^^^ 2 * y ^^^ 3)"
  12.400 -then ()
  12.401 -else error "rational.sml: diff.behav. in norm_Rational_mg 7";
  12.402 -*)
  12.403 -(*val t = str2term 
  12.404 -"(a ^^^ 4 * x + -1 * a ^^^ 4 * y + 4 * a ^^^ 3 * b * x + -4 * a ^^^ 3 * b * y + 6 * a ^^^ 2 * b ^^^ 2 * x + -6 * a ^^^ 2 * b ^^^ 2 * y + 4 * a * b ^^^ 3 * x + -4 * a * b ^^^ 3 * y + b ^^^ 4 * x + -1 * b ^^^ 4 * y) /(a ^^^ 2 * x ^^^ 3 + -3 * a ^^^ 2 * x ^^^ 2 * y + 3 * a ^^^ 2 * x * y ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 3 + 2 * a * b * x ^^^ 3 + -6 * a * b * x ^^^ 2 * y + 6 * a * b * x * y ^^^ 2 + -2 * a * b * y ^^^ 3 + b ^^^ 2 * x ^^^ 3 + -3 * b ^^^ 2 * x ^^^ 2 * y + 3 * b ^^^ 2 * x * y ^^^ 2 + -1 * b ^^^ 2 * y ^^^ 3)"
  12.405 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
  12.406 -term2str t;*)
  12.407 -(* uncaught exception nonexhaustive binding failure
  12.408 -   raised at: stdIn:93.1-93.51 *)
  12.409 -
  12.410 -(*Schalk I, p.66 Nr. 381a *)
  12.411 -(* ACHTUNG: rechnet ca. 2 Minuten !!! *)
  12.412 -(* WN060831???MG2
  12.413 -val t = str2term "18*(a+b)^^^3*(a - b)^^^2/(72*(a - b)^^^3*(a+b)^^^2)";
  12.414 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.415 -term2str t;
  12.416 -if (term2str t) =
  12.417 -"(a + b) / (4 * a + -4 * b)"
  12.418 -then () else error "rational.sml: diff.behav. in norm_Rational_mg 8";
  12.419 -*)
  12.420 +(*Schalk I, p.60 Nr. 215c: was not cancelled with Isabelle2002 *)
  12.421 +val t = str2term "(a + b)^^^4 * (x - y)  /  ((x - y)^^^3 * (a + b)^^^2)";
  12.422 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.423 +if term2str t = "(a ^^^ 2 + 2 * a * b + b ^^^ 2) / (x ^^^ 2 + -2 * x * y + y ^^^ 2)"
  12.424 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 7";
  12.425  
  12.426  (*SRC Schalk I, p.66 Nr. 381b *)
  12.427  val t = str2term 
  12.428  "(4*x^^^2 - 20*x + 25)/(2*x - 5)^^^3";
  12.429 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.430 -term2str t;
  12.431 -if (term2str t) =
  12.432 -"-1 / (5 + -2 * x)"
  12.433 -then ()
  12.434 -else error "rational.sml: diff.behav. in norm_Rational_mg 9";
  12.435 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.436 +if term2str t = "1 / (-5 + 2 * x)"
  12.437 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 9";
  12.438 +
  12.439 +(* e190c Stefan K.*)
  12.440 +val t = str2term "((1 + 9*a^^^2) * (1 + 3*a))  /  ((3*a + 9*a^^^2) * (1 + 3 * a))";
  12.441 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.442 +if term2str t =  "(1 + 9 * a ^^^ 2) / (3 * a + 9 * a ^^^ 2)"
  12.443 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 3";
  12.444 +
  12.445 +(* e192b Stefan K.*)
  12.446 +val t = str2term "(x^^^2 * (7*x + (-1)*y))  /  (y^^^2 * (7*x + (-1)*y))";
  12.447 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.448 +if term2str t = "x ^^^ 2 / y ^^^ 2"
  12.449 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 4";
  12.450 +
  12.451 +(*SRC Schalk I, p.66 Nr. 379c *)
  12.452 +val t = str2term "(a - b) / (b - a)";
  12.453 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.454 +if term2str t = "-1"
  12.455 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 5";
  12.456 +
  12.457 +(*SRC Schalk I, p.66 Nr. 380b *)
  12.458 +val t = str2term "15*(3*x + 3) * (4*x + 9)  /  (12*(2*x + 7) * (5*x + 5))";
  12.459 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.460 +if term2str t = "(27 + 12 * x) / (28 + 8 * x)"
  12.461 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 6";
  12.462 +
  12.463 +(*Schalk I, p.60 Nr. 215c *)
  12.464 +val t = str2term "(a + b)^^^4 * (x - y)  /  ((x - y)^^^3 * (a + b)^^^2)";
  12.465 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.466 +if term2str t = "(a ^^^ 2 + 2 * a * b + b ^^^ 2) / (x ^^^ 2 + -2 * x * y + y ^^^ 2)"
  12.467 +then () else error "Schalk I, p.60 Nr. 215c: with Isabelle2002 cancellation incomplete, changed";
  12.468 +
  12.469 +(* extreme example from somewhere *)
  12.470 +val t = str2term 
  12.471 +    ("(a^^^4 * x  +  -1*a^^^4 * y  +  4*a^^^3 * b * x  +  -4*a^^^3 * b * y  + " ^
  12.472 +      "6*a^^^2 * b^^^2 * x  +  -6*a^^^2 * b^^^2 * y  +  4*a * b^^^3 * x  +  -4*a * b^^^3 * y  + " ^
  12.473 +      "b^^^4 * x  +  -1*b^^^4 * y) " ^
  12.474 +  " / (a^^^2 * x^^^3  +  -3*a^^^2 * x^^^2 * y  +  3*a^^^2 * x * y^^^2  +  -1*a^^^2 * y^^^3 + " ^
  12.475 +      "2*a * b * x^^^3  +  -6*a * b * x^^^2 * y  +  6*a * b * x * y^^^2  +  -2*a * b * y^^^3 + " ^
  12.476 +      "b^^^2 * x^^^3  +  -3*b^^^2 * x^^^2 * y  +  3*b^^^2 * x * y^^^2  +  -1*b ^^^ 2 * y ^^^ 3)")
  12.477 +val SOME (t, _) = rewrite_set_ thy false cancel_p t;
  12.478 +if term2str t = "(a ^^^ 2 + 2 * a * b + b ^^^ 2) / (x ^^^ 2 + -2 * x * y + y ^^^ 2)"
  12.479 +then () else error "with Isabelle2002: NONE -- now SOME changed";
  12.480 +
  12.481 +(*Schalk I, p.66 Nr. 381a *)
  12.482 +(* ATTENTION: here the rls is very slow. In Isabelle2002 this required 2 min *)
  12.483 +val t = str2term "18*(a + b)^^^3 * (a - b)^^^2 / (72*(a - b)^^^3 * (a + b)^^^2)";
  12.484 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.485 +if term2str t = "(a + b) / (4 * a + -4 * b)"
  12.486 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 8";
  12.487 +
  12.488 +(*SRC Schalk I, p.66 Nr. 381b *)
  12.489 +val t = str2term "(4*x^^^2 - 20*x + 25) / (2*x - 5)^^^3";
  12.490 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.491 +if term2str t = "1 / (-5 + 2 * x)"
  12.492 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 9";
  12.493  
  12.494  (*SRC Schalk I, p.66 Nr. 381c *)
  12.495 -val t = str2term 
  12.496 -"(27*a^^^3+9*a^^^2+3*a+1)/(27*a^^^3+18*a^^^2+3*a)";
  12.497 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.498 -term2str t;
  12.499 -if (term2str t) =
  12.500 -"(1 + 9 * a ^^^ 2) / (3 * a + 9 * a ^^^ 2)"
  12.501 -then ()
  12.502 -else error "rational.sml: diff.behav. in norm_Rational_mg 10";
  12.503 +val t = str2term "(27*a^^^3 + 9*a^^^2+3*a+1) / (27*a^^^3 + 18*a^^^2+3*a)";
  12.504 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.505 +if term2str t = "(1 + 9 * a ^^^ 2) / (3 * a + 9 * a ^^^ 2)"
  12.506 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 10";
  12.507  
  12.508  (*SRC Schalk I, p.66 Nr. 383a *)
  12.509 -val t = str2term 
  12.510 -"(5*a^^^2 - 5*a*b)/(a - b)^^^2";
  12.511 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.512 -term2str t;
  12.513 -if (term2str t) =
  12.514 -"5 * a / (a + -1 * b)"
  12.515 -then ()
  12.516 -else error "rational.sml: diff.behav. in norm_Rational_mg 11";
  12.517 +val t = str2term "(5*a^^^2 - 5*a*b) / (a - b)^^^2";
  12.518 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.519 +if term2str t = "-5 * a / (-1 * a + b)"
  12.520 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 11";
  12.521  
  12.522 +"----- NOT TERMINATING ?: worked before 0707xx";
  12.523 +val t = str2term "(a^^^2 - 1)*(b + 1) / ((b^^^2 - 1)*(a+1))";
  12.524 +(* WN130911 "exception Div raised" by 
  12.525 +  cancel_p_ thy (str2term ("(-1 + -1 * b + a ^^^ 2 + a ^^^ 2 * b) /" ^
  12.526 +                           "(-1 + -1 * a + b ^^^ 2 + a * b ^^^ 2)"))
  12.527  
  12.528 -"-------- common denominator ----------------------------";
  12.529 -"-------- common denominator ----------------------------";
  12.530 -"-------- common denominator ----------------------------";
  12.531 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.532 +if term2str t = "(1 + -1 * a) / (1 + -1 * b)" then ()
  12.533 +else error "rational.sml MG tests 3e";
  12.534 +*)
  12.535 +
  12.536 +"-------- examples common denominator from: Mathematik 1 Schalk --------------";
  12.537 +"-------- examples common denominator from: Mathematik 1 Schalk --------------";
  12.538 +"-------- examples common denominator from: Mathematik 1 Schalk --------------";
  12.539  (*SRA Schalk I, p.67 Nr. 403a *)
  12.540 -val t = str2term 
  12.541 -"4/x - 3/y - 1";
  12.542 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.543 -term2str t;
  12.544 -if (term2str t) =
  12.545 -"(-3 * x + 4 * y + -1 * x * y) / (x * y)"
  12.546 -then ()
  12.547 -else error "rational.sml: diff.behav. in norm_Rational_mg 12";
  12.548 +val t = str2term "4/x - 3/y - 1";
  12.549 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.550 +if term2str t = "(-3 * x + 4 * y + -1 * x * y) / (x * y)"
  12.551 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 12";
  12.552  
  12.553 -(*SRA Schalk I, p.67 Nr. 407b *)
  12.554 -val t = str2term 
  12.555 -"(2*a+3*b)/(b*c) + (3*c+a)/(a*c) - (2*a^^^2+3*b*c)/(a*b*c)";
  12.556 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.557 -term2str t;
  12.558 -if (term2str t) =
  12.559 -"4 / c"
  12.560 -then ()
  12.561 -else error "rational.sml: diff.behav. in norm_Rational_mg 13";
  12.562 +val t = str2term "(2*a+3*b)/(b*c) + (3*c+a)/(a*c) - (2*a^^^2+3*b*c)/(a*b*c)";
  12.563 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.564 +if term2str t = "4 / c"
  12.565 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 13";
  12.566  
  12.567  (*SRA Schalk I, p.67 Nr. 410b *)
  12.568 -val t = str2term 
  12.569 -"1/(x+1) + 1/(x+2) - 2/(x+3)";
  12.570 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.571 -term2str t;
  12.572 -if (term2str t) =
  12.573 -"(5 + 3 * x) / (6 + 11 * x + 6 * x ^^^ 2 + x ^^^ 3)"
  12.574 -then ()
  12.575 -else error "rational.sml: diff.behav. in norm_Rational_mg 14";
  12.576 +val t = str2term "1/(x+1) + 1/(x+2) - 2/(x+3)";
  12.577 +(* WN130911 non-termination due to non-termination of
  12.578 +  cancel_p_ thy (str2term "(5 + 3 * x) / (6 + 11 * x + 6 * x ^^^ 2 + x ^^^ 3)")
  12.579 +
  12.580 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.581 +if term2str t = "(5 + 3 * x) / (6 + 11 * x + 6 * x ^^^ 2 + x ^^^ 3)"
  12.582 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 14";
  12.583 +*)
  12.584  
  12.585  (*SRA Schalk I, p.67 Nr. 413b *)
  12.586 -val t = str2term 
  12.587 -"(1+x)/(1 - x) - (1 - x)/(1+x) + 2*x/(1 - x^^^2)";
  12.588 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.589 -term2str t;
  12.590 -if (term2str t) =
  12.591 -"6 * x / (1 + -1 * x ^^^ 2)"
  12.592 -then ()
  12.593 -else error "rational.sml: diff.behav. in norm_Rational_mg 15";
  12.594 +val t = str2term "(1 + x)/(1 - x)  -  (1 - x)/(1 + x)  +  2*x/(1 - x^^^2)";
  12.595 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.596 +if term2str t = "6 * x / (1 + -1 * x ^^^ 2)"
  12.597 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 15";
  12.598  
  12.599  (*SRA Schalk I, p.68 Nr. 414a *)
  12.600 -val t = str2term 
  12.601 -"(x + 2)/(x - 1) + (x - 3)/(x - 2) - (x + 1)/((x - 1)*(x - 2))";
  12.602 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.603 -term2str t;
  12.604 -if (term2str t) =
  12.605 -"(-2 + -5 * x + 2 * x ^^^ 2) / (2 + -3 * x + x ^^^ 2)"
  12.606 -then ()
  12.607 -else error "rational.sml: diff.behav. in norm_Rational_mg 16";
  12.608 -
  12.609 -(*SRA Schalk I, p.68 Nr. 423a *)
  12.610 -val t = str2term 
  12.611 -"(2*x+3*y)/x + (4*x^^^3 - x*y^^^2 - 3*y^^^3)/(x^^^3 - 2*x^^^2*y+x*y^^^2) - (5*x+6*y)/(x - y)";
  12.612 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.613 -term2str t;
  12.614 -if (term2str t) =
  12.615 -"1"
  12.616 -then ()
  12.617 -else error "rational.sml: diff.behav. in norm_Rational_mg 17";
  12.618 +val t = str2term "(x + 2)/(x - 1)  +  (x - 3)/(x - 2)  -  (x + 1)/((x - 1)*(x - 2))";
  12.619 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.620 +if term2str t ="(-2 + -5 * x + 2 * x ^^^ 2) / (2 + -3 * x + x ^^^ 2)"
  12.621 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 16";
  12.622  
  12.623  (*SRA Schalk I, p.68 Nr. 428b *)
  12.624  val t = str2term 
  12.625 -"1/(a - b)^^^2 + 1/(a+b)^^^2 - 2/(a^^^2 - b^^^2) - 4*(b^^^2 - 1)/(a^^^2 - b^^^2)^^^2";
  12.626 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.627 -term2str t;
  12.628 -if (term2str t) =
  12.629 -"4 / (a ^^^ 4 + -2 * a ^^^ 2 * b ^^^ 2 + b ^^^ 4)"
  12.630 -then ()
  12.631 -else error "rational.sml: diff.behav. in norm_Rational_mg 18";
  12.632 +  "1/(a - b)^^^2  +  1/(a + b)^^^2  -  2/(a^^^2 - b^^^2)  -  4*(b^^^2 - 1)/(a^^^2 - b^^^2)^^^2";
  12.633 +(* WN130911 non-termination due to non-termination of
  12.634 +  cancel_p_ thy (str2term "(4 + -4 * b ^^^ 2) / (a ^^^ 4 + -2 * (a ^^^ 2 * b ^^^ 2) + b ^^^ 4)")
  12.635 +
  12.636 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.637 +if term2str t = "4 / (a ^^^ 4 + -2 * a ^^^ 2 * b ^^^ 2 + b ^^^ 4)"
  12.638 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 18";
  12.639 +*)
  12.640  
  12.641  (*SRA Schalk I, p.68 Nr. 430b *)
  12.642  val t = str2term 
  12.643 -"a^^^2/(a - 3*b) - 108*a*b^^^3/((a+3*b)*(a^^^2 - 9*b^^^2)) - 9*b^^^2*(a - 3*b)/(a+3*b)^^^2";
  12.644 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.645 -term2str t;
  12.646 -if (term2str t) =
  12.647 -"a + 3 * b"
  12.648 -then ()
  12.649 -else error "rational.sml: diff.behav. in norm_Rational_mg 19";
  12.650 -
  12.651 +  "a^^^2/(a - 3*b) - 108*a*b^^^3/((a+3*b)*(a^^^2 - 9*b^^^2)) - 9*b^^^2*(a - 3*b)/(a+3*b)^^^2";
  12.652 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.653 +if term2str t = "a + 3 * b"
  12.654 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 19";
  12.655  
  12.656  (*SRA Schalk I, p.68 Nr. 432 *)
  12.657  val t = str2term 
  12.658 -"(a^^^2+a*b)/(a^^^2 - b^^^2) - (b^^^2 - a*b)/(b^^^2 - a^^^2) + a^^^2*(a - b)/(a^^^3 - a^^^2*b) - 2*a*(a^^^2 - b^^^2)/(a^^^3 - a*b^^^2) - 2*b^^^2/(a^^^2 - b^^^2)";
  12.659 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.660 +  ("(a^^^2 + a*b) / (a^^^2 - b^^^2)  -  (b^^^2 - a*b) / (b^^^2 - a^^^2)  +  " ^
  12.661 +  "a^^^2*(a - b) / (a^^^3 - a^^^2*b)  -  2*a*(a^^^2 - b^^^2) / (a^^^3 - a*b^^^2)  -  " ^
  12.662 +  "2*b^^^2 / (a^^^2 - b^^^2)");
  12.663 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.664  term2str t;
  12.665 -if (term2str t) =
  12.666 -"0"
  12.667 -then ()
  12.668 -else error "rational.sml: diff.behav. in norm_Rational_mg 20";
  12.669 +if term2str t = "0"
  12.670 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 20";
  12.671  
  12.672 -(*Eigenes*)
  12.673 +(* some example *)
  12.674 +val t = str2term "3*a / (a*b)  +  x/y";
  12.675 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.676 +if term2str t = "(3 * y + b * x) / (b * y)"
  12.677 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 21";
  12.678 +
  12.679 +"-------- examples multiply and cancel from: Mathematik 1 Schalk -------------";
  12.680 +"-------- examples multiply and cancel from: Mathematik 1 Schalk -------------";
  12.681 +"-------- examples multiply and cancel from: Mathematik 1 Schalk -------------";
  12.682 +(*------- SRM Schalk I, p.68 Nr. 436a *)
  12.683 +val t = str2term "3*(x+y) / (15*(x - y))  *   25*(x - y)^^^2 / (18*(x + y)^^^2)";
  12.684 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.685 +if term2str t = "(-5 * x + 5 * y) / (-18 * x + -18 * y)"
  12.686 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 22";
  12.687 +
  12.688 +(*------- SRM.test Schalk I, p.68 Nr. 436b *)
  12.689 +val t = str2term "5*a*(a - b)^^^2*(a + b)^^^3/(7*b*(a - b)^^^3) * 7*b/(a + b)^^^3";
  12.690 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.691 +if term2str t = "5 * a / (a + -1 * b)"
  12.692 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 23";
  12.693 +
  12.694 +(*------- Schalk I, p.68 Nr. 437a *)
  12.695 +val t = str2term "(3*a - 4*b) / (4*c+3*e)  *  (3*a+4*b)/(9*a^^^2 - 16*b^^^2)";
  12.696 +(* raises an exception for unclear reasons:
  12.697 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.698 +:
  12.699 +###  rls: cancel_p on: (9 * a ^^^ 2 + -16 * b ^^^ 2) / (4 * c + 3 * e) /
  12.700 +(9 * a ^^^ 2 + -16 * b ^^^ 2) 
  12.701 +exception Div raised
  12.702 +
  12.703 +BUT
  12.704  val t = str2term 
  12.705 -"3*a/(a*b) + x/y";
  12.706 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.707 -term2str t;
  12.708 -if (term2str t) =
  12.709 -"(3 * y + b * x) / (b * y)"
  12.710 -then ()
  12.711 -else error "rational.sml: diff.behav. in norm_Rational_mg 21";
  12.712 +  ("(9 * a ^^^ 2 + -16 * b ^^^ 2) / (4 * c + 3 * e) /" ^
  12.713 +  "(9 * a ^^^ 2 + -16 * b ^^^ 2)");
  12.714 +NONE = cancel_p_ thy t;
  12.715  
  12.716 -
  12.717 -"-------- multiply and cancel ---------------------------";
  12.718 -"-------- multiply and cancel ---------------------------";
  12.719 -"-------- multiply and cancel ---------------------------";
  12.720 -(*SRM Schalk I, p.68 Nr. 436a *)
  12.721 -val t = str2term 
  12.722 -"3*(x+y)/(15*(x - y)) * 25*(x - y)^^^2/(18*(x+y)^^^2)";
  12.723 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.724 -term2str t;
  12.725 -if (term2str t) =
  12.726 -"(5 * x + -5 * y) / (18 * x + 18 * y)"
  12.727 -then ()
  12.728 -else error "rational.sml: diff.behav. in norm_Rational_mg 22";
  12.729 -
  12.730 -(*SRM.test Schalk I, p.68 Nr. 436b *)
  12.731 -(*WN060420???MG3 crashes with method 'simplify' in 
  12.732 -  IsacCore > Simplification > Rational Terms > Multiplication > No.2*)
  12.733 -val t = str2term "5*a*(a - b)^^^2*(a + b)^^^3/(7*b*(a - b)^^^3) * 7*b/(a + b)^^^3";
  12.734 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.735 -term2str t;
  12.736 -if (term2str t) =
  12.737 -"5 * a / (a + -1 * b)"
  12.738 -then ()
  12.739 -else error "rational.sml: diff.behav. in norm_Rational_mg 23";
  12.740 -
  12.741 -(*Schalk I, p.68 Nr. 437a *)
  12.742 -val t = str2term "(3*a - 4*b)/(4*c+3*e) * (3*a+4*b)/(9*a^^^2 - 16*b^^^2)";
  12.743 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.744 -if (term2str t) = "1 / (4 * c + 3 * e)" then ()
  12.745 +if term2str t = "1 / (4 * c + 3 * e)" then ()
  12.746  else error "rational.sml: diff.behav. in norm_Rational_mg 24";
  12.747 +*)
  12.748  
  12.749  "----- S.K. corrected non-termination 060904";
  12.750  val t = str2term "(3*a - 4*b) * (3*a+4*b)/((4*c+3*e)*(9*a^^^2 - 16*b^^^2))";
  12.751 -val SOME (t',_) = rewrite_set_ thy false make_polynomial t;
  12.752 -term2str t';
  12.753 -if term2str t' = 
  12.754 +val SOME (t, _) = rewrite_set_ thy false make_polynomial t;
  12.755 +if term2str t = 
  12.756    "(9 * a ^^^ 2 + -16 * b ^^^ 2) /\n(36 * a ^^^ 2 * c + 27 * a ^^^ 2 * e + -64 * b ^^^ 2 * c +\n -48 * b ^^^ 2 * e)"
  12.757  (*"(9 * a ^^^ 2 + -16 * b ^^^ 2) / (36 * a ^^^ 2 * c + 27 * a ^^^ 2 * e + -64 * b ^^^ 2 * c + -48 * b ^^^ 2 * e)"*)
  12.758  then () else error "rational.sml: S.K.8..corrected 060904-6";
  12.759  
  12.760  "----- S.K. corrected non-termination of cancel_p_";
  12.761  val t'' = str2term ("(9 * a ^^^ 2 + -16 * b ^^^ 2) /" ^
  12.762 -"(36 * a^^^2 * c + (27 * a^^^2 * e + (-64 * b^^^2 * c + -48 * b^^^2 * e)))");
  12.763 +  "(36 * a^^^2 * c + (27 * a^^^2 * e + (-64 * b^^^2 * c + -48 * b^^^2 * e)))");
  12.764  val SOME (t',_) = rewrite_set_ thy false cancel_p t'';
  12.765 -if term2str t' = "1 / (4 * c + 3 * e)" then ()
  12.766 -else error "rational.sml: diff.behav. in cancel_p S.K.8";
  12.767 +if term2str t' = "1 / (4 * c + 3 * e)"
  12.768 +then () else error "rational.sml: diff.behav. in cancel_p S.K.8";
  12.769  
  12.770 -(*Schalk I, p.68 Nr. 437b *)
  12.771 -(* nonterm.SK9 loops: cancel_p kann nicht weiter kuerzen!!! *)
  12.772 -val t'' = str2term "(a + b)/(x^^^2 - y^^^2) * ((x - y)^^^2/(a^^^2 - b^^^2))";
  12.773 -(* val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t'';
  12.774 -   *)
  12.775 -
  12.776 -"================delete===";
  12.777 -(*a casual output from above*)
  12.778 -val t = str2term 
  12.779 -"(a * x ^^^ 2 + -2 * a * x * y + a * y ^^^ 2 + b * x ^^^ 2 + -2 * b * x * y + b * y ^^^ 2) /(a ^^^ 2 * x ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 2 + -1 * b ^^^ 2 * x ^^^ 2 + b ^^^ 2 * y ^^^ 2)"; 
  12.780 -(* WN060831 nonterm.SK10 
  12.781 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
  12.782 -term2str t;
  12.783 +(*------- Schalk I, p.68 Nr. 437b*)
  12.784 +val t = str2term "(a + b)/(x^^^2 - y^^^2) * ((x - y)^^^2/(a^^^2 - b^^^2))";
  12.785 +(*val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.786 +:
  12.787 +####  rls: cancel_p on: (a * x ^^^ 2 + -2 * (a * (x * y)) + a * y ^^^ 2 + b * x ^^^ 2 +
  12.788 + -2 * (b * (x * y)) +
  12.789 + b * y ^^^ 2) /
  12.790 +(a ^^^ 2 * x ^^^ 2 + -1 * (a ^^^ 2 * y ^^^ 2) + -1 * (b ^^^ 2 * x ^^^ 2) +
  12.791 + b ^^^ 2 * y ^^^ 2) 
  12.792 +exception Div raised
  12.793  *)
  12.794  
  12.795 -(*SRM Schalk I, p.68 Nr. 438a *)
  12.796 -val t = str2term 
  12.797 -"x*y/(x*y - y^^^2)*(x^^^2 - x*y)";
  12.798 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.799 -term2str t;
  12.800 -if (term2str t) =
  12.801 -"x ^^^ 2"
  12.802 -then ()
  12.803 -else error "rational.sml: diff.behav. in norm_Rational_mg 24";
  12.804 +(*------- SRM Schalk I, p.68 Nr. 438a *)
  12.805 +val t = str2term "x*y / (x*y - y^^^2)  *  (x^^^2 - x*y)";
  12.806 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.807 +if term2str t = "x ^^^ 2"
  12.808 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 24";
  12.809  
  12.810 -(*SRM Schalk I, p.68 Nr. 439b *)
  12.811 -val t = str2term 
  12.812 -"(4*x^^^2+4*x+1)*((x^^^2 - 2*x^^^3)/(4*x^^^2+2*x))";
  12.813 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.814 -term2str t;
  12.815 -if (term2str t) =
  12.816 -"(x + -4 * x ^^^ 3) / 2"
  12.817 -then ()
  12.818 -else error "rational.sml: diff.behav. in norm_Rational_mg 25";
  12.819 +(*------- SRM Schalk I, p.68 Nr. 439b *)
  12.820 +val t = str2term "(4*x^^^2 + 4*x + 1)  *  ((x^^^2 - 2*x^^^3) / (4*x^^^2 + 2*x))";
  12.821 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.822 +if term2str t = "(x + -4 * x ^^^ 3) / 2"
  12.823 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 25";
  12.824  
  12.825 -(*SRM Schalk I, p.68 Nr. 440a *)
  12.826 -val t = str2term 
  12.827 -"(x^^^2 - 2*x)/(x^^^2 - 3*x) * (x - 3)^^^2/(x^^^2 - 4)";
  12.828 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.829 -term2str t;
  12.830 -if (term2str t) =
  12.831 -"(-3 + x) / (2 + x)"
  12.832 -then ()
  12.833 -else error "rational.sml: diff.behav. in norm_Rational_mg 26";
  12.834 +(*------- SRM Schalk I, p.68 Nr. 440a *)
  12.835 +val t = str2term "(x^^^2 - 2*x) / (x^^^2 - 3*x)  *  (x - 3)^^^2 / (x^^^2 - 4)";
  12.836 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.837 +if term2str t = "(-3 + x) / (2 + x)"
  12.838 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 26";
  12.839  
  12.840  "----- Schalk I, p.68 Nr. 440b SK11 works since 0707xx";
  12.841 +val t = str2term "(a^^^3 - 9*a) / (a^^^3*b - a*b^^^3)  *  (a^^^2*b + a*b^^^2) / (a+3)";
  12.842 +(* WN130911 non-termination for unclear reasons:
  12.843 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.844 +
  12.845 +... ENDS WITH THIS TRACE:
  12.846 +:
  12.847 +###  rls: cancel_p on: (-9 * (a ^^^ 3 * b) + -9 * (a ^^^ 2 * b ^^^ 2) + a ^^^ 5 * b +
  12.848 + a ^^^ 4 * b ^^^ 2) /
  12.849 +(a ^^^ 3 * b + -1 * (a * b ^^^ 3)) /
  12.850 +(3 + a)
  12.851 +BUT THIS IS CORRECTLY RECOGNISED 
  12.852  val t = str2term 
  12.853 -"(a^^^3 - 9*a)/(a^^^3*b - a*b^^^3)*(a^^^2*b+a*b^^^2)/(a+3)";
  12.854 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
  12.855 +  ("(-9 * (a^^^3 * b) + -9 * (a^^^2 * b^^^2) + a^^^5 * b + a^^^4 * b^^^2)  /" ^
  12.856 +  "(a^^^3 * b + -1 * (a * b^^^3))  /  (3 + (a::real))");
  12.857 +AS
  12.858 +NONE = cancel_p_ thy t;
  12.859 +
  12.860  if term2str t = "(-3 * a + a ^^^ 2) / (a + -1 * b)" then ()
  12.861  else error "rational.sml: diff.behav. in norm_Rational 27";
  12.862 +*)
  12.863  
  12.864  "----- SK12 works since 0707xx";
  12.865 -val t = str2term "(a^^^3 - 9*a)*(a^^^2*b+a*b^^^2)/((a^^^3*b - a*b^^^3)*(a+3))";
  12.866 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t; term2str t';
  12.867 +val t = str2term "(a^^^3 - 9*a) * (a^^^2*b+a*b^^^2)  /  ((a^^^3*b - a*b^^^3) * (a+3))";
  12.868 +(* WN130911 non-termination due to non-termination of
  12.869 +  cancel_p_ thy (str2term "(4 + -4 * b ^^^ 2) / (a ^^^ 4 + -2 * (a ^^^ 2 * b ^^^ 2) + b ^^^ 4)")
  12.870 +
  12.871 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.872  if term2str t' = "(-3 * a + a ^^^ 2) / (a + -1 * b)" then ()
  12.873  else error "rational.sml: diff.behav. in norm_Rational 28";
  12.874 +*)
  12.875  
  12.876 -
  12.877 -"-------- common denominator and multiplication ---------";
  12.878 -"-------- common denominator and multiplication ---------";
  12.879 -"-------- common denominator and multiplication ---------";
  12.880 -(*SRAM Schalk I, p.69 Nr. 441b *)
  12.881 +"-------- examples common denominator and multiplication from: Schalk --------";
  12.882 +"-------- examples common denominator and multiplication from: Schalk --------";
  12.883 +"-------- examples common denominator and multiplication from: Schalk --------";
  12.884 +(*------- SRAM Schalk I, p.69 Nr. 441b *)
  12.885  val t = str2term "(4*a/3 + 3*b^^^2/a^^^3 + b/(4*a))*(4*b/(3*a))";
  12.886 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.887 -term2str t;
  12.888 -if (term2str t) =
  12.889 -  "(36 * b ^^^ 3 + 3 * a ^^^ 2 * b ^^^ 2 + 16 * a ^^^ 4 * b) / (9 * a ^^^ 4)"
  12.890 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.891 +if term2str t = "(36 * b ^^^ 3 + 3 * a ^^^ 2 * b ^^^ 2 + 16 * a ^^^ 4 * b) / (9 * a ^^^ 4)"
  12.892  then () else error "rational.sml: diff.behav. in norm_Rational_mg 28";
  12.893  
  12.894 -(*SRAM Schalk I, p.69 Nr. 442b *)
  12.895 -val t = str2term "(15*a^^^2/x^^^3 - 5*b^^^4/x^^^2 + 25*c^^^2/x)*(x^^^3/(5*a*b^^^3*c^^^3)) + 1/c^^^3 * (b*x/a - 3*a/b^^^3)";
  12.896 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.897 -term2str t;
  12.898 -if (term2str t) =
  12.899 -"5 * x ^^^ 2 / (a * b ^^^ 3 * c)"
  12.900 +(*------- SRAM Schalk I, p.69 Nr. 442b *)
  12.901 +val t = str2term ("(15*a^^^2/x^^^3 - 5*b^^^4/x^^^2 + 25*c^^^2/x) * " ^
  12.902 +  "(x^^^3/(5*a*b^^^3*c^^^3)) + 1/c^^^3 * (b*x/a - 3*a/b^^^3)");
  12.903 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.904 +if term2str t = "5 * x ^^^ 2 / (a * b ^^^ 3 * c)"
  12.905  then () else error "rational.sml: diff.behav. in norm_Rational_mg 29";
  12.906  
  12.907 -(*SRAM Schalk I, p.69 Nr. 443b *)
  12.908 -val t = str2term "(a/2 + b/3)*(b/3 - a/2)";
  12.909 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.910 -term2str t;
  12.911 -if (term2str t) =
  12.912 -"(-9 * a ^^^ 2 + 4 * b ^^^ 2) / 36"
  12.913 +(*------- SRAM Schalk I, p.69 Nr. 443b *)
  12.914 +val t = str2term "(a/2 + b/3) * (b/3 - a/2)";
  12.915 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.916 +if term2str t = "(-9 * a ^^^ 2 + 4 * b ^^^ 2) / 36"
  12.917  then () else error "rational.sml: diff.behav. in norm_Rational_mg 30";
  12.918  
  12.919 -(*SRAM Schalk I, p.69 Nr. 445b *)
  12.920 +(*------- SRAM Schalk I, p.69 Nr. 445b *)
  12.921  val t = str2term "(a^^^2/9 + 2*a/(3*b) + 4/b^^^2)*(a/3 - 2/b) + 8/b^^^3";
  12.922 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.923 -term2str t;
  12.924 -if (term2str t) =
  12.925 -"a ^^^ 3 / 27"
  12.926 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.927 +if term2str t = "a ^^^ 3 / 27"
  12.928  then () else error "rational.sml: diff.behav. in norm_Rational_mg 31";
  12.929  
  12.930 -(*SRAM Schalk I, p.69 Nr. 446b *)
  12.931 +(*------- SRAM Schalk I, p.69 Nr. 446b *)
  12.932  val t = str2term "(x/(5*x + 4*y) - y/(5*x - 4*y) + 1)*(25*x^^^2 - 16*y^^^2)";
  12.933 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.934 -term2str t;
  12.935 -if (term2str t) =
  12.936 -"30 * x ^^^ 2 + -9 * x * y + -20 * y ^^^ 2"
  12.937 -then ()
  12.938 -else error "rational.sml: diff.behav. in norm_Rational_mg 32";
  12.939 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.940 +if term2str t = "30 * x ^^^ 2 + -9 * x * y + -20 * y ^^^ 2"
  12.941 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 32";
  12.942  
  12.943 -(*SRAM Schalk I, p.69 Nr. 449a *)(*Achtung: rechnet ca 8 Sekunden*)
  12.944 +(*------- SRAM Schalk I, p.69 Nr. 449a *)(*Achtung: rechnet ca 8 Sekunden*)
  12.945  val t = str2term 
  12.946  "(2*x^^^2/(3*y)+x/y^^^2)*(4*x^^^4/(9*y^^^2)+x^^^2/y^^^4)*(2*x^^^2/(3*y) - x/y^^^2)";
  12.947 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.948 -term2str t;
  12.949 -if (term2str t) = "(-81 * x ^^^ 4 + 16 * x ^^^ 8 * y ^^^ 4) / (81 * y ^^^ 8)"
  12.950 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.951 +if term2str t = "(-81 * x ^^^ 4 + 16 * x ^^^ 8 * y ^^^ 4) / (81 * y ^^^ 8)"
  12.952  then () else error "rational.sml: diff.behav. in norm_Rational_mg 33";
  12.953  
  12.954 -
  12.955 -(*SRAM Schalk I, p.69 Nr. 450a *)
  12.956 +(*------- SRAM Schalk I, p.69 Nr. 450a *)
  12.957  val t = str2term 
  12.958  "(4*x/(3*y)+2*y/(3*x))^^^2 - (2*y/(3*x) - 2*x/y)*(2*y/(3*x)+2*x/y)";
  12.959 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.960 -term2str t;
  12.961 -if (term2str t) =
  12.962 -"(52 * x ^^^ 2 + 16 * y ^^^ 2) / (9 * y ^^^ 2)"
  12.963 -then ()
  12.964 -else error "rational.sml: diff.behav. in norm_Rational_mg 34";
  12.965 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.966 +if term2str t = "(52 * x ^^^ 2 + 16 * y ^^^ 2) / (9 * y ^^^ 2)"
  12.967 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 34";
  12.968  
  12.969 +(*------- SRAM Schalk I, p.69 Nr. 442b --- abgewandelt*)
  12.970 +val t = str2term 
  12.971 +  ("(15*a^^^4/(a*x^^^3)  -  5*a*((b^^^4 - 5*c^^^2*x) / x^^^2))  *  " ^
  12.972 +  "(x^^^3/(5*a*b^^^3*c^^^3))   +   a/c^^^3 * (x*(b/a) - 3*b*(a/b^^^4))");
  12.973 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
  12.974 +if term2str t = "5 * x ^^^ 2 / (b ^^^ 3 * c)"
  12.975 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 53";
  12.976  
  12.977 -"-------- double fractions ------------------------------";
  12.978 -"-------- double fractions ------------------------------";
  12.979 -"-------- double fractions ------------------------------";
  12.980 -(*SRD Schalk I, p.69 Nr. 454b *)
  12.981 -val t = str2term 
  12.982 -"((2 - x)/(2*a)) / (2*a/(x - 2))";
  12.983 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.984 -term2str t;
  12.985 -if (term2str t) = 
  12.986 -"(-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2)"
  12.987 -then ()
  12.988 -else error "rational.sml: diff.behav. in norm_Rational_mg 35";
  12.989  
  12.990 -(*SRD Schalk I, p.69 Nr. 455a *)
  12.991 -val t = str2term 
  12.992 -"(a^^^2 + 1)/(a^^^2 - 1) / ((a+1)/(a - 1))";
  12.993 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
  12.994 -term2str t;
  12.995 -if (term2str t) = 
  12.996 -"(1 + a ^^^ 2) / (1 + 2 * a + a ^^^ 2)" then ()
  12.997 +"-------- examples double fractions from: Mathematik 1 Schalk ----------------";
  12.998 +"-------- examples double fractions from: Mathematik 1 Schalk ----------------";
  12.999 +"-------- examples double fractions from: Mathematik 1 Schalk ----------------";
 12.1000 +"----- SRD Schalk I, p.69 Nr. 454b";
 12.1001 +val t = str2term "((2 - x)/(2*a)) / (2*a/(x - 2))";
 12.1002 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1003 +if term2str t = "(-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2)"
 12.1004 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 35";
 12.1005 +
 12.1006 +"----- SRD Schalk I, p.69 Nr. 455a";
 12.1007 +val t = str2term "(a^^^2 + 1)/(a^^^2 - 1) / ((a+1)/(a - 1))";
 12.1008 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1009 +if term2str t = "(1 + a ^^^ 2) / (1 + 2 * a + a ^^^ 2)" then ()
 12.1010  else error "rational.sml: diff.behav. in norm_Rational_mg 36";
 12.1011  
 12.1012 -
 12.1013  "----- Schalk I, p.69 Nr. 455b";
 12.1014  val t = str2term "(x^^^2 - 4)/(y^^^2 - 9)/((2+x)/(3 - y))";
 12.1015 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1016 +(* WN130911 non-termination due to non-termination of
 12.1017 +  cancel_p_ thy (str2term ("(-12 + 4 * y + 3 * x ^^^ 2 + -1 * (x ^^^ 2 * y)) /" ^
 12.1018 +                           "(-18 + -9 * x + 2 * y ^^^ 2 + x * y ^^^ 2)"))
 12.1019 +
 12.1020 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1021  if term2str t = "(2 + -1 * x) / (3 + y)" then ()
 12.1022  else error "rational.sml: diff.behav. in norm_Rational_mg 37";
 12.1023 +*)
 12.1024  
 12.1025  "----- SK060904-1a non-termination of cancel_p_ ?: worked before 0707xx";
 12.1026 -val t = str2term "(x^^^2 - 4)*(3 - y)/((y^^^2 - 9)*(2+x))";
 12.1027 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1028 +val t = str2term "(x^^^2 - 4)*(3 - y) / ((y^^^2 - 9)*(2+x))";
 12.1029 +(* WN130911 non-termination due to non-termination of
 12.1030 +  cancel_p_ thy (str2term ("(-12 + 4 * y + 3 * x ^^^ 2 + -1 * (x ^^^ 2 * y)) /" ^
 12.1031 +                           "(-18 + -9 * x + 2 * y ^^^ 2 + x * y ^^^ 2)"))
 12.1032 +
 12.1033 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1034  if term2str t = "(2 + -1 * x) / (3 + y)" then ()
 12.1035  else error "rational.sml: diff.behav. in norm_Rational_mg 37b";
 12.1036 +*)
 12.1037  
 12.1038  "----- ?: worked before 0707xx";
 12.1039  val t = str2term "(3 + -1 * y) / (-9 + y ^^^ 2)";
 12.1040 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1041 -if term2str t = "-1 / (3 + y)" then ()
 12.1042 -else error "rational.sml: -1 / (3 + y) norm_Rational";
 12.1043 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1044 +if term2str t = "-1 / (3 + y)"
 12.1045 +then () else error "rational.sml: -1 / (3 + y) norm_Rational";
 12.1046  
 12.1047 -(*SRD Schalk I, p.69 Nr. 456b *)
 12.1048 -val t = str2term 
 12.1049 -"(b^^^3 - b^^^2)/(b^^^2+b)/(b^^^2 - 1)";
 12.1050 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1051 -term2str t;
 12.1052 -if (term2str t) = "b / (1 + 2 * b + b ^^^ 2)" then ()
 12.1053 -else error "rational.sml: diff.behav. in norm_Rational_mg 38";
 12.1054 +"----- SRD Schalk I, p.69 Nr. 456b";
 12.1055 +val t = str2term "(b^^^3 - b^^^2) / (b^^^2+b) / (b^^^2 - 1)";
 12.1056 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1057 +if term2str t = "b / (1 + 2 * b + b ^^^ 2)"
 12.1058 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 38";
 12.1059  
 12.1060 -(*SRD Schalk I, p.69 Nr. 457b *)
 12.1061 -val t = str2term 
 12.1062 -"(16*a^^^2 - 9*b^^^2)/(2*a+3*a*b) / ((4*a+3*b)/(4*a^^^2 - 9*a^^^2*b^^^2))";
 12.1063 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1064 -term2str t;
 12.1065 -if (term2str t) = 
 12.1066 -  "8 * a ^^^ 2 + -6 * a * b + -12 * a ^^^ 2 * b + 9 * a * b ^^^ 2"
 12.1067 +"----- SRD Schalk I, p.69 Nr. 457b";
 12.1068 +val t = str2term "(16*a^^^2 - 9*b^^^2)/(2*a+3*a*b) / ((4*a+3*b)/(4*a^^^2 - 9*a^^^2*b^^^2))";
 12.1069 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1070 +if term2str t = "8 * a ^^^ 2 + -6 * a * b + -12 * a ^^^ 2 * b + 9 * a * b ^^^ 2"
 12.1071  then () else error "rational.sml: diff.behav. in norm_Rational_mg 39";
 12.1072  
 12.1073  "----- Schalk I, p.69 Nr. 458b works since 0707";
 12.1074 +val t = str2term "(2*a^^^2*x - a^^^2) / (a*x - b*x) / (b^^^2*(2*x - 1) / (x*(a - b)))";
 12.1075 +(*val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1076 +:
 12.1077 +###  rls: cancel_p on: (-1 * a ^^^ 2 + 2 * (a ^^^ 2 * x)) / (a * x + -1 * (b * x)) /
 12.1078 +((-1 * b ^^^ 2 + 2 * (b ^^^ 2 * x)) / (a * x + -1 * (b * x))) 
 12.1079 +exception Div raised
 12.1080 +
 12.1081 +BUT
 12.1082  val t = str2term 
 12.1083 -"(2*a^^^2*x - a^^^2)/(a*x - b*x) / (b^^^2*(2*x - 1)/(x*(a - b)))";
 12.1084 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1085 +  ("(-1 * a ^^^ 2 + 2 * (a ^^^ 2 * x)) / (a * x + -1 * (b * x)) /" ^
 12.1086 +  "((-1 * b ^^^ 2 + 2 * (b ^^^ 2 * x)) / (a * x + -1 * (b * x)))");
 12.1087 +NONE = cancel_p_ thy t;
 12.1088 +
 12.1089  if term2str t = "a ^^^ 2 / b ^^^ 2" then ()
 12.1090  else error "rational.sml: diff.behav. in norm_Rational_mg 39b";
 12.1091 +*)
 12.1092  
 12.1093 -(*SRD Schalk I, p.69 Nr. 459b *)
 12.1094 +"----- SRD Schalk I, p.69 Nr. 459b";
 12.1095  val t = str2term "(a^^^2 - b^^^2)/(a*b) / (4*(a+b)^^^2/a)";
 12.1096 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1097 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1098  if term2str t = "(a + -1 * b) / (4 * a * b + 4 * b ^^^ 2)" then ()
 12.1099  else error "rational.sml: diff.behav. in norm_Rational_mg 41";
 12.1100  
 12.1101 +"----- Schalk I, p.69 Nr. 460b nonterm.SK";
 12.1102 +val t = str2term "(9*(x^^^2 - 8*x + 16) / (4*(y^^^2 - 2*y + 1))) / ((3*x - 12) / (16*y - 16))";
 12.1103 +(*val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1104 +exception Div raised
 12.1105  
 12.1106 -(*Schalk I, p.69 Nr. 460b nonterm.SK
 12.1107 +BUT
 12.1108  val t = str2term 
 12.1109 -"(9*(x^^^2 - 8*x+16)/(4*(y^^^2 - 2*y+1)))/((3*x - 12)/(16*y - 16))";
 12.1110 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1111 -if term2str t = 
 12.1112 -then ()
 12.1113 -else error "rational.sml: diff.behav. in norm_Rational_mg 42";
 12.1114 +  ("(144 + -72 * x + 9 * x ^^^ 2) / (4 + -8 * y + 4 * y ^^^ 2) /" ^
 12.1115 +  "((-12 + 3 * x) / (-16 + 16 * y))");
 12.1116 +NONE = cancel_p_ thy t;
 12.1117  
 12.1118 -val t = str2term 
 12.1119 -"9*(x^^^2 - 8*x+16)*(16*y - 16)/(4*(y^^^2 - 2*y+1)*(3*x - 12))";
 12.1120 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t;
 12.1121 -... non terminating.
 12.1122 -val SOME (t',_) = rewrite_set_ thy false make_polynomial t;
 12.1123 -"(-2304 + 1152 * x + 2304 * y + -144 * x ^^^ 2 + -1152 * x * y + 144 * x ^^^ 2 * y) /(-48 + 12 * x + 96 * y + -24 * x * y + -48 * y ^^^ 2 + 12 * x * y ^^^ 2)";
 12.1124 -val SOME (t,_) = rewrite_set_ thy false cancel_p t';
 12.1125 -... non terminating.*)
 12.1126 +if term2str t = !!!!!!!!!!!!!!!!!!!!!!!!!
 12.1127 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 42";
 12.1128 +*)
 12.1129  
 12.1130 -(*SRD Schalk I, p.70 Nr. 472a *)
 12.1131 -val t = str2term ("((8*x^^^2 - 32*y^^^2)/(2*x + 4*y))/" ^
 12.1132 -		 "((4*x - 8*y)/(x + y))");
 12.1133 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1134 -term2str t;
 12.1135 -if (term2str t) = 
 12.1136 -"x + y"
 12.1137 -then ()
 12.1138 -else error "rational.sml: diff.behav. in norm_Rational_mg 43";
 12.1139 +"----- some variant of the above; was non-terminating before";
 12.1140 +val t = str2term "9*(x^^^2 - 8*x+16)*(16*y - 16)/(4*(y^^^2 - 2*y+1)*(3*x - 12))";
 12.1141 +val SOME (t , _) = rewrite_set_ thy false norm_Rational t;
 12.1142 +if term2str t = "(48 + -12 * x) / (1 + -1 * y)"
 12.1143 +then () else error "some variant of the above; was non-terminating before";
 12.1144  
 12.1145 +"----- SRD Schalk I, p.70 Nr. 472a";
 12.1146 +val t = str2term ("((8*x^^^2 - 32*y^^^2) / (2*x + 4*y))  /  ((4*x - 8*y) / (x + y))");
 12.1147 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1148 +if term2str t = "x + y"
 12.1149 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 43";
 12.1150  
 12.1151 -(*----------------------------------------------------------------------*)
 12.1152 -(*---------------------- Einfache Dppelbrche --------------------------*)
 12.1153 -(*----------------------------------------------------------------------*)
 12.1154 +"----- Schalk I, p.70 Nr. 478b ----- Rechenzeit: 5 sec";
 12.1155 +val t = str2term ("(a - (a*b + b^^^2)/(a+b))/(b+(a - b)/(1+(a+b)/(a - b))) / " ^
 12.1156 +		 "((a - a^^^2/(a+b))/(a+(a*b)/(a - b)))");
 12.1157 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1158 +if term2str t = "(2 * a ^^^ 3 + 2 * a ^^^ 2 * b) / (a ^^^ 2 * b + b ^^^ 3)"
 12.1159 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 51";
 12.1160  
 12.1161  (*SRD Schalk I, p.69 Nr. 461a *)
 12.1162 -val t = str2term 
 12.1163 -"(2/(x+3) + 2/(x - 3)) / (8*x/(x^^^2 - 9))";
 12.1164 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1165 -term2str t;
 12.1166 -if (term2str t) = 
 12.1167 -"1 / 2"
 12.1168 -then ()
 12.1169 -else error "rational.sml: diff.behav. in norm_Rational_mg 44";
 12.1170 +val t = str2term "(2/(x+3) + 2/(x - 3)) / (8*x/(x^^^2 - 9))";
 12.1171 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1172 +if term2str t = "1 / 2"
 12.1173 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 44";
 12.1174  
 12.1175  (*SRD Schalk I, p.69 Nr. 464b *)
 12.1176 -val t = str2term 
 12.1177 -"(a - a/(a - 2)) / (a + a/(a - 2))";
 12.1178 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1179 -term2str t;
 12.1180 -if (term2str t) = 
 12.1181 -"(3 + -1 * a) / (1 + -1 * a)"
 12.1182 -then ()
 12.1183 -else error "rational.sml: diff.behav. in norm_Rational_mg 45";
 12.1184 +val t = str2term "(a - a/(a - 2)) / (a + a/(a - 2))";
 12.1185 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1186 +if term2str t = "(-3 + a) / (-1 + a)"
 12.1187 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 45";
 12.1188  
 12.1189  (*SRD Schalk I, p.69 Nr. 465b *)
 12.1190 -val t = str2term 
 12.1191 -"((x+3*y)/9 + (4*y^^^2 - 9*z^^^2)/(16*x)) /(x/9+y/6+z/4)";
 12.1192 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1193 -term2str t;
 12.1194 -if (term2str t) = 
 12.1195 -"(4 * x + 6 * y + -9 * z) / (4 * x)"
 12.1196 -then ()
 12.1197 -else error "rational.sml: diff.behav. in norm_Rational_mg 46";
 12.1198 +val t = str2term "((x+3*y)/9 + (4*y^^^2 - 9*z^^^2)/(16*x))   /   (x/9 + y/6 + z/4)";
 12.1199 +(* WN130911 non-termination due to non-termination of
 12.1200 +  cancel_p_ thy (str2term 
 12.1201 +    ("("(576 * x ^^^ 2 + 1728 * (x * y) + 1296 * y ^^^ 2 + -2916 * z ^^^ 2) /" ^
 12.1202 +      "(576 * x ^^^ 2 + 864 * (x * y) + 1296 * (x * z))"))
 12.1203 +
 12.1204 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1205 +if term2str t = "(4 * x + 6 * y + -9 * z) / (4 * x)"
 12.1206 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 46";
 12.1207 +*)
 12.1208  
 12.1209  (*SRD Schalk I, p.69 Nr. 466b *)
 12.1210 -val t = str2term 
 12.1211 -"((1 - 7*(x - 2)/(x^^^2 - 4)) / (6/(x+2))) / (3/(x+5)+30/(x^^^2 - 25))";
 12.1212 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1213 -term2str t;
 12.1214 -if (term2str t) = 
 12.1215 -"(25 + -10 * x + x ^^^ 2) / 18"
 12.1216 -then ()
 12.1217 -else error "rational.sml: diff.behav. in norm_Rational_mg 47";
 12.1218 +val t = str2term "((1 - 7*(x - 2)/(x^^^2 - 4)) / (6/(x+2))) / (3/(x+5)+30/(x^^^2 - 25))";
 12.1219 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1220 +if term2str t = "(25 + -10 * x + x ^^^ 2) / 18"
 12.1221 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 47";
 12.1222  
 12.1223  (*SRD Schalk I, p.70 Nr. 469 *)
 12.1224 -val t = str2term 
 12.1225 -"3*b^^^2/(4*a^^^2 - 8*a*b + 4*b^^^2)/(a/(a^^^2*b - b^^^3) + (a - b)/(4*a*b^^^2+4*b^^^3) - 1/(4*b^^^2))";
 12.1226 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1227 -term2str t;
 12.1228 -if (term2str t) = 
 12.1229 -"3 * b ^^^ 3 / (2 * a + -2 * b)"
 12.1230 -then ()
 12.1231 -else error "rational.sml: diff.behav. in norm_Rational_mg 48";
 12.1232 +val t = str2term ("3*b^^^2 / (4*a^^^2 - 8*a*b + 4*b^^^2) / " ^
 12.1233 +  "(a / (a^^^2*b - b^^^3)  +  (a - b) / (4*a*b^^^2 + 4*b^^^3)  -  1 / (4*b^^^2))");
 12.1234 +val SOME (t, _) = rewrite_set_ thy false norm_Rational t;
 12.1235 +if term2str t = "-3 * b ^^^ 3 / (-2 * a + 2 * b)"
 12.1236 +then () else error "rational.sml: diff.behav. in norm_Rational_mg 48";
 12.1237  
 12.1238 -(*----------------------------------------------------------------------*)
 12.1239 -(*---------------------- Mehrfache Dppelbrueche ------------------------*)
 12.1240 -(*----------------------------------------------------------------------*)
 12.1241 -
 12.1242 -(*SRD.test Schalk I, p.70 Nr. 476b *) (* Rechenzeit: 10 sec *)
 12.1243 -(*WN060419 crashes with method 'simplify' ????SK*)
 12.1244 -val t = str2term 
 12.1245 -"((a^^^2 - b^^^2)/(2*a*b)+2*a*b/(a^^^2 - b^^^2))/((a^^^2+b^^^2)/(2*a*b)+1) / ((a^^^2+b^^^2)^^^2/(a+b)^^^2)";
 12.1246 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1247 -if term2str t = "1 / (a ^^^ 2 + -1 * b ^^^ 2)" then ()
 12.1248 -else error "rational.sml: diff.behav. in norm_Rational_mg 49";
 12.1249 -
 12.1250 -"----- Schalk I, p.70 Nr. 477a";
 12.1251 -(* MG Achtung: terme explodieren; Bsp zu komplex; 
 12.1252 -   L???ung sollte (ziemlich grosser) Faktorisierter Ausdruck sein 
 12.1253 -val t = str2term "b*y/(b - 2*y)/((b^^^2 - y^^^2)/(b+2*y)) /" ^
 12.1254 -		 "(b^^^2*y+b*y^^^2)*(a+x)^^^2/((b^^^2 - 4*y^^^2)*(a+2*x)^^^2)";
 12.1255 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t;
 12.1256 -
 12.1257 -
 12.1258 -val t = str2term "b*y*(b+2*y)*(b^^^2 - 4*y^^^2)*(a+2*x)^^^2 / " ^
 12.1259 -		 "((b - 2*y)*(b^^^2 - y^^^2)*(b^^^2*y+b*y^^^2)*(a+x)^^^2)";
 12.1260 -val SOME (t,_) = rewrite_set_ thy false make_polynomial t;
 12.1261 -????SK ???MG*)
 12.1262 -
 12.1263 -
 12.1264 -"----- Schalk I, p.70 Nr. 478b ----- Rechenzeit: 5 sec";
 12.1265 -val t = str2term ("(a - (a*b+b^^^2)/(a+b))/(b+(a - b)/(1+(a+b)/(a - b))) / " ^
 12.1266 -		 "((a - a^^^2/(a+b))/(a+(a*b)/(a - b)))");
 12.1267 -val SOME (t',_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1268 -if term2str t' = 
 12.1269 -"(2 * a ^^^ 3 + 2 * a ^^^ 2 * b) / (a ^^^ 2 * b + b ^^^ 3)"
 12.1270 -then ()
 12.1271 -else error "rational.sml: diff.behav. in norm_Rational_mg 51";
 12.1272 -
 12.1273 -(* TODO.new_c:WN050820 STOP_REW_SUB introduced gave ...
 12.1274 -if term2str t' = "(a ^^^ 4 + -1 * a ^^^ 2 * b ^^^ 2) /(a * b * (b + (a * (a + -1 * b) + -1 * b * (a + -1 * b)) / (2 * a)) * (a + -1 * b))" then ()
 12.1275 -else error "rational.sml: works again";
 12.1276 -re-outcommented with TODO.new_c: cvs before 071227, 11:50*)
 12.1277 -
 12.1278 -
 12.1279 -
 12.1280 -(*Schalk I, p.70 Nr. 480a *)
 12.1281 -(* Achtung: rechnet ewig; cancel_p kann nicht krzen: WN060831 nonterm.SK00
 12.1282 -val t = str2term 
 12.1283 -"(1/x+1/y+1/z)/(1/x - 1/y - 1/z) / (2*x^^^2/(x^^^2 - z^^^2)/(x/(x+z)+x/(x - z)))";
 12.1284 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1285 -term2str t;
 12.1286 -if (term2str t) = 
 12.1287 -
 12.1288 -then ()
 12.1289 -else error "rational.sml: diff.behav. in norm_Rational_mg 52";
 12.1290 -
 12.1291 -(*MG Berechne Zwischenergebnisse: WN060831 nonterm.SK00*)
 12.1292 -val t = str2term 
 12.1293 -"(1/x+1/y+1/z)/(1/x - 1/y - 1/z)";
 12.1294 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1295 -term2str t;
 12.1296 -"(x ^^^ 2 * y ^^^ 2 * z + x ^^^ 2 * y * z ^^^ 2 + x * y ^^^ 2 * z ^^^ 2) /
 12.1297 -(-1 * x ^^^ 2 * y ^^^ 2 * z + -1 * x ^^^ 2 * y * z ^^^ 2 + x * y ^^^ 2 * z ^^^ 2)";
 12.1298 -val t = str2term 
 12.1299 -"2*x^^^2/(x^^^2 - z^^^2)/(x/(x+z)+x/(x - z))";
 12.1300 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1301 -term2str t;
 12.1302 -"1"
 12.1303 -
 12.1304 -(* SK 1. Ausdruck kann nicht weiter gekrzt werden; cancel_p !!!*)
 12.1305 -###  rls: cancel_p on: 
 12.1306 -(x ^^^ 2 * (y ^^^ 2 * z) + x ^^^ 2 * (y * z ^^^ 2) + x * (y ^^^ 2 * z ^^^ 2)) /
 12.1307 -(-1 * (x ^^^ 2 * (y ^^^ 2 * z)) + -1 * (x ^^^ 2 * (y * z ^^^ 2)) + x * (y ^^^ 2 * z ^^^ 2))
 12.1308 -GC #3.61.81.101.197.17503:   (0 ms)
 12.1309 -*** RATIONALS_DIRECT_CANCEL_EXCEPTION: Invalid fraction
 12.1310 -
 12.1311 -val t = str2term 
 12.1312 -"(x^^^2 * (y^^^2 * z) + x^^^2 * (y * z^^^2) + x * (y^^^2 * z^^^2)) / (-1 * (x^^^2 * (y^^^2 * z)) + -1 * (x^^^2 * (y * z^^^2)) + x * (y^^^2 * z^^^2))";
 12.1313 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1314 -term2str t;
 12.1315 -(*uncaught exception nonexhaustive binding failure*)
 12.1316 -
 12.1317 -(* Das kann er aber krzen !!????: *)
 12.1318 -val t = str2term 
 12.1319 -"(x^^^2 * (y^^^2 * z) +  x * (y^^^2 * z^^^2)) / (-1 * (x^^^2 * (y * z^^^2)) + x * (y^^^2 * z^^^2))";
 12.1320 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1321 -term2str t;
 12.1322 -"(-1 * (y * x) + -1 * (z * y)) / (1 * (z * x) + -1 * (z * y))";
 12.1323 -*)
 12.1324 -
 12.1325 -
 12.1326 -"-------- crucial examples ------------------------------";
 12.1327 -"-------- crucial examples ------------------------------";
 12.1328 -"-------- crucial examples ------------------------------";
 12.1329 -(*Schalk I, p.60 Nr. 215d *)
 12.1330 -(* Achtung: rechnet ewig ...
 12.1331 -val t = str2term "(a-b)^^^3 * (x+y)^^^4 / ((x+y)^^^2 * (a-b)^^^5)";
 12.1332 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1333 -term2str t; noterm.SK
 12.1334 -*)
 12.1335 -
 12.1336 -(* Kein Wunder, denn Z???ler und Nenner extra als Polynom dargestellt ergibt:*)
 12.1337 -(*
 12.1338 -val t = str2term "(a-b)^^^3 * (x+y)^^^4";
 12.1339 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1340 -term2str t;
 12.1341 -"a^^^3 * x^^^4 + 4 * a^^^3 * x^^^3 * y +6 * a^^^3 * x^^^2 * y^^^2 +4 * a^^^3 * x * y^^^3 +a^^^3 * y^^^4 +-3 * a^^^2 * b * x^^^4 +-12 * a^^^2 * b * x^^^3 * y +-18 * a^^^2 * b * x^^^2 * y^^^2 +-12 * a^^^2 * b * x * y^^^3 +-3 * a^^^2 * b * y^^^4 +3 * a * b^^^2 * x^^^4 +12 * a * b^^^2 * x^^^3 * y +18 * a * b^^^2 * x^^^2 * y^^^2 +12 * a * b^^^2 * x * y^^^3 +3 * a * b^^^2 * y^^^4 +-1 * b^^^3 * x^^^4 +-4 * b^^^3 * x^^^3 * y +-6 * b^^^3 * x^^^2 * y^^^2 +-4 * b^^^3 * x * y^^^3 +-1 * b^^^3 * y^^^4";
 12.1342 -val t = str2term "((x+y)^^^2 * (a-b)^^^5)";
 12.1343 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1344 -term2str t;
 12.1345 -"a^^^5 * x^^^2 + 2 * a^^^5 * x * y + a^^^5 * y^^^2 +-5 * a^^^4 * b * x^^^2 +-10 * a^^^4 * b * x * y +-5 * a^^^4 * b * y^^^2 +10 * a^^^3 * b^^^2 * x^^^2 +20 * a^^^3 * b^^^2 * x * y +10 * a^^^3 * b^^^2 * y^^^2 +-10 * a^^^2 * b^^^3 * x^^^2 +-20 * a^^^2 * b^^^3 * x * y +-10 * a^^^2 * b^^^3 * y^^^2 +5 * a * b^^^4 * x^^^2 +10 * a * b^^^4 * x * y +5 * a * b^^^4 * y^^^2 +-1 * b^^^5 * x^^^2 +-2 * b^^^5 * x * y +-1 * b^^^5 * y^^^2";
 12.1346 -*)
 12.1347 -(*anscheinend macht dem Rechner das Krzen diese Bruches keinen Spass mehr ...*)
 12.1348 -
 12.1349 -(*--------------------------------------------------------------------*)
 12.1350 -(*Schalk I, p.70 Nr. 480b 
 12.1351 -val t = str2term "((12*x*y/(9*x^^^2 - y^^^2))/" ^
 12.1352 -		 "(1/(3*x - y)^^^2 - 1/(3*x + y)^^^2)) *" ^
 12.1353 -		 "(1/(x - 5*y)^^^2 - 1/(x + 5*y)^^^2)/" ^
 12.1354 -		 "(20*x*y/(x^^^2 - 25*y^^^2))";
 12.1355 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1356 -SK.nonterm
 12.1357 -Kann nicht weiter vereinfacht werden !!!!?? *)
 12.1358 -
 12.1359 -(*--------------------------------------------------------------------*)
 12.1360 -"---- MGs test set";
 12.1361 -val t = str2term " (1 + x^^^5) / (y + x) + x^^^3 / x ";
 12.1362 -val SOME (t,_) = rewrite_set_ thy false common_nominator_p t;
 12.1363 -if term2str t = "(1 + x ^^^ 3 + x ^^^ 5 + y * x ^^^ 2) / (x + y)" then()
 12.1364 -else error "";
 12.1365 -
 12.1366 -(*--------------------------------------------------------------------*)
 12.1367 -(* cancel_p liefert nicht immer Polynomnormalform (2): WN060831???SK3b
 12.1368 -   ---> Sortierung FALSCH !!  *)
 12.1369 -val t = str2term "b^^^3 * a^^^5/a ";
 12.1370 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1371 -term2str t;
 12.1372 -"1 * (a^^^4 * b^^^3) / 1"; (*OK*)
 12.1373 -
 12.1374 -val t = str2term "b^^^3 * a^^^5/b ";
 12.1375 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1376 -term2str t;
 12.1377 -"1 * (b^^^2 * a^^^5) / 1"; (*cancel_p sortiert hier falsch um!*)
 12.1378 -
 12.1379 -(* Problem liegt NICHT bei ord_make_polynomial! (siehe folgende Bsple) *)
 12.1380 -(*
 12.1381 -val x = str2term "x"; val bdv = str2term "bdv";
 12.1382 -val t1 = str2term "b^^^2 * a^^^5";
 12.1383 -val t2 = str2term "a^^^5 * b^^^2 ";
 12.1384 -ord_make_polynomial false Rational.thy [(x,bdv)] (t1,t2); (*false*)
 12.1385 -*)
 12.1386 -(* ==> "b^^^2 * a^^^5" > "a^^^5 * b^^^2 " ... OK!*)
 12.1387 -
 12.1388 -(*--------------------------------------------------------------------*)
 12.1389 -(* cancel_p liefert nicht immer Polynomnormalform (2): WN060831???SK3c
 12.1390 -   ---> erzeugt berflssige "1 * ..."
 12.1391 -   
 12.1392 -val t = str2term "-1 / (3 + y)";
 12.1393 -(*~~         *)
 12.1394 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1395 -term2str t;
 12.1396 -"-1 / (3 + 1 * y)";
 12.1397 -(********* Das ist das PROBLEM !!!!!!!??? *******************)
 12.1398 -(* -1 im Z???ler der Angabe verursacht das Problem !*)
 12.1399 -*)
 12.1400 -
 12.1401 -(* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *)
 12.1402 -"----- MGs test set";
 12.1403 -val t = str2term "(a^^^2 + -1)/(a+1)";
 12.1404 -val SOME (t',_) = rewrite_set_ thy false cancel_p t;
 12.1405 -if term2str t' = "(-1 + a) / 1" then ()
 12.1406 -else error "rational.sml MG tests 3d";
 12.1407 -
 12.1408 -"----- NOT TERMINATING ?: worked before 0707xx";
 12.1409 -val t = str2term "(a^^^2 - 1)*(b + 1) / ((b^^^2 - 1)*(a+1))";
 12.1410 -val SOME (t'',_) = rewrite_set_ thy false norm_Rational t;
 12.1411 -if term2str t'' = "(1 + -1 * a) / (1 + -1 * b)" then ()
 12.1412 -else error "rational.sml MG tests 3e";
 12.1413 -
 12.1414 -"----- corrected SK060905";
 12.1415 -val t = str2term "(4*x^^^2 - 20*x + 25)/(2*x - 5)^^^3";
 12.1416 -val SOME (t',_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1417 -if term2str t' = "-1 / (5 + -2 * x)" then ()
 12.1418 -else error "rational.sml corrected SK060905";
 12.1419 -
 12.1420 -
 12.1421 -"-------- examples for Stefan Karnels thesis ------------";
 12.1422 -"-------- examples for Stefan Karnels thesis ------------";
 12.1423 -"-------- examples for Stefan Karnels thesis ------------";
 12.1424 -(*SRAM Schalk I, p.69 Nr. 442b --- abgewandelt*)
 12.1425 -val t = str2term 
 12.1426 -"(15*a^^^4/(a*x^^^3) - 5*a*((b^^^4 - 5*c^^^2*x)/x^^^2))*(x^^^3/(5*a*b^^^3*c^^^3)) + a/c^^^3 * (x*(b/a) - 3*b*(a/b^^^4))";
 12.1427 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1428 -term2str t;
 12.1429 -if (term2str t) =
 12.1430 -"5 * x ^^^ 2 / (b ^^^ 3 * c)"
 12.1431 -then ()
 12.1432 -else error "rational.sml: diff.behav. in norm_Rational_mg 53";
 12.1433 -
 12.1434 -
 12.1435 -"-------- me Schalk I No.186 ----------------------------";
 12.1436 -"-------- me Schalk I No.186 ----------------------------";
 12.1437 -"-------- me Schalk I No.186 ----------------------------";
 12.1438 -val fmz = ["Term ((14 * x * y) / ( x * y ))",
 12.1439 -	   "normalform N"];
 12.1440 +"-------- me Schalk I No.186 -------------------------------------------------";
 12.1441 +"-------- me Schalk I No.186 -------------------------------------------------";
 12.1442 +"-------- me Schalk I No.186 -------------------------------------------------";
 12.1443 +val fmz = ["Term ((14 * x * y) / ( x * y ))", "normalform N"];
 12.1444  val (dI',pI',mI') =
 12.1445    ("Rational",["rational","simplification"],
 12.1446     ["simplification","of_rationals"]);
 12.1447 @@ -1627,90 +1438,150 @@
 12.1448      ("14", ("End_Proof'", _)) => ()
 12.1449    | _ => error "rational.sml diff.behav. in me Schalk I No.186";
 12.1450  
 12.1451 -
 12.1452 -"-------- interSteps ..Simp_Rat_Double_No-1.xml ---------";
 12.1453 -"-------- interSteps ..Simp_Rat_Double_No-1.xml ---------";
 12.1454 -"-------- interSteps ..Simp_Rat_Double_No-1.xml ---------";
 12.1455 +"-------- interSteps ..Simp_Rat_Double_No-1.xml ------------------------------";
 12.1456 +"-------- interSteps ..Simp_Rat_Double_No-1.xml ------------------------------";
 12.1457 +"-------- interSteps ..Simp_Rat_Double_No-1.xml ------------------------------";
 12.1458  states:=[];
 12.1459 -CalcTree
 12.1460 -[(["Term (((2 - x)/(2*a)) / (2*a/(x - 2)))", "normalform N"], 
 12.1461 -  ("Rational",["rational","simplification"],
 12.1462 -  ["simplification","of_rationals"]))];
 12.1463 +CalcTree [(["Term (((2 - x)/(2*a)) / (2*a/(x - 2)))", "normalform N"], 
 12.1464 +  ("Rational", ["rational", "simplification"], ["simplification", "of_rationals"]))];
 12.1465  Iterator 1;
 12.1466  moveActiveRoot 1;
 12.1467  autoCalculate 1 CompleteCalc;
 12.1468 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1469 +val ((pt, p), _) = get_calc 1; 
 12.1470 +(*
 12.1471 +show_pt pt;
 12.1472 +[
 12.1473 +(([], Frm), Simplify ((2 - x) / (2 * a) / (2 * a / (x - 2)))),
 12.1474 +(([1], Frm), (2 - x) / (2 * a) / (2 * a / (x - 2))),
 12.1475 +(([1], Res), (2 + -1 * x) / (2 * a) / (2 * a / (x + -1 * 2))),
 12.1476 +(([2], Res), (2 + -1 * x) / (2 * a) / (2 * a / (-2 + x))),
 12.1477 +(([3], Res), (2 + -1 * x) * (-2 + x) / (2 * a * (2 * a))),
 12.1478 +(([4], Res), (-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2)),
 12.1479 +(([], Res), (-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2))] 
 12.1480 +*)
 12.1481 +interSteps 1 ([1], Res);
 12.1482 +val ((pt, p), _) = get_calc 1; 
 12.1483 +(*show_pt pt;
 12.1484 +[
 12.1485 +(([], Frm), Simplify ((2 - x) / (2 * a) / (2 * a / (x - 2)))),
 12.1486 +(([1], Frm), (2 - x) / (2 * a) / (2 * a / (x - 2))),
 12.1487 +(([1,1], Frm), (2 - x) / (2 * a) / (2 * a / (x - 2))),
 12.1488 +(([1,1], Res), (2 - x) / (2 * a) / (2 * a / (x + -1 * 2))),
 12.1489 +(([1,2], Res), (2 + -1 * x) / (2 * a) / (2 * a / (x + -1 * 2))),
 12.1490 +(([1], Res), (2 + -1 * x) / (2 * a) / (2 * a / (x + -1 * 2))),
 12.1491 +(([2], Res), (2 + -1 * x) / (2 * a) / (2 * a / (-2 + x))),
 12.1492 +(([3], Res), (2 + -1 * x) * (-2 + x) / (2 * a * (2 * a))),
 12.1493 +(([4], Res), (-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2)),
 12.1494 +(([], Res), (-4 + 4 * x + -1 * x ^^^ 2) / (4 * a ^^^ 2))] 
 12.1495 +*)
 12.1496 +val (t, asm) = get_obj g_result pt [1, 1];
 12.1497 +if term2str t = "(2 - x) / (2 * a) / (2 * a / (x + -1 * 2))" andalso terms2str asm = "[]"
 12.1498 +then () else error "2nd interSteps ..Simp_Rat_Double_No-1 changed on [1, 1]";
 12.1499 +val (t, asm) = get_obj g_result pt [1, 2];
 12.1500 +if term2str t = "(2 + -1 * x) / (2 * a) / (2 * a / (x + -1 * 2))" andalso terms2str asm = "[]"
 12.1501 +then () else error "3rd interSteps ..Simp_Rat_Double_No-1 changed on [1, 2]";
 12.1502  
 12.1503 -interSteps 1 ([1],Res);
 12.1504 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1505  
 12.1506 -
 12.1507 -"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ---------";
 12.1508 -"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ---------";
 12.1509 -"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ---------";
 12.1510 +"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ------------------------------";
 12.1511 +"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ------------------------------";
 12.1512 +"-------- interSteps ..Simp_Rat_Cancel_No-1.xml ------------------------------";
 12.1513  states:=[];
 12.1514 -CalcTree
 12.1515 -[(["Term ((a^2 + -1*b^2) / (a^2 + -2*a*b + b^2))", "normalform N"], 
 12.1516 -  ("Rational",["rational","simplification"],
 12.1517 -  ["simplification","of_rationals"]))];
 12.1518 +CalcTree [(["Term ((a^2 + -1*b^2) / (a^2 + -2*a*b + b^2))", "normalform N"], 
 12.1519 +  ("Rational", ["rational", "simplification"], ["simplification", "of_rationals"]))];
 12.1520  Iterator 1;
 12.1521  moveActiveRoot 1;
 12.1522  autoCalculate 1 CompleteCalc;
 12.1523 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1524 -(*========== inhibit exn 110314 ================================================
 12.1525 -(*with explicit script done already... and removed [1,..] at below...
 12.1526 -interSteps 1 ([1],Res);
 12.1527 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1528 +val ((pt, p), _) = get_calc 1;
 12.1529 +(*show_pt pt;
 12.1530 +[
 12.1531 +(([], Frm), Simplify ((a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2))),
 12.1532 +(([1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2)),
 12.1533 +(([1], Res), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1534 +(([2], Res), (a + b) / (a + -1 * b)),
 12.1535 +(([], Res), (a + b) / (a + -1 * b))] 
 12.1536  *)
 12.1537 -interSteps 1 ([2],Res);
 12.1538 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1539 -
 12.1540 +interSteps 1 ([2], Res);
 12.1541 +val ((pt, p), _) = get_calc 1;
 12.1542 +(*show_pt pt;
 12.1543 +[
 12.1544 +(([], Frm), Simplify ((a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2))),
 12.1545 +(([1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2)),
 12.1546 +(([1], Res), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1547 +(([2,1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1548 +(([2,1], Res), (a + b) / (a + -1 * b)),
 12.1549 +(([2], Res), (a + b) / (a + -1 * b)),
 12.1550 +(([], Res), (a + b) / (a + -1 * b))] 
 12.1551 +*)
 12.1552  interSteps 1 ([2,1],Res);
 12.1553 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1554 +val ((pt, p), _) = get_calc 1; 
 12.1555 +(*show_pt pt;
 12.1556 +[
 12.1557 +(([], Frm), Simplify ((a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2))),
 12.1558 +(([1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * a * b + b ^^^ 2)),
 12.1559 +(([1], Res), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1560 +(([2,1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1561 +(([2,1,1], Frm), (a ^^^ 2 + -1 * b ^^^ 2) / (a ^^^ 2 + -2 * (a * b) + b ^^^ 2)),
 12.1562 +(([2,1,1], Res), (a ^^^ 2 + -1 * (a * b) + a * b + -1 * b ^^^ 2) /
 12.1563 +(a ^^^ 2 + -2 * (a * b) + 1 * b ^^^ 2)),
 12.1564 +(([2,1,2], Res), (a ^^^ 2 + -1 * (a * b) + a * b + -1 * b ^^^ 2) /
 12.1565 +(a ^^^ 2 + -2 * (a * b) + -1 ^^^ 2 * b ^^^ 2)),
 12.1566 +(([2,1,3], Res), (a ^^^ 2 + -1 * (a * b) + a * b + -1 * b ^^^ 2) /
 12.1567 +(a ^^^ 2 + -2 * (a * b) + (-1 * b) ^^^ 2)),
 12.1568 +(([2,1,4], Res), (a * a + -1 * (a * b) + a * b + -1 * b ^^^ 2) /
 12.1569 +(a ^^^ 2 + -2 * (a * b) + (-1 * b) ^^^ 2)),
 12.1570 +(([2,1,5], Res), (a * a + -1 * (a * b) + a * b + -1 * (b * b)) /
 12.1571 +(a ^^^ 2 + -2 * (a * b) + (-1 * b) ^^^ 2)),
 12.1572 +(([2,1,6], Res), (a * a + -1 * (a * b) + a * b + -1 * (b * b)) /
 12.1573 +(a ^^^ 2 + -1 * (2 * (a * b)) + (-1 * b) ^^^ 2)),
 12.1574 +(([2,1,7], Res), (a * a + a * (-1 * b) + (b * a + b * (-1 * b))) /
 12.1575 +(a ^^^ 2 + 2 * (a * (-1 * b)) + (-1 * b) ^^^ 2)),
 12.1576 +(([2,1,8], Res), (a * a + a * (-1 * b) + (b * a + b * (-1 * b))) /
 12.1577 +(a ^^^ 2 + 2 * a * (-1 * b) + (-1 * b) ^^^ 2)),
 12.1578 +(([2,1,9], Res), (a * (a + -1 * b) + (b * a + b * (-1 * b))) /
 12.1579 +(a ^^^ 2 + 2 * a * (-1 * b) + (-1 * b) ^^^ 2)),
 12.1580 +(([2,1,10], Res), (a * (a + -1 * b) + b * (a + -1 * b)) /
 12.1581 +(a ^^^ 2 + 2 * a * (-1 * b) + (-1 * b) ^^^ 2)),
 12.1582 +(([2,1,11], Res), (a + b) * (a + -1 * b) / (a ^^^ 2 + 2 * a * (-1 * b) + (-1 * b) ^^^ 2)),
 12.1583 +(([2,1,12], Res), (a + b) * (a + -1 * b) / ((a + -1 * b) * (a + -1 * b))),
 12.1584 +(([2,1,13], Res), (a + b) / (a + -1 * b)),
 12.1585 +(([2,1], Res), (a + b) / (a + -1 * b)),
 12.1586 +(([2], Res), (a + b) / (a + -1 * b)),
 12.1587 +(([], Res), (a + b) / (a + -1 * b))] 
 12.1588 +*)
 12.1589  val newnds = children (get_nd pt [2,1]) (*see "fun detailrls"*);
 12.1590 -(*if length newnds = 12 then () WN060905*)
 12.1591 -if length newnds = 13 then ()
 12.1592 -else error "rational.sml: interSteps cancel_p rev_rew_p";
 12.1593 +if length newnds = 13 then () else error "rational.sml: interSteps cancel_p rev_rew_p";
 12.1594  
 12.1595  val p = ([2,1,9],Res);
 12.1596  getTactic 1 p;
 12.1597  val (_, tac, _) = pt_extract (pt, p);
 12.1598 -(*case tac of SOME (Rewrite ("sym_real_plus_binom_times1", _)) => ()
 12.1599 -WN060905*)
 12.1600 -case tac of SOME (Rewrite ("sym_real_add_mult_distrib2", _)) => ()
 12.1601 +case tac of SOME (Rewrite ("sym_distrib_left", _)) => ()
 12.1602  | _ => error "rational.sml: getTactic, sym_real_plus_binom_times1";
 12.1603 -============ inhibit exn 110314 ==============================================*)
 12.1604  
 12.1605  
 12.1606 -"-------- investigate rulesets for cancel_p -------------";
 12.1607 -"-------- investigate rulesets for cancel_p -------------";
 12.1608 -"-------- investigate rulesets for cancel_p -------------";
 12.1609 +"-------- investigate rulesets for cancel_p ----------------------------------";
 12.1610 +"-------- investigate rulesets for cancel_p ----------------------------------";
 12.1611 +"-------- investigate rulesets for cancel_p ----------------------------------";
 12.1612  val thy = @{theory "Rational"};
 12.1613 -"---------------- (a^^^2 + -1*b^^^2) / (a^^^2 + -2*a*b + b^^^2)";
 12.1614  val t = str2term "(a^^^2 + -1*b^^^2) / (a^^^2 + -2*a*b + b^^^2)";
 12.1615  val tt = str2term "(1 * a + 1 * b) * (1 * a + -1 * b)"(*numerator only*);
 12.1616 +
 12.1617  "----- with rewrite_set_";
 12.1618  val SOME (tt',asm) = rewrite_set_ thy false make_polynomial tt;
 12.1619 -term2str tt'= "a ^^^ 2 + -1 * b ^^^ 2" (*true*);
 12.1620 +if term2str tt'= "a ^^^ 2 + -1 * b ^^^ 2" then () else error "rls chancel_p 1";
 12.1621  val tt = str2term "((1 * a + -1 * b) * (1 * a + -1 * b))"(*denominator only*);
 12.1622  val SOME (tt',asm) = rewrite_set_ thy false make_polynomial tt;
 12.1623 -term2str tt' = "a ^^^ 2 + -2 * a * b + b ^^^ 2" (*true*);
 12.1624 +if term2str tt' = "a ^^^ 2 + -2 * a * b + b ^^^ 2" then () else error "rls chancel_p 2";
 12.1625  
 12.1626 -"----- with make_deriv";
 12.1627 -val SOME (tt, _) = factout_p_ thy t; term2str tt =
 12.1628 -"(1 * a + 1 * b) * (1 * a + -1 * b) / ((1 * a + -1 * b) * (1 * a + -1 * b))";
 12.1629 -(*
 12.1630 -"--- with ruleset as before 060829";
 12.1631 -val {rules, rew_ord=(_,ro),...} =
 12.1632 -    rep_rls (assoc_rls "make_polynomial");
 12.1633 +"----- with make_deriv; WN1130912 not investigated further, will be discontinued";
 12.1634 +val SOME (tt, _) = factout_p_ thy t; 
 12.1635 +if term2str tt = "(a + b) * (a + -1 * b) / ((a + -1 * b) * (a + -1 * b))"
 12.1636 +then () else error "rls chancel_p 3";
 12.1637 +term2str tt = "(1 * a + 1 * b) * (1 * a + -1 * b) / ((1 * a + -1 * b) * (1 * a + -1 * b))";
 12.1638 +
 12.1639 +"--- with simpler ruleset";
 12.1640 +val {rules, rew_ord= (_, ro), ...} = rep_rls (assoc_rls "rev_rew_p");
 12.1641  val der = make_deriv thy Atools_erls rules ro NONE tt;
 12.1642 -print_depth 99; map (term2str o #1) der; print_depth 3;
 12.1643 -print_depth 99; map (rule2str o #2) der; print_depth 3;
 12.1644 -... did not terminate*)
 12.1645 -"--- with simpler ruleset";
 12.1646 -val {rules, rew_ord=(_,ro),...} =
 12.1647 -    rep_rls (assoc_rls "rev_rew_p");
 12.1648 -val der = make_deriv thy Atools_erls rules ro NONE tt;
 12.1649 +if length der = 12 then () else error "WN1130912 rls chancel_p 4";
 12.1650  print_depth 99; writeln (deriv2str der); print_depth 3;
 12.1651  
 12.1652  print_depth 99; map (term2str o #1) der; print_depth 3;
 12.1653 @@ -1719,305 +1590,52 @@
 12.1654  print_depth 99; map (term2str o #1 o #3) der; print_depth 3;
 12.1655  
 12.1656  val der = make_deriv thy Atools_erls rules ro NONE 
 12.1657 -		     (str2term "(1 * a + 1 * b) * (1 * a + -1 * b)");
 12.1658 +	(str2term "(1 * a + 1 * b) * (1 * a + -1 * b)");
 12.1659  print_depth 99; writeln (deriv2str der); print_depth 3;
 12.1660  
 12.1661 -val {rules, rew_ord=(_,ro),...} =
 12.1662 -    rep_rls (assoc_rls "rev_rew_p");
 12.1663 +val {rules, rew_ord=(_,ro),...} = rep_rls (assoc_rls "rev_rew_p");
 12.1664  val der = make_deriv thy Atools_erls rules ro NONE 
 12.1665 -		     (str2term "(1 * a + -1 * b) * (1 * a + -1 * b)");
 12.1666 +	(str2term "(1 * a + -1 * b) * (1 * a + -1 * b)");
 12.1667  print_depth 99; writeln (deriv2str der); print_depth 3;
 12.1668  print_depth 99; map (term2str o #1) der; print_depth 3;
 12.1669  (*WN060829 ...postponed*)
 12.1670  
 12.1671  
 12.1672 -"-------- investigate format of factout_ and factout_p_ -";
 12.1673 -"-------- investigate format of factout_ and factout_p_ -";
 12.1674 -"-------- investigate format of factout_ and factout_p_ -";
 12.1675 -val {rules, rew_ord = (_,ro),...} = rep_rls (assoc_rls "make_polynomial");
 12.1676 -val (thy, eval_rls) = (@{theory "Rational"}, Atools_erls)(*see 'fun init_state'*);
 12.1677 -val Rrls {scr = Rfuns {init_state,...},...} = assoc_rls "cancel_p";
 12.1678 -
 12.1679 -"----- see Rational.ML, local cancel_p, fun init_state";
 12.1680 -val t = str2term "(a^^^2 + (-1)*b^^^2) / (a^^^2 + (-2)*a*b + b^^^2)";
 12.1681 -val SOME (t',_) = factout_p_ thy t; term2str t';
 12.1682 -(*
 12.1683 -val rtas = reverse_deriv thy eval_rls rules ro NONE t';
 12.1684 -writeln(trtas2str rst);
 12.1685 -*)
 12.1686 -
 12.1687 -
 12.1688 -"----- see Rational.ML, local cancel_p, fun init_state";
 12.1689 -val t = str2term "a^^^2 / a";
 12.1690 -val SOME (t',_) = factout_p_ thy t; 
 12.1691 -term2str t' = "a * a / (1 * a)" (*true*); 
 12.1692 -(*... can be canceled with
 12.1693 -real_mult_div_cancel2 ?k ~= 0 ==> ?m * ?k / (?n * ?k) = ?m / ?n"*)
 12.1694 -(* sml/ME/rewtools.sml:
 12.1695 -val rtas = reverse_deriv thy Atools_erls rules ro NONE t';
 12.1696 -writeln (deri2str rtas);
 12.1697 -*)
 12.1698 -
 12.1699 -
 12.1700 -"-------- SK 060904 ----------------------------------------------";
 12.1701 -"----- order on polynomials -- input + output";
 12.1702 -val thy = @{theory "Isac"};
 12.1703 -val t = str2term "(a + -1 * b) / (-1 * a + b)";
 12.1704 -val SOME (t', _) = factout_p_ thy t; term2str t';
 12.1705 -val SOME (t', _) = cancel_p_ thy t; term2str t';
 12.1706 -
 12.1707 -val t = str2term "a*b*c*d / (d*e*f*g)";
 12.1708 -val SOME (t', _) = cancel_p_ thy t; term2str t';
 12.1709 -
 12.1710 -val t = str2term "a*(b*(c*d)) / (b*(e*(f*g)))";
 12.1711 -val SOME (t', _) = cancel_p_ thy t; term2str t';
 12.1712 -(*???order.SK  ???*)
 12.1713 -
 12.1714 -"----- SK060904-1a non-termination of cancel_p_ ? worked before 0707xx";
 12.1715 -val t = str2term "(x^^^2 - 4)*(3 - y) / ((y^^^2 - 9)*(2+x))";
 12.1716 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t; 
 12.1717 -if term2str t' = "(2 + -1 * x) / (3 + y)" then ()
 12.1718 -else error "rational.sml SK060904-1a worked since 0707xx";
 12.1719 -
 12.1720 -"----- SK060904-1b non-termination of cancel_p_ ... worked before 0707xx";
 12.1721 -val t = str2term ("(9 * a ^^^ 2 + -16 * b ^^^ 2) /" ^
 12.1722 -"(36 * a^^^2 * c + (27 * a^^^2 * e + (-64 * b^^^2 * c + -48 * b^^^2 * e)))");
 12.1723 -val SOME (t',_) = cancel_p_ thy t; 
 12.1724 -if term2str t' = "1 / (4 * c + 3 * e)" then ()
 12.1725 -else error "rational.sml SK060904-1b";
 12.1726 -
 12.1727 -
 12.1728 -"----- SK060904-2a non-termination of add_fraction_p_";
 12.1729 -val t = str2term (" (a + b * x) / (a + -1 * (b * x)) +  " ^
 12.1730 -		  " (-1 * a + b * x) / (a + b * x)      ");
 12.1731 -(* nonterm.SK
 12.1732 -val SOME (t',_) = rewrite_set_ thy false common_nominator_p t;
 12.1733 -
 12.1734 -common_nominator_p_ thy t;
 12.1735 -" (a + b * x)*(a + b * x) / ((a + -1 * (b * x))*(a + -1 * (b * x))) +  " ^
 12.1736 -" (-1 * a + b * x)*(a + -1 * (b * x)) / ((a + b * x)*(-1 * a + b * x)) ";
 12.1737 -
 12.1738 -add_fraction_p_ thy t; 
 12.1739 -" ((a + b * x)*(a + b * x)  +  (-1 * a + b * x)*(a + -1 * (b * x))) /" ^
 12.1740 -" ((a + b * x)*(-1 * a + b * x))                                     ";
 12.1741 -*)
 12.1742 -
 12.1743 -
 12.1744 -"-------- how to stepwise construct Scripts -------------";
 12.1745 -"-------- how to stepwise construct Scripts -------------";
 12.1746 -"-------- how to stepwise construct Scripts -------------";
 12.1747 -val thy = @{theory "Rational"};
 12.1748 -(*no trailing _*)
 12.1749 -val p1 = parse thy (
 12.1750 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1751 -"  (Rewrite_Set discard_minus False                   " ^
 12.1752 -"   t_t)");
 12.1753 -
 12.1754 -(*required (): (Rewrite_Set discard_minus False)*)
 12.1755 -val p2 = parse thy (
 12.1756 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1757 -"  (Rewrite_Set discard_minus False                   " ^
 12.1758 -"   t_t)");
 12.1759 -
 12.1760 -val p3 = parse thy (
 12.1761 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1762 -"  ((Rewrite_Set discard_minus False)                   " ^
 12.1763 -"   t_t)");
 12.1764 -
 12.1765 -val p4 = parse thy (
 12.1766 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1767 -"  ((Rewrite_Set discard_minus False)                   " ^
 12.1768 -"   t_t)");
 12.1769 -
 12.1770 -val p5 = parse thy (
 12.1771 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1772 -"  ((Try (Rewrite_Set discard_minus False)                   " ^
 12.1773 -"    Try (Rewrite_Set discard_parentheses False))               " ^
 12.1774 -"   t_t)");
 12.1775 -
 12.1776 -val p6 = parse thy (
 12.1777 -"Script SimplifyScript (t_t::real) =                             " ^
 12.1778 -"  ((Try (Rewrite_Set discard_minus False) @@                   " ^
 12.1779 -"    Try (Rewrite_Set rat_mult_poly False) @@                    " ^
 12.1780 -"    Try (Rewrite_Set make_rat_poly_with_parentheses False) @@   " ^
 12.1781 -"    Try (Rewrite_Set cancel_p_rls False) @@                     " ^
 12.1782 -"    (Repeat                                                     " ^
 12.1783 -"     ((Try (Rewrite_Set common_nominator_p_rls False) @@        " ^
 12.1784 -"       Try (Rewrite_Set rat_mult_div_pow False) @@              " ^
 12.1785 -"       Try (Rewrite_Set make_rat_poly_with_parentheses False) @@" ^
 12.1786 -"       Try (Rewrite_Set cancel_p_rls False) @@                  " ^
 12.1787 -"       Try (Rewrite_Set rat_reduce_1 False)))) @@               " ^
 12.1788 -"    Try (Rewrite_Set discard_parentheses False))               " ^
 12.1789 -"   t_t)"
 12.1790 -);
 12.1791 -
 12.1792 -"----------- get_denominator ----------------------------";
 12.1793 -"----------- get_denominator ----------------------------";
 12.1794 -"----------- get_denominator ----------------------------";
 12.1795 +"-------- fun eval_get_denominator -------------------------------------------";
 12.1796 +"-------- fun eval_get_denominator -------------------------------------------";
 12.1797 +"-------- fun eval_get_denominator -------------------------------------------";
 12.1798  val thy = @{theory Isac};
 12.1799  val t = term_of (the (parse thy "get_denominator ((a +x)/b)"));
 12.1800  val SOME (_, t') = eval_get_denominator "" 0 t thy;
 12.1801 -if term2str t' = "get_denominator ((a + x) / b) = b" then ()
 12.1802 -else error "get_denominator ((a + x) / b) = b"
 12.1803 +if term2str t' = "get_denominator ((a + x) / b) = b"
 12.1804 +then () else error "get_denominator ((a + x) / b) = b"
 12.1805  
 12.1806  
 12.1807 -"--------- several errpats in complicated term -------------------";
 12.1808 -"--------- several errpats in complicated term -------------------";
 12.1809 -"--------- several errpats in complicated term -------------------";
 12.1810 -(*TODO: instead of Gabriella's example here (27.Jul.12) find a simpler one*)
 12.1811 -states:=[];
 12.1812 -CalcTree
 12.1813 -[(["Term ((5*b + 25)/(a^2 - b^2) * (a - b)/(5*b))", "normalform N"], 
 12.1814 -  ("Rational",["rational","simplification"], ["simplification","of_rationals"]))];
 12.1815 +"-------- several errpats in complicated term --------------------------------";
 12.1816 +"-------- several errpats in complicated term --------------------------------";
 12.1817 +"-------- several errpats in complicated term --------------------------------";
 12.1818 +(*WN12xxxx TODO: instead of Gabriella's example here (27.Jul.12) find a simpler one
 12.1819 +  WN130912: kept this test, although not clear what for*)
 12.1820 +states := [];
 12.1821 +CalcTree [(["Term ((5*b + 25)/(a^2 - b^2) * (a - b)/(5*b))", "normalform N"], 
 12.1822 +  ("Rational", ["rational", "simplification"], ["simplification", "of_rationals"]))];
 12.1823  Iterator 1;
 12.1824  moveActiveRoot 1;
 12.1825  autoCalculate 1 CompleteCalc;
 12.1826 -val ((pt,p),_) = get_calc 1; show_pt pt;
 12.1827 +val ((pt, p), _) = get_calc 1;
 12.1828 +(*show_pt pt;
 12.1829 +[
 12.1830 +(([], Frm), Simplify ((5 * b + 25) / (a ^^^ 2 - b ^^^ 2) * (a - b) / (5 * b))),
 12.1831 +(([1], Frm), (5 * b + 25) / (a ^^^ 2 - b ^^^ 2) * (a - b) / (5 * b)),
 12.1832 +(([1], Res), (5 * b + 25) / (a ^^^ 2 + -1 * b ^^^ 2) * (a + -1 * b) / (5 * b)),
 12.1833 +(([2], Res), (5 * b + 25) * (a + -1 * b) / (a ^^^ 2 + -1 * b ^^^ 2) / (5 * b)),
 12.1834 +(([3], Res), (25 * a + -25 * b + 5 * (a * b) + -5 * b ^^^ 2) / (a ^^^ 2 + -1 * b ^^^ 2) /
 12.1835 +(5 * b)),
 12.1836 +(([4], Res), (25 + 5 * b) / (a + b) / (5 * b)),
 12.1837 +(([5], Res), (25 + 5 * b) / ((a + b) * (5 * b))),
 12.1838 +(([6], Res), (25 + 5 * b) / (5 * (a * b) + 5 * b ^^^ 2)),
 12.1839 +(([7], Res), (5 + b) / (a * b + b ^^^ 2)),
 12.1840 +(([], Res), (5 + b) / (a * b + b ^^^ 2))] *)
 12.1841  
 12.1842 -"-------- nonterminating cancel_p, norm_Rational 2002 ---";
 12.1843 -"-------- nonterminating cancel_p, norm_Rational 2002 ---";
 12.1844 -"-------- nonterminating cancel_p, norm_Rational 2002 ---";
 12.1845 -(*------------------------------------------------------------------------------------\
 12.1846 -"--- WN121204: searched rational.sml for "nonterm", added new numbering" ^
 12.1847 -"              and thoroughly tested with this numbering subsequently";
 12.1848 -"--- 1 ---";
 12.1849 -WN.2.6.03 from rlang.sml 56a 
 12.1850 -val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) = 4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)";
 12.1851 -val NONE = rewrite_set_ thy false common_nominator_p t;
 12.1852 -"--- 2 ---";
 12.1853 -WN060831 nonterm.SK7 
 12.1854 -val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x)";
 12.1855 -val NONE = add_fraction_p_ thy t;
 12.1856 -"--- 3 ---";
 12.1857 -nonterm.SK9 loops: cancel_p kann nicht weiter kuerzen!!! *)
 12.1858 -val t'' = str2term "(a + b)/(x^^^2 - y^^^2) * ((x - y)^^^2/(a^^^2 - b^^^2))";
 12.1859 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t'';
 12.1860 -"--- 4 ---";
 12.1861 -val t = str2term 
 12.1862 -"(a * x ^^^ 2 + -2 * a * x * y + a * y ^^^ 2 + b * x ^^^ 2 + -2 * b * x * y + b * y ^^^ 2) /(a ^^^ 2 * x ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 2 + -1 * b ^^^ 2 * x ^^^ 2 + b ^^^ 2 * y ^^^ 2)"; 
 12.1863 -WN060831 nonterm.SK10 
 12.1864 -val SOME (t,_) = rewrite_set_ thy false cancel_p t;
 12.1865 -term2str t;
 12.1866 -"--- 5 ---";
 12.1867 -val t = str2term 
 12.1868 -"(9*(x^^^2 - 8*x+16)/(4*(y^^^2 - 2*y+1)))/((3*x - 12)/(16*y - 16))";
 12.1869 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1870 -if term2str t = 
 12.1871 -then ()
 12.1872 -else error "rational.sml: diff.behav. in norm_Rational_mg 42";
 12.1873 -"--- 6 ---";
 12.1874 -val t = str2term 
 12.1875 -"9*(x^^^2 - 8*x+16)*(16*y - 16)/(4*(y^^^2 - 2*y+1)*(3*x - 12))";
 12.1876 -val SOME (t',_) = rewrite_set_ thy false norm_Rational t;
 12.1877 -... non terminating.
 12.1878 -"--- 7 ---";
 12.1879 -val SOME (t',_) = rewrite_set_ thy false make_polynomial t;
 12.1880 -"(-2304 + 1152 * x + 2304 * y + -144 * x ^^^ 2 + -1152 * x * y + 144 * x ^^^ 2 * y) /(-48 + 12 * x + 96 * y + -24 * x * y + -48 * y ^^^ 2 + 12 * x * y ^^^ 2)";
 12.1881 -val SOME (t,_) = rewrite_set_ thy false cancel_p t';
 12.1882 -"--- 8 ---";
 12.1883 -val t = str2term "(a-b)^^^3 * (x+y)^^^4 / ((x+y)^^^2 * (a-b)^^^5)";
 12.1884 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1885 -"--- 9 ---";
 12.1886 -val t = str2term "((12*x*y/(9*x^^^2 - y^^^2))/" ^
 12.1887 -		 "(1/(3*x - y)^^^2 - 1/(3*x + y)^^^2)) *" ^
 12.1888 -		 "(1/(x - 5*y)^^^2 - 1/(x + 5*y)^^^2)/" ^
 12.1889 -		 "(20*x*y/(x^^^2 - 25*y^^^2))";
 12.1890 -val SOME (t,_) = rewrite_set_ thy false norm_Rational(*_mg*) t;
 12.1891 -"--- 10 ---";
 12.1892 -SK060904-2a non-termination of add_fraction_p_";
 12.1893 -val t = str2term (" (a + b * x) / (a + -1 * (b * x)) +  " ^
 12.1894 -		  " (-1 * a + b * x) / (a + b * x)      ");
 12.1895 -(* nonterm.SK = WN130830
 12.1896 -val SOME (t',_) = rewrite_set_ thy false common_nominator_p t;
 12.1897 -"--- 11 ---";
 12.1898 -common_nominator_p_ thy t;
 12.1899 -" (a + b * x)*(a + b * x) / ((a + -1 * (b * x))*(a + -1 * (b * x))) +  " ^
 12.1900 -" (-1 * a + b * x)*(a + -1 * (b * x)) / ((a + b * x)*(-1 * a + b * x)) ";
 12.1901 -"--- 12 ---";                             
 12.1902 -add_fraction_p_ thy t; 
 12.1903 -" ((a + b * x)*(a + b * x)  +  (-1 * a + b * x)*(a + -1 * (b * x))) /" ^
 12.1904 -" ((a + b * x)*(-1 * a + b * x))                                     ";
 12.1905 ---------------------------------------------------------------------------------------/*)
 12.1906  
 12.1907 -(*------------------------------------------------------------------------------------\
 12.1908 -"WN121205: thoroughly tested with the above numbering.";
 12.1909 -"  errors in cancel_p: --- 4,5,6,7.";
 12.1910 -"  error in common_nominator_p, common_nominator_p_: --- 10; 1,2?.";
 12.1911 -"  errors caused by ruleset norm_Rational: --- 8,9.";
 12.1912 -trace_rewrite := false;
 12.1913  
 12.1914 -"--- 1 ---: non-terminating with ### add_fract: done t22 "; = WN130830
 12.1915 -val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) = 4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)";
 12.1916 -trace_rewrite := false;
 12.1917 -rewrite_set_ thy false common_nominator_p t;
 12.1918 -
 12.1919 -"--- 2 ---: non-terminating with ### add_fract: done t22 ";
 12.1920 -val t = str2term "(a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x)";
 12.1921 -add_fraction_p_ thy t;
 12.1922 -
 12.1923 -"--- 3 ---: norm_Rational calls Rrls cancel_p with non-normalised polys";
 12.1924 -val t = str2term "(a + b)/(x^^^2 - y^^^2) * ((x - y)^^^2/(a^^^2 - b^^^2))";
 12.1925 -rewrite_set_ thy false norm_Rational t;
 12.1926 -(*tracing end...####  rls: cancel_p on: 
 12.1927 -(a * x ^^^ 2 + -2 * (a * (x * y)) + a * y ^^^ 2 + b * x ^^^ 2 + -2 * (b * (x * y)) + b * y ^^^ 2) /
 12.1928 -(a ^^^ 2 * x ^^^ 2 + -1 * (a ^^^ 2 * y ^^^ 2) + -1 * (b ^^^ 2 * x ^^^ 2) + b ^^^ 2 * y ^^^ 2) *)
 12.1929 -
 12.1930 -"--- 4 ---: non-terminating with Rrls cancel_p on plausible input";
 12.1931 -val t = str2term (
 12.1932 -"(a * x ^^^ 2 + -2 * a * x * y + a * y ^^^ 2 + b * x ^^^ 2 + -2 * b * x * y + b * y ^^^ 2) /"^
 12.1933 -"(a ^^^ 2 * x ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 2 + -1 * b ^^^ 2 * x ^^^ 2 + b ^^^ 2 * y ^^^ 2)"); 
 12.1934 -rewrite_set_ thy false cancel_p t;
 12.1935 -(*#  rls: cancel_p on: 
 12.1936 -(a * x ^^^ 2 + -2 * a * x * y + a * y ^^^ 2 + b * x ^^^ 2 + -2 * b * x * y + b * y ^^^ 2) /
 12.1937 -(a ^^^ 2 * x ^^^ 2 + -1 * a ^^^ 2 * y ^^^ 2 + -1 * b ^^^ 2 * x ^^^ 2 + b ^^^ 2 * y ^^^ 2) *)
 12.1938 -
 12.1939 -"--- 5 ---: non-terminating with Rrls cancel_p on plausible input";
 12.1940 -val t = str2term "(9*(x^^^2 - 8*x+16)/(4*(y^^^2 - 2*y+1)))/((3*x - 12)/(16*y - 16))";
 12.1941 -rewrite_set_ thy false norm_Rational t;
 12.1942 -(*####  rls: cancel_p on: 
 12.1943 -(2304 + -1152 * x + -2304 * y + 144 * x ^^^ 2 + 1152 * (x * y) + -144 * (x ^^^ 2 * y)) /
 12.1944 -(48 + -12 * x + -96 * y + 24 * (x * y) + 48 * y ^^^ 2 + -12 * (x * y ^^^ 2))  *)
 12.1945 -
 12.1946 -"--- 6 ---: non-terminating with Rrls cancel_p on plausible input";
 12.1947 -val t = str2term 
 12.1948 -"9*(x^^^2 - 8*x+16)*(16*y - 16)/(4*(y^^^2 - 2*y+1)*(3*x - 12))";
 12.1949 -rewrite_set_ thy false norm_Rational t;
 12.1950 -(*###  rls: cancel_p on: (-2304 + 1152 * x + 2304 * y + -144 * x ^^^ 2 + -1152 * (x * y) +
 12.1951 - 144 * (x ^^^ 2 * y)) /
 12.1952 -(-48 + 12 * x + 96 * y + -24 * (x * y) + -48 * y ^^^ 2 + 12 * (x * y ^^^ 2)) *)
 12.1953 -
 12.1954 -"--- 7 ---: non-terminating with Rrls cancel_p on plausible input";
 12.1955 -val t' = str2term (
 12.1956 -"(-2304 + 1152 * x + 2304 * y + -144 * x ^^^ 2 + -1152 * x * y + 144 * x ^^^ 2 * y) /"^
 12.1957 -"(-48 + 12 * x + 96 * y + -24 * x * y + -48 * y ^^^ 2 + 12 * x * y ^^^ 2)");
 12.1958 -rewrite_set_ thy false cancel_p t';
 12.1959 -
 12.1960 -"--- 8 ---: bottom of output cannot be looked ad (due to looping?)";
 12.1961 -val t = str2term "(a-b)^^^3 * (x+y)^^^4 / ((x+y)^^^2 * (a-b)^^^5)";
 12.1962 -val SOME (t,_) = rewrite_set_ thy false norm_Rational t;
 12.1963 -
 12.1964 -"--- 9 ---: probably error in norm_Rational";
 12.1965 -val t = str2term (
 12.1966 -"((12*x*y / (9*x^^^2 - y^^^2)) / (1/(3*x - y)^^^2 - 1/(3*x + y)^^^2)) *" ^
 12.1967 -		"(1/(x - 5*y)^^^2 - 1/(x + 5*y)^^^2) / (20*x*y/(x^^^2 - 25*y^^^2))");
 12.1968 -rewrite_set_ thy false norm_Rational t;
 12.1969 -(*####  rls: cancel_p on: (19440 * (x ^^^ 8 * y ^^^ 2) + -490320 * (x ^^^ 6 * y ^^^ 4) +
 12.1970 - 108240 * (x ^^^ 4 * y ^^^ 6) +
 12.1971 - -6000 * (x ^^^ 2 * y ^^^ 8)) /
 12.1972 -(2160 * (x ^^^ 8 * y ^^^ 2) + -108240 * (x ^^^ 6 * y ^^^ 4) +
 12.1973 - 1362000 * (x ^^^ 4 * y ^^^ 6) +
 12.1974 - -150000 * (x ^^^ 2 * y ^^^ 8)) *)
 12.1975 -
 12.1976 -"--- 10 ---: non-terminating with ### add_fract: done t22: error in common_nominator_p ";
 12.1977 -val t = str2term (" (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x)");
 12.1978 -rewrite_set_ thy false common_nominator_p t; (*### add_fract: done t22 *)
 12.1979 -common_nominator_p_ thy t;                   (*loops without output*)
 12.1980 -"--- reformulated 10:";
 12.1981 -val t = str2term "(a + -1 * (b * x)) / (a + b * x)";
 12.1982 -rewrite_set_ thy false cancel_p t = NONE;
 12.1983 -"--- 11 ---";
 12.1984 -"--- 12 ---";                             
 12.1985 -"...both are to be considered after common_nominator_p_ is improved";
 12.1986 ---------------------------------------------------------------------------------------/*)
 12.1987 -============ inhibit exn WN130824 TODO ======================================================*)
 12.1988 -
    13.1 --- a/test/Tools/isac/Knowledge/rlang.sml	Mon Sep 16 11:28:43 2013 +0200
    13.2 +++ b/test/Tools/isac/Knowledge/rlang.sml	Mon Sep 16 12:20:00 2013 +0200
    13.3 @@ -1443,7 +1443,7 @@
    13.4  ... with sml-nj:
    13.5   (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) =
    13.6      4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)
    13.7 -common_nominator_p wird nicht angewendet, weil ...
    13.8 +add_fractions_p wird nicht angewendet, weil ...
    13.9  add_fract terminiert nicht: 030603
   13.10  siehe Rational.ML rational.sml
   13.11  *)
   13.12 @@ -1482,7 +1482,7 @@
   13.13  ###  try calc: op *'
   13.14  ===  calc. to: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + 1 * (b * x)) / (a +b * x) = 4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)
   13.15  
   13.16 -##  rls: common_nominator_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + 1 * (b * x)) / (a + b * x) = 
   13.17 +##  rls: add_fractions_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + 1 * (b * x)) / (a + b * x) = 
   13.18                                                                                                      4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)
   13.19  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!GC
   13.20  
   13.21 @@ -1496,7 +1496,7 @@
   13.22  
   13.23  ##  rls: order_add_mult on:
   13.24  
   13.25 -##  rls: common_nominator_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) =
   13.26 +##  rls: add_fractions_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) =
   13.27                                                                                                      4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)
   13.28  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!GC
   13.29  
   13.30 @@ -1507,7 +1507,7 @@
   13.31  ##  rls: reduce_0_1_2 on:
   13.32  ##  rls: order_add_mult on:
   13.33  ##  rls: collect_numerals on:
   13.34 -##  rls: common_nominator_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) =
   13.35 +##  rls: add_fractions_p on: (a + b * x) / (a + -1 * (b * x)) + (-1 * a + b * x) / (a + b * x) =
   13.36  4 * (a * b) / (a ^^^ 2 + -1 * b ^^^ 2)
   13.37  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!GC
   13.38  *)
    14.1 --- a/test/Tools/isac/Knowledge/simplify.sml	Mon Sep 16 11:28:43 2013 +0200
    14.2 +++ b/test/Tools/isac/Knowledge/simplify.sml	Mon Sep 16 12:20:00 2013 +0200
    14.3 @@ -44,24 +44,44 @@
    14.4  "----------- append inform with final result ------------";
    14.5  states:=[];
    14.6  CalcTree [(["Term ((14 * x * y) / ( x * y ))", "normalform N"],
    14.7 -	   ("Rational",["rational","simplification"],
    14.8 -	    ["simplification","of_rationals"]))];
    14.9 +	("Rational", ["rational","simplification"], ["simplification","of_rationals"]))];
   14.10  Iterator 1;
   14.11  moveActiveRoot 1;
   14.12  autoCalculate 1 CompleteCalcHead;
   14.13 -
   14.14 -val ((pt,p),_) = get_calc 1;
   14.15 -pt_extract (pt, p);
   14.16 +val ((pt,p),_) = get_calc 1; show_pt pt; 
   14.17 +(*[
   14.18 +(([], Frm), Simplify (14 * x * y / (x * y)))] *)
   14.19 +pt_extract (pt, p); (*determines SOME (Apply_Method ["simplification", "of_rationals"])*)
   14.20  
   14.21  autoCalculate 1 (Step 1);
   14.22 +val ((pt,p),_) = get_calc 1; show_pt pt;
   14.23 +(*[
   14.24 +(([], Frm), Simplify (14 * x * y / (x * y))),
   14.25 +(([1], Frm), 14 * x * y / (x * y))] *)
   14.26  
   14.27  appendFormula 1 "14";
   14.28  val ((pt,p),_) = get_calc 1; show_pt pt;
   14.29 +(*[
   14.30 +(([], Frm), Simplify (14 * x * y / (x * y))),
   14.31 +(([1], Frm), 14 * x * y / (x * y)),
   14.32 +(([1,1], Frm), 14 * x * y / (x * y)),
   14.33 +(([1,1], Res), 14 * (x * y) / (x * y)),
   14.34 +(([1,2], Res), 14 / 1),
   14.35 +(([1,3], Res), 14),
   14.36 +(([1], Res), 14)]*)
   14.37  
   14.38  autoCalculate 1 (Step 1);
   14.39  val ((pt,p),_) = get_calc 1; show_pt pt;
   14.40 +(*[
   14.41 +(([], Frm), Simplify (14 * x * y / (x * y))),
   14.42 +(([1], Frm), 14 * x * y / (x * y)),
   14.43 +(([1,1], Frm), 14 * x * y / (x * y)),
   14.44 +(([1,1], Res), 14 * (x * y) / (x * y)),
   14.45 +(([1,2], Res), 14 / 1),
   14.46 +(([1,3], Res), 14),
   14.47 +(([1], Res), 14),
   14.48 +(([], Res), 14)] *)
   14.49  val Form res = (#1 o pt_extract) (pt, ([],Res));
   14.50 -term2str res = "??.empty";
   14.51  if p = ([], Res) andalso term2str res = "14" then ()
   14.52 -else error "simplify.sml: append inform with final result ?!?";
   14.53 +else error "simplify.sml: append inform with final result changed";
   14.54  
    15.1 --- a/test/Tools/isac/ProgLang/rewrite.sml	Mon Sep 16 11:28:43 2013 +0200
    15.2 +++ b/test/Tools/isac/ProgLang/rewrite.sml	Mon Sep 16 12:20:00 2013 +0200
    15.3 @@ -370,7 +370,7 @@
    15.4  if ([], true) = eval__true thy 0 asms [] erls
    15.5  then () else error "rewrite.sml: prepat cancel eval__true";
    15.6  
    15.7 -"===== Rational.thy: common_nominator_p ===";
    15.8 +"===== Rational.thy: add_fractions_p ===";
    15.9  (* if each pat* matches with the current term, the Rrls is applied
   15.10     (there are no preconditions to be checked, they are @{term True}) *)
   15.11  val t = str2term "a / b + 1 / 2";
   15.12 @@ -382,7 +382,7 @@
   15.13  
   15.14  val subst = Pattern.match thy (pat, t) (Vartab.empty, Vartab.empty);
   15.15  if ([], true) = eval__true thy 0 (map (Envir.subst_term subst) pres) [] erls
   15.16 -then () else error "rewrite.sml: prepat common_nominator_p";
   15.17 +then () else error "rewrite.sml: prepat add_fractions_p";
   15.18  
   15.19  "===== Poly.thy: order_mult_ ===";
   15.20            (* ?p matched with the current term gives an environment,
    16.1 --- a/test/Tools/isac/ProgLang/scrtools.sml	Mon Sep 16 11:28:43 2013 +0200
    16.2 +++ b/test/Tools/isac/ProgLang/scrtools.sml	Mon Sep 16 12:20:00 2013 +0200
    16.3 @@ -9,6 +9,7 @@
    16.4  "-------- test the same called by interSteps norm_Poly -----------";
    16.5  "-------- test the same called by interSteps norm_Rational -------";
    16.6  "-------- check auto-gen.script for Rewrite_Set_Inst -------------";
    16.7 +"-------- how to stepwise construct Scripts ----------------------";
    16.8  "-----------------------------------------------------------------";
    16.9  "-----------------------------------------------------------------";
   16.10  "-----------------------------------------------------------------";
   16.11 @@ -187,4 +188,50 @@
   16.12  init_istate (Rewrite_Set_Inst (["(bdv, x)"], "integration_rules")) 
   16.13  			      (str2term "someTermWithBdv");
   16.14  
   16.15 +"-------- how to stepwise construct Scripts ----------------------";
   16.16 +"-------- how to stepwise construct Scripts ----------------------";
   16.17 +"-------- how to stepwise construct Scripts ----------------------";
   16.18 +val thy = @{theory "Rational"};
   16.19 +(*no trailing _*)
   16.20 +val p1 = parse thy (
   16.21 +"Script SimplifyScript (t_t::real) =                             " ^
   16.22 +"  (Rewrite_Set discard_minus False                   " ^
   16.23 +"   t_t)");
   16.24  
   16.25 +(*required (): (Rewrite_Set discard_minus False)*)
   16.26 +val p2 = parse thy (
   16.27 +"Script SimplifyScript (t_t::real) =                             " ^
   16.28 +"  (Rewrite_Set discard_minus False                   " ^
   16.29 +"   t_t)");
   16.30 +
   16.31 +val p3 = parse thy (
   16.32 +"Script SimplifyScript (t_t::real) =                             " ^
   16.33 +"  ((Rewrite_Set discard_minus False)                   " ^
   16.34 +"   t_t)");
   16.35 +
   16.36 +val p4 = parse thy (
   16.37 +"Script SimplifyScript (t_t::real) =                             " ^
   16.38 +"  ((Rewrite_Set discard_minus False)                   " ^
   16.39 +"   t_t)");
   16.40 +
   16.41 +val p5 = parse thy (
   16.42 +"Script SimplifyScript (t_t::real) =                             " ^
   16.43 +"  ((Try (Rewrite_Set discard_minus False)                   " ^
   16.44 +"    Try (Rewrite_Set discard_parentheses False))               " ^
   16.45 +"   t_t)");
   16.46 +
   16.47 +val p6 = parse thy (
   16.48 +"Script SimplifyScript (t_t::real) =                             " ^
   16.49 +"  ((Try (Rewrite_Set discard_minus False) @@                   " ^
   16.50 +"    Try (Rewrite_Set rat_mult_poly False) @@                    " ^
   16.51 +"    Try (Rewrite_Set make_rat_poly_with_parentheses False) @@   " ^
   16.52 +"    Try (Rewrite_Set cancel_p_rls False) @@                     " ^
   16.53 +"    (Repeat                                                     " ^
   16.54 +"     ((Try (Rewrite_Set add_fractions_p_rls False) @@        " ^
   16.55 +"       Try (Rewrite_Set rat_mult_div_pow False) @@              " ^
   16.56 +"       Try (Rewrite_Set make_rat_poly_with_parentheses False) @@" ^
   16.57 +"       Try (Rewrite_Set cancel_p_rls False) @@                  " ^
   16.58 +"       Try (Rewrite_Set rat_reduce_1 False)))) @@               " ^
   16.59 +"    Try (Rewrite_Set discard_parentheses False))               " ^
   16.60 +"   t_t)"
   16.61 +);
    17.1 --- a/test/Tools/isac/Test_Isac.thy	Mon Sep 16 11:28:43 2013 +0200
    17.2 +++ b/test/Tools/isac/Test_Isac.thy	Mon Sep 16 12:20:00 2013 +0200
    17.3 @@ -12,9 +12,9 @@
    17.4  $ ./bin/isabelle jedit -l Isac test/Tools/isac/Test_Isac.thy &
    17.5  *)
    17.6  
    17.7 -(* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *)
    17.8 -(* !!!!! wait a minute until Isac and the theories below are loaded !!!!! *)
    17.9 -(* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *)
   17.10 +(* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *)
   17.11 +(* !!!!! wait a minute until session Isac and the theories below are loaded !!!!! *)
   17.12 +(* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *)
   17.13  
   17.14  theory Test_Isac imports Isac
   17.15    "ADDTESTS/Ctxt"
   17.16 @@ -75,7 +75,7 @@
   17.17    ML_file "Interpret/inform.sml"
   17.18  (*WITHOUT inhibit exn WN1130621 Isabelle2012-->13 !thehier! THIS ERROR OCCURS:
   17.19    ... SAME ERROR HERE ON ISABELLE2012 AS IN ISAC ON ISABELLE2011*)
   17.20 -  ML_file "Interpret/mathengine.sml"    (*!part.*)
   17.21 +  ML_file "Interpret/mathengine.sml"    (*!part. WN130804: +check Interpret/me.sml*)
   17.22    ML {*"%%%%%%%%%%%%%%%%% end Interpret.thy %%%%%%%%%%%%%%%%%%%%";*}
   17.23    ML {*"%%%%%%%%%%%%%%%%% start xmlsrc.thy %%%%%%%%%%%%%%%%%%%%%";*}
   17.24    ML_file "xmlsrc/mathml.sml"           (*part.*)
   17.25 @@ -118,8 +118,8 @@
   17.26    ML_file "Knowledge/rootrat.sml"
   17.27    ML_file "Knowledge/rootrateq.sml"(*ome complicated equations not recovered from 2002 *)
   17.28    ML_file "Knowledge/partial_fractions.sml"
   17.29 -  ML_file "Knowledge/polyeq.sml" (*-----------------works if cut into parts !!!!!!!!!!!*)
   17.30 -(*ML_file "Knowledge/rlang.sml"     much to clean up, not urgent due to similar tests  *)
   17.31 +  ML_file "Knowledge/polyeq.sml"
   17.32 +(*ML_file "Knowledge/rlang.sml"     much to clean up, similar tests in other files     *)
   17.33    ML_file "Knowledge/calculus.sml"
   17.34    ML_file "Knowledge/trig.sml"
   17.35  (*ML_file "Knowledge/logexp.sml"    not included as stuff for presentation of authoring*) 
   17.36 @@ -138,8 +138,6 @@
   17.37    ML_file "Knowledge/build_thydata.sml"
   17.38    ML {*"%%%%%%%%%%%%%%%%% end Knowledge %%%%%%%%%%%%%%%%%%%%%%%%";*}
   17.39    ML {*"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%";*}
   17.40 -  ML {*"%%%%%%%%%%%%%%%%% all tests successful %%%%%%%%%%%%%%%%%";*}
   17.41 -  ML {*"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%";*}
   17.42  
   17.43  section {* history of tests *}
   17.44  text {*
    18.1 --- a/test/Tools/isac/Test_Some.thy	Mon Sep 16 11:28:43 2013 +0200
    18.2 +++ b/test/Tools/isac/Test_Some.thy	Mon Sep 16 12:20:00 2013 +0200
    18.3 @@ -20,54 +20,32 @@
    18.4    print_theory
    18.5  *}
    18.6  ML {*
    18.7 -(*========== inhibit exn WN130822 only runs with Rational2.thy =================================
    18.8 -============ inhibit exn WN130822 only runs with Rational2.thy ================================*)
    18.9 -
   18.10 -(*========== inhibit exn WN130826 TODO =========================================================
   18.11 -============ inhibit exn WN130826 TODO ========================================================*)
   18.12 -
   18.13 +(*========== inhibit exn WN130909 TODO =========================================================
   18.14 +============ inhibit exn WN130909 TODO ========================================================*)
   18.15  (*-.-.-.-.-.-isolate response.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
   18.16  -.-.-.-.-.-.-isolate response.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-*)
   18.17 -
   18.18 -(*=========================^^^ correct until here ^^^==========================================*)
   18.19  *}
   18.20  
   18.21 -
   18.22 -section {* ====================================================================================*}
   18.23 -ML {*
   18.24 -*} ML {*
   18.25 -*} ML {*
   18.26 -*} ML {*
   18.27 -*} ML {*
   18.28 -*}
   18.29 -
   18.30 -section {* GREAT CONFUSION -> final hg ci =====================================================*}
   18.31 -ML {*
   18.32 -(*in isabisac12/test/../rational.sml*)
   18.33 -"-------- investigate rls common_nominator_p from OLD gcd --------------------";
   18.34 -(*ATTENTION:
   18.35 -val common_nominator_p =
   18.36 -  Rrls {id = "common_nominator_p", ...
   18.37 -	  scr = Rfuns {init_state  = init_state thy Atools_erls ro,
   18.38 -		  normal_form = add_fraction_p_ thy, <<<===================================
   18.39 -:
   18.40 -val add_fractions_p = common_nominator_p; (*FIXXXME:eilig f"ur norm_Rational*)
   18.41 -(*but ^^^ not exported, just ^^^*)
   18.42 -
   18.43 -i.e. GREAT CONFUSION:
   18.44 -# normal_form of add_fractions_p is add_fraction_p_,
   18.45 -# and id of add_fractions_p is common_nominator_p
   18.46 -*)
   18.47 -
   18.48  section {* ===================================================================================*}
   18.49  ML {*
   18.50  *} ML {*
   18.51  *} ML {*
   18.52 +*} ML {*
   18.53 +*} 
   18.54 +
   18.55 +
   18.56 +section {* ===================================================================================*}
   18.57 +ML {*
   18.58 +*} ML {*
   18.59 +*} ML {*
   18.60 +*} ML {*
   18.61  *}
   18.62  
   18.63  section {* ===================================================================================*}
   18.64  ML {*
   18.65  *} ML {*
   18.66  *} ML {*
   18.67 +*} ML {*
   18.68  *}
   18.69 +
   18.70  end