test/Tools/isac/Knowledge/rational-1.sml
author wneuper <Walther.Neuper@jku.at>
Sun, 09 Oct 2022 07:44:22 +0200
changeset 60565 f92963a33fe3
parent 60500 59a3af532717
child 60660 c4b24621077e
permissions -rw-r--r--
eliminate term2str in test/*
walther@60327
     1
(* Title: test/Tools/isac/Knowledge/rational-1.sml
walther@60327
     2
   Author: Walther Neuper
walther@60327
     3
   Use is subject to license terms.
walther@60327
     4
walther@60327
     5
Test of basic functions and application to complex examples.
walther@60327
     6
*)
walther@60327
     7
walther@60327
     8
"-----------------------------------------------------------------------------------------------";
walther@60327
     9
"-----------------------------------------------------------------------------------------------";
walther@60327
    10
"table of contents -----------------------------------------------------------------------------";
walther@60327
    11
"-----------------------------------------------------------------------------------------------";
walther@60327
    12
"-------- fun poly_of_term ---------------------------------------------------------------------";
walther@60327
    13
"-------- fun is_poly --------------------------------------------------------------------------";
walther@60355
    14
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
walther@60327
    15
"-------- fun term_of_poly ---------------------------------------------------------------------";
walther@60347
    16
"-------- fun cancel_p special cases -----------------------------------------------------------";
walther@60327
    17
"-------- complex examples: rls norm_Rational --------------------------------------------------";
walther@60327
    18
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
walther@60327
    19
"-----------------------------------------------------------------------------------------------";
walther@60327
    20
"-----------------------------------------------------------------------------------------------";
walther@60327
    21
walther@60327
    22
walther@60327
    23
"-------- fun poly_of_term ---------------------------------------------------------------------";
walther@60327
    24
"-------- fun poly_of_term ---------------------------------------------------------------------";
walther@60327
    25
"-------- fun poly_of_term ---------------------------------------------------------------------";
walther@60348
    26
val thy = @{theory Isac_Knowledge};
Walther@60565
    27
val vs = TermC.vars_of (TermC.parse_test @{context} "12 * x \<up> 3 * y \<up> 4 * z \<up> 6");
walther@60327
    28
Walther@60565
    29
val t = TermC.parse_test @{context} "0 ::real";
walther@60347
    30
if  poly_of_term vs t = SOME [(0, [0, 0, 0])] 
walther@60347
    31
then () else error "poly_of_term 0 changed";
walther@60347
    32
Walther@60565
    33
val t = TermC.parse_test @{context} "-3 + - 2 * x ::real";
walther@60327
    34
if poly_of_term vs t = SOME [(~3, [0, 0, 0]), (~2, [1, 0, 0])]
walther@60327
    35
then () else error "poly_of_term uminus changed";
walther@60327
    36
Walther@60565
    37
if poly_of_term vs (TermC.parse_test @{context} "12::real") = SOME [(12, [0, 0, 0])]
walther@60327
    38
then () else error "poly_of_term 1 changed";
walther@60327
    39
Walther@60565
    40
if poly_of_term vs (TermC.parse_test @{context} "x::real") = SOME [(1, [1, 0, 0])]
walther@60327
    41
then () else error "poly_of_term 2 changed";
walther@60327
    42
Walther@60565
    43
if         poly_of_term vs (TermC.parse_test @{context} "12 * x \<up> 3") = SOME [(12, [3, 0, 0])]
walther@60327
    44
then () else error "poly_of_term 3 changed";
walther@60327
    45
"~~~~~ fun poly_of_term , args:"; val (vs, t) =
Walther@60565
    46
  (vs, (TermC.parse_test @{context} "12 * x \<up> 3"));
walther@60327
    47
walther@60327
    48
           monom_of_term vs (1, replicate (length vs) 0) t;(*poly malformed 1 with x \<up> 3*)
walther@60336
    49
"~~~~~ fun monom_of_term , args:"; val (vs, (c, es), (Const (\<^const_name>\<open>times\<close>, _) $ m1 $ m2)) =
walther@60327
    50
  (vs, (1, replicate (length vs) 0), t);
walther@60327
    51
    val (c', es') =
walther@60327
    52
walther@60327
    53
           monom_of_term vs (c, es) m1;
wenzelm@60405
    54
"~~~~~ fun monom_of_term , args:"; val (vs, (c, es), (Const (\<^const_name>\<open>realpow\<close>, _) $ (t as Free _) $ (Const (\<^const_name>\<open>numeral\<close>, _) $ num)) ) =
walther@60327
    55
  (vs, (c', es'), m2);
walther@60327
    56
(*+*)c = 12;
walther@60327
    57
(*+*)(num |> HOLogic.dest_numeral |> list_update es (find_index (curry op = t) vs)) = [3, 0, 0];
walther@60327
    58
walther@60327
    59
if (c, num |> HOLogic.dest_numeral |> list_update es (find_index (curry op = t) vs)) = (12, [3, 0, 0])
wenzelm@60405
    60
then () else error "monom_of_term (realpow): return value CHANGED";
walther@60327
    61
Walther@60565
    62
if poly_of_term vs (TermC.parse_test @{context} "12 * x \<up> 3 * y \<up> 4 * z \<up> 6") = SOME [(12, [3, 4, 6])]
walther@60327
    63
then () else error "poly_of_term 4 changed";
walther@60327
    64
Walther@60565
    65
if poly_of_term vs (TermC.parse_test @{context} "1 + 2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + y") =
walther@60327
    66
  SOME [(1, [0, 0, 0]), (1, [0, 1, 0]), (2, [3, 4, 6])]
walther@60327
    67
then () else error "poly_of_term 5 changed";
walther@60327
    68
walther@60327
    69
(*poly_of_term is quite liberal:*)
walther@60327
    70
(*the coefficient may be somewhere, the order of variables and the parentheses 
walther@60327
    71
  within a monomial are arbitrary*)
Walther@60565
    72
if poly_of_term vs (TermC.parse_test @{context} "y \<up> 4 * (x \<up> 3 * 12 * z \<up> 6)") = SOME [(12, [3, 4, 6])]
walther@60327
    73
then () else error "poly_of_term 6 changed";
walther@60327
    74
walther@60327
    75
(*there may even be more than 1 coefficient:*)
Walther@60565
    76
if poly_of_term vs (TermC.parse_test @{context} "2 * y \<up> 4 * (x \<up> 3 * 6 * z \<up> 6)") = SOME [(12, [3, 4, 6])]
walther@60327
    77
then () else error "poly_of_term 7 changed";
walther@60327
    78
walther@60327
    79
(*the order and the parentheses within monomials are arbitrary:*)
Walther@60565
    80
if poly_of_term vs (TermC.parse_test @{context} "2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + (7 * y \<up> 8 + 1)")
walther@60327
    81
  = SOME [(1, [0, 0, 0]), (7, [0, 8, 0]), (2, [3, 4, 6])]
walther@60327
    82
then () else error "poly_of_term 8 changed";
walther@60327
    83
walther@60327
    84
(*from --- rls norm_Rational downto fun gcd_poly ---*)
Walther@60565
    85
val t = TermC.parse_test @{context} (*copy from above: "::real" is not required due to " \<up> "*)
walther@60329
    86
  ("(- 12 + 4 * y + 3 * x \<up> 2 + - 1 * (x \<up> 2 * y)) /" ^
walther@60329
    87
  "(- 18 + -9 * x + 2 * y \<up> 2 + x * y \<up> 2)");
walther@60327
    88
"~~~~~ fun cancel_p_, args:"; val (t) = (t);
walther@60327
    89
val opt = check_fraction t;
walther@60327
    90
val SOME (numerator, denominator) = opt;
walther@60327
    91
(*+*)UnparseC.term numerator = "- 12 + 4 * y + 3 * x \<up> 2 + - 1 * (x \<up> 2 * y)"; (*isa -- isa2*);
walther@60327
    92
(*+*)UnparseC.term denominator = "- 18 + - 9 * x + 2 * y \<up> 2 + x * y \<up> 2";     (*isa -- isa2*);
walther@60327
    93
       val vs = TermC.vars_of t;
walther@60327
    94
(*+*)UnparseC.terms vs = "[\"x\", \"y\"]";
walther@60327
    95
       val baseT = type_of numerator
walther@60327
    96
       val expT = HOLogic.realT;
walther@60327
    97
val (SOME _, SOME _) = (poly_of_term vs numerator, poly_of_term vs denominator);  (*isa <> isa2*)
walther@60327
    98
walther@60327
    99
"-------- fun is_poly --------------------------------------------------------------------------";
walther@60327
   100
"-------- fun is_poly --------------------------------------------------------------------------";
walther@60327
   101
"-------- fun is_poly --------------------------------------------------------------------------";
Walther@60565
   102
if is_poly (TermC.parse_test @{context} "2 * x \<up> 3 * y \<up> 4 * z \<up> 6 + 7 * y \<up> 8 + 1")
walther@60327
   103
then () else error "is_poly 1 changed";
Walther@60565
   104
if not (is_poly (TermC.parse_test @{context} "2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1"))
walther@60327
   105
then () else error "is_poly 2 changed";
walther@60327
   106
walther@60355
   107
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
walther@60355
   108
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
walther@60355
   109
"-------- fun is_ratpolyexp --------------------------------------------------------------------";
walther@60355
   110
if is_ratpolyexp @{term "14 * x * y / (x * y)"}
walther@60355
   111
then () else error "is_ratpolyexp (14 * x * y / (x * y)) CHANGED";
walther@60355
   112
if is_ratpolyexp @{term "2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1"}
walther@60355
   113
then () else error "is_ratpolyexp (2 * (x \<up> 3 * y \<up> 4 * z \<up> 6 + 7) * y \<up> 8 + 1) CHANGED";
walther@60355
   114
walther@60355
   115
if is_ratpolyexp @{term "((sin x) \<up> 2 - (cos x) \<up> 2)/ ((sin x)+ (cos x))"}
walther@60355
   116
then error "is_ratpolyexp (((sin x) \<up> 2 - (cos x) \<up> 2)/ ((sin x)+ (cos x)) CHANGED" else ();
walther@60355
   117
if is_ratpolyexp @{term "1 + sqrt x + sqrt y"}
walther@60355
   118
then error "is_ratpolyexp (1 + sqrt x + sqrt y) CHANGED" else ();
walther@60355
   119
walther@60355
   120
walther@60327
   121
"-------- fun term_of_poly ---------------------------------------------------------------------";
walther@60327
   122
"-------- fun term_of_poly ---------------------------------------------------------------------";
walther@60327
   123
"-------- fun term_of_poly ---------------------------------------------------------------------";
walther@60327
   124
val expT = HOLogic.realT
Walther@60565
   125
val Free (_, baseT) = (hd o vars o TermC.parse_test @{context}) "12 * x \<up> 3 * y \<up> 4 * z \<up> 6";
walther@60327
   126
val p = [(1, [0, 0, 0]), (7, [0, 8, 0]), (2, [3, 4, 5])]
walther@60327
   127
val vs = TermC.vars_of (the (parseNEW ctxt "12 * x \<up> 3 * y \<up> 4 * z \<up> 6"))
walther@60327
   128
(*precondition for [(c, es),...]: legth es = length vs*)
walther@60327
   129
;
walther@60327
   130
if UnparseC.term (term_of_poly baseT expT vs p) = "1 + 7 * y \<up> 8 + 2 * x \<up> 3 * y \<up> 4 * z \<up> 5"
walther@60327
   131
then () else error "term_of_poly 1 changed";
walther@60327
   132
walther@60347
   133
"-------- fun cancel_p special cases -----------------------------------------------------------";
walther@60347
   134
"-------- fun cancel_p special cases -----------------------------------------------------------";
walther@60347
   135
"-------- fun cancel_p special cases -----------------------------------------------------------";
walther@60349
   136
val thy = @{theory Isac_Knowledge};
Walther@60500
   137
val ctxt = Proof_Context.init_global thy
walther@60349
   138
walther@60347
   139
(*------- standard case: *)
Walther@60565
   140
val t = TermC.parse_test @{context} "2 / 3 + 1 / 6 ::real";
walther@60347
   141
"~~~~~ fun add_fraction_p_ , args:"; val ((_: theory), t) = (thy, t);
walther@60347
   142
val SOME ((n1, d1), (n2, d2)) =
walther@60347
   143
     (*case*) check_frac_sum t (*of*);
walther@60347
   144
      val vs = TermC.vars_of t;
walther@60347
   145
(*+*)val [] = vs;
walther@60347
   146
val (SOME n1', SOME a, SOME n2', SOME b) =
walther@60347
   147
   (*case*) (poly_of_term vs n1, poly_of_term vs d1, poly_of_term vs n2, poly_of_term vs d2) (*of*);
walther@60347
   148
            val ((a', b'), c) = gcd_poly a b
walther@60347
   149
            val (baseT, expT) = (type_of n1, HOLogic.realT);
walther@60347
   150
(*+*)val [(1, [])] = a'; (* 6 * _1_ = 6 *)
walther@60347
   151
(*+*)val [(2, [])] = b'; (* 3 * _2_ = 6 *)
walther@60347
   152
(*+*)val [(3, [])] = c;  (* 3 / 6 \<and> 3 / 3 ..gcd *)
walther@60347
   153
walther@60347
   154
            val nomin = term_of_poly baseT expT vs
walther@60347
   155
              (((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
walther@60347
   156
walther@60347
   157
(*+*)val "5" = UnparseC.term nomin; (* = "3" ERROR*)
walther@60347
   158
walther@60347
   159
(*+*)val [(2, [])] =   the (poly_of_term vs n1);            (*---v----------------------v----*)
walther@60347
   160
(*+*)val [(4, [])] = ((the (poly_of_term vs n1)) %%*%% b'); (* = 2 * _2_  new nomin for 2 / 3*)
walther@60347
   161
walther@60347
   162
(*+*)val [(1, [])] =   the (poly_of_term vs n2);            (*---v----------------------v----*)
walther@60347
   163
(*+*)val [(1, [])] = ((the (poly_of_term vs n2)) %%*%% a'); (* = 1 * _1_  new nomin for 1 / 6*)
walther@60347
   164
walther@60347
   165
(*+*)val [(5, [])] =                                        (* = 4 + 1    new nomin for sum  *)
walther@60347
   166
            (((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
walther@60347
   167
walther@60347
   168
            val denom =                                     (* = 3 * 1 * 2 new denom for sum *)
walther@60347
   169
                        term_of_poly baseT expT vs ((c %%*%% a') %%*%% b');
walther@60347
   170
(*+*)val "6" = UnparseC.term denom;
walther@60347
   171
walther@60347
   172
            val t' = HOLogic.mk_binop \<^const_name>\<open>divide\<close> (nomin, denom);
walther@60347
   173
(*+*)val "5 / 6" = UnparseC.term t'
walther@60347
   174
walther@60347
   175
walther@60347
   176
(*------- 0 / m + 0 / n
walther@60347
   177
             20 years old bug found here: *)
Walther@60565
   178
val t = TermC.parse_test @{context} "0 = c_2 + c * 0 + 1 / EI * (L * q_0 / 12 * 0 \<up> 3 + - 1 * q_0 / 24 * 0 \<up> 4)";
Walther@60500
   179
val SOME (t', _) = rewrite_set_ ctxt true norm_Rational t;
walther@60347
   180
(*
walther@60347
   181
:
walther@60347
   182
##  rls: cancel_p_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24) 
walther@60347
   183
###  rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24) 
walther@60347
   184
------------------------------------------------------------these are missing now -----\
walther@60347
   185
/##  rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 1)  from isa2: strange behaviour
walther@60347
   186
/##  rls: cancel_p on: 0 = c_2 + 1 / EI * (0 / 1 + 0 / 1)   from isa2: strange behaviour
walther@60347
   187
------------------------------------------------------------these are missing now -----/
walther@60347
   188
##  rls: norm_Rational_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24) 
walther@60347
   189
###  rls: add_fractions_p_rls on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24) 
walther@60347
   190
####  rls: add_fractions_p on: 0 = c_2 + 1 / EI * (0 / 12 + 0 / 24)
walther@60347
   191
--------------------------------------------------^v^v^v^v^v^v^v^v^--undetected bug
walther@60347
   192
####  rls: add_fractions_p on: 0 = c_2 + 1 / EI * (3 / 24)  =3: ERROR
walther@60347
   193
###  rls: rat_mult_div_pow on: 0 = c_2 + 1 / EI * (3 / 24) 
walther@60347
   194
:
walther@60347
   195
*)
walther@60347
   196
if UnparseC.term t' = "0 = c_2" then () else error "norm_Rational CHANGED"; (*isa2*)
walther@60347
   197
Walther@60565
   198
val t = TermC.parse_test @{context} "0 / 12 + 0 / 24 ::real";
walther@60347
   199
       add_fraction_p_ @{theory} t;
walther@60347
   200
"~~~~~ fun add_fraction_p_ , args:"; val ((_: theory), t) = (thy, t);
walther@60347
   201
val SOME ((n1, d1), (n2, d2)) =
walther@60347
   202
     (*case*) check_frac_sum t (*of*);
walther@60347
   203
walther@60347
   204
(*+*)val Const ("Groups.zero_class.zero", _) = n1;
walther@60347
   205
(*+*)val Const ("Groups.zero_class.zero", _) = n2;
walther@60347
   206
walther@60347
   207
      val vs = TermC.vars_of t;
walther@60347
   208
(*+*)val [] = vs;
walther@60347
   209
walther@60347
   210
val (SOME n1', SOME a, SOME n2', SOME b) =
walther@60347
   211
   (*case*) (poly_of_term vs n1, poly_of_term vs d1, poly_of_term vs n2, poly_of_term vs d2) (*of*);
walther@60347
   212
walther@60347
   213
(*+*)if n1' = [(0, [])] then () else error "correction w.r.t zero polynomial CHANGED";
walther@60347
   214
walther@60347
   215
            val ((a', b'), c) = gcd_poly a b
walther@60347
   216
            val (baseT, expT) = (type_of n1, HOLogic.realT);
walther@60347
   217
(*+*)val [(1, [])] = a'; (* 1 * _1_ = 24 *)          
walther@60347
   218
(*+*)val [(2, [])] = b'; (* 2 * _2_ = 12 *)          
walther@60347
   219
(*+*)val [(12, [])] = c; (* 12 / 24 \<and> 12 / 12 ..gcd *)  
walther@60347
   220
walther@60347
   221
            val nomin = term_of_poly baseT expT vs
walther@60347
   222
              (((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
walther@60347
   223
walther@60347
   224
(*+*)UnparseC.term nomin; (* = "3" ERROR*)
walther@60347
   225
(* correct ERROR ------------------------------------------------------------------\\*)
walther@60347
   226
(*+*)val SOME [(0, [])] = poly_of_term vs n1 (* ERROR WAS [(1, [])] *)
walther@60347
   227
(* correct ERROR ------------------------------------------------------------------//*)
walther@60347
   228
walther@60347
   229
(*+*)val [(0, [])] =   the (poly_of_term vs n1);            (*---v----------------------v-----*)
walther@60347
   230
(*+*)val [(0, [])] = ((the (poly_of_term vs n1)) %%*%% b'); (* = 0 * _0_  new nomin for 0 / 12*)
walther@60347
   231
walther@60347
   232
(*+*)val [(0, [])] =   the (poly_of_term vs n2);            (*---v----------------------v-----*)
walther@60347
   233
(*+*)val [(0, [])] = ((the (poly_of_term vs n2)) %%*%% a'); (* = 0 * _0_  new nomin for 0 / 24*)
walther@60347
   234
walther@60347
   235
(*+*)val [(0, [])] =                                        (* = 0 + 0    new nomin for sum   *)
walther@60347
   236
        (((the (poly_of_term vs n1)) %%*%% b') %%+%% ((the (poly_of_term vs n2)) %%*%% a'));
walther@60347
   237
walther@60347
   238
            val denom =                                     (* = 12 * 1 * 2 new denom for sum *)
walther@60347
   239
                        term_of_poly baseT expT vs ((c %%*%% a') %%*%% b');
walther@60347
   240
(*+*)val "24" =  UnparseC.term denom;
walther@60347
   241
walther@60347
   242
            val t' = HOLogic.mk_binop \<^const_name>\<open>divide\<close> (nomin, denom);
walther@60347
   243
(*+*)val "0 / 24" =  UnparseC.term t'
walther@60347
   244
walther@60347
   245
(*---------- fun cancel_p with Const AA *)
walther@60347
   246
val thy = @{theory Partial_Fractions};
walther@60347
   247
val ctxt = Proof_Context.init_global @{theory}
walther@60347
   248
val SOME t = TermC.parseNEW ctxt "2 * AA / 2"; (* Const (\<^const_name>\<open>AA\<close>, "real") *)
walther@60347
   249
Walther@60500
   250
val SOME (t', _) = rewrite_set_ ctxt true cancel_p t;
walther@60347
   251
case t' of
walther@60347
   252
  Const (\<^const_name>\<open>divide\<close>, _) $ Const (\<^const_name>\<open>AA\<close>, _) $
walther@60347
   253
    Const (\<^const_name>\<open>one_class.one\<close>, _) => ()
walther@60347
   254
| _ => error "WRONG rewrite_set_ cancel_p (2 * AA / 2) \<longrightarrow> AA changed";
walther@60347
   255
walther@60347
   256
"~~~~~ fun cancel_p , args:"; val (t) = (t);
walther@60347
   257
val opt = check_fraction t
walther@60347
   258
val SOME (numerator, denominator) = (*case*) opt (*of*);
walther@60347
   259
walther@60347
   260
if UnparseC.term numerator = "2 * AA" andalso UnparseC.term denominator = "2"
walther@60347
   261
then () else error "check_fraction (2 * AA / 2) changed";
walther@60347
   262
        val vs = TermC.vars_of t;
walther@60347
   263
case vs of
walther@60347
   264
  [Const (\<^const_name>\<open>AA\<close>, _)] => ()
walther@60347
   265
| _ => error "rewrite_set_ cancel_p (2 * AA / 2) \<longrightarrow> AA/1  changed";
walther@60347
   266
walther@60347
   267
walther@60327
   268
"-------- complex examples: rls norm_Rational --------------------------------------------------";
walther@60327
   269
"-------- complex examples: rls norm_Rational --------------------------------------------------";
walther@60327
   270
"-------- complex examples: rls norm_Rational --------------------------------------------------";
Walther@60565
   271
val t = TermC.parse_test @{context} "(3*x+5)/18 - x/2  - -(3*x - 2)/9 = 0";
Walther@60500
   272
val SOME (t', _) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
walther@60327
   273
if UnparseC.term t' = "1 / 18 = 0" then () else error "rational.sml 1";
walther@60327
   274
Walther@60565
   275
val t = TermC.parse_test @{context} "(17*x - 51)/9 - (-(13*x - 3)/6) + 11 - (9*x - 7)/4 = 0";
Walther@60500
   276
val SOME (t',_) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
walther@60327
   277
if UnparseC.term t' = "(237 + 65 * x) / 36 = 0" then () 
walther@60327
   278
else error "rational.sml 2";
walther@60327
   279
Walther@60565
   280
val t = TermC.parse_test @{context} "(1/2 + (5*x)/2) \<up> 2 - ((13*x)/2 - 5/2) \<up> 2 - (6*x) \<up> 2 + 29";
Walther@60500
   281
val SOME (t',_) = rewrite_set_ ctxt false norm_Rational t; UnparseC.term t';
walther@60327
   282
if UnparseC.term t' = "23 + 35 * x + - 72 * x \<up> 2" then ()
walther@60327
   283
else error "rational.sml 3";
walther@60327
   284
walther@60327
   285
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
walther@60327
   286
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
walther@60327
   287
"-------- complex examples cancellation from: Mathematik 1 Schalk ------------------------------";
walther@60327
   288
(*Schalk I, p.60 Nr. 215c *)
Walther@60565
   289
val t = TermC.parse_test @{context} "(a + b) \<up> 4 * (x - y)  /  ((x - y) \<up> 3 * (a + b) \<up> 2)";
Walther@60500
   290
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
walther@60327
   291
if UnparseC.term t = "(a \<up> 2 + 2 * a * b + b \<up> 2) / (x \<up> 2 + - 2 * x * y + y \<up> 2)"
walther@60327
   292
then () else error "rational.sml: diff.behav. in norm_Rational_mg 7";
walther@60327
   293
walther@60327
   294
(*SRC Schalk I, p.66 Nr. 381b *)
Walther@60565
   295
val t = TermC.parse_test @{context} 
walther@60327
   296
"(4*x \<up> 2 - 20*x + 25)/(2*x - 5) \<up> 3";
Walther@60500
   297
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
walther@60327
   298
if UnparseC.term t = "1 / (- 5 + 2 * x)"
walther@60327
   299
then () else error "rational.sml: diff.behav. in norm_Rational_mg 9";
walther@60327
   300
walther@60327
   301
(*Schalk I, p.60 Nr. 215c *)
Walther@60565
   302
val t = TermC.parse_test @{context} "(a + b) \<up> 4 * (x - y)  /  ((x - y) \<up> 3 * (a + b) \<up> 2)";
Walther@60500
   303
val SOME (t, _) = rewrite_set_ ctxt false norm_Rational t;
walther@60327
   304
if UnparseC.term t = "(a \<up> 2 + 2 * a * b + b \<up> 2) / (x \<up> 2 + - 2 * x * y + y \<up> 2)"
walther@60327
   305
then () else error "Schalk I, p.60 Nr. 215c: with Isabelle2002 cancellation incomplete, changed";
walther@60327
   306