src/HOL/Tools/Presburger/generated_cooper.ML
changeset 23466 886655a150f6
parent 23465 8f8835aac299
child 23467 d1b97708d5eb
equal deleted inserted replaced
23465:8f8835aac299 23466:886655a150f6
     1 structure GeneratedCooper =
       
     2 struct
       
     3 nonfix oo;
       
     4 fun nat i = if i < 0 then 0 else i;
       
     5 
       
     6 val one_def0 : int = (0 + 1);
       
     7 
       
     8 datatype num = C of int | Bound of int | CX of int * num | Neg of num
       
     9   | Add of num * num | Sub of num * num | Mul of int * num;
       
    10 
       
    11 fun snd (a, b) = b;
       
    12 
       
    13 fun negateSnd x = (fn (q, r) => (q, ~ r)) x;
       
    14 
       
    15 fun minus_def2 z w = (z + ~ w);
       
    16 
       
    17 fun adjust b =
       
    18   (fn (q, r) =>
       
    19     (if (0 <= minus_def2 r b) then (((2 * q) + 1), minus_def2 r b)
       
    20       else ((2 * q), r)));
       
    21 
       
    22 fun negDivAlg a b =
       
    23     (if ((0 <= (a + b)) orelse (b <= 0)) then (~1, (a + b))
       
    24       else adjust b (negDivAlg a (2 * b)));
       
    25 
       
    26 fun posDivAlg a b =
       
    27     (if ((a < b) orelse (b <= 0)) then (0, a)
       
    28       else adjust b (posDivAlg a (2 * b)));
       
    29 
       
    30 fun divAlg x =
       
    31   (fn (a, b) =>
       
    32     (if (0 <= a)
       
    33       then (if (0 <= b) then posDivAlg a b
       
    34              else (if (a = 0) then (0, 0)
       
    35                     else negateSnd (negDivAlg (~ a) (~ b))))
       
    36       else (if (0 < b) then negDivAlg a b
       
    37              else negateSnd (posDivAlg (~ a) (~ b)))))
       
    38     x;
       
    39 
       
    40 fun mod_def1 a b = snd (divAlg (a, b));
       
    41 
       
    42 fun dvd m n = (mod_def1 n m = 0);
       
    43 
       
    44 fun abs i = (if (i < 0) then ~ i else i);
       
    45 
       
    46 fun less_def3 m n = ((m) < (n));
       
    47 
       
    48 fun less_eq_def3 m n = Bool.not (less_def3 n m);
       
    49 
       
    50 fun numadd (Add (Mul (c1, Bound n1), r1), Add (Mul (c2, Bound n2), r2)) =
       
    51     (if (n1 = n2)
       
    52       then let val c = (c1 + c2)
       
    53            in (if (c = 0) then numadd (r1, r2)
       
    54                 else Add (Mul (c, Bound n1), numadd (r1, r2)))
       
    55            end
       
    56       else (if less_eq_def3 n1 n2
       
    57              then Add (Mul (c1, Bound n1),
       
    58                         numadd (r1, Add (Mul (c2, Bound n2), r2)))
       
    59              else Add (Mul (c2, Bound n2),
       
    60                         numadd (Add (Mul (c1, Bound n1), r1), r2))))
       
    61   | numadd (Add (Mul (c1, Bound n1), r1), C afq) =
       
    62     Add (Mul (c1, Bound n1), numadd (r1, C afq))
       
    63   | numadd (Add (Mul (c1, Bound n1), r1), Bound afr) =
       
    64     Add (Mul (c1, Bound n1), numadd (r1, Bound afr))
       
    65   | numadd (Add (Mul (c1, Bound n1), r1), CX (afs, aft)) =
       
    66     Add (Mul (c1, Bound n1), numadd (r1, CX (afs, aft)))
       
    67   | numadd (Add (Mul (c1, Bound n1), r1), Neg afu) =
       
    68     Add (Mul (c1, Bound n1), numadd (r1, Neg afu))
       
    69   | numadd (Add (Mul (c1, Bound n1), r1), Add (C agx, afw)) =
       
    70     Add (Mul (c1, Bound n1), numadd (r1, Add (C agx, afw)))
       
    71   | numadd (Add (Mul (c1, Bound n1), r1), Add (Bound agy, afw)) =
       
    72     Add (Mul (c1, Bound n1), numadd (r1, Add (Bound agy, afw)))
       
    73   | numadd (Add (Mul (c1, Bound n1), r1), Add (CX (agz, aha), afw)) =
       
    74     Add (Mul (c1, Bound n1), numadd (r1, Add (CX (agz, aha), afw)))
       
    75   | numadd (Add (Mul (c1, Bound n1), r1), Add (Neg ahb, afw)) =
       
    76     Add (Mul (c1, Bound n1), numadd (r1, Add (Neg ahb, afw)))
       
    77   | numadd (Add (Mul (c1, Bound n1), r1), Add (Add (ahc, ahd), afw)) =
       
    78     Add (Mul (c1, Bound n1), numadd (r1, Add (Add (ahc, ahd), afw)))
       
    79   | numadd (Add (Mul (c1, Bound n1), r1), Add (Sub (ahe, ahf), afw)) =
       
    80     Add (Mul (c1, Bound n1), numadd (r1, Add (Sub (ahe, ahf), afw)))
       
    81   | numadd (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, C aie), afw)) =
       
    82     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, C aie), afw)))
       
    83   | numadd (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, CX (aig, aih)), afw)) =
       
    84     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, CX (aig, aih)), afw)))
       
    85   | numadd (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, Neg aii), afw)) =
       
    86     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, Neg aii), afw)))
       
    87   | numadd
       
    88       (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, Add (aij, aik)), afw)) =
       
    89     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, Add (aij, aik)), afw)))
       
    90   | numadd
       
    91       (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, Sub (ail, aim)), afw)) =
       
    92     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, Sub (ail, aim)), afw)))
       
    93   | numadd
       
    94       (Add (Mul (c1, Bound n1), r1), Add (Mul (ahg, Mul (ain, aio)), afw)) =
       
    95     Add (Mul (c1, Bound n1), numadd (r1, Add (Mul (ahg, Mul (ain, aio)), afw)))
       
    96   | numadd (Add (Mul (c1, Bound n1), r1), Sub (afx, afy)) =
       
    97     Add (Mul (c1, Bound n1), numadd (r1, Sub (afx, afy)))
       
    98   | numadd (Add (Mul (c1, Bound n1), r1), Mul (afz, aga)) =
       
    99     Add (Mul (c1, Bound n1), numadd (r1, Mul (afz, aga)))
       
   100   | numadd (C w, Add (Mul (c2, Bound n2), r2)) =
       
   101     Add (Mul (c2, Bound n2), numadd (C w, r2))
       
   102   | numadd (Bound x, Add (Mul (c2, Bound n2), r2)) =
       
   103     Add (Mul (c2, Bound n2), numadd (Bound x, r2))
       
   104   | numadd (CX (y, z), Add (Mul (c2, Bound n2), r2)) =
       
   105     Add (Mul (c2, Bound n2), numadd (CX (y, z), r2))
       
   106   | numadd (Neg ab, Add (Mul (c2, Bound n2), r2)) =
       
   107     Add (Mul (c2, Bound n2), numadd (Neg ab, r2))
       
   108   | numadd (Add (C li, ad), Add (Mul (c2, Bound n2), r2)) =
       
   109     Add (Mul (c2, Bound n2), numadd (Add (C li, ad), r2))
       
   110   | numadd (Add (Bound lj, ad), Add (Mul (c2, Bound n2), r2)) =
       
   111     Add (Mul (c2, Bound n2), numadd (Add (Bound lj, ad), r2))
       
   112   | numadd (Add (CX (lk, ll), ad), Add (Mul (c2, Bound n2), r2)) =
       
   113     Add (Mul (c2, Bound n2), numadd (Add (CX (lk, ll), ad), r2))
       
   114   | numadd (Add (Neg lm, ad), Add (Mul (c2, Bound n2), r2)) =
       
   115     Add (Mul (c2, Bound n2), numadd (Add (Neg lm, ad), r2))
       
   116   | numadd (Add (Add (ln, lo), ad), Add (Mul (c2, Bound n2), r2)) =
       
   117     Add (Mul (c2, Bound n2), numadd (Add (Add (ln, lo), ad), r2))
       
   118   | numadd (Add (Sub (lp, lq), ad), Add (Mul (c2, Bound n2), r2)) =
       
   119     Add (Mul (c2, Bound n2), numadd (Add (Sub (lp, lq), ad), r2))
       
   120   | numadd (Add (Mul (lr, C abv), ad), Add (Mul (c2, Bound n2), r2)) =
       
   121     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, C abv), ad), r2))
       
   122   | numadd (Add (Mul (lr, CX (abx, aby)), ad), Add (Mul (c2, Bound n2), r2)) =
       
   123     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, CX (abx, aby)), ad), r2))
       
   124   | numadd (Add (Mul (lr, Neg abz), ad), Add (Mul (c2, Bound n2), r2)) =
       
   125     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, Neg abz), ad), r2))
       
   126   | numadd (Add (Mul (lr, Add (aca, acb)), ad), Add (Mul (c2, Bound n2), r2)) =
       
   127     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, Add (aca, acb)), ad), r2))
       
   128   | numadd (Add (Mul (lr, Sub (acc, acd)), ad), Add (Mul (c2, Bound n2), r2)) =
       
   129     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, Sub (acc, acd)), ad), r2))
       
   130   | numadd (Add (Mul (lr, Mul (ace, acf)), ad), Add (Mul (c2, Bound n2), r2)) =
       
   131     Add (Mul (c2, Bound n2), numadd (Add (Mul (lr, Mul (ace, acf)), ad), r2))
       
   132   | numadd (Sub (ae, af), Add (Mul (c2, Bound n2), r2)) =
       
   133     Add (Mul (c2, Bound n2), numadd (Sub (ae, af), r2))
       
   134   | numadd (Mul (ag, ah), Add (Mul (c2, Bound n2), r2)) =
       
   135     Add (Mul (c2, Bound n2), numadd (Mul (ag, ah), r2))
       
   136   | numadd (C b1, C b2) = C (b1 + b2)
       
   137   | numadd (C ai, Bound bf) = Add (C ai, Bound bf)
       
   138   | numadd (C ai, CX (bg, bh)) = Add (C ai, CX (bg, bh))
       
   139   | numadd (C ai, Neg bi) = Add (C ai, Neg bi)
       
   140   | numadd (C ai, Add (C ca, bk)) = Add (C ai, Add (C ca, bk))
       
   141   | numadd (C ai, Add (Bound cb, bk)) = Add (C ai, Add (Bound cb, bk))
       
   142   | numadd (C ai, Add (CX (cc, cd), bk)) = Add (C ai, Add (CX (cc, cd), bk))
       
   143   | numadd (C ai, Add (Neg ce, bk)) = Add (C ai, Add (Neg ce, bk))
       
   144   | numadd (C ai, Add (Add (cf, cg), bk)) = Add (C ai, Add (Add (cf, cg), bk))
       
   145   | numadd (C ai, Add (Sub (ch, ci), bk)) = Add (C ai, Add (Sub (ch, ci), bk))
       
   146   | numadd (C ai, Add (Mul (cj, C cw), bk)) =
       
   147     Add (C ai, Add (Mul (cj, C cw), bk))
       
   148   | numadd (C ai, Add (Mul (cj, CX (cy, cz)), bk)) =
       
   149     Add (C ai, Add (Mul (cj, CX (cy, cz)), bk))
       
   150   | numadd (C ai, Add (Mul (cj, Neg da), bk)) =
       
   151     Add (C ai, Add (Mul (cj, Neg da), bk))
       
   152   | numadd (C ai, Add (Mul (cj, Add (db, dc)), bk)) =
       
   153     Add (C ai, Add (Mul (cj, Add (db, dc)), bk))
       
   154   | numadd (C ai, Add (Mul (cj, Sub (dd, de)), bk)) =
       
   155     Add (C ai, Add (Mul (cj, Sub (dd, de)), bk))
       
   156   | numadd (C ai, Add (Mul (cj, Mul (df, dg)), bk)) =
       
   157     Add (C ai, Add (Mul (cj, Mul (df, dg)), bk))
       
   158   | numadd (C ai, Sub (bl, bm)) = Add (C ai, Sub (bl, bm))
       
   159   | numadd (C ai, Mul (bn, bo)) = Add (C ai, Mul (bn, bo))
       
   160   | numadd (Bound aj, C ds) = Add (Bound aj, C ds)
       
   161   | numadd (Bound aj, Bound dt) = Add (Bound aj, Bound dt)
       
   162   | numadd (Bound aj, CX (du, dv)) = Add (Bound aj, CX (du, dv))
       
   163   | numadd (Bound aj, Neg dw) = Add (Bound aj, Neg dw)
       
   164   | numadd (Bound aj, Add (C eo, dy)) = Add (Bound aj, Add (C eo, dy))
       
   165   | numadd (Bound aj, Add (Bound ep, dy)) = Add (Bound aj, Add (Bound ep, dy))
       
   166   | numadd (Bound aj, Add (CX (eq, er), dy)) =
       
   167     Add (Bound aj, Add (CX (eq, er), dy))
       
   168   | numadd (Bound aj, Add (Neg es, dy)) = Add (Bound aj, Add (Neg es, dy))
       
   169   | numadd (Bound aj, Add (Add (et, eu), dy)) =
       
   170     Add (Bound aj, Add (Add (et, eu), dy))
       
   171   | numadd (Bound aj, Add (Sub (ev, ew), dy)) =
       
   172     Add (Bound aj, Add (Sub (ev, ew), dy))
       
   173   | numadd (Bound aj, Add (Mul (ex, C fk), dy)) =
       
   174     Add (Bound aj, Add (Mul (ex, C fk), dy))
       
   175   | numadd (Bound aj, Add (Mul (ex, CX (fm, fn')), dy)) =
       
   176     Add (Bound aj, Add (Mul (ex, CX (fm, fn')), dy))
       
   177   | numadd (Bound aj, Add (Mul (ex, Neg fo), dy)) =
       
   178     Add (Bound aj, Add (Mul (ex, Neg fo), dy))
       
   179   | numadd (Bound aj, Add (Mul (ex, Add (fp, fq)), dy)) =
       
   180     Add (Bound aj, Add (Mul (ex, Add (fp, fq)), dy))
       
   181   | numadd (Bound aj, Add (Mul (ex, Sub (fr, fs)), dy)) =
       
   182     Add (Bound aj, Add (Mul (ex, Sub (fr, fs)), dy))
       
   183   | numadd (Bound aj, Add (Mul (ex, Mul (ft, fu)), dy)) =
       
   184     Add (Bound aj, Add (Mul (ex, Mul (ft, fu)), dy))
       
   185   | numadd (Bound aj, Sub (dz, ea)) = Add (Bound aj, Sub (dz, ea))
       
   186   | numadd (Bound aj, Mul (eb, ec)) = Add (Bound aj, Mul (eb, ec))
       
   187   | numadd (CX (ak, al), C gg) = Add (CX (ak, al), C gg)
       
   188   | numadd (CX (ak, al), Bound gh) = Add (CX (ak, al), Bound gh)
       
   189   | numadd (CX (ak, al), CX (gi, gj)) = Add (CX (ak, al), CX (gi, gj))
       
   190   | numadd (CX (ak, al), Neg gk) = Add (CX (ak, al), Neg gk)
       
   191   | numadd (CX (ak, al), Add (C hc, gm)) = Add (CX (ak, al), Add (C hc, gm))
       
   192   | numadd (CX (ak, al), Add (Bound hd, gm)) =
       
   193     Add (CX (ak, al), Add (Bound hd, gm))
       
   194   | numadd (CX (ak, al), Add (CX (he, hf), gm)) =
       
   195     Add (CX (ak, al), Add (CX (he, hf), gm))
       
   196   | numadd (CX (ak, al), Add (Neg hg, gm)) = Add (CX (ak, al), Add (Neg hg, gm))
       
   197   | numadd (CX (ak, al), Add (Add (hh, hi), gm)) =
       
   198     Add (CX (ak, al), Add (Add (hh, hi), gm))
       
   199   | numadd (CX (ak, al), Add (Sub (hj, hk), gm)) =
       
   200     Add (CX (ak, al), Add (Sub (hj, hk), gm))
       
   201   | numadd (CX (ak, al), Add (Mul (hl, C hy), gm)) =
       
   202     Add (CX (ak, al), Add (Mul (hl, C hy), gm))
       
   203   | numadd (CX (ak, al), Add (Mul (hl, CX (ia, ib)), gm)) =
       
   204     Add (CX (ak, al), Add (Mul (hl, CX (ia, ib)), gm))
       
   205   | numadd (CX (ak, al), Add (Mul (hl, Neg ic), gm)) =
       
   206     Add (CX (ak, al), Add (Mul (hl, Neg ic), gm))
       
   207   | numadd (CX (ak, al), Add (Mul (hl, Add (id, ie)), gm)) =
       
   208     Add (CX (ak, al), Add (Mul (hl, Add (id, ie)), gm))
       
   209   | numadd (CX (ak, al), Add (Mul (hl, Sub (if', ig)), gm)) =
       
   210     Add (CX (ak, al), Add (Mul (hl, Sub (if', ig)), gm))
       
   211   | numadd (CX (ak, al), Add (Mul (hl, Mul (ih, ii)), gm)) =
       
   212     Add (CX (ak, al), Add (Mul (hl, Mul (ih, ii)), gm))
       
   213   | numadd (CX (ak, al), Sub (gn, go)) = Add (CX (ak, al), Sub (gn, go))
       
   214   | numadd (CX (ak, al), Mul (gp, gq)) = Add (CX (ak, al), Mul (gp, gq))
       
   215   | numadd (Neg am, C iu) = Add (Neg am, C iu)
       
   216   | numadd (Neg am, Bound iv) = Add (Neg am, Bound iv)
       
   217   | numadd (Neg am, CX (iw, ix)) = Add (Neg am, CX (iw, ix))
       
   218   | numadd (Neg am, Neg iy) = Add (Neg am, Neg iy)
       
   219   | numadd (Neg am, Add (C jq, ja)) = Add (Neg am, Add (C jq, ja))
       
   220   | numadd (Neg am, Add (Bound jr, ja)) = Add (Neg am, Add (Bound jr, ja))
       
   221   | numadd (Neg am, Add (CX (js, jt), ja)) = Add (Neg am, Add (CX (js, jt), ja))
       
   222   | numadd (Neg am, Add (Neg ju, ja)) = Add (Neg am, Add (Neg ju, ja))
       
   223   | numadd (Neg am, Add (Add (jv, jw), ja)) =
       
   224     Add (Neg am, Add (Add (jv, jw), ja))
       
   225   | numadd (Neg am, Add (Sub (jx, jy), ja)) =
       
   226     Add (Neg am, Add (Sub (jx, jy), ja))
       
   227   | numadd (Neg am, Add (Mul (jz, C km), ja)) =
       
   228     Add (Neg am, Add (Mul (jz, C km), ja))
       
   229   | numadd (Neg am, Add (Mul (jz, CX (ko, kp)), ja)) =
       
   230     Add (Neg am, Add (Mul (jz, CX (ko, kp)), ja))
       
   231   | numadd (Neg am, Add (Mul (jz, Neg kq), ja)) =
       
   232     Add (Neg am, Add (Mul (jz, Neg kq), ja))
       
   233   | numadd (Neg am, Add (Mul (jz, Add (kr, ks)), ja)) =
       
   234     Add (Neg am, Add (Mul (jz, Add (kr, ks)), ja))
       
   235   | numadd (Neg am, Add (Mul (jz, Sub (kt, ku)), ja)) =
       
   236     Add (Neg am, Add (Mul (jz, Sub (kt, ku)), ja))
       
   237   | numadd (Neg am, Add (Mul (jz, Mul (kv, kw)), ja)) =
       
   238     Add (Neg am, Add (Mul (jz, Mul (kv, kw)), ja))
       
   239   | numadd (Neg am, Sub (jb, jc)) = Add (Neg am, Sub (jb, jc))
       
   240   | numadd (Neg am, Mul (jd, je)) = Add (Neg am, Mul (jd, je))
       
   241   | numadd (Add (C lt, ao), C mp) = Add (Add (C lt, ao), C mp)
       
   242   | numadd (Add (C lt, ao), Bound mq) = Add (Add (C lt, ao), Bound mq)
       
   243   | numadd (Add (C lt, ao), CX (mr, ms)) = Add (Add (C lt, ao), CX (mr, ms))
       
   244   | numadd (Add (C lt, ao), Neg mt) = Add (Add (C lt, ao), Neg mt)
       
   245   | numadd (Add (C lt, ao), Add (C nl, mv)) =
       
   246     Add (Add (C lt, ao), Add (C nl, mv))
       
   247   | numadd (Add (C lt, ao), Add (Bound nm, mv)) =
       
   248     Add (Add (C lt, ao), Add (Bound nm, mv))
       
   249   | numadd (Add (C lt, ao), Add (CX (nn, no), mv)) =
       
   250     Add (Add (C lt, ao), Add (CX (nn, no), mv))
       
   251   | numadd (Add (C lt, ao), Add (Neg np, mv)) =
       
   252     Add (Add (C lt, ao), Add (Neg np, mv))
       
   253   | numadd (Add (C lt, ao), Add (Add (nq, nr), mv)) =
       
   254     Add (Add (C lt, ao), Add (Add (nq, nr), mv))
       
   255   | numadd (Add (C lt, ao), Add (Sub (ns, nt), mv)) =
       
   256     Add (Add (C lt, ao), Add (Sub (ns, nt), mv))
       
   257   | numadd (Add (C lt, ao), Add (Mul (nu, C oh), mv)) =
       
   258     Add (Add (C lt, ao), Add (Mul (nu, C oh), mv))
       
   259   | numadd (Add (C lt, ao), Add (Mul (nu, CX (oj, ok)), mv)) =
       
   260     Add (Add (C lt, ao), Add (Mul (nu, CX (oj, ok)), mv))
       
   261   | numadd (Add (C lt, ao), Add (Mul (nu, Neg ol), mv)) =
       
   262     Add (Add (C lt, ao), Add (Mul (nu, Neg ol), mv))
       
   263   | numadd (Add (C lt, ao), Add (Mul (nu, Add (om, on)), mv)) =
       
   264     Add (Add (C lt, ao), Add (Mul (nu, Add (om, on)), mv))
       
   265   | numadd (Add (C lt, ao), Add (Mul (nu, Sub (oo, op')), mv)) =
       
   266     Add (Add (C lt, ao), Add (Mul (nu, Sub (oo, op')), mv))
       
   267   | numadd (Add (C lt, ao), Add (Mul (nu, Mul (oq, or)), mv)) =
       
   268     Add (Add (C lt, ao), Add (Mul (nu, Mul (oq, or)), mv))
       
   269   | numadd (Add (C lt, ao), Sub (mw, mx)) = Add (Add (C lt, ao), Sub (mw, mx))
       
   270   | numadd (Add (C lt, ao), Mul (my, mz)) = Add (Add (C lt, ao), Mul (my, mz))
       
   271   | numadd (Add (Bound lu, ao), C pd) = Add (Add (Bound lu, ao), C pd)
       
   272   | numadd (Add (Bound lu, ao), Bound pe) = Add (Add (Bound lu, ao), Bound pe)
       
   273   | numadd (Add (Bound lu, ao), CX (pf, pg)) =
       
   274     Add (Add (Bound lu, ao), CX (pf, pg))
       
   275   | numadd (Add (Bound lu, ao), Neg ph) = Add (Add (Bound lu, ao), Neg ph)
       
   276   | numadd (Add (Bound lu, ao), Add (C pz, pj)) =
       
   277     Add (Add (Bound lu, ao), Add (C pz, pj))
       
   278   | numadd (Add (Bound lu, ao), Add (Bound qa, pj)) =
       
   279     Add (Add (Bound lu, ao), Add (Bound qa, pj))
       
   280   | numadd (Add (Bound lu, ao), Add (CX (qb, qc), pj)) =
       
   281     Add (Add (Bound lu, ao), Add (CX (qb, qc), pj))
       
   282   | numadd (Add (Bound lu, ao), Add (Neg qd, pj)) =
       
   283     Add (Add (Bound lu, ao), Add (Neg qd, pj))
       
   284   | numadd (Add (Bound lu, ao), Add (Add (qe, qf), pj)) =
       
   285     Add (Add (Bound lu, ao), Add (Add (qe, qf), pj))
       
   286   | numadd (Add (Bound lu, ao), Add (Sub (qg, qh), pj)) =
       
   287     Add (Add (Bound lu, ao), Add (Sub (qg, qh), pj))
       
   288   | numadd (Add (Bound lu, ao), Add (Mul (qi, C qv), pj)) =
       
   289     Add (Add (Bound lu, ao), Add (Mul (qi, C qv), pj))
       
   290   | numadd (Add (Bound lu, ao), Add (Mul (qi, CX (qx, qy)), pj)) =
       
   291     Add (Add (Bound lu, ao), Add (Mul (qi, CX (qx, qy)), pj))
       
   292   | numadd (Add (Bound lu, ao), Add (Mul (qi, Neg qz), pj)) =
       
   293     Add (Add (Bound lu, ao), Add (Mul (qi, Neg qz), pj))
       
   294   | numadd (Add (Bound lu, ao), Add (Mul (qi, Add (ra, rb)), pj)) =
       
   295     Add (Add (Bound lu, ao), Add (Mul (qi, Add (ra, rb)), pj))
       
   296   | numadd (Add (Bound lu, ao), Add (Mul (qi, Sub (rc, rd)), pj)) =
       
   297     Add (Add (Bound lu, ao), Add (Mul (qi, Sub (rc, rd)), pj))
       
   298   | numadd (Add (Bound lu, ao), Add (Mul (qi, Mul (re, rf)), pj)) =
       
   299     Add (Add (Bound lu, ao), Add (Mul (qi, Mul (re, rf)), pj))
       
   300   | numadd (Add (Bound lu, ao), Sub (pk, pl)) =
       
   301     Add (Add (Bound lu, ao), Sub (pk, pl))
       
   302   | numadd (Add (Bound lu, ao), Mul (pm, pn)) =
       
   303     Add (Add (Bound lu, ao), Mul (pm, pn))
       
   304   | numadd (Add (CX (lv, lw), ao), C rr) = Add (Add (CX (lv, lw), ao), C rr)
       
   305   | numadd (Add (CX (lv, lw), ao), Bound rs) =
       
   306     Add (Add (CX (lv, lw), ao), Bound rs)
       
   307   | numadd (Add (CX (lv, lw), ao), CX (rt, ru)) =
       
   308     Add (Add (CX (lv, lw), ao), CX (rt, ru))
       
   309   | numadd (Add (CX (lv, lw), ao), Neg rv) = Add (Add (CX (lv, lw), ao), Neg rv)
       
   310   | numadd (Add (CX (lv, lw), ao), Add (C sn, rx)) =
       
   311     Add (Add (CX (lv, lw), ao), Add (C sn, rx))
       
   312   | numadd (Add (CX (lv, lw), ao), Add (Bound so, rx)) =
       
   313     Add (Add (CX (lv, lw), ao), Add (Bound so, rx))
       
   314   | numadd (Add (CX (lv, lw), ao), Add (CX (sp, sq), rx)) =
       
   315     Add (Add (CX (lv, lw), ao), Add (CX (sp, sq), rx))
       
   316   | numadd (Add (CX (lv, lw), ao), Add (Neg sr, rx)) =
       
   317     Add (Add (CX (lv, lw), ao), Add (Neg sr, rx))
       
   318   | numadd (Add (CX (lv, lw), ao), Add (Add (ss, st), rx)) =
       
   319     Add (Add (CX (lv, lw), ao), Add (Add (ss, st), rx))
       
   320   | numadd (Add (CX (lv, lw), ao), Add (Sub (su, sv), rx)) =
       
   321     Add (Add (CX (lv, lw), ao), Add (Sub (su, sv), rx))
       
   322   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, C tj), rx)) =
       
   323     Add (Add (CX (lv, lw), ao), Add (Mul (sw, C tj), rx))
       
   324   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, CX (tl, tm)), rx)) =
       
   325     Add (Add (CX (lv, lw), ao), Add (Mul (sw, CX (tl, tm)), rx))
       
   326   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, Neg tn), rx)) =
       
   327     Add (Add (CX (lv, lw), ao), Add (Mul (sw, Neg tn), rx))
       
   328   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, Add (to, tp)), rx)) =
       
   329     Add (Add (CX (lv, lw), ao), Add (Mul (sw, Add (to, tp)), rx))
       
   330   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, Sub (tq, tr)), rx)) =
       
   331     Add (Add (CX (lv, lw), ao), Add (Mul (sw, Sub (tq, tr)), rx))
       
   332   | numadd (Add (CX (lv, lw), ao), Add (Mul (sw, Mul (ts, tt)), rx)) =
       
   333     Add (Add (CX (lv, lw), ao), Add (Mul (sw, Mul (ts, tt)), rx))
       
   334   | numadd (Add (CX (lv, lw), ao), Sub (ry, rz)) =
       
   335     Add (Add (CX (lv, lw), ao), Sub (ry, rz))
       
   336   | numadd (Add (CX (lv, lw), ao), Mul (sa, sb)) =
       
   337     Add (Add (CX (lv, lw), ao), Mul (sa, sb))
       
   338   | numadd (Add (Neg lx, ao), C uf) = Add (Add (Neg lx, ao), C uf)
       
   339   | numadd (Add (Neg lx, ao), Bound ug) = Add (Add (Neg lx, ao), Bound ug)
       
   340   | numadd (Add (Neg lx, ao), CX (uh, ui)) = Add (Add (Neg lx, ao), CX (uh, ui))
       
   341   | numadd (Add (Neg lx, ao), Neg uj) = Add (Add (Neg lx, ao), Neg uj)
       
   342   | numadd (Add (Neg lx, ao), Add (C vb, ul)) =
       
   343     Add (Add (Neg lx, ao), Add (C vb, ul))
       
   344   | numadd (Add (Neg lx, ao), Add (Bound vc, ul)) =
       
   345     Add (Add (Neg lx, ao), Add (Bound vc, ul))
       
   346   | numadd (Add (Neg lx, ao), Add (CX (vd, ve), ul)) =
       
   347     Add (Add (Neg lx, ao), Add (CX (vd, ve), ul))
       
   348   | numadd (Add (Neg lx, ao), Add (Neg vf, ul)) =
       
   349     Add (Add (Neg lx, ao), Add (Neg vf, ul))
       
   350   | numadd (Add (Neg lx, ao), Add (Add (vg, vh), ul)) =
       
   351     Add (Add (Neg lx, ao), Add (Add (vg, vh), ul))
       
   352   | numadd (Add (Neg lx, ao), Add (Sub (vi, vj), ul)) =
       
   353     Add (Add (Neg lx, ao), Add (Sub (vi, vj), ul))
       
   354   | numadd (Add (Neg lx, ao), Add (Mul (vk, C vx), ul)) =
       
   355     Add (Add (Neg lx, ao), Add (Mul (vk, C vx), ul))
       
   356   | numadd (Add (Neg lx, ao), Add (Mul (vk, CX (vz, wa)), ul)) =
       
   357     Add (Add (Neg lx, ao), Add (Mul (vk, CX (vz, wa)), ul))
       
   358   | numadd (Add (Neg lx, ao), Add (Mul (vk, Neg wb), ul)) =
       
   359     Add (Add (Neg lx, ao), Add (Mul (vk, Neg wb), ul))
       
   360   | numadd (Add (Neg lx, ao), Add (Mul (vk, Add (wc, wd)), ul)) =
       
   361     Add (Add (Neg lx, ao), Add (Mul (vk, Add (wc, wd)), ul))
       
   362   | numadd (Add (Neg lx, ao), Add (Mul (vk, Sub (we, wf)), ul)) =
       
   363     Add (Add (Neg lx, ao), Add (Mul (vk, Sub (we, wf)), ul))
       
   364   | numadd (Add (Neg lx, ao), Add (Mul (vk, Mul (wg, wh)), ul)) =
       
   365     Add (Add (Neg lx, ao), Add (Mul (vk, Mul (wg, wh)), ul))
       
   366   | numadd (Add (Neg lx, ao), Sub (um, un)) =
       
   367     Add (Add (Neg lx, ao), Sub (um, un))
       
   368   | numadd (Add (Neg lx, ao), Mul (uo, up)) =
       
   369     Add (Add (Neg lx, ao), Mul (uo, up))
       
   370   | numadd (Add (Add (ly, lz), ao), C wt) = Add (Add (Add (ly, lz), ao), C wt)
       
   371   | numadd (Add (Add (ly, lz), ao), Bound wu) =
       
   372     Add (Add (Add (ly, lz), ao), Bound wu)
       
   373   | numadd (Add (Add (ly, lz), ao), CX (wv, ww)) =
       
   374     Add (Add (Add (ly, lz), ao), CX (wv, ww))
       
   375   | numadd (Add (Add (ly, lz), ao), Neg wx) =
       
   376     Add (Add (Add (ly, lz), ao), Neg wx)
       
   377   | numadd (Add (Add (ly, lz), ao), Add (C xp, wz)) =
       
   378     Add (Add (Add (ly, lz), ao), Add (C xp, wz))
       
   379   | numadd (Add (Add (ly, lz), ao), Add (Bound xq, wz)) =
       
   380     Add (Add (Add (ly, lz), ao), Add (Bound xq, wz))
       
   381   | numadd (Add (Add (ly, lz), ao), Add (CX (xr, xs), wz)) =
       
   382     Add (Add (Add (ly, lz), ao), Add (CX (xr, xs), wz))
       
   383   | numadd (Add (Add (ly, lz), ao), Add (Neg xt, wz)) =
       
   384     Add (Add (Add (ly, lz), ao), Add (Neg xt, wz))
       
   385   | numadd (Add (Add (ly, lz), ao), Add (Add (xu, xv), wz)) =
       
   386     Add (Add (Add (ly, lz), ao), Add (Add (xu, xv), wz))
       
   387   | numadd (Add (Add (ly, lz), ao), Add (Sub (xw, xx), wz)) =
       
   388     Add (Add (Add (ly, lz), ao), Add (Sub (xw, xx), wz))
       
   389   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, C yl), wz)) =
       
   390     Add (Add (Add (ly, lz), ao), Add (Mul (xy, C yl), wz))
       
   391   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, CX (yn, yo)), wz)) =
       
   392     Add (Add (Add (ly, lz), ao), Add (Mul (xy, CX (yn, yo)), wz))
       
   393   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, Neg yp), wz)) =
       
   394     Add (Add (Add (ly, lz), ao), Add (Mul (xy, Neg yp), wz))
       
   395   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, Add (yq, yr)), wz)) =
       
   396     Add (Add (Add (ly, lz), ao), Add (Mul (xy, Add (yq, yr)), wz))
       
   397   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, Sub (ys, yt)), wz)) =
       
   398     Add (Add (Add (ly, lz), ao), Add (Mul (xy, Sub (ys, yt)), wz))
       
   399   | numadd (Add (Add (ly, lz), ao), Add (Mul (xy, Mul (yu, yv)), wz)) =
       
   400     Add (Add (Add (ly, lz), ao), Add (Mul (xy, Mul (yu, yv)), wz))
       
   401   | numadd (Add (Add (ly, lz), ao), Sub (xa, xb)) =
       
   402     Add (Add (Add (ly, lz), ao), Sub (xa, xb))
       
   403   | numadd (Add (Add (ly, lz), ao), Mul (xc, xd)) =
       
   404     Add (Add (Add (ly, lz), ao), Mul (xc, xd))
       
   405   | numadd (Add (Sub (ma, mb), ao), C zh) = Add (Add (Sub (ma, mb), ao), C zh)
       
   406   | numadd (Add (Sub (ma, mb), ao), Bound zi) =
       
   407     Add (Add (Sub (ma, mb), ao), Bound zi)
       
   408   | numadd (Add (Sub (ma, mb), ao), CX (zj, zk)) =
       
   409     Add (Add (Sub (ma, mb), ao), CX (zj, zk))
       
   410   | numadd (Add (Sub (ma, mb), ao), Neg zl) =
       
   411     Add (Add (Sub (ma, mb), ao), Neg zl)
       
   412   | numadd (Add (Sub (ma, mb), ao), Add (C aad, zn)) =
       
   413     Add (Add (Sub (ma, mb), ao), Add (C aad, zn))
       
   414   | numadd (Add (Sub (ma, mb), ao), Add (Bound aae, zn)) =
       
   415     Add (Add (Sub (ma, mb), ao), Add (Bound aae, zn))
       
   416   | numadd (Add (Sub (ma, mb), ao), Add (CX (aaf, aag), zn)) =
       
   417     Add (Add (Sub (ma, mb), ao), Add (CX (aaf, aag), zn))
       
   418   | numadd (Add (Sub (ma, mb), ao), Add (Neg aah, zn)) =
       
   419     Add (Add (Sub (ma, mb), ao), Add (Neg aah, zn))
       
   420   | numadd (Add (Sub (ma, mb), ao), Add (Add (aai, aaj), zn)) =
       
   421     Add (Add (Sub (ma, mb), ao), Add (Add (aai, aaj), zn))
       
   422   | numadd (Add (Sub (ma, mb), ao), Add (Sub (aak, aal), zn)) =
       
   423     Add (Add (Sub (ma, mb), ao), Add (Sub (aak, aal), zn))
       
   424   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, C aaz), zn)) =
       
   425     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, C aaz), zn))
       
   426   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, CX (abb, abc)), zn)) =
       
   427     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, CX (abb, abc)), zn))
       
   428   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, Neg abd), zn)) =
       
   429     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, Neg abd), zn))
       
   430   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, Add (abe, abf)), zn)) =
       
   431     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, Add (abe, abf)), zn))
       
   432   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, Sub (abg, abh)), zn)) =
       
   433     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, Sub (abg, abh)), zn))
       
   434   | numadd (Add (Sub (ma, mb), ao), Add (Mul (aam, Mul (abi, abj)), zn)) =
       
   435     Add (Add (Sub (ma, mb), ao), Add (Mul (aam, Mul (abi, abj)), zn))
       
   436   | numadd (Add (Sub (ma, mb), ao), Sub (zo, zp)) =
       
   437     Add (Add (Sub (ma, mb), ao), Sub (zo, zp))
       
   438   | numadd (Add (Sub (ma, mb), ao), Mul (zq, zr)) =
       
   439     Add (Add (Sub (ma, mb), ao), Mul (zq, zr))
       
   440   | numadd (Add (Mul (mc, C acg), ao), C adc) =
       
   441     Add (Add (Mul (mc, C acg), ao), C adc)
       
   442   | numadd (Add (Mul (mc, C acg), ao), Bound add) =
       
   443     Add (Add (Mul (mc, C acg), ao), Bound add)
       
   444   | numadd (Add (Mul (mc, C acg), ao), CX (ade, adf)) =
       
   445     Add (Add (Mul (mc, C acg), ao), CX (ade, adf))
       
   446   | numadd (Add (Mul (mc, C acg), ao), Neg adg) =
       
   447     Add (Add (Mul (mc, C acg), ao), Neg adg)
       
   448   | numadd (Add (Mul (mc, C acg), ao), Add (C ady, adi)) =
       
   449     Add (Add (Mul (mc, C acg), ao), Add (C ady, adi))
       
   450   | numadd (Add (Mul (mc, C acg), ao), Add (Bound adz, adi)) =
       
   451     Add (Add (Mul (mc, C acg), ao), Add (Bound adz, adi))
       
   452   | numadd (Add (Mul (mc, C acg), ao), Add (CX (aea, aeb), adi)) =
       
   453     Add (Add (Mul (mc, C acg), ao), Add (CX (aea, aeb), adi))
       
   454   | numadd (Add (Mul (mc, C acg), ao), Add (Neg aec, adi)) =
       
   455     Add (Add (Mul (mc, C acg), ao), Add (Neg aec, adi))
       
   456   | numadd (Add (Mul (mc, C acg), ao), Add (Add (aed, aee), adi)) =
       
   457     Add (Add (Mul (mc, C acg), ao), Add (Add (aed, aee), adi))
       
   458   | numadd (Add (Mul (mc, C acg), ao), Add (Sub (aef, aeg), adi)) =
       
   459     Add (Add (Mul (mc, C acg), ao), Add (Sub (aef, aeg), adi))
       
   460   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, C aeu), adi)) =
       
   461     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, C aeu), adi))
       
   462   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, CX (aew, aex)), adi)) =
       
   463     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, CX (aew, aex)), adi))
       
   464   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Neg aey), adi)) =
       
   465     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Neg aey), adi))
       
   466   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Add (aez, afa)), adi)) =
       
   467     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Add (aez, afa)), adi))
       
   468   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Sub (afb, afc)), adi)) =
       
   469     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Sub (afb, afc)), adi))
       
   470   | numadd (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Mul (afd, afe)), adi)) =
       
   471     Add (Add (Mul (mc, C acg), ao), Add (Mul (aeh, Mul (afd, afe)), adi))
       
   472   | numadd (Add (Mul (mc, C acg), ao), Sub (adj, adk)) =
       
   473     Add (Add (Mul (mc, C acg), ao), Sub (adj, adk))
       
   474   | numadd (Add (Mul (mc, C acg), ao), Mul (adl, adm)) =
       
   475     Add (Add (Mul (mc, C acg), ao), Mul (adl, adm))
       
   476   | numadd (Add (Mul (mc, CX (aci, acj)), ao), C ajl) =
       
   477     Add (Add (Mul (mc, CX (aci, acj)), ao), C ajl)
       
   478   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Bound ajm) =
       
   479     Add (Add (Mul (mc, CX (aci, acj)), ao), Bound ajm)
       
   480   | numadd (Add (Mul (mc, CX (aci, acj)), ao), CX (ajn, ajo)) =
       
   481     Add (Add (Mul (mc, CX (aci, acj)), ao), CX (ajn, ajo))
       
   482   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Neg ajp) =
       
   483     Add (Add (Mul (mc, CX (aci, acj)), ao), Neg ajp)
       
   484   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (C akh, ajr)) =
       
   485     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (C akh, ajr))
       
   486   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Bound aki, ajr)) =
       
   487     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Bound aki, ajr))
       
   488   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (CX (akj, akk), ajr)) =
       
   489     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (CX (akj, akk), ajr))
       
   490   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Neg akl, ajr)) =
       
   491     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Neg akl, ajr))
       
   492   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Add (akm, akn), ajr)) =
       
   493     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Add (akm, akn), ajr))
       
   494   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Sub (ako, akp), ajr)) =
       
   495     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Sub (ako, akp), ajr))
       
   496   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, C ald), ajr)) =
       
   497     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, C ald), ajr))
       
   498   | numadd
       
   499       (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, CX (alf, alg)), ajr)) =
       
   500     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, CX (alf, alg)), ajr))
       
   501   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, Neg alh), ajr)) =
       
   502     Add (Add (Mul (mc, CX (aci, acj)), ao), Add (Mul (akq, Neg alh), ajr))
       
   503   | numadd
       
   504       (Add (Mul (mc, CX (aci, acj)), ao),
       
   505         Add (Mul (akq, Add (ali, alj)), ajr)) =
       
   506     Add (Add (Mul (mc, CX (aci, acj)), ao),
       
   507           Add (Mul (akq, Add (ali, alj)), ajr))
       
   508   | numadd
       
   509       (Add (Mul (mc, CX (aci, acj)), ao),
       
   510         Add (Mul (akq, Sub (alk, all)), ajr)) =
       
   511     Add (Add (Mul (mc, CX (aci, acj)), ao),
       
   512           Add (Mul (akq, Sub (alk, all)), ajr))
       
   513   | numadd
       
   514       (Add (Mul (mc, CX (aci, acj)), ao),
       
   515         Add (Mul (akq, Mul (alm, aln)), ajr)) =
       
   516     Add (Add (Mul (mc, CX (aci, acj)), ao),
       
   517           Add (Mul (akq, Mul (alm, aln)), ajr))
       
   518   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Sub (ajs, ajt)) =
       
   519     Add (Add (Mul (mc, CX (aci, acj)), ao), Sub (ajs, ajt))
       
   520   | numadd (Add (Mul (mc, CX (aci, acj)), ao), Mul (aju, ajv)) =
       
   521     Add (Add (Mul (mc, CX (aci, acj)), ao), Mul (aju, ajv))
       
   522   | numadd (Add (Mul (mc, Neg ack), ao), C alz) =
       
   523     Add (Add (Mul (mc, Neg ack), ao), C alz)
       
   524   | numadd (Add (Mul (mc, Neg ack), ao), Bound ama) =
       
   525     Add (Add (Mul (mc, Neg ack), ao), Bound ama)
       
   526   | numadd (Add (Mul (mc, Neg ack), ao), CX (amb, amc)) =
       
   527     Add (Add (Mul (mc, Neg ack), ao), CX (amb, amc))
       
   528   | numadd (Add (Mul (mc, Neg ack), ao), Neg amd) =
       
   529     Add (Add (Mul (mc, Neg ack), ao), Neg amd)
       
   530   | numadd (Add (Mul (mc, Neg ack), ao), Add (C amv, amf)) =
       
   531     Add (Add (Mul (mc, Neg ack), ao), Add (C amv, amf))
       
   532   | numadd (Add (Mul (mc, Neg ack), ao), Add (Bound amw, amf)) =
       
   533     Add (Add (Mul (mc, Neg ack), ao), Add (Bound amw, amf))
       
   534   | numadd (Add (Mul (mc, Neg ack), ao), Add (CX (amx, amy), amf)) =
       
   535     Add (Add (Mul (mc, Neg ack), ao), Add (CX (amx, amy), amf))
       
   536   | numadd (Add (Mul (mc, Neg ack), ao), Add (Neg amz, amf)) =
       
   537     Add (Add (Mul (mc, Neg ack), ao), Add (Neg amz, amf))
       
   538   | numadd (Add (Mul (mc, Neg ack), ao), Add (Add (ana, anb), amf)) =
       
   539     Add (Add (Mul (mc, Neg ack), ao), Add (Add (ana, anb), amf))
       
   540   | numadd (Add (Mul (mc, Neg ack), ao), Add (Sub (anc, and'), amf)) =
       
   541     Add (Add (Mul (mc, Neg ack), ao), Add (Sub (anc, and'), amf))
       
   542   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, C anr), amf)) =
       
   543     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, C anr), amf))
       
   544   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, CX (ant, anu)), amf)) =
       
   545     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, CX (ant, anu)), amf))
       
   546   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Neg anv), amf)) =
       
   547     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Neg anv), amf))
       
   548   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Add (anw, anx)), amf)) =
       
   549     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Add (anw, anx)), amf))
       
   550   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Sub (any, anz)), amf)) =
       
   551     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Sub (any, anz)), amf))
       
   552   | numadd (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Mul (aoa, aob)), amf)) =
       
   553     Add (Add (Mul (mc, Neg ack), ao), Add (Mul (ane, Mul (aoa, aob)), amf))
       
   554   | numadd (Add (Mul (mc, Neg ack), ao), Sub (amg, amh)) =
       
   555     Add (Add (Mul (mc, Neg ack), ao), Sub (amg, amh))
       
   556   | numadd (Add (Mul (mc, Neg ack), ao), Mul (ami, amj)) =
       
   557     Add (Add (Mul (mc, Neg ack), ao), Mul (ami, amj))
       
   558   | numadd (Add (Mul (mc, Add (acl, acm)), ao), C aon) =
       
   559     Add (Add (Mul (mc, Add (acl, acm)), ao), C aon)
       
   560   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Bound aoo) =
       
   561     Add (Add (Mul (mc, Add (acl, acm)), ao), Bound aoo)
       
   562   | numadd (Add (Mul (mc, Add (acl, acm)), ao), CX (aop, aoq)) =
       
   563     Add (Add (Mul (mc, Add (acl, acm)), ao), CX (aop, aoq))
       
   564   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Neg aor) =
       
   565     Add (Add (Mul (mc, Add (acl, acm)), ao), Neg aor)
       
   566   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (C apj, aot)) =
       
   567     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (C apj, aot))
       
   568   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Bound apk, aot)) =
       
   569     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Bound apk, aot))
       
   570   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (CX (apl, apm), aot)) =
       
   571     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (CX (apl, apm), aot))
       
   572   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Neg apn, aot)) =
       
   573     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Neg apn, aot))
       
   574   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Add (apo, app), aot)) =
       
   575     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Add (apo, app), aot))
       
   576   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Sub (apq, apr), aot)) =
       
   577     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Sub (apq, apr), aot))
       
   578   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Mul (aps, C aqf), aot)) =
       
   579     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Mul (aps, C aqf), aot))
       
   580   | numadd
       
   581       (Add (Mul (mc, Add (acl, acm)), ao),
       
   582         Add (Mul (aps, CX (aqh, aqi)), aot)) =
       
   583     Add (Add (Mul (mc, Add (acl, acm)), ao),
       
   584           Add (Mul (aps, CX (aqh, aqi)), aot))
       
   585   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Add (Mul (aps, Neg aqj), aot)) =
       
   586     Add (Add (Mul (mc, Add (acl, acm)), ao), Add (Mul (aps, Neg aqj), aot))
       
   587   | numadd
       
   588       (Add (Mul (mc, Add (acl, acm)), ao),
       
   589         Add (Mul (aps, Add (aqk, aql)), aot)) =
       
   590     Add (Add (Mul (mc, Add (acl, acm)), ao),
       
   591           Add (Mul (aps, Add (aqk, aql)), aot))
       
   592   | numadd
       
   593       (Add (Mul (mc, Add (acl, acm)), ao),
       
   594         Add (Mul (aps, Sub (aqm, aqn)), aot)) =
       
   595     Add (Add (Mul (mc, Add (acl, acm)), ao),
       
   596           Add (Mul (aps, Sub (aqm, aqn)), aot))
       
   597   | numadd
       
   598       (Add (Mul (mc, Add (acl, acm)), ao),
       
   599         Add (Mul (aps, Mul (aqo, aqp)), aot)) =
       
   600     Add (Add (Mul (mc, Add (acl, acm)), ao),
       
   601           Add (Mul (aps, Mul (aqo, aqp)), aot))
       
   602   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Sub (aou, aov)) =
       
   603     Add (Add (Mul (mc, Add (acl, acm)), ao), Sub (aou, aov))
       
   604   | numadd (Add (Mul (mc, Add (acl, acm)), ao), Mul (aow, aox)) =
       
   605     Add (Add (Mul (mc, Add (acl, acm)), ao), Mul (aow, aox))
       
   606   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), C arb) =
       
   607     Add (Add (Mul (mc, Sub (acn, aco)), ao), C arb)
       
   608   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Bound arc) =
       
   609     Add (Add (Mul (mc, Sub (acn, aco)), ao), Bound arc)
       
   610   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), CX (ard, are)) =
       
   611     Add (Add (Mul (mc, Sub (acn, aco)), ao), CX (ard, are))
       
   612   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Neg arf) =
       
   613     Add (Add (Mul (mc, Sub (acn, aco)), ao), Neg arf)
       
   614   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (C arx, arh)) =
       
   615     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (C arx, arh))
       
   616   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Bound ary, arh)) =
       
   617     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Bound ary, arh))
       
   618   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (CX (arz, asa), arh)) =
       
   619     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (CX (arz, asa), arh))
       
   620   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Neg asb, arh)) =
       
   621     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Neg asb, arh))
       
   622   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Add (asc, asd), arh)) =
       
   623     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Add (asc, asd), arh))
       
   624   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Sub (ase, asf), arh)) =
       
   625     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Sub (ase, asf), arh))
       
   626   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Mul (asg, C ast), arh)) =
       
   627     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Mul (asg, C ast), arh))
       
   628   | numadd
       
   629       (Add (Mul (mc, Sub (acn, aco)), ao),
       
   630         Add (Mul (asg, CX (asv, asw)), arh)) =
       
   631     Add (Add (Mul (mc, Sub (acn, aco)), ao),
       
   632           Add (Mul (asg, CX (asv, asw)), arh))
       
   633   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Add (Mul (asg, Neg asx), arh)) =
       
   634     Add (Add (Mul (mc, Sub (acn, aco)), ao), Add (Mul (asg, Neg asx), arh))
       
   635   | numadd
       
   636       (Add (Mul (mc, Sub (acn, aco)), ao),
       
   637         Add (Mul (asg, Add (asy, asz)), arh)) =
       
   638     Add (Add (Mul (mc, Sub (acn, aco)), ao),
       
   639           Add (Mul (asg, Add (asy, asz)), arh))
       
   640   | numadd
       
   641       (Add (Mul (mc, Sub (acn, aco)), ao),
       
   642         Add (Mul (asg, Sub (ata, atb)), arh)) =
       
   643     Add (Add (Mul (mc, Sub (acn, aco)), ao),
       
   644           Add (Mul (asg, Sub (ata, atb)), arh))
       
   645   | numadd
       
   646       (Add (Mul (mc, Sub (acn, aco)), ao),
       
   647         Add (Mul (asg, Mul (atc, atd)), arh)) =
       
   648     Add (Add (Mul (mc, Sub (acn, aco)), ao),
       
   649           Add (Mul (asg, Mul (atc, atd)), arh))
       
   650   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Sub (ari, arj)) =
       
   651     Add (Add (Mul (mc, Sub (acn, aco)), ao), Sub (ari, arj))
       
   652   | numadd (Add (Mul (mc, Sub (acn, aco)), ao), Mul (ark, arl)) =
       
   653     Add (Add (Mul (mc, Sub (acn, aco)), ao), Mul (ark, arl))
       
   654   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), C atp) =
       
   655     Add (Add (Mul (mc, Mul (acp, acq)), ao), C atp)
       
   656   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Bound atq) =
       
   657     Add (Add (Mul (mc, Mul (acp, acq)), ao), Bound atq)
       
   658   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), CX (atr, ats)) =
       
   659     Add (Add (Mul (mc, Mul (acp, acq)), ao), CX (atr, ats))
       
   660   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Neg att) =
       
   661     Add (Add (Mul (mc, Mul (acp, acq)), ao), Neg att)
       
   662   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (C aul, atv)) =
       
   663     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (C aul, atv))
       
   664   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Bound aum, atv)) =
       
   665     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Bound aum, atv))
       
   666   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (CX (aun, auo), atv)) =
       
   667     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (CX (aun, auo), atv))
       
   668   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Neg aup, atv)) =
       
   669     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Neg aup, atv))
       
   670   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Add (auq, aur), atv)) =
       
   671     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Add (auq, aur), atv))
       
   672   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Sub (aus, aut), atv)) =
       
   673     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Sub (aus, aut), atv))
       
   674   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Mul (auu, C avh), atv)) =
       
   675     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Mul (auu, C avh), atv))
       
   676   | numadd
       
   677       (Add (Mul (mc, Mul (acp, acq)), ao),
       
   678         Add (Mul (auu, CX (avj, avk)), atv)) =
       
   679     Add (Add (Mul (mc, Mul (acp, acq)), ao),
       
   680           Add (Mul (auu, CX (avj, avk)), atv))
       
   681   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Add (Mul (auu, Neg avl), atv)) =
       
   682     Add (Add (Mul (mc, Mul (acp, acq)), ao), Add (Mul (auu, Neg avl), atv))
       
   683   | numadd
       
   684       (Add (Mul (mc, Mul (acp, acq)), ao),
       
   685         Add (Mul (auu, Add (avm, avn)), atv)) =
       
   686     Add (Add (Mul (mc, Mul (acp, acq)), ao),
       
   687           Add (Mul (auu, Add (avm, avn)), atv))
       
   688   | numadd
       
   689       (Add (Mul (mc, Mul (acp, acq)), ao),
       
   690         Add (Mul (auu, Sub (avo, avp)), atv)) =
       
   691     Add (Add (Mul (mc, Mul (acp, acq)), ao),
       
   692           Add (Mul (auu, Sub (avo, avp)), atv))
       
   693   | numadd
       
   694       (Add (Mul (mc, Mul (acp, acq)), ao),
       
   695         Add (Mul (auu, Mul (avq, avr)), atv)) =
       
   696     Add (Add (Mul (mc, Mul (acp, acq)), ao),
       
   697           Add (Mul (auu, Mul (avq, avr)), atv))
       
   698   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Sub (atw, atx)) =
       
   699     Add (Add (Mul (mc, Mul (acp, acq)), ao), Sub (atw, atx))
       
   700   | numadd (Add (Mul (mc, Mul (acp, acq)), ao), Mul (aty, atz)) =
       
   701     Add (Add (Mul (mc, Mul (acp, acq)), ao), Mul (aty, atz))
       
   702   | numadd (Sub (ap, aq), C awd) = Add (Sub (ap, aq), C awd)
       
   703   | numadd (Sub (ap, aq), Bound awe) = Add (Sub (ap, aq), Bound awe)
       
   704   | numadd (Sub (ap, aq), CX (awf, awg)) = Add (Sub (ap, aq), CX (awf, awg))
       
   705   | numadd (Sub (ap, aq), Neg awh) = Add (Sub (ap, aq), Neg awh)
       
   706   | numadd (Sub (ap, aq), Add (C awz, awj)) =
       
   707     Add (Sub (ap, aq), Add (C awz, awj))
       
   708   | numadd (Sub (ap, aq), Add (Bound axa, awj)) =
       
   709     Add (Sub (ap, aq), Add (Bound axa, awj))
       
   710   | numadd (Sub (ap, aq), Add (CX (axb, axc), awj)) =
       
   711     Add (Sub (ap, aq), Add (CX (axb, axc), awj))
       
   712   | numadd (Sub (ap, aq), Add (Neg axd, awj)) =
       
   713     Add (Sub (ap, aq), Add (Neg axd, awj))
       
   714   | numadd (Sub (ap, aq), Add (Add (axe, axf), awj)) =
       
   715     Add (Sub (ap, aq), Add (Add (axe, axf), awj))
       
   716   | numadd (Sub (ap, aq), Add (Sub (axg, axh), awj)) =
       
   717     Add (Sub (ap, aq), Add (Sub (axg, axh), awj))
       
   718   | numadd (Sub (ap, aq), Add (Mul (axi, C axv), awj)) =
       
   719     Add (Sub (ap, aq), Add (Mul (axi, C axv), awj))
       
   720   | numadd (Sub (ap, aq), Add (Mul (axi, CX (axx, axy)), awj)) =
       
   721     Add (Sub (ap, aq), Add (Mul (axi, CX (axx, axy)), awj))
       
   722   | numadd (Sub (ap, aq), Add (Mul (axi, Neg axz), awj)) =
       
   723     Add (Sub (ap, aq), Add (Mul (axi, Neg axz), awj))
       
   724   | numadd (Sub (ap, aq), Add (Mul (axi, Add (aya, ayb)), awj)) =
       
   725     Add (Sub (ap, aq), Add (Mul (axi, Add (aya, ayb)), awj))
       
   726   | numadd (Sub (ap, aq), Add (Mul (axi, Sub (ayc, ayd)), awj)) =
       
   727     Add (Sub (ap, aq), Add (Mul (axi, Sub (ayc, ayd)), awj))
       
   728   | numadd (Sub (ap, aq), Add (Mul (axi, Mul (aye, ayf)), awj)) =
       
   729     Add (Sub (ap, aq), Add (Mul (axi, Mul (aye, ayf)), awj))
       
   730   | numadd (Sub (ap, aq), Sub (awk, awl)) = Add (Sub (ap, aq), Sub (awk, awl))
       
   731   | numadd (Sub (ap, aq), Mul (awm, awn)) = Add (Sub (ap, aq), Mul (awm, awn))
       
   732   | numadd (Mul (ar, as'), C ayr) = Add (Mul (ar, as'), C ayr)
       
   733   | numadd (Mul (ar, as'), Bound ays) = Add (Mul (ar, as'), Bound ays)
       
   734   | numadd (Mul (ar, as'), CX (ayt, ayu)) = Add (Mul (ar, as'), CX (ayt, ayu))
       
   735   | numadd (Mul (ar, as'), Neg ayv) = Add (Mul (ar, as'), Neg ayv)
       
   736   | numadd (Mul (ar, as'), Add (C azn, ayx)) =
       
   737     Add (Mul (ar, as'), Add (C azn, ayx))
       
   738   | numadd (Mul (ar, as'), Add (Bound azo, ayx)) =
       
   739     Add (Mul (ar, as'), Add (Bound azo, ayx))
       
   740   | numadd (Mul (ar, as'), Add (CX (azp, azq), ayx)) =
       
   741     Add (Mul (ar, as'), Add (CX (azp, azq), ayx))
       
   742   | numadd (Mul (ar, as'), Add (Neg azr, ayx)) =
       
   743     Add (Mul (ar, as'), Add (Neg azr, ayx))
       
   744   | numadd (Mul (ar, as'), Add (Add (azs, azt), ayx)) =
       
   745     Add (Mul (ar, as'), Add (Add (azs, azt), ayx))
       
   746   | numadd (Mul (ar, as'), Add (Sub (azu, azv), ayx)) =
       
   747     Add (Mul (ar, as'), Add (Sub (azu, azv), ayx))
       
   748   | numadd (Mul (ar, as'), Add (Mul (azw, C baj), ayx)) =
       
   749     Add (Mul (ar, as'), Add (Mul (azw, C baj), ayx))
       
   750   | numadd (Mul (ar, as'), Add (Mul (azw, CX (bal, bam)), ayx)) =
       
   751     Add (Mul (ar, as'), Add (Mul (azw, CX (bal, bam)), ayx))
       
   752   | numadd (Mul (ar, as'), Add (Mul (azw, Neg ban), ayx)) =
       
   753     Add (Mul (ar, as'), Add (Mul (azw, Neg ban), ayx))
       
   754   | numadd (Mul (ar, as'), Add (Mul (azw, Add (bao, bap)), ayx)) =
       
   755     Add (Mul (ar, as'), Add (Mul (azw, Add (bao, bap)), ayx))
       
   756   | numadd (Mul (ar, as'), Add (Mul (azw, Sub (baq, bar)), ayx)) =
       
   757     Add (Mul (ar, as'), Add (Mul (azw, Sub (baq, bar)), ayx))
       
   758   | numadd (Mul (ar, as'), Add (Mul (azw, Mul (bas, bat)), ayx)) =
       
   759     Add (Mul (ar, as'), Add (Mul (azw, Mul (bas, bat)), ayx))
       
   760   | numadd (Mul (ar, as'), Sub (ayy, ayz)) = Add (Mul (ar, as'), Sub (ayy, ayz))
       
   761   | numadd (Mul (ar, as'), Mul (aza, azb)) =
       
   762     Add (Mul (ar, as'), Mul (aza, azb));
       
   763 
       
   764 fun nummul (C j) = (fn i => C (i * j))
       
   765   | nummul (Add (a, b)) = (fn i => numadd (nummul a i, nummul b i))
       
   766   | nummul (Mul (c, t)) = (fn i => nummul t (i * c))
       
   767   | nummul (Bound v) = (fn i => Mul (i, Bound v))
       
   768   | nummul (CX (w, x)) = (fn i => Mul (i, CX (w, x)))
       
   769   | nummul (Neg y) = (fn i => Mul (i, Neg y))
       
   770   | nummul (Sub (ac, ad)) = (fn i => Mul (i, Sub (ac, ad)));
       
   771 
       
   772 fun numneg t = nummul t (~ 1);
       
   773 
       
   774 fun numsub s t = (if (s = t) then C 0 else numadd (s, numneg t));
       
   775 
       
   776 fun simpnum (C j) = C j
       
   777   | simpnum (Bound n) = Add (Mul (1, Bound n), C 0)
       
   778   | simpnum (Neg t) = numneg (simpnum t)
       
   779   | simpnum (Add (t, s)) = numadd (simpnum t, simpnum s)
       
   780   | simpnum (Sub (t, s)) = numsub (simpnum t) (simpnum s)
       
   781   | simpnum (Mul (i, t)) = (if (i = 0) then C 0 else nummul (simpnum t) i)
       
   782   | simpnum (CX (w, x)) = CX (w, x);
       
   783 
       
   784 datatype fm = T | F | Lt of num | Le of num | Gt of num | Ge of num | Eq of num
       
   785   | NEq of num | Dvd of int * num | NDvd of int * num | NOT of fm
       
   786   | And of fm * fm | Or of fm * fm | Imp of fm * fm | Iff of fm * fm | E of fm
       
   787   | A of fm | Closed of int | NClosed of int;
       
   788 
       
   789 fun not (NOT p) = p
       
   790   | not T = F
       
   791   | not F = T
       
   792   | not (Lt u) = NOT (Lt u)
       
   793   | not (Le v) = NOT (Le v)
       
   794   | not (Gt w) = NOT (Gt w)
       
   795   | not (Ge x) = NOT (Ge x)
       
   796   | not (Eq y) = NOT (Eq y)
       
   797   | not (NEq z) = NOT (NEq z)
       
   798   | not (Dvd (aa, ab)) = NOT (Dvd (aa, ab))
       
   799   | not (NDvd (ac, ad)) = NOT (NDvd (ac, ad))
       
   800   | not (And (af, ag)) = NOT (And (af, ag))
       
   801   | not (Or (ah, ai)) = NOT (Or (ah, ai))
       
   802   | not (Imp (aj, ak)) = NOT (Imp (aj, ak))
       
   803   | not (Iff (al, am)) = NOT (Iff (al, am))
       
   804   | not (E an) = NOT (E an)
       
   805   | not (A ao) = NOT (A ao)
       
   806   | not (Closed ap) = NOT (Closed ap)
       
   807   | not (NClosed aq) = NOT (NClosed aq);
       
   808 
       
   809 fun iff p q =
       
   810   (if (p = q) then T
       
   811     else (if ((p = not q) orelse (not p = q)) then F
       
   812            else (if (p = F) then not q
       
   813                   else (if (q = F) then not p
       
   814                          else (if (p = T) then q
       
   815                                 else (if (q = T) then p else Iff (p, q)))))));
       
   816 
       
   817 fun imp p q =
       
   818   (if ((p = F) orelse (q = T)) then T
       
   819     else (if (p = T) then q else (if (q = F) then not p else Imp (p, q))));
       
   820 
       
   821 fun disj p q =
       
   822   (if ((p = T) orelse (q = T)) then T
       
   823     else (if (p = F) then q else (if (q = F) then p else Or (p, q))));
       
   824 
       
   825 fun conj p q =
       
   826   (if ((p = F) orelse (q = F)) then F
       
   827     else (if (p = T) then q else (if (q = T) then p else And (p, q))));
       
   828 
       
   829 fun simpfm (And (p, q)) = conj (simpfm p) (simpfm q)
       
   830   | simpfm (Or (p, q)) = disj (simpfm p) (simpfm q)
       
   831   | simpfm (Imp (p, q)) = imp (simpfm p) (simpfm q)
       
   832   | simpfm (Iff (p, q)) = iff (simpfm p) (simpfm q)
       
   833   | simpfm (NOT p) = not (simpfm p)
       
   834   | simpfm (Lt a) =
       
   835     let val a' = simpnum a
       
   836     in (case a' of C x => (if (x < 0) then T else F) | Bound x => Lt a'
       
   837          | CX (x, xa) => Lt a' | Neg x => Lt a' | Add (x, xa) => Lt a'
       
   838          | Sub (x, xa) => Lt a' | Mul (x, xa) => Lt a')
       
   839     end
       
   840   | simpfm (Le a) =
       
   841     let val a' = simpnum a
       
   842     in (case a' of C x => (if (x <= 0) then T else F) | Bound x => Le a'
       
   843          | CX (x, xa) => Le a' | Neg x => Le a' | Add (x, xa) => Le a'
       
   844          | Sub (x, xa) => Le a' | Mul (x, xa) => Le a')
       
   845     end
       
   846   | simpfm (Gt a) =
       
   847     let val a' = simpnum a
       
   848     in (case a' of C x => (if (0 < x) then T else F) | Bound x => Gt a'
       
   849          | CX (x, xa) => Gt a' | Neg x => Gt a' | Add (x, xa) => Gt a'
       
   850          | Sub (x, xa) => Gt a' | Mul (x, xa) => Gt a')
       
   851     end
       
   852   | simpfm (Ge a) =
       
   853     let val a' = simpnum a
       
   854     in (case a' of C x => (if (0 <= x) then T else F) | Bound x => Ge a'
       
   855          | CX (x, xa) => Ge a' | Neg x => Ge a' | Add (x, xa) => Ge a'
       
   856          | Sub (x, xa) => Ge a' | Mul (x, xa) => Ge a')
       
   857     end
       
   858   | simpfm (Eq a) =
       
   859     let val a' = simpnum a
       
   860     in (case a' of C x => (if (x = 0) then T else F) | Bound x => Eq a'
       
   861          | CX (x, xa) => Eq a' | Neg x => Eq a' | Add (x, xa) => Eq a'
       
   862          | Sub (x, xa) => Eq a' | Mul (x, xa) => Eq a')
       
   863     end
       
   864   | simpfm (NEq a) =
       
   865     let val a' = simpnum a
       
   866     in (case a' of C x => (if Bool.not (x = 0) then T else F)
       
   867          | Bound x => NEq a' | CX (x, xa) => NEq a' | Neg x => NEq a'
       
   868          | Add (x, xa) => NEq a' | Sub (x, xa) => NEq a'
       
   869          | Mul (x, xa) => NEq a')
       
   870     end
       
   871   | simpfm (Dvd (i, a)) =
       
   872     (if (i = 0) then simpfm (Eq a)
       
   873       else (if (abs i = 1) then T
       
   874              else let val a' = simpnum a
       
   875                   in (case a' of C x => (if dvd i x then T else F)
       
   876                        | Bound x => Dvd (i, a') | CX (x, xa) => Dvd (i, a')
       
   877                        | Neg x => Dvd (i, a') | Add (x, xa) => Dvd (i, a')
       
   878                        | Sub (x, xa) => Dvd (i, a')
       
   879                        | Mul (x, xa) => Dvd (i, a'))
       
   880                   end))
       
   881   | simpfm (NDvd (i, a)) =
       
   882     (if (i = 0) then simpfm (NEq a)
       
   883       else (if (abs i = 1) then F
       
   884              else let val a' = simpnum a
       
   885                   in (case a' of C x => (if Bool.not (dvd i x) then T else F)
       
   886                        | Bound x => NDvd (i, a') | CX (x, xa) => NDvd (i, a')
       
   887                        | Neg x => NDvd (i, a') | Add (x, xa) => NDvd (i, a')
       
   888                        | Sub (x, xa) => NDvd (i, a')
       
   889                        | Mul (x, xa) => NDvd (i, a'))
       
   890                   end))
       
   891   | simpfm T = T
       
   892   | simpfm F = F
       
   893   | simpfm (E ao) = E ao
       
   894   | simpfm (A ap) = A ap
       
   895   | simpfm (Closed aq) = Closed aq
       
   896   | simpfm (NClosed ar) = NClosed ar;
       
   897 
       
   898 fun foldr f [] a = a
       
   899   | foldr f (x :: xs) a = f x (foldr f xs a);
       
   900 
       
   901 fun djf f p q =
       
   902   (if (q = T) then T
       
   903     else (if (q = F) then f p
       
   904            else let val fp = f p
       
   905                 in (case fp of T => T | F => q | Lt x => Or (f p, q)
       
   906                      | Le x => Or (f p, q) | Gt x => Or (f p, q)
       
   907                      | Ge x => Or (f p, q) | Eq x => Or (f p, q)
       
   908                      | NEq x => Or (f p, q) | Dvd (x, xa) => Or (f p, q)
       
   909                      | NDvd (x, xa) => Or (f p, q) | NOT x => Or (f p, q)
       
   910                      | And (x, xa) => Or (f p, q) | Or (x, xa) => Or (f p, q)
       
   911                      | Imp (x, xa) => Or (f p, q) | Iff (x, xa) => Or (f p, q)
       
   912                      | E x => Or (f p, q) | A x => Or (f p, q)
       
   913                      | Closed x => Or (f p, q) | NClosed x => Or (f p, q))
       
   914                 end));
       
   915 
       
   916 fun evaldjf f ps = foldr (djf f) ps F;
       
   917 
       
   918 fun append [] ys = ys
       
   919   | append (x :: xs) ys = (x :: append xs ys);
       
   920 
       
   921 fun disjuncts (Or (p, q)) = append (disjuncts p) (disjuncts q)
       
   922   | disjuncts F = []
       
   923   | disjuncts T = [T]
       
   924   | disjuncts (Lt u) = [Lt u]
       
   925   | disjuncts (Le v) = [Le v]
       
   926   | disjuncts (Gt w) = [Gt w]
       
   927   | disjuncts (Ge x) = [Ge x]
       
   928   | disjuncts (Eq y) = [Eq y]
       
   929   | disjuncts (NEq z) = [NEq z]
       
   930   | disjuncts (Dvd (aa, ab)) = [Dvd (aa, ab)]
       
   931   | disjuncts (NDvd (ac, ad)) = [NDvd (ac, ad)]
       
   932   | disjuncts (NOT ae) = [NOT ae]
       
   933   | disjuncts (And (af, ag)) = [And (af, ag)]
       
   934   | disjuncts (Imp (aj, ak)) = [Imp (aj, ak)]
       
   935   | disjuncts (Iff (al, am)) = [Iff (al, am)]
       
   936   | disjuncts (E an) = [E an]
       
   937   | disjuncts (A ao) = [A ao]
       
   938   | disjuncts (Closed ap) = [Closed ap]
       
   939   | disjuncts (NClosed aq) = [NClosed aq];
       
   940 
       
   941 fun DJ f p = evaldjf f (disjuncts p);
       
   942 
       
   943 fun qelim (E p) = (fn qe => DJ qe (qelim p qe))
       
   944   | qelim (A p) = (fn qe => not (qe (qelim (NOT p) qe)))
       
   945   | qelim (NOT p) = (fn qe => not (qelim p qe))
       
   946   | qelim (And (p, q)) = (fn qe => conj (qelim p qe) (qelim q qe))
       
   947   | qelim (Or (p, q)) = (fn qe => disj (qelim p qe) (qelim q qe))
       
   948   | qelim (Imp (p, q)) = (fn qe => imp (qelim p qe) (qelim q qe))
       
   949   | qelim (Iff (p, q)) = (fn qe => iff (qelim p qe) (qelim q qe))
       
   950   | qelim T = (fn y => simpfm T)
       
   951   | qelim F = (fn y => simpfm F)
       
   952   | qelim (Lt u) = (fn y => simpfm (Lt u))
       
   953   | qelim (Le v) = (fn y => simpfm (Le v))
       
   954   | qelim (Gt w) = (fn y => simpfm (Gt w))
       
   955   | qelim (Ge x) = (fn y => simpfm (Ge x))
       
   956   | qelim (Eq y) = (fn ya => simpfm (Eq y))
       
   957   | qelim (NEq z) = (fn y => simpfm (NEq z))
       
   958   | qelim (Dvd (aa, ab)) = (fn y => simpfm (Dvd (aa, ab)))
       
   959   | qelim (NDvd (ac, ad)) = (fn y => simpfm (NDvd (ac, ad)))
       
   960   | qelim (Closed ap) = (fn y => simpfm (Closed ap))
       
   961   | qelim (NClosed aq) = (fn y => simpfm (NClosed aq));
       
   962 
       
   963 fun minus_def1 m n = nat (minus_def2 (m) (n));
       
   964 
       
   965 fun decrnum (Bound n) = Bound (minus_def1 n one_def0)
       
   966   | decrnum (Neg a) = Neg (decrnum a)
       
   967   | decrnum (Add (a, b)) = Add (decrnum a, decrnum b)
       
   968   | decrnum (Sub (a, b)) = Sub (decrnum a, decrnum b)
       
   969   | decrnum (Mul (c, a)) = Mul (c, decrnum a)
       
   970   | decrnum (C u) = C u
       
   971   | decrnum (CX (w, x)) = CX (w, x);
       
   972 
       
   973 fun decr (Lt a) = Lt (decrnum a)
       
   974   | decr (Le a) = Le (decrnum a)
       
   975   | decr (Gt a) = Gt (decrnum a)
       
   976   | decr (Ge a) = Ge (decrnum a)
       
   977   | decr (Eq a) = Eq (decrnum a)
       
   978   | decr (NEq a) = NEq (decrnum a)
       
   979   | decr (Dvd (i, a)) = Dvd (i, decrnum a)
       
   980   | decr (NDvd (i, a)) = NDvd (i, decrnum a)
       
   981   | decr (NOT p) = NOT (decr p)
       
   982   | decr (And (p, q)) = And (decr p, decr q)
       
   983   | decr (Or (p, q)) = Or (decr p, decr q)
       
   984   | decr (Imp (p, q)) = Imp (decr p, decr q)
       
   985   | decr (Iff (p, q)) = Iff (decr p, decr q)
       
   986   | decr T = T
       
   987   | decr F = F
       
   988   | decr (E ao) = E ao
       
   989   | decr (A ap) = A ap
       
   990   | decr (Closed aq) = Closed aq
       
   991   | decr (NClosed ar) = NClosed ar;
       
   992 
       
   993 fun map f [] = []
       
   994   | map f (x :: xs) = (f x :: map f xs);
       
   995 
       
   996 fun allpairs f [] ys = []
       
   997   | allpairs f (x :: xs) ys = append (map (f x) ys) (allpairs f xs ys);
       
   998 
       
   999 fun numsubst0 t (C c) = C c
       
  1000   | numsubst0 t (Bound n) = (if (n = 0) then t else Bound n)
       
  1001   | numsubst0 t (CX (i, a)) = Add (Mul (i, t), numsubst0 t a)
       
  1002   | numsubst0 t (Neg a) = Neg (numsubst0 t a)
       
  1003   | numsubst0 t (Add (a, b)) = Add (numsubst0 t a, numsubst0 t b)
       
  1004   | numsubst0 t (Sub (a, b)) = Sub (numsubst0 t a, numsubst0 t b)
       
  1005   | numsubst0 t (Mul (i, a)) = Mul (i, numsubst0 t a);
       
  1006 
       
  1007 fun subst0 t T = T
       
  1008   | subst0 t F = F
       
  1009   | subst0 t (Lt a) = Lt (numsubst0 t a)
       
  1010   | subst0 t (Le a) = Le (numsubst0 t a)
       
  1011   | subst0 t (Gt a) = Gt (numsubst0 t a)
       
  1012   | subst0 t (Ge a) = Ge (numsubst0 t a)
       
  1013   | subst0 t (Eq a) = Eq (numsubst0 t a)
       
  1014   | subst0 t (NEq a) = NEq (numsubst0 t a)
       
  1015   | subst0 t (Dvd (i, a)) = Dvd (i, numsubst0 t a)
       
  1016   | subst0 t (NDvd (i, a)) = NDvd (i, numsubst0 t a)
       
  1017   | subst0 t (NOT p) = NOT (subst0 t p)
       
  1018   | subst0 t (And (p, q)) = And (subst0 t p, subst0 t q)
       
  1019   | subst0 t (Or (p, q)) = Or (subst0 t p, subst0 t q)
       
  1020   | subst0 t (Imp (p, q)) = Imp (subst0 t p, subst0 t q)
       
  1021   | subst0 t (Iff (p, q)) = Iff (subst0 t p, subst0 t q)
       
  1022   | subst0 t (Closed P) = Closed P
       
  1023   | subst0 t (NClosed P) = NClosed P;
       
  1024 
       
  1025 fun minusinf (And (p, q)) = And (minusinf p, minusinf q)
       
  1026   | minusinf (Or (p, q)) = Or (minusinf p, minusinf q)
       
  1027   | minusinf (Eq (CX (c, e))) = F
       
  1028   | minusinf (NEq (CX (c, e))) = T
       
  1029   | minusinf (Lt (CX (c, e))) = T
       
  1030   | minusinf (Le (CX (c, e))) = T
       
  1031   | minusinf (Gt (CX (c, e))) = F
       
  1032   | minusinf (Ge (CX (c, e))) = F
       
  1033   | minusinf T = T
       
  1034   | minusinf F = F
       
  1035   | minusinf (Lt (C bo)) = Lt (C bo)
       
  1036   | minusinf (Lt (Bound bp)) = Lt (Bound bp)
       
  1037   | minusinf (Lt (Neg bs)) = Lt (Neg bs)
       
  1038   | minusinf (Lt (Add (bt, bu))) = Lt (Add (bt, bu))
       
  1039   | minusinf (Lt (Sub (bv, bw))) = Lt (Sub (bv, bw))
       
  1040   | minusinf (Lt (Mul (bx, by))) = Lt (Mul (bx, by))
       
  1041   | minusinf (Le (C ck)) = Le (C ck)
       
  1042   | minusinf (Le (Bound cl)) = Le (Bound cl)
       
  1043   | minusinf (Le (Neg co)) = Le (Neg co)
       
  1044   | minusinf (Le (Add (cp, cq))) = Le (Add (cp, cq))
       
  1045   | minusinf (Le (Sub (cr, cs))) = Le (Sub (cr, cs))
       
  1046   | minusinf (Le (Mul (ct, cu))) = Le (Mul (ct, cu))
       
  1047   | minusinf (Gt (C dg)) = Gt (C dg)
       
  1048   | minusinf (Gt (Bound dh)) = Gt (Bound dh)
       
  1049   | minusinf (Gt (Neg dk)) = Gt (Neg dk)
       
  1050   | minusinf (Gt (Add (dl, dm))) = Gt (Add (dl, dm))
       
  1051   | minusinf (Gt (Sub (dn, do'))) = Gt (Sub (dn, do'))
       
  1052   | minusinf (Gt (Mul (dp, dq))) = Gt (Mul (dp, dq))
       
  1053   | minusinf (Ge (C ec)) = Ge (C ec)
       
  1054   | minusinf (Ge (Bound ed)) = Ge (Bound ed)
       
  1055   | minusinf (Ge (Neg eg)) = Ge (Neg eg)
       
  1056   | minusinf (Ge (Add (eh, ei))) = Ge (Add (eh, ei))
       
  1057   | minusinf (Ge (Sub (ej, ek))) = Ge (Sub (ej, ek))
       
  1058   | minusinf (Ge (Mul (el, em))) = Ge (Mul (el, em))
       
  1059   | minusinf (Eq (C ey)) = Eq (C ey)
       
  1060   | minusinf (Eq (Bound ez)) = Eq (Bound ez)
       
  1061   | minusinf (Eq (Neg fc)) = Eq (Neg fc)
       
  1062   | minusinf (Eq (Add (fd, fe))) = Eq (Add (fd, fe))
       
  1063   | minusinf (Eq (Sub (ff, fg))) = Eq (Sub (ff, fg))
       
  1064   | minusinf (Eq (Mul (fh, fi))) = Eq (Mul (fh, fi))
       
  1065   | minusinf (NEq (C fu)) = NEq (C fu)
       
  1066   | minusinf (NEq (Bound fv)) = NEq (Bound fv)
       
  1067   | minusinf (NEq (Neg fy)) = NEq (Neg fy)
       
  1068   | minusinf (NEq (Add (fz, ga))) = NEq (Add (fz, ga))
       
  1069   | minusinf (NEq (Sub (gb, gc))) = NEq (Sub (gb, gc))
       
  1070   | minusinf (NEq (Mul (gd, ge))) = NEq (Mul (gd, ge))
       
  1071   | minusinf (Dvd (aa, ab)) = Dvd (aa, ab)
       
  1072   | minusinf (NDvd (ac, ad)) = NDvd (ac, ad)
       
  1073   | minusinf (NOT ae) = NOT ae
       
  1074   | minusinf (Imp (aj, ak)) = Imp (aj, ak)
       
  1075   | minusinf (Iff (al, am)) = Iff (al, am)
       
  1076   | minusinf (E an) = E an
       
  1077   | minusinf (A ao) = A ao
       
  1078   | minusinf (Closed ap) = Closed ap
       
  1079   | minusinf (NClosed aq) = NClosed aq;
       
  1080 
       
  1081 fun iupt (i, j) = (if (j < i) then [] else (i :: iupt ((i + 1), j)));
       
  1082 
       
  1083 fun mirror (And (p, q)) = And (mirror p, mirror q)
       
  1084   | mirror (Or (p, q)) = Or (mirror p, mirror q)
       
  1085   | mirror (Eq (CX (c, e))) = Eq (CX (c, Neg e))
       
  1086   | mirror (NEq (CX (c, e))) = NEq (CX (c, Neg e))
       
  1087   | mirror (Lt (CX (c, e))) = Gt (CX (c, Neg e))
       
  1088   | mirror (Le (CX (c, e))) = Ge (CX (c, Neg e))
       
  1089   | mirror (Gt (CX (c, e))) = Lt (CX (c, Neg e))
       
  1090   | mirror (Ge (CX (c, e))) = Le (CX (c, Neg e))
       
  1091   | mirror (Dvd (i, CX (c, e))) = Dvd (i, CX (c, Neg e))
       
  1092   | mirror (NDvd (i, CX (c, e))) = NDvd (i, CX (c, Neg e))
       
  1093   | mirror T = T
       
  1094   | mirror F = F
       
  1095   | mirror (Lt (C bo)) = Lt (C bo)
       
  1096   | mirror (Lt (Bound bp)) = Lt (Bound bp)
       
  1097   | mirror (Lt (Neg bs)) = Lt (Neg bs)
       
  1098   | mirror (Lt (Add (bt, bu))) = Lt (Add (bt, bu))
       
  1099   | mirror (Lt (Sub (bv, bw))) = Lt (Sub (bv, bw))
       
  1100   | mirror (Lt (Mul (bx, by))) = Lt (Mul (bx, by))
       
  1101   | mirror (Le (C ck)) = Le (C ck)
       
  1102   | mirror (Le (Bound cl)) = Le (Bound cl)
       
  1103   | mirror (Le (Neg co)) = Le (Neg co)
       
  1104   | mirror (Le (Add (cp, cq))) = Le (Add (cp, cq))
       
  1105   | mirror (Le (Sub (cr, cs))) = Le (Sub (cr, cs))
       
  1106   | mirror (Le (Mul (ct, cu))) = Le (Mul (ct, cu))
       
  1107   | mirror (Gt (C dg)) = Gt (C dg)
       
  1108   | mirror (Gt (Bound dh)) = Gt (Bound dh)
       
  1109   | mirror (Gt (Neg dk)) = Gt (Neg dk)
       
  1110   | mirror (Gt (Add (dl, dm))) = Gt (Add (dl, dm))
       
  1111   | mirror (Gt (Sub (dn, do'))) = Gt (Sub (dn, do'))
       
  1112   | mirror (Gt (Mul (dp, dq))) = Gt (Mul (dp, dq))
       
  1113   | mirror (Ge (C ec)) = Ge (C ec)
       
  1114   | mirror (Ge (Bound ed)) = Ge (Bound ed)
       
  1115   | mirror (Ge (Neg eg)) = Ge (Neg eg)
       
  1116   | mirror (Ge (Add (eh, ei))) = Ge (Add (eh, ei))
       
  1117   | mirror (Ge (Sub (ej, ek))) = Ge (Sub (ej, ek))
       
  1118   | mirror (Ge (Mul (el, em))) = Ge (Mul (el, em))
       
  1119   | mirror (Eq (C ey)) = Eq (C ey)
       
  1120   | mirror (Eq (Bound ez)) = Eq (Bound ez)
       
  1121   | mirror (Eq (Neg fc)) = Eq (Neg fc)
       
  1122   | mirror (Eq (Add (fd, fe))) = Eq (Add (fd, fe))
       
  1123   | mirror (Eq (Sub (ff, fg))) = Eq (Sub (ff, fg))
       
  1124   | mirror (Eq (Mul (fh, fi))) = Eq (Mul (fh, fi))
       
  1125   | mirror (NEq (C fu)) = NEq (C fu)
       
  1126   | mirror (NEq (Bound fv)) = NEq (Bound fv)
       
  1127   | mirror (NEq (Neg fy)) = NEq (Neg fy)
       
  1128   | mirror (NEq (Add (fz, ga))) = NEq (Add (fz, ga))
       
  1129   | mirror (NEq (Sub (gb, gc))) = NEq (Sub (gb, gc))
       
  1130   | mirror (NEq (Mul (gd, ge))) = NEq (Mul (gd, ge))
       
  1131   | mirror (Dvd (aa, C gq)) = Dvd (aa, C gq)
       
  1132   | mirror (Dvd (aa, Bound gr)) = Dvd (aa, Bound gr)
       
  1133   | mirror (Dvd (aa, Neg gu)) = Dvd (aa, Neg gu)
       
  1134   | mirror (Dvd (aa, Add (gv, gw))) = Dvd (aa, Add (gv, gw))
       
  1135   | mirror (Dvd (aa, Sub (gx, gy))) = Dvd (aa, Sub (gx, gy))
       
  1136   | mirror (Dvd (aa, Mul (gz, ha))) = Dvd (aa, Mul (gz, ha))
       
  1137   | mirror (NDvd (ac, C hm)) = NDvd (ac, C hm)
       
  1138   | mirror (NDvd (ac, Bound hn)) = NDvd (ac, Bound hn)
       
  1139   | mirror (NDvd (ac, Neg hq)) = NDvd (ac, Neg hq)
       
  1140   | mirror (NDvd (ac, Add (hr, hs))) = NDvd (ac, Add (hr, hs))
       
  1141   | mirror (NDvd (ac, Sub (ht, hu))) = NDvd (ac, Sub (ht, hu))
       
  1142   | mirror (NDvd (ac, Mul (hv, hw))) = NDvd (ac, Mul (hv, hw))
       
  1143   | mirror (NOT ae) = NOT ae
       
  1144   | mirror (Imp (aj, ak)) = Imp (aj, ak)
       
  1145   | mirror (Iff (al, am)) = Iff (al, am)
       
  1146   | mirror (E an) = E an
       
  1147   | mirror (A ao) = A ao
       
  1148   | mirror (Closed ap) = Closed ap
       
  1149   | mirror (NClosed aq) = NClosed aq;
       
  1150 
       
  1151 fun plus_def0 m n = nat ((m) + (n));
       
  1152 
       
  1153 fun size_def9 [] = 0
       
  1154   | size_def9 (a :: list) = plus_def0 (size_def9 list) (0 + 1);
       
  1155 
       
  1156 fun alpha (And (p, q)) = append (alpha p) (alpha q)
       
  1157   | alpha (Or (p, q)) = append (alpha p) (alpha q)
       
  1158   | alpha (Eq (CX (c, e))) = [Add (C ~1, e)]
       
  1159   | alpha (NEq (CX (c, e))) = [e]
       
  1160   | alpha (Lt (CX (c, e))) = [e]
       
  1161   | alpha (Le (CX (c, e))) = [Add (C ~1, e)]
       
  1162   | alpha (Gt (CX (c, e))) = []
       
  1163   | alpha (Ge (CX (c, e))) = []
       
  1164   | alpha T = []
       
  1165   | alpha F = []
       
  1166   | alpha (Lt (C bo)) = []
       
  1167   | alpha (Lt (Bound bp)) = []
       
  1168   | alpha (Lt (Neg bs)) = []
       
  1169   | alpha (Lt (Add (bt, bu))) = []
       
  1170   | alpha (Lt (Sub (bv, bw))) = []
       
  1171   | alpha (Lt (Mul (bx, by))) = []
       
  1172   | alpha (Le (C ck)) = []
       
  1173   | alpha (Le (Bound cl)) = []
       
  1174   | alpha (Le (Neg co)) = []
       
  1175   | alpha (Le (Add (cp, cq))) = []
       
  1176   | alpha (Le (Sub (cr, cs))) = []
       
  1177   | alpha (Le (Mul (ct, cu))) = []
       
  1178   | alpha (Gt (C dg)) = []
       
  1179   | alpha (Gt (Bound dh)) = []
       
  1180   | alpha (Gt (Neg dk)) = []
       
  1181   | alpha (Gt (Add (dl, dm))) = []
       
  1182   | alpha (Gt (Sub (dn, do'))) = []
       
  1183   | alpha (Gt (Mul (dp, dq))) = []
       
  1184   | alpha (Ge (C ec)) = []
       
  1185   | alpha (Ge (Bound ed)) = []
       
  1186   | alpha (Ge (Neg eg)) = []
       
  1187   | alpha (Ge (Add (eh, ei))) = []
       
  1188   | alpha (Ge (Sub (ej, ek))) = []
       
  1189   | alpha (Ge (Mul (el, em))) = []
       
  1190   | alpha (Eq (C ey)) = []
       
  1191   | alpha (Eq (Bound ez)) = []
       
  1192   | alpha (Eq (Neg fc)) = []
       
  1193   | alpha (Eq (Add (fd, fe))) = []
       
  1194   | alpha (Eq (Sub (ff, fg))) = []
       
  1195   | alpha (Eq (Mul (fh, fi))) = []
       
  1196   | alpha (NEq (C fu)) = []
       
  1197   | alpha (NEq (Bound fv)) = []
       
  1198   | alpha (NEq (Neg fy)) = []
       
  1199   | alpha (NEq (Add (fz, ga))) = []
       
  1200   | alpha (NEq (Sub (gb, gc))) = []
       
  1201   | alpha (NEq (Mul (gd, ge))) = []
       
  1202   | alpha (Dvd (aa, ab)) = []
       
  1203   | alpha (NDvd (ac, ad)) = []
       
  1204   | alpha (NOT ae) = []
       
  1205   | alpha (Imp (aj, ak)) = []
       
  1206   | alpha (Iff (al, am)) = []
       
  1207   | alpha (E an) = []
       
  1208   | alpha (A ao) = []
       
  1209   | alpha (Closed ap) = []
       
  1210   | alpha (NClosed aq) = [];
       
  1211 
       
  1212 fun memberl x [] = false
       
  1213   | memberl x (y :: ys) = ((x = y) orelse memberl x ys);
       
  1214 
       
  1215 fun remdups [] = []
       
  1216   | remdups (x :: xs) =
       
  1217     (if memberl x xs then remdups xs else (x :: remdups xs));
       
  1218 
       
  1219 fun beta (And (p, q)) = append (beta p) (beta q)
       
  1220   | beta (Or (p, q)) = append (beta p) (beta q)
       
  1221   | beta (Eq (CX (c, e))) = [Sub (C ~1, e)]
       
  1222   | beta (NEq (CX (c, e))) = [Neg e]
       
  1223   | beta (Lt (CX (c, e))) = []
       
  1224   | beta (Le (CX (c, e))) = []
       
  1225   | beta (Gt (CX (c, e))) = [Neg e]
       
  1226   | beta (Ge (CX (c, e))) = [Sub (C ~1, e)]
       
  1227   | beta T = []
       
  1228   | beta F = []
       
  1229   | beta (Lt (C bo)) = []
       
  1230   | beta (Lt (Bound bp)) = []
       
  1231   | beta (Lt (Neg bs)) = []
       
  1232   | beta (Lt (Add (bt, bu))) = []
       
  1233   | beta (Lt (Sub (bv, bw))) = []
       
  1234   | beta (Lt (Mul (bx, by))) = []
       
  1235   | beta (Le (C ck)) = []
       
  1236   | beta (Le (Bound cl)) = []
       
  1237   | beta (Le (Neg co)) = []
       
  1238   | beta (Le (Add (cp, cq))) = []
       
  1239   | beta (Le (Sub (cr, cs))) = []
       
  1240   | beta (Le (Mul (ct, cu))) = []
       
  1241   | beta (Gt (C dg)) = []
       
  1242   | beta (Gt (Bound dh)) = []
       
  1243   | beta (Gt (Neg dk)) = []
       
  1244   | beta (Gt (Add (dl, dm))) = []
       
  1245   | beta (Gt (Sub (dn, do'))) = []
       
  1246   | beta (Gt (Mul (dp, dq))) = []
       
  1247   | beta (Ge (C ec)) = []
       
  1248   | beta (Ge (Bound ed)) = []
       
  1249   | beta (Ge (Neg eg)) = []
       
  1250   | beta (Ge (Add (eh, ei))) = []
       
  1251   | beta (Ge (Sub (ej, ek))) = []
       
  1252   | beta (Ge (Mul (el, em))) = []
       
  1253   | beta (Eq (C ey)) = []
       
  1254   | beta (Eq (Bound ez)) = []
       
  1255   | beta (Eq (Neg fc)) = []
       
  1256   | beta (Eq (Add (fd, fe))) = []
       
  1257   | beta (Eq (Sub (ff, fg))) = []
       
  1258   | beta (Eq (Mul (fh, fi))) = []
       
  1259   | beta (NEq (C fu)) = []
       
  1260   | beta (NEq (Bound fv)) = []
       
  1261   | beta (NEq (Neg fy)) = []
       
  1262   | beta (NEq (Add (fz, ga))) = []
       
  1263   | beta (NEq (Sub (gb, gc))) = []
       
  1264   | beta (NEq (Mul (gd, ge))) = []
       
  1265   | beta (Dvd (aa, ab)) = []
       
  1266   | beta (NDvd (ac, ad)) = []
       
  1267   | beta (NOT ae) = []
       
  1268   | beta (Imp (aj, ak)) = []
       
  1269   | beta (Iff (al, am)) = []
       
  1270   | beta (E an) = []
       
  1271   | beta (A ao) = []
       
  1272   | beta (Closed ap) = []
       
  1273   | beta (NClosed aq) = [];
       
  1274 
       
  1275 fun fst (a, b) = a;
       
  1276 
       
  1277 fun div_def1 a b = fst (divAlg (a, b));
       
  1278 
       
  1279 fun div_def0 m n = nat (div_def1 (m) (n));
       
  1280 
       
  1281 fun mod_def0 m n = nat (mod_def1 (m) (n));
       
  1282 
       
  1283 fun gcd (m, n) = (if (n = 0) then m else gcd (n, mod_def0 m n));
       
  1284 
       
  1285 fun times_def0 m n = nat ((m) * (n));
       
  1286 
       
  1287 fun lcm x = (fn (m, n) => div_def0 (times_def0 m n) (gcd (m, n))) x;
       
  1288 
       
  1289 fun ilcm x = (fn j => (lcm (nat (abs x), nat (abs j))));
       
  1290 
       
  1291 fun delta (And (p, q)) = ilcm (delta p) (delta q)
       
  1292   | delta (Or (p, q)) = ilcm (delta p) (delta q)
       
  1293   | delta (Dvd (i, CX (c, e))) = i
       
  1294   | delta (NDvd (i, CX (c, e))) = i
       
  1295   | delta T = 1
       
  1296   | delta F = 1
       
  1297   | delta (Lt u) = 1
       
  1298   | delta (Le v) = 1
       
  1299   | delta (Gt w) = 1
       
  1300   | delta (Ge x) = 1
       
  1301   | delta (Eq y) = 1
       
  1302   | delta (NEq z) = 1
       
  1303   | delta (Dvd (aa, C bo)) = 1
       
  1304   | delta (Dvd (aa, Bound bp)) = 1
       
  1305   | delta (Dvd (aa, Neg bs)) = 1
       
  1306   | delta (Dvd (aa, Add (bt, bu))) = 1
       
  1307   | delta (Dvd (aa, Sub (bv, bw))) = 1
       
  1308   | delta (Dvd (aa, Mul (bx, by))) = 1
       
  1309   | delta (NDvd (ac, C ck)) = 1
       
  1310   | delta (NDvd (ac, Bound cl)) = 1
       
  1311   | delta (NDvd (ac, Neg co)) = 1
       
  1312   | delta (NDvd (ac, Add (cp, cq))) = 1
       
  1313   | delta (NDvd (ac, Sub (cr, cs))) = 1
       
  1314   | delta (NDvd (ac, Mul (ct, cu))) = 1
       
  1315   | delta (NOT ae) = 1
       
  1316   | delta (Imp (aj, ak)) = 1
       
  1317   | delta (Iff (al, am)) = 1
       
  1318   | delta (E an) = 1
       
  1319   | delta (A ao) = 1
       
  1320   | delta (Closed ap) = 1
       
  1321   | delta (NClosed aq) = 1;
       
  1322 
       
  1323 fun a_beta (And (p, q)) = (fn k => And (a_beta p k, a_beta q k))
       
  1324   | a_beta (Or (p, q)) = (fn k => Or (a_beta p k, a_beta q k))
       
  1325   | a_beta (Eq (CX (c, e))) = (fn k => Eq (CX (1, Mul (div_def1 k c, e))))
       
  1326   | a_beta (NEq (CX (c, e))) = (fn k => NEq (CX (1, Mul (div_def1 k c, e))))
       
  1327   | a_beta (Lt (CX (c, e))) = (fn k => Lt (CX (1, Mul (div_def1 k c, e))))
       
  1328   | a_beta (Le (CX (c, e))) = (fn k => Le (CX (1, Mul (div_def1 k c, e))))
       
  1329   | a_beta (Gt (CX (c, e))) = (fn k => Gt (CX (1, Mul (div_def1 k c, e))))
       
  1330   | a_beta (Ge (CX (c, e))) = (fn k => Ge (CX (1, Mul (div_def1 k c, e))))
       
  1331   | a_beta (Dvd (i, CX (c, e))) =
       
  1332     (fn k => Dvd ((div_def1 k c * i), CX (1, Mul (div_def1 k c, e))))
       
  1333   | a_beta (NDvd (i, CX (c, e))) =
       
  1334     (fn k => NDvd ((div_def1 k c * i), CX (1, Mul (div_def1 k c, e))))
       
  1335   | a_beta T = (fn k => T)
       
  1336   | a_beta F = (fn k => F)
       
  1337   | a_beta (Lt (C bo)) = (fn k => Lt (C bo))
       
  1338   | a_beta (Lt (Bound bp)) = (fn k => Lt (Bound bp))
       
  1339   | a_beta (Lt (Neg bs)) = (fn k => Lt (Neg bs))
       
  1340   | a_beta (Lt (Add (bt, bu))) = (fn k => Lt (Add (bt, bu)))
       
  1341   | a_beta (Lt (Sub (bv, bw))) = (fn k => Lt (Sub (bv, bw)))
       
  1342   | a_beta (Lt (Mul (bx, by))) = (fn k => Lt (Mul (bx, by)))
       
  1343   | a_beta (Le (C ck)) = (fn k => Le (C ck))
       
  1344   | a_beta (Le (Bound cl)) = (fn k => Le (Bound cl))
       
  1345   | a_beta (Le (Neg co)) = (fn k => Le (Neg co))
       
  1346   | a_beta (Le (Add (cp, cq))) = (fn k => Le (Add (cp, cq)))
       
  1347   | a_beta (Le (Sub (cr, cs))) = (fn k => Le (Sub (cr, cs)))
       
  1348   | a_beta (Le (Mul (ct, cu))) = (fn k => Le (Mul (ct, cu)))
       
  1349   | a_beta (Gt (C dg)) = (fn k => Gt (C dg))
       
  1350   | a_beta (Gt (Bound dh)) = (fn k => Gt (Bound dh))
       
  1351   | a_beta (Gt (Neg dk)) = (fn k => Gt (Neg dk))
       
  1352   | a_beta (Gt (Add (dl, dm))) = (fn k => Gt (Add (dl, dm)))
       
  1353   | a_beta (Gt (Sub (dn, do'))) = (fn k => Gt (Sub (dn, do')))
       
  1354   | a_beta (Gt (Mul (dp, dq))) = (fn k => Gt (Mul (dp, dq)))
       
  1355   | a_beta (Ge (C ec)) = (fn k => Ge (C ec))
       
  1356   | a_beta (Ge (Bound ed)) = (fn k => Ge (Bound ed))
       
  1357   | a_beta (Ge (Neg eg)) = (fn k => Ge (Neg eg))
       
  1358   | a_beta (Ge (Add (eh, ei))) = (fn k => Ge (Add (eh, ei)))
       
  1359   | a_beta (Ge (Sub (ej, ek))) = (fn k => Ge (Sub (ej, ek)))
       
  1360   | a_beta (Ge (Mul (el, em))) = (fn k => Ge (Mul (el, em)))
       
  1361   | a_beta (Eq (C ey)) = (fn k => Eq (C ey))
       
  1362   | a_beta (Eq (Bound ez)) = (fn k => Eq (Bound ez))
       
  1363   | a_beta (Eq (Neg fc)) = (fn k => Eq (Neg fc))
       
  1364   | a_beta (Eq (Add (fd, fe))) = (fn k => Eq (Add (fd, fe)))
       
  1365   | a_beta (Eq (Sub (ff, fg))) = (fn k => Eq (Sub (ff, fg)))
       
  1366   | a_beta (Eq (Mul (fh, fi))) = (fn k => Eq (Mul (fh, fi)))
       
  1367   | a_beta (NEq (C fu)) = (fn k => NEq (C fu))
       
  1368   | a_beta (NEq (Bound fv)) = (fn k => NEq (Bound fv))
       
  1369   | a_beta (NEq (Neg fy)) = (fn k => NEq (Neg fy))
       
  1370   | a_beta (NEq (Add (fz, ga))) = (fn k => NEq (Add (fz, ga)))
       
  1371   | a_beta (NEq (Sub (gb, gc))) = (fn k => NEq (Sub (gb, gc)))
       
  1372   | a_beta (NEq (Mul (gd, ge))) = (fn k => NEq (Mul (gd, ge)))
       
  1373   | a_beta (Dvd (aa, C gq)) = (fn k => Dvd (aa, C gq))
       
  1374   | a_beta (Dvd (aa, Bound gr)) = (fn k => Dvd (aa, Bound gr))
       
  1375   | a_beta (Dvd (aa, Neg gu)) = (fn k => Dvd (aa, Neg gu))
       
  1376   | a_beta (Dvd (aa, Add (gv, gw))) = (fn k => Dvd (aa, Add (gv, gw)))
       
  1377   | a_beta (Dvd (aa, Sub (gx, gy))) = (fn k => Dvd (aa, Sub (gx, gy)))
       
  1378   | a_beta (Dvd (aa, Mul (gz, ha))) = (fn k => Dvd (aa, Mul (gz, ha)))
       
  1379   | a_beta (NDvd (ac, C hm)) = (fn k => NDvd (ac, C hm))
       
  1380   | a_beta (NDvd (ac, Bound hn)) = (fn k => NDvd (ac, Bound hn))
       
  1381   | a_beta (NDvd (ac, Neg hq)) = (fn k => NDvd (ac, Neg hq))
       
  1382   | a_beta (NDvd (ac, Add (hr, hs))) = (fn k => NDvd (ac, Add (hr, hs)))
       
  1383   | a_beta (NDvd (ac, Sub (ht, hu))) = (fn k => NDvd (ac, Sub (ht, hu)))
       
  1384   | a_beta (NDvd (ac, Mul (hv, hw))) = (fn k => NDvd (ac, Mul (hv, hw)))
       
  1385   | a_beta (NOT ae) = (fn k => NOT ae)
       
  1386   | a_beta (Imp (aj, ak)) = (fn k => Imp (aj, ak))
       
  1387   | a_beta (Iff (al, am)) = (fn k => Iff (al, am))
       
  1388   | a_beta (E an) = (fn k => E an)
       
  1389   | a_beta (A ao) = (fn k => A ao)
       
  1390   | a_beta (Closed ap) = (fn k => Closed ap)
       
  1391   | a_beta (NClosed aq) = (fn k => NClosed aq);
       
  1392 
       
  1393 fun zeta (And (p, q)) = ilcm (zeta p) (zeta q)
       
  1394   | zeta (Or (p, q)) = ilcm (zeta p) (zeta q)
       
  1395   | zeta (Eq (CX (c, e))) = c
       
  1396   | zeta (NEq (CX (c, e))) = c
       
  1397   | zeta (Lt (CX (c, e))) = c
       
  1398   | zeta (Le (CX (c, e))) = c
       
  1399   | zeta (Gt (CX (c, e))) = c
       
  1400   | zeta (Ge (CX (c, e))) = c
       
  1401   | zeta (Dvd (i, CX (c, e))) = c
       
  1402   | zeta (NDvd (i, CX (c, e))) = c
       
  1403   | zeta T = 1
       
  1404   | zeta F = 1
       
  1405   | zeta (Lt (C bo)) = 1
       
  1406   | zeta (Lt (Bound bp)) = 1
       
  1407   | zeta (Lt (Neg bs)) = 1
       
  1408   | zeta (Lt (Add (bt, bu))) = 1
       
  1409   | zeta (Lt (Sub (bv, bw))) = 1
       
  1410   | zeta (Lt (Mul (bx, by))) = 1
       
  1411   | zeta (Le (C ck)) = 1
       
  1412   | zeta (Le (Bound cl)) = 1
       
  1413   | zeta (Le (Neg co)) = 1
       
  1414   | zeta (Le (Add (cp, cq))) = 1
       
  1415   | zeta (Le (Sub (cr, cs))) = 1
       
  1416   | zeta (Le (Mul (ct, cu))) = 1
       
  1417   | zeta (Gt (C dg)) = 1
       
  1418   | zeta (Gt (Bound dh)) = 1
       
  1419   | zeta (Gt (Neg dk)) = 1
       
  1420   | zeta (Gt (Add (dl, dm))) = 1
       
  1421   | zeta (Gt (Sub (dn, do'))) = 1
       
  1422   | zeta (Gt (Mul (dp, dq))) = 1
       
  1423   | zeta (Ge (C ec)) = 1
       
  1424   | zeta (Ge (Bound ed)) = 1
       
  1425   | zeta (Ge (Neg eg)) = 1
       
  1426   | zeta (Ge (Add (eh, ei))) = 1
       
  1427   | zeta (Ge (Sub (ej, ek))) = 1
       
  1428   | zeta (Ge (Mul (el, em))) = 1
       
  1429   | zeta (Eq (C ey)) = 1
       
  1430   | zeta (Eq (Bound ez)) = 1
       
  1431   | zeta (Eq (Neg fc)) = 1
       
  1432   | zeta (Eq (Add (fd, fe))) = 1
       
  1433   | zeta (Eq (Sub (ff, fg))) = 1
       
  1434   | zeta (Eq (Mul (fh, fi))) = 1
       
  1435   | zeta (NEq (C fu)) = 1
       
  1436   | zeta (NEq (Bound fv)) = 1
       
  1437   | zeta (NEq (Neg fy)) = 1
       
  1438   | zeta (NEq (Add (fz, ga))) = 1
       
  1439   | zeta (NEq (Sub (gb, gc))) = 1
       
  1440   | zeta (NEq (Mul (gd, ge))) = 1
       
  1441   | zeta (Dvd (aa, C gq)) = 1
       
  1442   | zeta (Dvd (aa, Bound gr)) = 1
       
  1443   | zeta (Dvd (aa, Neg gu)) = 1
       
  1444   | zeta (Dvd (aa, Add (gv, gw))) = 1
       
  1445   | zeta (Dvd (aa, Sub (gx, gy))) = 1
       
  1446   | zeta (Dvd (aa, Mul (gz, ha))) = 1
       
  1447   | zeta (NDvd (ac, C hm)) = 1
       
  1448   | zeta (NDvd (ac, Bound hn)) = 1
       
  1449   | zeta (NDvd (ac, Neg hq)) = 1
       
  1450   | zeta (NDvd (ac, Add (hr, hs))) = 1
       
  1451   | zeta (NDvd (ac, Sub (ht, hu))) = 1
       
  1452   | zeta (NDvd (ac, Mul (hv, hw))) = 1
       
  1453   | zeta (NOT ae) = 1
       
  1454   | zeta (Imp (aj, ak)) = 1
       
  1455   | zeta (Iff (al, am)) = 1
       
  1456   | zeta (E an) = 1
       
  1457   | zeta (A ao) = 1
       
  1458   | zeta (Closed ap) = 1
       
  1459   | zeta (NClosed aq) = 1;
       
  1460 
       
  1461 fun split x = (fn p => x (fst p) (snd p));
       
  1462 
       
  1463 fun zsplit0 (C c) = (0, C c)
       
  1464   | zsplit0 (Bound n) = (if (n = 0) then (1, C 0) else (0, Bound n))
       
  1465   | zsplit0 (CX (i, a)) = split (fn i' => (fn x => ((i + i'), x))) (zsplit0 a)
       
  1466   | zsplit0 (Neg a) = (fn (i', a') => (~ i', Neg a')) (zsplit0 a)
       
  1467   | zsplit0 (Add (a, b)) =
       
  1468     (fn (ia, a') => (fn (ib, b') => ((ia + ib), Add (a', b'))) (zsplit0 b))
       
  1469       (zsplit0 a)
       
  1470   | zsplit0 (Sub (a, b)) =
       
  1471     (fn (ia, a') =>
       
  1472       (fn (ib, b') => (minus_def2 ia ib, Sub (a', b'))) (zsplit0 b))
       
  1473       (zsplit0 a)
       
  1474   | zsplit0 (Mul (i, a)) = (fn (i', a') => ((i * i'), Mul (i, a'))) (zsplit0 a);
       
  1475 
       
  1476 fun zlfm (And (p, q)) = And (zlfm p, zlfm q)
       
  1477   | zlfm (Or (p, q)) = Or (zlfm p, zlfm q)
       
  1478   | zlfm (Imp (p, q)) = Or (zlfm (NOT p), zlfm q)
       
  1479   | zlfm (Iff (p, q)) =
       
  1480     Or (And (zlfm p, zlfm q), And (zlfm (NOT p), zlfm (NOT q)))
       
  1481   | zlfm (Lt a) =
       
  1482     let val x = zsplit0 a
       
  1483     in (fn (c, r) =>
       
  1484          (if (c = 0) then Lt r
       
  1485            else (if (0 < c) then Lt (CX (c, r)) else Gt (CX (~ c, Neg r)))))
       
  1486          x
       
  1487     end
       
  1488   | zlfm (Le a) =
       
  1489     let val x = zsplit0 a
       
  1490     in (fn (c, r) =>
       
  1491          (if (c = 0) then Le r
       
  1492            else (if (0 < c) then Le (CX (c, r)) else Ge (CX (~ c, Neg r)))))
       
  1493          x
       
  1494     end
       
  1495   | zlfm (Gt a) =
       
  1496     let val x = zsplit0 a
       
  1497     in (fn (c, r) =>
       
  1498          (if (c = 0) then Gt r
       
  1499            else (if (0 < c) then Gt (CX (c, r)) else Lt (CX (~ c, Neg r)))))
       
  1500          x
       
  1501     end
       
  1502   | zlfm (Ge a) =
       
  1503     let val x = zsplit0 a
       
  1504     in (fn (c, r) =>
       
  1505          (if (c = 0) then Ge r
       
  1506            else (if (0 < c) then Ge (CX (c, r)) else Le (CX (~ c, Neg r)))))
       
  1507          x
       
  1508     end
       
  1509   | zlfm (Eq a) =
       
  1510     let val x = zsplit0 a
       
  1511     in (fn (c, r) =>
       
  1512          (if (c = 0) then Eq r
       
  1513            else (if (0 < c) then Eq (CX (c, r)) else Eq (CX (~ c, Neg r)))))
       
  1514          x
       
  1515     end
       
  1516   | zlfm (NEq a) =
       
  1517     let val x = zsplit0 a
       
  1518     in (fn (c, r) =>
       
  1519          (if (c = 0) then NEq r
       
  1520            else (if (0 < c) then NEq (CX (c, r)) else NEq (CX (~ c, Neg r)))))
       
  1521          x
       
  1522     end
       
  1523   | zlfm (Dvd (i, a)) =
       
  1524     (if (i = 0) then zlfm (Eq a)
       
  1525       else let val x = zsplit0 a
       
  1526            in (fn (c, r) =>
       
  1527                 (if (c = 0) then Dvd (abs i, r)
       
  1528                   else (if (0 < c) then Dvd (abs i, CX (c, r))
       
  1529                          else Dvd (abs i, CX (~ c, Neg r)))))
       
  1530                 x
       
  1531            end)
       
  1532   | zlfm (NDvd (i, a)) =
       
  1533     (if (i = 0) then zlfm (NEq a)
       
  1534       else let val x = zsplit0 a
       
  1535            in (fn (c, r) =>
       
  1536                 (if (c = 0) then NDvd (abs i, r)
       
  1537                   else (if (0 < c) then NDvd (abs i, CX (c, r))
       
  1538                          else NDvd (abs i, CX (~ c, Neg r)))))
       
  1539                 x
       
  1540            end)
       
  1541   | zlfm (NOT (And (p, q))) = Or (zlfm (NOT p), zlfm (NOT q))
       
  1542   | zlfm (NOT (Or (p, q))) = And (zlfm (NOT p), zlfm (NOT q))
       
  1543   | zlfm (NOT (Imp (p, q))) = And (zlfm p, zlfm (NOT q))
       
  1544   | zlfm (NOT (Iff (p, q))) =
       
  1545     Or (And (zlfm p, zlfm (NOT q)), And (zlfm (NOT p), zlfm q))
       
  1546   | zlfm (NOT (NOT p)) = zlfm p
       
  1547   | zlfm (NOT T) = F
       
  1548   | zlfm (NOT F) = T
       
  1549   | zlfm (NOT (Lt a)) = zlfm (Ge a)
       
  1550   | zlfm (NOT (Le a)) = zlfm (Gt a)
       
  1551   | zlfm (NOT (Gt a)) = zlfm (Le a)
       
  1552   | zlfm (NOT (Ge a)) = zlfm (Lt a)
       
  1553   | zlfm (NOT (Eq a)) = zlfm (NEq a)
       
  1554   | zlfm (NOT (NEq a)) = zlfm (Eq a)
       
  1555   | zlfm (NOT (Dvd (i, a))) = zlfm (NDvd (i, a))
       
  1556   | zlfm (NOT (NDvd (i, a))) = zlfm (Dvd (i, a))
       
  1557   | zlfm (NOT (Closed P)) = NClosed P
       
  1558   | zlfm (NOT (NClosed P)) = Closed P
       
  1559   | zlfm T = T
       
  1560   | zlfm F = F
       
  1561   | zlfm (NOT (E ci)) = NOT (E ci)
       
  1562   | zlfm (NOT (A cj)) = NOT (A cj)
       
  1563   | zlfm (E ao) = E ao
       
  1564   | zlfm (A ap) = A ap
       
  1565   | zlfm (Closed aq) = Closed aq
       
  1566   | zlfm (NClosed ar) = NClosed ar;
       
  1567 
       
  1568 fun unit p =
       
  1569   let val p' = zlfm p; val l = zeta p';
       
  1570       val q = And (Dvd (l, CX (1, C 0)), a_beta p' l); val d = delta q;
       
  1571       val B = remdups (map simpnum (beta q));
       
  1572       val a = remdups (map simpnum (alpha q))
       
  1573   in (if less_eq_def3 (size_def9 B) (size_def9 a) then (q, (B, d))
       
  1574        else (mirror q, (a, d)))
       
  1575   end;
       
  1576 
       
  1577 fun cooper p =
       
  1578   let val (q, (B, d)) = unit p; val js = iupt (1, d);
       
  1579       val mq = simpfm (minusinf q);
       
  1580       val md = evaldjf (fn j => simpfm (subst0 (C j) mq)) js
       
  1581   in (if (md = T) then T
       
  1582        else let val qd =
       
  1583                   evaldjf (fn (b, j) => simpfm (subst0 (Add (b, C j)) q))
       
  1584                     (allpairs (fn x => fn xa => (x, xa)) B js)
       
  1585             in decr (disj md qd) end)
       
  1586   end;
       
  1587 
       
  1588 fun prep (E T) = T
       
  1589   | prep (E F) = F
       
  1590   | prep (E (Or (p, q))) = Or (prep (E p), prep (E q))
       
  1591   | prep (E (Imp (p, q))) = Or (prep (E (NOT p)), prep (E q))
       
  1592   | prep (E (Iff (p, q))) =
       
  1593     Or (prep (E (And (p, q))), prep (E (And (NOT p, NOT q))))
       
  1594   | prep (E (NOT (And (p, q)))) = Or (prep (E (NOT p)), prep (E (NOT q)))
       
  1595   | prep (E (NOT (Imp (p, q)))) = prep (E (And (p, NOT q)))
       
  1596   | prep (E (NOT (Iff (p, q)))) =
       
  1597     Or (prep (E (And (p, NOT q))), prep (E (And (NOT p, q))))
       
  1598   | prep (E (Lt ef)) = E (prep (Lt ef))
       
  1599   | prep (E (Le eg)) = E (prep (Le eg))
       
  1600   | prep (E (Gt eh)) = E (prep (Gt eh))
       
  1601   | prep (E (Ge ei)) = E (prep (Ge ei))
       
  1602   | prep (E (Eq ej)) = E (prep (Eq ej))
       
  1603   | prep (E (NEq ek)) = E (prep (NEq ek))
       
  1604   | prep (E (Dvd (el, em))) = E (prep (Dvd (el, em)))
       
  1605   | prep (E (NDvd (en, eo))) = E (prep (NDvd (en, eo)))
       
  1606   | prep (E (NOT T)) = E (prep (NOT T))
       
  1607   | prep (E (NOT F)) = E (prep (NOT F))
       
  1608   | prep (E (NOT (Lt gw))) = E (prep (NOT (Lt gw)))
       
  1609   | prep (E (NOT (Le gx))) = E (prep (NOT (Le gx)))
       
  1610   | prep (E (NOT (Gt gy))) = E (prep (NOT (Gt gy)))
       
  1611   | prep (E (NOT (Ge gz))) = E (prep (NOT (Ge gz)))
       
  1612   | prep (E (NOT (Eq ha))) = E (prep (NOT (Eq ha)))
       
  1613   | prep (E (NOT (NEq hb))) = E (prep (NOT (NEq hb)))
       
  1614   | prep (E (NOT (Dvd (hc, hd)))) = E (prep (NOT (Dvd (hc, hd))))
       
  1615   | prep (E (NOT (NDvd (he, hf)))) = E (prep (NOT (NDvd (he, hf))))
       
  1616   | prep (E (NOT (NOT hg))) = E (prep (NOT (NOT hg)))
       
  1617   | prep (E (NOT (Or (hj, hk)))) = E (prep (NOT (Or (hj, hk))))
       
  1618   | prep (E (NOT (E hp))) = E (prep (NOT (E hp)))
       
  1619   | prep (E (NOT (A hq))) = E (prep (NOT (A hq)))
       
  1620   | prep (E (NOT (Closed hr))) = E (prep (NOT (Closed hr)))
       
  1621   | prep (E (NOT (NClosed hs))) = E (prep (NOT (NClosed hs)))
       
  1622   | prep (E (And (eq, er))) = E (prep (And (eq, er)))
       
  1623   | prep (E (E ey)) = E (prep (E ey))
       
  1624   | prep (E (A ez)) = E (prep (A ez))
       
  1625   | prep (E (Closed fa)) = E (prep (Closed fa))
       
  1626   | prep (E (NClosed fb)) = E (prep (NClosed fb))
       
  1627   | prep (A (And (p, q))) = And (prep (A p), prep (A q))
       
  1628   | prep (A T) = prep (NOT (E (NOT T)))
       
  1629   | prep (A F) = prep (NOT (E (NOT F)))
       
  1630   | prep (A (Lt jn)) = prep (NOT (E (NOT (Lt jn))))
       
  1631   | prep (A (Le jo)) = prep (NOT (E (NOT (Le jo))))
       
  1632   | prep (A (Gt jp)) = prep (NOT (E (NOT (Gt jp))))
       
  1633   | prep (A (Ge jq)) = prep (NOT (E (NOT (Ge jq))))
       
  1634   | prep (A (Eq jr)) = prep (NOT (E (NOT (Eq jr))))
       
  1635   | prep (A (NEq js)) = prep (NOT (E (NOT (NEq js))))
       
  1636   | prep (A (Dvd (jt, ju))) = prep (NOT (E (NOT (Dvd (jt, ju)))))
       
  1637   | prep (A (NDvd (jv, jw))) = prep (NOT (E (NOT (NDvd (jv, jw)))))
       
  1638   | prep (A (NOT jx)) = prep (NOT (E (NOT (NOT jx))))
       
  1639   | prep (A (Or (ka, kb))) = prep (NOT (E (NOT (Or (ka, kb)))))
       
  1640   | prep (A (Imp (kc, kd))) = prep (NOT (E (NOT (Imp (kc, kd)))))
       
  1641   | prep (A (Iff (ke, kf))) = prep (NOT (E (NOT (Iff (ke, kf)))))
       
  1642   | prep (A (E kg)) = prep (NOT (E (NOT (E kg))))
       
  1643   | prep (A (A kh)) = prep (NOT (E (NOT (A kh))))
       
  1644   | prep (A (Closed ki)) = prep (NOT (E (NOT (Closed ki))))
       
  1645   | prep (A (NClosed kj)) = prep (NOT (E (NOT (NClosed kj))))
       
  1646   | prep (NOT (NOT p)) = prep p
       
  1647   | prep (NOT (And (p, q))) = Or (prep (NOT p), prep (NOT q))
       
  1648   | prep (NOT (A p)) = prep (E (NOT p))
       
  1649   | prep (NOT (Or (p, q))) = And (prep (NOT p), prep (NOT q))
       
  1650   | prep (NOT (Imp (p, q))) = And (prep p, prep (NOT q))
       
  1651   | prep (NOT (Iff (p, q))) = Or (prep (And (p, NOT q)), prep (And (NOT p, q)))
       
  1652   | prep (NOT T) = NOT (prep T)
       
  1653   | prep (NOT F) = NOT (prep F)
       
  1654   | prep (NOT (Lt bo)) = NOT (prep (Lt bo))
       
  1655   | prep (NOT (Le bp)) = NOT (prep (Le bp))
       
  1656   | prep (NOT (Gt bq)) = NOT (prep (Gt bq))
       
  1657   | prep (NOT (Ge br)) = NOT (prep (Ge br))
       
  1658   | prep (NOT (Eq bs)) = NOT (prep (Eq bs))
       
  1659   | prep (NOT (NEq bt)) = NOT (prep (NEq bt))
       
  1660   | prep (NOT (Dvd (bu, bv))) = NOT (prep (Dvd (bu, bv)))
       
  1661   | prep (NOT (NDvd (bw, bx))) = NOT (prep (NDvd (bw, bx)))
       
  1662   | prep (NOT (E ch)) = NOT (prep (E ch))
       
  1663   | prep (NOT (Closed cj)) = NOT (prep (Closed cj))
       
  1664   | prep (NOT (NClosed ck)) = NOT (prep (NClosed ck))
       
  1665   | prep (Or (p, q)) = Or (prep p, prep q)
       
  1666   | prep (And (p, q)) = And (prep p, prep q)
       
  1667   | prep (Imp (p, q)) = prep (Or (NOT p, q))
       
  1668   | prep (Iff (p, q)) = Or (prep (And (p, q)), prep (And (NOT p, NOT q)))
       
  1669   | prep T = T
       
  1670   | prep F = F
       
  1671   | prep (Lt u) = Lt u
       
  1672   | prep (Le v) = Le v
       
  1673   | prep (Gt w) = Gt w
       
  1674   | prep (Ge x) = Ge x
       
  1675   | prep (Eq y) = Eq y
       
  1676   | prep (NEq z) = NEq z
       
  1677   | prep (Dvd (aa, ab)) = Dvd (aa, ab)
       
  1678   | prep (NDvd (ac, ad)) = NDvd (ac, ad)
       
  1679   | prep (Closed ap) = Closed ap
       
  1680   | prep (NClosed aq) = NClosed aq;
       
  1681 
       
  1682 fun pa x = qelim (prep x) cooper;
       
  1683 
       
  1684 val pa = (fn x => pa x);
       
  1685 
       
  1686 val test =
       
  1687   (fn x =>
       
  1688     pa (E (A (Imp (Ge (Sub (Bound 0, Bound one_def0)),
       
  1689                     E (E (Eq (Sub (Add (Mul (3, Bound one_def0),
       
  1690  Mul (5, Bound 0)),
       
  1691                                     Bound (nat 2))))))))));
       
  1692 
       
  1693 end;