merged
authorhuffman
Tue, 11 May 2010 11:02:56 -0700
changeset 3682284ee370b4b1b
parent 36821 4d4462d644ae
parent 36815 fc672bf92fc2
child 36823 6a47f043d498
merged
src/HOL/Tools/Qelim/cooper_data.ML
src/HOL/Tools/Qelim/generated_cooper.ML
src/HOL/Tools/Qelim/presburger.ML
     1.1 --- a/NEWS	Tue May 11 09:10:31 2010 -0700
     1.2 +++ b/NEWS	Tue May 11 11:02:56 2010 -0700
     1.3 @@ -140,6 +140,9 @@
     1.4  
     1.5  *** HOL ***
     1.6  
     1.7 +* Theorem Int.int_induct renamed to Int.int_of_nat_induct and is
     1.8 +no longer shadowed.  INCOMPATIBILITY.
     1.9 +
    1.10  * Dropped theorem duplicate comp_arith; use semiring_norm instead.  INCOMPATIBILITY.
    1.11  
    1.12  * Theory 'Finite_Set': various folding_* locales facilitate the application
     2.1 --- a/src/HOL/Decision_Procs/Cooper.thy	Tue May 11 09:10:31 2010 -0700
     2.2 +++ b/src/HOL/Decision_Procs/Cooper.thy	Tue May 11 11:02:56 2010 -0700
     2.3 @@ -1910,7 +1910,7 @@
     2.4  ML {* @{code cooper_test} () *}
     2.5  
     2.6  (*
     2.7 -code_reflect Generated_Cooper
     2.8 +code_reflect Cooper_Procedure
     2.9    functions pa
    2.10    file "~~/src/HOL/Tools/Qelim/generated_cooper.ML"
    2.11  *)
     3.1 --- a/src/HOL/Int.thy	Tue May 11 09:10:31 2010 -0700
     3.2 +++ b/src/HOL/Int.thy	Tue May 11 11:02:56 2010 -0700
     3.3 @@ -559,7 +559,7 @@
     3.4  apply (blast dest: nat_0_le [THEN sym])
     3.5  done
     3.6  
     3.7 -theorem int_induct [induct type: int, case_names nonneg neg]:
     3.8 +theorem int_of_nat_induct [induct type: int, case_names nonneg neg]:
     3.9       "[|!! n. P (of_nat n \<Colon> int);  !!n. P (- (of_nat (Suc n))) |] ==> P z"
    3.10    by (cases z rule: int_cases) auto
    3.11  
    3.12 @@ -1784,6 +1784,23 @@
    3.13  apply (rule step, simp+)
    3.14  done
    3.15  
    3.16 +theorem int_induct [case_names base step1 step2]:
    3.17 +  fixes k :: int
    3.18 +  assumes base: "P k"
    3.19 +    and step1: "\<And>i. k \<le> i \<Longrightarrow> P i \<Longrightarrow> P (i + 1)"
    3.20 +    and step2: "\<And>i. k \<ge> i \<Longrightarrow> P i \<Longrightarrow> P (i - 1)"
    3.21 +  shows "P i"
    3.22 +proof -
    3.23 +  have "i \<le> k \<or> i \<ge> k" by arith
    3.24 +  then show ?thesis proof
    3.25 +    assume "i \<ge> k" then show ?thesis using base
    3.26 +      by (rule int_ge_induct) (fact step1)
    3.27 +  next
    3.28 +    assume "i \<le> k" then show ?thesis using base
    3.29 +      by (rule int_le_induct) (fact step2)
    3.30 +  qed
    3.31 +qed
    3.32 +
    3.33  subsection{*Intermediate value theorems*}
    3.34  
    3.35  lemma int_val_lemma:
     4.1 --- a/src/HOL/IsaMakefile	Tue May 11 09:10:31 2010 -0700
     4.2 +++ b/src/HOL/IsaMakefile	Tue May 11 11:02:56 2010 -0700
     4.3 @@ -302,10 +302,8 @@
     4.4    Tools/Predicate_Compile/predicate_compile_specialisation.ML \
     4.5    Tools/Predicate_Compile/predicate_compile_pred.ML \
     4.6    Tools/quickcheck_generators.ML \
     4.7 -  Tools/Qelim/cooper_data.ML \
     4.8    Tools/Qelim/cooper.ML \
     4.9 -  Tools/Qelim/generated_cooper.ML \
    4.10 -  Tools/Qelim/presburger.ML \
    4.11 +  Tools/Qelim/cooper_procedure.ML \
    4.12    Tools/Qelim/qelim.ML \
    4.13    Tools/Quotient/quotient_def.ML \
    4.14    Tools/Quotient/quotient_info.ML \
     5.1 --- a/src/HOL/Library/Formal_Power_Series.thy	Tue May 11 09:10:31 2010 -0700
     5.2 +++ b/src/HOL/Library/Formal_Power_Series.thy	Tue May 11 11:02:56 2010 -0700
     5.3 @@ -402,7 +402,7 @@
     5.4  
     5.5  lemma number_of_fps_const: "(number_of k::('a::comm_ring_1) fps) = fps_const (of_int k)"
     5.6    
     5.7 -proof(induct k rule: int_induct[where k=0])
     5.8 +proof(induct k rule: int_induct [where k=0])
     5.9    case base thus ?case unfolding number_of_fps_def of_int_0 by simp
    5.10  next
    5.11    case (step1 i) thus ?case unfolding number_of_fps_def 
    5.12 @@ -3214,7 +3214,7 @@
    5.13  
    5.14  lemma fps_number_of_fps_const: "number_of i = fps_const (number_of i :: 'a:: {comm_ring_1, number_ring})"
    5.15    apply (subst (2) number_of_eq)
    5.16 -apply(rule int_induct[of _ 0])
    5.17 +apply(rule int_induct [of _ 0])
    5.18  apply (simp_all add: number_of_fps_def)
    5.19  by (simp_all add: fps_const_add[symmetric] fps_const_minus[symmetric])
    5.20  
     6.1 --- a/src/HOL/Library/Quotient_List.thy	Tue May 11 09:10:31 2010 -0700
     6.2 +++ b/src/HOL/Library/Quotient_List.thy	Tue May 11 11:02:56 2010 -0700
     6.3 @@ -52,12 +52,17 @@
     6.4  lemma list_rel_transp:
     6.5    assumes a: "equivp R"
     6.6    shows "list_rel R xs1 xs2 \<Longrightarrow> list_rel R xs2 xs3 \<Longrightarrow> list_rel R xs1 xs3"
     6.7 -  apply(induct xs1 xs2 arbitrary: xs3 rule: list_induct2')
     6.8 -  apply(simp_all)
     6.9 +  using a
    6.10 +  apply(induct R xs1 xs2 arbitrary: xs3 rule: list_rel.induct)
    6.11 +  apply(simp)
    6.12 +  apply(simp)
    6.13 +  apply(simp)
    6.14    apply(case_tac xs3)
    6.15 -  apply(simp_all)
    6.16 -  apply(rule equivp_transp[OF a])
    6.17 -  apply(auto)
    6.18 +  apply(clarify)
    6.19 +  apply(simp (no_asm_use))
    6.20 +  apply(clarify)
    6.21 +  apply(simp (no_asm_use))
    6.22 +  apply(auto intro: equivp_transp)
    6.23    done
    6.24  
    6.25  lemma list_equivp[quot_equiv]:
     7.1 --- a/src/HOL/Mirabelle/Tools/mirabelle.ML	Tue May 11 09:10:31 2010 -0700
     7.2 +++ b/src/HOL/Mirabelle/Tools/mirabelle.ML	Tue May 11 11:02:56 2010 -0700
     7.3 @@ -92,7 +92,7 @@
     7.4  
     7.5  fun log thy s =
     7.6    let fun append_to n = if n = "" then K () else File.append (Path.explode n)
     7.7 -  in append_to (Config.get_thy thy logfile) (s ^ "\n") end
     7.8 +  in append_to (Config.get_global thy logfile) (s ^ "\n") end
     7.9    (* FIXME: with multithreading and parallel proofs enabled, we might need to
    7.10       encapsulate this inside a critical section *)
    7.11  
    7.12 @@ -108,7 +108,7 @@
    7.13    | in_range l r (SOME i) = (l <= i andalso (r < 0 orelse i <= r))
    7.14  
    7.15  fun only_within_range thy pos f x =
    7.16 -  let val l = Config.get_thy thy start_line and r = Config.get_thy thy end_line
    7.17 +  let val l = Config.get_global thy start_line and r = Config.get_global thy end_line
    7.18    in if in_range l r (Position.line_of pos) then f x else () end
    7.19  
    7.20  in
    7.21 @@ -118,7 +118,7 @@
    7.22      val thy = Proof.theory_of pre
    7.23      val pos = Toplevel.pos_of tr
    7.24      val name = Toplevel.name_of tr
    7.25 -    val st = (pre, post, Time.fromSeconds (Config.get_thy thy timeout))
    7.26 +    val st = (pre, post, Time.fromSeconds (Config.get_global thy timeout))
    7.27  
    7.28      val str0 = string_of_int o the_default 0
    7.29      val loc = str0 (Position.line_of pos) ^ ":" ^ str0 (Position.column_of pos)
     8.1 --- a/src/HOL/Presburger.thy	Tue May 11 09:10:31 2010 -0700
     8.2 +++ b/src/HOL/Presburger.thy	Tue May 11 11:02:56 2010 -0700
     8.3 @@ -8,17 +8,12 @@
     8.4  imports Groebner_Basis SetInterval
     8.5  uses
     8.6    "Tools/Qelim/qelim.ML"
     8.7 -  "Tools/Qelim/cooper_data.ML"
     8.8 -  "Tools/Qelim/generated_cooper.ML"
     8.9 +  "Tools/Qelim/cooper_procedure.ML"
    8.10    ("Tools/Qelim/cooper.ML")
    8.11 -  ("Tools/Qelim/presburger.ML")
    8.12  begin
    8.13  
    8.14 -setup CooperData.setup
    8.15 -
    8.16  subsection{* The @{text "-\<infinity>"} and @{text "+\<infinity>"} Properties *}
    8.17  
    8.18 -
    8.19  lemma minf:
    8.20    "\<lbrakk>\<exists>(z ::'a::linorder).\<forall>x<z. P x = P' x; \<exists>z.\<forall>x<z. Q x = Q' x\<rbrakk> 
    8.21       \<Longrightarrow> \<exists>z.\<forall>x<z. (P x \<and> Q x) = (P' x \<and> Q' x)"
    8.22 @@ -222,16 +217,6 @@
    8.23  lemma incr_lemma: "0 < (d::int) \<Longrightarrow> z < x + (abs(x-z)+1) * d"
    8.24  by(induct rule: int_gr_induct, simp_all add:int_distrib)
    8.25  
    8.26 -theorem int_induct[case_names base step1 step2]:
    8.27 -  assumes 
    8.28 -  base: "P(k::int)" and step1: "\<And>i. \<lbrakk>k \<le> i; P i\<rbrakk> \<Longrightarrow> P(i+1)" and
    8.29 -  step2: "\<And>i. \<lbrakk>k \<ge> i; P i\<rbrakk> \<Longrightarrow> P(i - 1)"
    8.30 -  shows "P i"
    8.31 -proof -
    8.32 -  have "i \<le> k \<or> i\<ge> k" by arith
    8.33 -  thus ?thesis using prems int_ge_induct[where P="P" and k="k" and i="i"] int_le_induct[where P="P" and k="k" and i="i"] by blast
    8.34 -qed
    8.35 -
    8.36  lemma decr_mult_lemma:
    8.37    assumes dpos: "(0::int) < d" and minus: "\<forall>x. P x \<longrightarrow> P(x - d)" and knneg: "0 <= k"
    8.38    shows "ALL x. P x \<longrightarrow> P(x - k*d)"
    8.39 @@ -387,10 +372,11 @@
    8.40  
    8.41  lemma zdiff_int_split: "P (int (x - y)) =
    8.42    ((y \<le> x \<longrightarrow> P (int x - int y)) \<and> (x < y \<longrightarrow> P 0))"
    8.43 -  by (case_tac "y \<le> x", simp_all add: zdiff_int)
    8.44 +  by (cases "y \<le> x") (simp_all add: zdiff_int)
    8.45  
    8.46  lemma number_of1: "(0::int) <= number_of n \<Longrightarrow> (0::int) <= number_of (Int.Bit0 n) \<and> (0::int) <= number_of (Int.Bit1 n)"
    8.47  by simp
    8.48 +
    8.49  lemma number_of2: "(0::int) <= Numeral0" by simp
    8.50  
    8.51  text {*
    8.52 @@ -401,9 +387,12 @@
    8.53  
    8.54  theorem conj_le_cong: "(0 <= x \<Longrightarrow> P = P') \<Longrightarrow> (0 <= (x::int) \<and> P) = (0 <= x \<and> P')" 
    8.55    by (simp cong: conj_cong)
    8.56 -lemma int_eq_number_of_eq:
    8.57 -  "(((number_of v)::int) = (number_of w)) = iszero ((number_of (v + (uminus w)))::int)"
    8.58 -  by (rule eq_number_of_eq)
    8.59 +
    8.60 +use "Tools/Qelim/cooper.ML"
    8.61 +
    8.62 +setup Cooper.setup
    8.63 +
    8.64 +method_setup presburger = "Cooper.method" "Cooper's algorithm for Presburger arithmetic"
    8.65  
    8.66  declare dvd_eq_mod_eq_0[symmetric, presburger]
    8.67  declare mod_1[presburger] 
    8.68 @@ -426,31 +415,6 @@
    8.69  lemma [presburger]: "(a::int) div 0 = 0" and [presburger]: "a mod 0 = a"
    8.70  by simp_all
    8.71  
    8.72 -use "Tools/Qelim/cooper.ML"
    8.73 -oracle linzqe_oracle = Coopereif.cooper_oracle
    8.74 -
    8.75 -use "Tools/Qelim/presburger.ML"
    8.76 -
    8.77 -setup {* Arith_Data.add_tactic "Presburger arithmetic" (K (Presburger.cooper_tac true [] [])) *}
    8.78 -
    8.79 -method_setup presburger = {*
    8.80 -let
    8.81 - fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ()
    8.82 - fun simple_keyword k = Scan.lift (Args.$$$ k) >> K ()
    8.83 - val addN = "add"
    8.84 - val delN = "del"
    8.85 - val elimN = "elim"
    8.86 - val any_keyword = keyword addN || keyword delN || simple_keyword elimN
    8.87 - val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
    8.88 -in
    8.89 -  Scan.optional (simple_keyword elimN >> K false) true --
    8.90 -  Scan.optional (keyword addN |-- thms) [] --
    8.91 -  Scan.optional (keyword delN |-- thms) [] >>
    8.92 -  (fn ((elim, add_ths), del_ths) => fn ctxt =>
    8.93 -    SIMPLE_METHOD' (Presburger.cooper_tac elim add_ths del_ths ctxt))
    8.94 -end
    8.95 -*} "Cooper's algorithm for Presburger arithmetic"
    8.96 -
    8.97  lemma [presburger, algebra]: "m mod 2 = (1::nat) \<longleftrightarrow> \<not> 2 dvd m " by presburger
    8.98  lemma [presburger, algebra]: "m mod 2 = Suc 0 \<longleftrightarrow> \<not> 2 dvd m " by presburger
    8.99  lemma [presburger, algebra]: "m mod (Suc (Suc 0)) = (1::nat) \<longleftrightarrow> \<not> 2 dvd m " by presburger
     9.1 --- a/src/HOL/Tools/Qelim/cooper.ML	Tue May 11 09:10:31 2010 -0700
     9.2 +++ b/src/HOL/Tools/Qelim/cooper.ML	Tue May 11 11:02:56 2010 -0700
     9.3 @@ -1,19 +1,70 @@
     9.4  (*  Title:      HOL/Tools/Qelim/cooper.ML
     9.5      Author:     Amine Chaieb, TU Muenchen
     9.6 +
     9.7 +Presburger arithmetic by Cooper's algorithm.
     9.8  *)
     9.9  
    9.10  signature COOPER =
    9.11  sig
    9.12 -  val cooper_conv : Proof.context -> conv
    9.13 -  exception COOPER of string * exn
    9.14 +  type entry
    9.15 +  val get: Proof.context -> entry
    9.16 +  val del: term list -> attribute
    9.17 +  val add: term list -> attribute 
    9.18 +  val conv: Proof.context -> conv
    9.19 +  val tac: bool -> thm list -> thm list -> Proof.context -> int -> tactic
    9.20 +  val method: (Proof.context -> Method.method) context_parser
    9.21 +  val setup: theory -> theory
    9.22  end;
    9.23  
    9.24  structure Cooper: COOPER =
    9.25  struct
    9.26  
    9.27 -open Conv;
    9.28 +type entry = simpset * term list;
    9.29  
    9.30 -exception COOPER of string * exn;
    9.31 +val allowed_consts = 
    9.32 +  [@{term "op + :: int => _"}, @{term "op + :: nat => _"},
    9.33 +   @{term "op - :: int => _"}, @{term "op - :: nat => _"},
    9.34 +   @{term "op * :: int => _"}, @{term "op * :: nat => _"},
    9.35 +   @{term "op div :: int => _"}, @{term "op div :: nat => _"},
    9.36 +   @{term "op mod :: int => _"}, @{term "op mod :: nat => _"},
    9.37 +   @{term "op &"}, @{term "op |"}, @{term "op -->"}, 
    9.38 +   @{term "op = :: int => _"}, @{term "op = :: nat => _"}, @{term "op = :: bool => _"},
    9.39 +   @{term "op < :: int => _"}, @{term "op < :: nat => _"},
    9.40 +   @{term "op <= :: int => _"}, @{term "op <= :: nat => _"},
    9.41 +   @{term "op dvd :: int => _"}, @{term "op dvd :: nat => _"},
    9.42 +   @{term "abs :: int => _"},
    9.43 +   @{term "max :: int => _"}, @{term "max :: nat => _"},
    9.44 +   @{term "min :: int => _"}, @{term "min :: nat => _"},
    9.45 +   @{term "uminus :: int => _"}, (*@ {term "uminus :: nat => _"},*)
    9.46 +   @{term "Not"}, @{term "Suc"},
    9.47 +   @{term "Ex :: (int => _) => _"}, @{term "Ex :: (nat => _) => _"},
    9.48 +   @{term "All :: (int => _) => _"}, @{term "All :: (nat => _) => _"},
    9.49 +   @{term "nat"}, @{term "int"},
    9.50 +   @{term "Int.Bit0"}, @{term "Int.Bit1"},
    9.51 +   @{term "Int.Pls"}, @{term "Int.Min"},
    9.52 +   @{term "Int.number_of :: int => int"}, @{term "Int.number_of :: int => nat"},
    9.53 +   @{term "0::int"}, @{term "1::int"}, @{term "0::nat"}, @{term "1::nat"},
    9.54 +   @{term "True"}, @{term "False"}];
    9.55 +
    9.56 +structure Data = Generic_Data
    9.57 +(
    9.58 +  type T = simpset * term list;
    9.59 +  val empty = (HOL_ss, allowed_consts);
    9.60 +  val extend  = I;
    9.61 +  fun merge ((ss1, ts1), (ss2, ts2)) =
    9.62 +    (merge_ss (ss1, ss2), Library.merge (op aconv) (ts1, ts2));
    9.63 +);
    9.64 +
    9.65 +val get = Data.get o Context.Proof;
    9.66 +
    9.67 +fun add ts = Thm.declaration_attribute (fn th => fn context => 
    9.68 +  context |> Data.map (fn (ss,ts') => 
    9.69 +     (ss addsimps [th], merge (op aconv) (ts',ts) ))) 
    9.70 +
    9.71 +fun del ts = Thm.declaration_attribute (fn th => fn context => 
    9.72 +  context |> Data.map (fn (ss,ts') => 
    9.73 +     (ss delsimps [th], subtract (op aconv) ts' ts ))) 
    9.74 +
    9.75  fun simp_thms_conv ctxt =
    9.76    Simplifier.rewrite (Simplifier.context ctxt HOL_basic_ss addsimps @{thms simp_thms});
    9.77  val FWD = Drule.implies_elim_list;
    9.78 @@ -46,8 +97,7 @@
    9.79       [bsetconj, bsetdisj, bseteq, bsetneq, bsetlt, bsetle,
    9.80        bsetgt, bsetge, bsetdvd, bsetndvd,bsetP]]  = [@{thms "aset"}, @{thms "bset"}];
    9.81  
    9.82 -val [miex, cpmi, piex, cppi] = [@{thm "minusinfinity"}, @{thm "cpmi"},
    9.83 -                                @{thm "plusinfinity"}, @{thm "cppi"}];
    9.84 +val [cpmi, cppi] = [@{thm "cpmi"}, @{thm "cppi"}];
    9.85  
    9.86  val unity_coeff_ex = instantiate' [SOME @{ctyp "int"}] [] @{thm "unity_coeff_ex"};
    9.87  
    9.88 @@ -69,7 +119,7 @@
    9.89  ( case (term_of ct) of
    9.90    Const("op &",_)$_$_ => And (Thm.dest_binop ct)
    9.91  | Const ("op |",_)$_$_ => Or (Thm.dest_binop ct)
    9.92 -| Const ("op =",ty)$y$_ => if term_of x aconv y then Eq (Thm.dest_arg ct) else Nox
    9.93 +| Const ("op =",_)$y$_ => if term_of x aconv y then Eq (Thm.dest_arg ct) else Nox
    9.94  | Const (@{const_name Not},_) $ (Const ("op =",_)$y$_) =>
    9.95    if term_of x aconv y then NEq (funpow 2 Thm.dest_arg ct) else Nox
    9.96  | Const (@{const_name Orderings.less}, _) $ y$ z =>
    9.97 @@ -118,8 +168,7 @@
    9.98  val cmulC =  @{cterm "op * :: int => _"}
    9.99  val cminus =  @{cterm "op - :: int => _"}
   9.100  val cone =  @{cterm "1 :: int"}
   9.101 -val cneg = @{cterm "uminus :: int => _"}
   9.102 -val [addC, mulC, subC, negC] = map term_of [cadd, cmulC, cminus, cneg]
   9.103 +val [addC, mulC, subC] = map term_of [cadd, cmulC, cminus]
   9.104  val [zero, one] = [@{term "0 :: int"}, @{term "1 :: int"}];
   9.105  
   9.106  val is_numeral = can dest_numeral;
   9.107 @@ -202,6 +251,7 @@
   9.108  fun linear_neg tm = linear_cmul ~1 tm;
   9.109  fun linear_sub vars tm1 tm2 = linear_add vars tm1 (linear_neg tm2);
   9.110  
   9.111 +exception COOPER of string;
   9.112  
   9.113  fun lint vars tm =  if is_numeral tm then tm  else case tm of
   9.114    Const (@{const_name Groups.uminus}, _) $ t => linear_neg (lint vars t)
   9.115 @@ -212,7 +262,7 @@
   9.116        val t' = lint vars t
   9.117    in if is_numeral s' then (linear_cmul (dest_numeral s') t')
   9.118       else if is_numeral t' then (linear_cmul (dest_numeral t') s')
   9.119 -     else raise COOPER ("Cooper Failed", TERM ("lint: not linear",[tm]))
   9.120 +     else raise COOPER "lint: not linear"
   9.121    end
   9.122   | _ => addC $ (mulC $ one $ tm) $ zero;
   9.123  
   9.124 @@ -254,16 +304,16 @@
   9.125  fun linearize_conv ctxt vs ct = case term_of ct of
   9.126    Const(@{const_name Rings.dvd},_)$d$t =>
   9.127    let
   9.128 -    val th = binop_conv (lint_conv ctxt vs) ct
   9.129 +    val th = Conv.binop_conv (lint_conv ctxt vs) ct
   9.130      val (d',t') = Thm.dest_binop (Thm.rhs_of th)
   9.131      val (dt',tt') = (term_of d', term_of t')
   9.132    in if is_numeral dt' andalso is_numeral tt'
   9.133 -     then Conv.fconv_rule (arg_conv (Simplifier.rewrite presburger_ss)) th
   9.134 +     then Conv.fconv_rule (Conv.arg_conv (Simplifier.rewrite presburger_ss)) th
   9.135       else
   9.136       let
   9.137        val dth =
   9.138        ((if dest_numeral (term_of d') < 0 then
   9.139 -          Conv.fconv_rule (arg_conv (arg1_conv (lint_conv ctxt vs)))
   9.140 +          Conv.fconv_rule (Conv.arg_conv (Conv.arg1_conv (lint_conv ctxt vs)))
   9.141                             (Thm.transitive th (inst' [d',t'] dvd_uminus))
   9.142          else th) handle TERM _ => th)
   9.143        val d'' = Thm.rhs_of dth |> Thm.dest_arg1
   9.144 @@ -271,13 +321,13 @@
   9.145        case tt' of
   9.146          Const(@{const_name Groups.plus},_)$(Const(@{const_name Groups.times},_)$c$_)$_ =>
   9.147          let val x = dest_numeral c
   9.148 -        in if x < 0 then Conv.fconv_rule (arg_conv (arg_conv (lint_conv ctxt vs)))
   9.149 +        in if x < 0 then Conv.fconv_rule (Conv.arg_conv (Conv.arg_conv (lint_conv ctxt vs)))
   9.150                                         (Thm.transitive dth (inst' [d'',t'] dvd_uminus'))
   9.151          else dth end
   9.152        | _ => dth
   9.153       end
   9.154    end
   9.155 -| Const (@{const_name Not},_)$(Const(@{const_name Rings.dvd},_)$_$_) => arg_conv (linearize_conv ctxt vs) ct
   9.156 +| Const (@{const_name Not},_)$(Const(@{const_name Rings.dvd},_)$_$_) => Conv.arg_conv (linearize_conv ctxt vs) ct
   9.157  | t => if is_intrel t
   9.158        then (provelin ctxt ((HOLogic.eq_const bT)$t$(lin vs t) |> HOLogic.mk_Trueprop))
   9.159         RS eq_reflection
   9.160 @@ -331,9 +381,9 @@
   9.161      end
   9.162    fun unit_conv t =
   9.163     case (term_of t) of
   9.164 -   Const("op &",_)$_$_ => binop_conv unit_conv t
   9.165 -  | Const("op |",_)$_$_ => binop_conv unit_conv t
   9.166 -  | Const (@{const_name Not},_)$_ => arg_conv unit_conv t
   9.167 +   Const("op &",_)$_$_ => Conv.binop_conv unit_conv t
   9.168 +  | Const("op |",_)$_$_ => Conv.binop_conv unit_conv t
   9.169 +  | Const (@{const_name Not},_)$_ => Conv.arg_conv unit_conv t
   9.170    | Const(s,_)$(Const(@{const_name Groups.times},_)$c$y)$ _ =>
   9.171      if x=y andalso member (op =)
   9.172        ["op =", @{const_name Orderings.less}, @{const_name Orderings.less_eq}] s
   9.173 @@ -371,9 +421,7 @@
   9.174  
   9.175  val emptyIS = @{cterm "{}::int set"};
   9.176  val insert_tm = @{cterm "insert :: int => _"};
   9.177 -val mem_tm = Const("op :",[iT , HOLogic.mk_setT iT] ---> bT);
   9.178  fun mkISet cts = fold_rev (Thm.capply insert_tm #> Thm.capply) cts emptyIS;
   9.179 -val cTrp = @{cterm "Trueprop"};
   9.180  val eqelem_imp_imp = (thm"eqelem_imp_iff") RS iffD1;
   9.181  val [A_tm,B_tm] = map (fn th => cprop_of th |> funpow 2 Thm.dest_arg |> Thm.dest_abs NONE |> snd |> Thm.dest_arg1 |> Thm.dest_arg
   9.182                                        |> Thm.dest_abs NONE |> snd |> Thm.dest_fun |> Thm.dest_arg)
   9.183 @@ -399,13 +447,12 @@
   9.184    | Le t => (bacc, ins (plus1 t) aacc,dacc)
   9.185    | Gt t => (ins t bacc, aacc,dacc)
   9.186    | Ge t => (ins (minus1 t) bacc, aacc,dacc)
   9.187 -  | Dvd (d,s) => (bacc,aacc,insert (op =) (term_of d |> dest_numeral) dacc)
   9.188 -  | NDvd (d,s) => (bacc,aacc,insert (op =) (term_of d|> dest_numeral) dacc)
   9.189 +  | Dvd (d,_) => (bacc,aacc,insert (op =) (term_of d |> dest_numeral) dacc)
   9.190 +  | NDvd (d,_) => (bacc,aacc,insert (op =) (term_of d|> dest_numeral) dacc)
   9.191    | _ => (bacc, aacc, dacc)
   9.192   val (b0,a0,ds) = h p ([],[],[])
   9.193   val d = Integer.lcms ds
   9.194   val cd = Numeral.mk_cnumber @{ctyp "int"} d
   9.195 - val dt = term_of cd
   9.196   fun divprop x =
   9.197     let
   9.198      val th =
   9.199 @@ -474,10 +521,6 @@
   9.200     val eqelem_th = instantiate' [SOME @{ctyp "int"}] [NONE,NONE, SOME S] eqelem_imp_imp
   9.201     val inS =
   9.202       let
   9.203 -      fun transmem th0 th1 =
   9.204 -       Thm.equal_elim
   9.205 -        (Drule.arg_cong_rule cTrp (Drule.fun_cong_rule (Drule.arg_cong_rule
   9.206 -               ((Thm.dest_fun o Thm.dest_fun o Thm.dest_arg o cprop_of) th1) th0) S)) th1
   9.207        val tab = fold Termtab.update
   9.208          (map (fn eq =>
   9.209                  let val (s,t) = cprop_of eq |> Thm.dest_arg |> Thm.dest_binop
   9.210 @@ -503,8 +546,8 @@
   9.211  fun literals_conv bops uops env cv =
   9.212   let fun h t =
   9.213    case (term_of t) of
   9.214 -   b$_$_ => if member (op aconv) bops b then binop_conv h t else cv env t
   9.215 - | u$_ => if member (op aconv) uops u then arg_conv h t else cv env t
   9.216 +   b$_$_ => if member (op aconv) bops b then Conv.binop_conv h t else cv env t
   9.217 + | u$_ => if member (op aconv) uops u then Conv.arg_conv h t else cv env t
   9.218   | _ => cv env t
   9.219   in h end;
   9.220  
   9.221 @@ -523,131 +566,325 @@
   9.222        (OldTerm.term_frees (term_of p)) (linearize_conv ctxt) (integer_nnf_conv ctxt)
   9.223        (cooperex_conv ctxt) p
   9.224    end
   9.225 -  handle  CTERM s => raise COOPER ("Cooper Failed", CTERM s)
   9.226 -        | THM s => raise COOPER ("Cooper Failed", THM s)
   9.227 -        | TYPE s => raise COOPER ("Cooper Failed", TYPE s)
   9.228 -in val cooper_conv = conv
   9.229 -end;
   9.230 +  handle  CTERM s => raise COOPER "bad cterm"
   9.231 +        | THM s => raise COOPER "bad thm"
   9.232 +        | TYPE s => raise COOPER "bad type"
   9.233 +in val conv = conv
   9.234  end;
   9.235  
   9.236 +fun term_bools acc t =
   9.237 +  let
   9.238 +    val ops = [@{term "op &"}, @{term "op |"}, @{term "op -->"}, @{term "op = :: bool => _"},
   9.239 +      @{term "op = :: int => _"}, @{term "op < :: int => _"},
   9.240 +      @{term "op <= :: int => _"}, @{term "Not"}, @{term "All:: (int => _) => _"},
   9.241 +      @{term "Ex:: (int => _) => _"}, @{term "True"}, @{term "False"}]
   9.242 +    fun ty t = not (fastype_of t = HOLogic.boolT)
   9.243 +  in case t of
   9.244 +      (l as f $ a) $ b => if ty t orelse member (op =) ops f then term_bools (term_bools acc l)b
   9.245 +              else insert (op aconv) t acc
   9.246 +    | f $ a => if ty t orelse member (op =) ops f then term_bools (term_bools acc f) a
   9.247 +              else insert (op aconv) t acc
   9.248 +    | Abs p => term_bools acc (snd (variant_abs p))
   9.249 +    | _ => if ty t orelse member (op =) ops t then acc else insert (op aconv) t acc
   9.250 +  end;
   9.251  
   9.252 -
   9.253 -structure Coopereif =
   9.254 -struct
   9.255 -
   9.256 -open Generated_Cooper;
   9.257 -
   9.258 -fun member eq = Library.member eq;
   9.259 -
   9.260 -fun cooper s = raise Cooper.COOPER ("Cooper oracle failed", ERROR s);
   9.261  fun i_of_term vs t = case t
   9.262   of Free (xn, xT) => (case AList.lookup (op aconv) vs t
   9.263 -     of NONE   => cooper "Variable not found in the list!"
   9.264 -      | SOME n => Bound n)
   9.265 -  | @{term "0::int"} => C 0
   9.266 -  | @{term "1::int"} => C 1
   9.267 -  | Term.Bound i => Bound i
   9.268 -  | Const(@{const_name Groups.uminus},_)$t' => Neg (i_of_term vs t')
   9.269 -  | Const(@{const_name Groups.plus},_)$t1$t2 => Add (i_of_term vs t1,i_of_term vs t2)
   9.270 -  | Const(@{const_name Groups.minus},_)$t1$t2 => Sub (i_of_term vs t1,i_of_term vs t2)
   9.271 +     of NONE   => raise COOPER "reification: variable not found in list"
   9.272 +      | SOME n => Cooper_Procedure.Bound n)
   9.273 +  | @{term "0::int"} => Cooper_Procedure.C 0
   9.274 +  | @{term "1::int"} => Cooper_Procedure.C 1
   9.275 +  | Term.Bound i => Cooper_Procedure.Bound i
   9.276 +  | Const(@{const_name Groups.uminus},_)$t' => Cooper_Procedure.Neg (i_of_term vs t')
   9.277 +  | Const(@{const_name Groups.plus},_)$t1$t2 => Cooper_Procedure.Add (i_of_term vs t1,i_of_term vs t2)
   9.278 +  | Const(@{const_name Groups.minus},_)$t1$t2 => Cooper_Procedure.Sub (i_of_term vs t1,i_of_term vs t2)
   9.279    | Const(@{const_name Groups.times},_)$t1$t2 =>
   9.280 -     (Mul (HOLogic.dest_number t1 |> snd, i_of_term vs t2)
   9.281 +     (Cooper_Procedure.Mul (HOLogic.dest_number t1 |> snd, i_of_term vs t2)
   9.282      handle TERM _ =>
   9.283 -       (Mul (HOLogic.dest_number t2 |> snd, i_of_term vs t1)
   9.284 -        handle TERM _ => cooper "Reification: Unsupported kind of multiplication"))
   9.285 -  | _ => (C (HOLogic.dest_number t |> snd)
   9.286 -           handle TERM _ => cooper "Reification: unknown term");
   9.287 +       (Cooper_Procedure.Mul (HOLogic.dest_number t2 |> snd, i_of_term vs t1)
   9.288 +        handle TERM _ => raise COOPER "reification: unsupported kind of multiplication"))
   9.289 +  | _ => (Cooper_Procedure.C (HOLogic.dest_number t |> snd)
   9.290 +           handle TERM _ => raise COOPER "reification: unknown term");
   9.291  
   9.292  fun qf_of_term ps vs t =  case t
   9.293 - of Const("True",_) => T
   9.294 -  | Const("False",_) => F
   9.295 -  | Const(@{const_name Orderings.less},_)$t1$t2 => Lt (Sub (i_of_term vs t1,i_of_term vs t2))
   9.296 -  | Const(@{const_name Orderings.less_eq},_)$t1$t2 => Le (Sub(i_of_term vs t1,i_of_term vs t2))
   9.297 + of Const("True",_) => Cooper_Procedure.T
   9.298 +  | Const("False",_) => Cooper_Procedure.F
   9.299 +  | Const(@{const_name Orderings.less},_)$t1$t2 => Cooper_Procedure.Lt (Cooper_Procedure.Sub (i_of_term vs t1,i_of_term vs t2))
   9.300 +  | Const(@{const_name Orderings.less_eq},_)$t1$t2 => Cooper_Procedure.Le (Cooper_Procedure.Sub(i_of_term vs t1,i_of_term vs t2))
   9.301    | Const(@{const_name Rings.dvd},_)$t1$t2 =>
   9.302 -      (Dvd(HOLogic.dest_number t1 |> snd, i_of_term vs t2) handle _ => cooper "Reification: unsupported dvd")  (* FIXME avoid handle _ *)
   9.303 -  | @{term "op = :: int => _"}$t1$t2 => Eq (Sub (i_of_term vs t1,i_of_term vs t2))
   9.304 -  | @{term "op = :: bool => _ "}$t1$t2 => Iff(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.305 -  | Const("op &",_)$t1$t2 => And(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.306 -  | Const("op |",_)$t1$t2 => Or(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.307 -  | Const("op -->",_)$t1$t2 => Imp(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.308 -  | Const (@{const_name Not},_)$t' => Not(qf_of_term ps vs t')
   9.309 +      (Cooper_Procedure.Dvd (HOLogic.dest_number t1 |> snd, i_of_term vs t2)
   9.310 +        handle TERM _ => raise COOPER "reification: unsupported dvd")
   9.311 +  | @{term "op = :: int => _"}$t1$t2 => Cooper_Procedure.Eq (Cooper_Procedure.Sub (i_of_term vs t1,i_of_term vs t2))
   9.312 +  | @{term "op = :: bool => _ "}$t1$t2 => Cooper_Procedure.Iff(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.313 +  | Const("op &",_)$t1$t2 => Cooper_Procedure.And(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.314 +  | Const("op |",_)$t1$t2 => Cooper_Procedure.Or(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.315 +  | Const("op -->",_)$t1$t2 => Cooper_Procedure.Imp(qf_of_term ps vs t1,qf_of_term ps vs t2)
   9.316 +  | Const (@{const_name Not},_)$t' => Cooper_Procedure.Not(qf_of_term ps vs t')
   9.317    | Const("Ex",_)$Abs(xn,xT,p) =>
   9.318       let val (xn',p') = variant_abs (xn,xT,p)
   9.319           val vs' = (Free (xn',xT), 0) :: (map (fn(v,n) => (v,1+ n)) vs)
   9.320 -     in E (qf_of_term ps vs' p')
   9.321 +     in Cooper_Procedure.E (qf_of_term ps vs' p')
   9.322       end
   9.323    | Const("All",_)$Abs(xn,xT,p) =>
   9.324       let val (xn',p') = variant_abs (xn,xT,p)
   9.325           val vs' = (Free (xn',xT), 0) :: (map (fn(v,n) => (v,1+ n)) vs)
   9.326 -     in A (qf_of_term ps vs' p')
   9.327 +     in Cooper_Procedure.A (qf_of_term ps vs' p')
   9.328       end
   9.329    | _ =>(case AList.lookup (op aconv) ps t of
   9.330 -           NONE => cooper "Reification: unknown term!"
   9.331 -         | SOME n => Closed n);
   9.332 -
   9.333 -local
   9.334 - val ops = [@{term "op &"}, @{term "op |"}, @{term "op -->"}, @{term "op = :: bool => _"},
   9.335 -             @{term "op = :: int => _"}, @{term "op < :: int => _"},
   9.336 -             @{term "op <= :: int => _"}, @{term "Not"}, @{term "All:: (int => _) => _"},
   9.337 -             @{term "Ex:: (int => _) => _"}, @{term "True"}, @{term "False"}]
   9.338 -fun ty t = Bool.not (fastype_of t = HOLogic.boolT)
   9.339 -in
   9.340 -fun term_bools acc t =
   9.341 -case t of
   9.342 -    (l as f $ a) $ b => if ty t orelse member (op =) ops f then term_bools (term_bools acc l)b
   9.343 -            else insert (op aconv) t acc
   9.344 -  | f $ a => if ty t orelse member (op =) ops f then term_bools (term_bools acc f) a
   9.345 -            else insert (op aconv) t acc
   9.346 -  | Abs p => term_bools acc (snd (variant_abs p))
   9.347 -  | _ => if ty t orelse member (op =) ops t then acc else insert (op aconv) t acc
   9.348 -end;
   9.349 -
   9.350 -fun myassoc2 l v =
   9.351 -    case l of
   9.352 -  [] => NONE
   9.353 -      | (x,v')::xs => if v = v' then SOME x
   9.354 -          else myassoc2 xs v;
   9.355 +           NONE => raise COOPER "reification: unknown term"
   9.356 +         | SOME n => Cooper_Procedure.Closed n);
   9.357  
   9.358  fun term_of_i vs t = case t
   9.359 - of C i => HOLogic.mk_number HOLogic.intT i
   9.360 -  | Bound n => the (myassoc2 vs n)
   9.361 -  | Neg t' => @{term "uminus :: int => _"} $ term_of_i vs t'
   9.362 -  | Add (t1, t2) => @{term "op + :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   9.363 -  | Sub (t1, t2) => @{term "op - :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   9.364 -  | Mul (i, t2) => @{term "op * :: int => _"} $
   9.365 + of Cooper_Procedure.C i => HOLogic.mk_number HOLogic.intT i
   9.366 +  | Cooper_Procedure.Bound n => the (AList.lookup (op =) vs n)
   9.367 +  | Cooper_Procedure.Neg t' => @{term "uminus :: int => _"} $ term_of_i vs t'
   9.368 +  | Cooper_Procedure.Add (t1, t2) => @{term "op + :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   9.369 +  | Cooper_Procedure.Sub (t1, t2) => @{term "op - :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   9.370 +  | Cooper_Procedure.Mul (i, t2) => @{term "op * :: int => _"} $
   9.371        HOLogic.mk_number HOLogic.intT i $ term_of_i vs t2
   9.372 -  | Cn (n, i, t') => term_of_i vs (Add (Mul (i, Bound n), t'));
   9.373 +  | Cooper_Procedure.Cn (n, i, t') => term_of_i vs (Cooper_Procedure.Add (Cooper_Procedure.Mul (i, Cooper_Procedure.Bound n), t'));
   9.374  
   9.375  fun term_of_qf ps vs t =
   9.376   case t of
   9.377 -   T => HOLogic.true_const
   9.378 - | F => HOLogic.false_const
   9.379 - | Lt t' => @{term "op < :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   9.380 - | Le t' => @{term "op <= :: int => _ "}$ term_of_i vs t' $ @{term "0::int"}
   9.381 - | Gt t' => @{term "op < :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   9.382 - | Ge t' => @{term "op <= :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   9.383 - | Eq t' => @{term "op = :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   9.384 - | NEq t' => term_of_qf ps vs (Not (Eq t'))
   9.385 - | Dvd(i,t') => @{term "op dvd :: int => _ "} $
   9.386 +   Cooper_Procedure.T => HOLogic.true_const
   9.387 + | Cooper_Procedure.F => HOLogic.false_const
   9.388 + | Cooper_Procedure.Lt t' => @{term "op < :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   9.389 + | Cooper_Procedure.Le t' => @{term "op <= :: int => _ "}$ term_of_i vs t' $ @{term "0::int"}
   9.390 + | Cooper_Procedure.Gt t' => @{term "op < :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   9.391 + | Cooper_Procedure.Ge t' => @{term "op <= :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   9.392 + | Cooper_Procedure.Eq t' => @{term "op = :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   9.393 + | Cooper_Procedure.NEq t' => term_of_qf ps vs (Cooper_Procedure.Not (Cooper_Procedure.Eq t'))
   9.394 + | Cooper_Procedure.Dvd(i,t') => @{term "op dvd :: int => _ "} $
   9.395      HOLogic.mk_number HOLogic.intT i $ term_of_i vs t'
   9.396 - | NDvd(i,t')=> term_of_qf ps vs (Not(Dvd(i,t')))
   9.397 - | Not t' => HOLogic.Not$(term_of_qf ps vs t')
   9.398 - | And(t1,t2) => HOLogic.conj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.399 - | Or(t1,t2) => HOLogic.disj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.400 - | Imp(t1,t2) => HOLogic.imp$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.401 - | Iff(t1,t2) => @{term "op = :: bool => _"} $ term_of_qf ps vs t1 $ term_of_qf ps vs t2
   9.402 - | Closed n => the (myassoc2 ps n)
   9.403 - | NClosed n => term_of_qf ps vs (Not (Closed n))
   9.404 - | _ => cooper "If this is raised, Isabelle/HOL or code generator is inconsistent!";
   9.405 + | Cooper_Procedure.NDvd(i,t')=> term_of_qf ps vs (Cooper_Procedure.Not(Cooper_Procedure.Dvd(i,t')))
   9.406 + | Cooper_Procedure.Not t' => HOLogic.Not$(term_of_qf ps vs t')
   9.407 + | Cooper_Procedure.And(t1,t2) => HOLogic.conj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.408 + | Cooper_Procedure.Or(t1,t2) => HOLogic.disj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.409 + | Cooper_Procedure.Imp(t1,t2) => HOLogic.imp$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   9.410 + | Cooper_Procedure.Iff(t1,t2) => @{term "op = :: bool => _"} $ term_of_qf ps vs t1 $ term_of_qf ps vs t2
   9.411 + | Cooper_Procedure.Closed n => the (AList.lookup (op =) ps n)
   9.412 + | Cooper_Procedure.NClosed n => term_of_qf ps vs (Cooper_Procedure.Not (Cooper_Procedure.Closed n));
   9.413  
   9.414 -fun cooper_oracle ct =
   9.415 +fun invoke t =
   9.416    let
   9.417 -    val thy = Thm.theory_of_cterm ct;
   9.418 -    val t = Thm.term_of ct;
   9.419      val (vs, ps) = pairself (map_index swap) (OldTerm.term_frees t, term_bools [] t);
   9.420    in
   9.421 -    Thm.cterm_of thy (Logic.mk_equals (HOLogic.mk_Trueprop t,
   9.422 -      HOLogic.mk_Trueprop (term_of_qf ps vs (pa (qf_of_term ps vs t)))))
   9.423 +    Logic.mk_equals (HOLogic.mk_Trueprop t,
   9.424 +      HOLogic.mk_Trueprop (term_of_qf (map swap ps) (map swap vs) (Cooper_Procedure.pa (qf_of_term ps vs t))))
   9.425    end;
   9.426  
   9.427 +val (_, oracle) = Context.>>> (Context.map_theory_result
   9.428 +  (Thm.add_oracle (Binding.name "cooper",
   9.429 +    (fn (ctxt, t) => Thm.cterm_of (ProofContext.theory_of ctxt) (invoke t)))));
   9.430 +
   9.431 +val comp_ss = HOL_ss addsimps @{thms semiring_norm};
   9.432 +
   9.433 +fun strip_objimp ct =
   9.434 +  (case Thm.term_of ct of
   9.435 +    Const ("op -->", _) $ _ $ _ =>
   9.436 +      let val (A, B) = Thm.dest_binop ct
   9.437 +      in A :: strip_objimp B end
   9.438 +  | _ => [ct]);
   9.439 +
   9.440 +fun strip_objall ct = 
   9.441 + case term_of ct of 
   9.442 +  Const ("All", _) $ Abs (xn,xT,p) => 
   9.443 +   let val (a,(v,t')) = (apsnd (Thm.dest_abs (SOME xn)) o Thm.dest_comb) ct
   9.444 +   in apfst (cons (a,v)) (strip_objall t')
   9.445 +   end
   9.446 +| _ => ([],ct);
   9.447 +
   9.448 +local
   9.449 +  val all_maxscope_ss = 
   9.450 +     HOL_basic_ss addsimps map (fn th => th RS sym) @{thms "all_simps"}
   9.451 +in
   9.452 +fun thin_prems_tac P = simp_tac all_maxscope_ss THEN'
   9.453 +  CSUBGOAL (fn (p', i) =>
   9.454 +    let
   9.455 +     val (qvs, p) = strip_objall (Thm.dest_arg p')
   9.456 +     val (ps, c) = split_last (strip_objimp p)
   9.457 +     val qs = filter P ps
   9.458 +     val q = if P c then c else @{cterm "False"}
   9.459 +     val ng = fold_rev (fn (a,v) => fn t => Thm.capply a (Thm.cabs v t)) qvs 
   9.460 +         (fold_rev (fn p => fn q => Thm.capply (Thm.capply @{cterm "op -->"} p) q) qs q)
   9.461 +     val g = Thm.capply (Thm.capply @{cterm "op ==>"} (Thm.capply @{cterm "Trueprop"} ng)) p'
   9.462 +     val ntac = (case qs of [] => q aconvc @{cterm "False"}
   9.463 +                         | _ => false)
   9.464 +    in 
   9.465 +    if ntac then no_tac
   9.466 +      else rtac (Goal.prove_internal [] g (K (blast_tac HOL_cs 1))) i
   9.467 +    end)
   9.468  end;
   9.469 +
   9.470 +local
   9.471 + fun isnum t = case t of 
   9.472 +   Const(@{const_name Groups.zero},_) => true
   9.473 + | Const(@{const_name Groups.one},_) => true
   9.474 + | @{term "Suc"}$s => isnum s
   9.475 + | @{term "nat"}$s => isnum s
   9.476 + | @{term "int"}$s => isnum s
   9.477 + | Const(@{const_name Groups.uminus},_)$s => isnum s
   9.478 + | Const(@{const_name Groups.plus},_)$l$r => isnum l andalso isnum r
   9.479 + | Const(@{const_name Groups.times},_)$l$r => isnum l andalso isnum r
   9.480 + | Const(@{const_name Groups.minus},_)$l$r => isnum l andalso isnum r
   9.481 + | Const(@{const_name Power.power},_)$l$r => isnum l andalso isnum r
   9.482 + | Const(@{const_name Divides.mod},_)$l$r => isnum l andalso isnum r
   9.483 + | Const(@{const_name Divides.div},_)$l$r => isnum l andalso isnum r
   9.484 + | _ => can HOLogic.dest_number t orelse can HOLogic.dest_nat t
   9.485 +
   9.486 + fun ty cts t = 
   9.487 + if not (member (op =) [HOLogic.intT, HOLogic.natT, HOLogic.boolT] (typ_of (ctyp_of_term t))) then false 
   9.488 +    else case term_of t of 
   9.489 +      c$l$r => if member (op =) [@{term"op *::int => _"}, @{term"op *::nat => _"}] c
   9.490 +               then not (isnum l orelse isnum r)
   9.491 +               else not (member (op aconv) cts c)
   9.492 +    | c$_ => not (member (op aconv) cts c)
   9.493 +    | c => not (member (op aconv) cts c)
   9.494 +
   9.495 + val term_constants =
   9.496 +  let fun h acc t = case t of
   9.497 +    Const _ => insert (op aconv) t acc
   9.498 +  | a$b => h (h acc a) b
   9.499 +  | Abs (_,_,t) => h acc t
   9.500 +  | _ => acc
   9.501 + in h [] end;
   9.502 +in 
   9.503 +fun is_relevant ctxt ct = 
   9.504 + subset (op aconv) (term_constants (term_of ct) , snd (get ctxt))
   9.505 + andalso forall (fn Free (_,T) => member (op =) [@{typ int}, @{typ nat}] T) (OldTerm.term_frees (term_of ct))
   9.506 + andalso forall (fn Var (_,T) => member (op =) [@{typ int}, @{typ nat}] T) (OldTerm.term_vars (term_of ct));
   9.507 +
   9.508 +fun int_nat_terms ctxt ct =
   9.509 + let 
   9.510 +  val cts = snd (get ctxt)
   9.511 +  fun h acc t = if ty cts t then insert (op aconvc) t acc else
   9.512 +   case (term_of t) of
   9.513 +    _$_ => h (h acc (Thm.dest_arg t)) (Thm.dest_fun t)
   9.514 +  | Abs(_,_,_) => Thm.dest_abs NONE t ||> h acc |> uncurry (remove (op aconvc))
   9.515 +  | _ => acc
   9.516 + in h [] ct end
   9.517 +end;
   9.518 +
   9.519 +fun generalize_tac f = CSUBGOAL (fn (p, i) => PRIMITIVE (fn st =>
   9.520 + let 
   9.521 +   fun all T = Drule.cterm_rule (instantiate' [SOME T] []) @{cpat "all"}
   9.522 +   fun gen x t = Thm.capply (all (ctyp_of_term x)) (Thm.cabs x t)
   9.523 +   val ts = sort (fn (a,b) => Term_Ord.fast_term_ord (term_of a, term_of b)) (f p)
   9.524 +   val p' = fold_rev gen ts p
   9.525 + in implies_intr p' (implies_elim st (fold forall_elim ts (assume p'))) end));
   9.526 +
   9.527 +local
   9.528 +val ss1 = comp_ss
   9.529 +  addsimps @{thms simp_thms} @ [@{thm "nat_number_of_def"}, @{thm "zdvd_int"}] 
   9.530 +      @ map (fn r => r RS sym) 
   9.531 +        [@{thm "int_int_eq"}, @{thm "zle_int"}, @{thm "zless_int"}, @{thm "zadd_int"}, 
   9.532 +         @{thm "zmult_int"}]
   9.533 +    addsplits [@{thm "zdiff_int_split"}]
   9.534 +
   9.535 +val ss2 = HOL_basic_ss
   9.536 +  addsimps [@{thm "nat_0_le"}, @{thm "int_nat_number_of"},
   9.537 +            @{thm "all_nat"}, @{thm "ex_nat"}, @{thm "number_of1"}, 
   9.538 +            @{thm "number_of2"}, @{thm "int_0"}, @{thm "int_1"}, @{thm "Suc_eq_plus1"}]
   9.539 +  addcongs [@{thm "conj_le_cong"}, @{thm "imp_le_cong"}]
   9.540 +val div_mod_ss = HOL_basic_ss addsimps @{thms simp_thms}
   9.541 +  @ map (symmetric o mk_meta_eq) 
   9.542 +    [@{thm "dvd_eq_mod_eq_0"},
   9.543 +     @{thm "mod_add_left_eq"}, @{thm "mod_add_right_eq"}, 
   9.544 +     @{thm "mod_add_eq"}, @{thm "div_add1_eq"}, @{thm "zdiv_zadd1_eq"}]
   9.545 +  @ [@{thm "mod_self"}, @{thm "zmod_self"}, @{thm "mod_by_0"}, 
   9.546 +     @{thm "div_by_0"}, @{thm "DIVISION_BY_ZERO"} RS conjunct1, 
   9.547 +     @{thm "DIVISION_BY_ZERO"} RS conjunct2, @{thm "zdiv_zero"}, @{thm "zmod_zero"}, 
   9.548 +     @{thm "div_0"}, @{thm "mod_0"}, @{thm "div_by_1"}, @{thm "mod_by_1"}, @{thm "div_1"}, 
   9.549 +     @{thm "mod_1"}, @{thm "Suc_eq_plus1"}]
   9.550 +  @ @{thms add_ac}
   9.551 + addsimprocs [cancel_div_mod_nat_proc, cancel_div_mod_int_proc]
   9.552 + val splits_ss = comp_ss addsimps [@{thm "mod_div_equality'"}] addsplits 
   9.553 +     [@{thm "split_zdiv"}, @{thm "split_zmod"}, @{thm "split_div'"}, 
   9.554 +      @{thm "split_min"}, @{thm "split_max"}, @{thm "abs_split"}]
   9.555 +in
   9.556 +fun nat_to_int_tac ctxt = 
   9.557 +  simp_tac (Simplifier.context ctxt ss1) THEN_ALL_NEW
   9.558 +  simp_tac (Simplifier.context ctxt ss2) THEN_ALL_NEW
   9.559 +  simp_tac (Simplifier.context ctxt comp_ss);
   9.560 +
   9.561 +fun div_mod_tac ctxt i = simp_tac (Simplifier.context ctxt div_mod_ss) i;
   9.562 +fun splits_tac ctxt i = simp_tac (Simplifier.context ctxt splits_ss) i;
   9.563 +end;
   9.564 +
   9.565 +fun core_tac ctxt = CSUBGOAL (fn (p, i) =>
   9.566 +   let
   9.567 +    val cpth = 
   9.568 +       if !quick_and_dirty 
   9.569 +       then oracle (ctxt, Envir.beta_norm (Pattern.eta_long [] (term_of (Thm.dest_arg p))))
   9.570 +       else Conv.arg_conv (conv ctxt) p
   9.571 +    val p' = Thm.rhs_of cpth
   9.572 +    val th = implies_intr p' (equal_elim (symmetric cpth) (assume p'))
   9.573 +   in rtac th i end
   9.574 +   handle COOPER _ => no_tac);
   9.575 +
   9.576 +fun finish_tac q = SUBGOAL (fn (_, i) =>
   9.577 +  (if q then I else TRY) (rtac TrueI i));
   9.578 +
   9.579 +fun tac elim add_ths del_ths ctxt =
   9.580 +let val ss = Simplifier.context ctxt (fst (get ctxt)) delsimps del_ths addsimps add_ths
   9.581 +    val aprems = Arith_Data.get_arith_facts ctxt
   9.582 +in
   9.583 +  Method.insert_tac aprems
   9.584 +  THEN_ALL_NEW Object_Logic.full_atomize_tac
   9.585 +  THEN_ALL_NEW CONVERSION Thm.eta_long_conversion
   9.586 +  THEN_ALL_NEW simp_tac ss
   9.587 +  THEN_ALL_NEW (TRY o generalize_tac (int_nat_terms ctxt))
   9.588 +  THEN_ALL_NEW Object_Logic.full_atomize_tac
   9.589 +  THEN_ALL_NEW (thin_prems_tac (is_relevant ctxt))
   9.590 +  THEN_ALL_NEW Object_Logic.full_atomize_tac
   9.591 +  THEN_ALL_NEW div_mod_tac ctxt
   9.592 +  THEN_ALL_NEW splits_tac ctxt
   9.593 +  THEN_ALL_NEW simp_tac ss
   9.594 +  THEN_ALL_NEW CONVERSION Thm.eta_long_conversion
   9.595 +  THEN_ALL_NEW nat_to_int_tac ctxt
   9.596 +  THEN_ALL_NEW (core_tac ctxt)
   9.597 +  THEN_ALL_NEW finish_tac elim
   9.598 +end;
   9.599 +
   9.600 +val method =
   9.601 +  let
   9.602 +    fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ()
   9.603 +    fun simple_keyword k = Scan.lift (Args.$$$ k) >> K ()
   9.604 +    val addN = "add"
   9.605 +    val delN = "del"
   9.606 +    val elimN = "elim"
   9.607 +    val any_keyword = keyword addN || keyword delN || simple_keyword elimN
   9.608 +    val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
   9.609 +  in
   9.610 +    Scan.optional (simple_keyword elimN >> K false) true --
   9.611 +    Scan.optional (keyword addN |-- thms) [] --
   9.612 +    Scan.optional (keyword delN |-- thms) [] >>
   9.613 +    (fn ((elim, add_ths), del_ths) => fn ctxt =>
   9.614 +      SIMPLE_METHOD' (tac elim add_ths del_ths ctxt))
   9.615 +  end;
   9.616 +
   9.617 +
   9.618 +(* theory setup *)
   9.619 +
   9.620 +local
   9.621 +
   9.622 +fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ();
   9.623 +
   9.624 +val constsN = "consts";
   9.625 +val any_keyword = keyword constsN
   9.626 +val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
   9.627 +val terms = thms >> map (term_of o Drule.dest_term);
   9.628 +
   9.629 +fun optional scan = Scan.optional scan [];
   9.630 +
   9.631 +in
   9.632 +
   9.633 +val setup =
   9.634 +  Attrib.setup @{binding presburger}
   9.635 +    ((Scan.lift (Args.$$$ "del") |-- optional (keyword constsN |-- terms)) >> del ||
   9.636 +      optional (keyword constsN |-- terms) >> add) "data for Cooper's algorithm"
   9.637 +  #> Arith_Data.add_tactic "Presburger arithmetic" (K (tac true [] []));
   9.638 +
   9.639 +end;
   9.640 +
   9.641 +end;
    10.1 --- a/src/HOL/Tools/Qelim/cooper_data.ML	Tue May 11 09:10:31 2010 -0700
    10.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.3 @@ -1,87 +0,0 @@
    10.4 -(*  Title:      HOL/Tools/Qelim/cooper_data.ML
    10.5 -    Author:     Amine Chaieb, TU Muenchen
    10.6 -*)
    10.7 -
    10.8 -signature COOPER_DATA =
    10.9 -sig
   10.10 -  type entry
   10.11 -  val get: Proof.context -> entry
   10.12 -  val del: term list -> attribute
   10.13 -  val add: term list -> attribute 
   10.14 -  val setup: theory -> theory
   10.15 -end;
   10.16 -
   10.17 -structure CooperData : COOPER_DATA =
   10.18 -struct
   10.19 -
   10.20 -type entry = simpset * (term list);
   10.21 -
   10.22 -val allowed_consts = 
   10.23 -  [@{term "op + :: int => _"}, @{term "op + :: nat => _"},
   10.24 -   @{term "op - :: int => _"}, @{term "op - :: nat => _"},
   10.25 -   @{term "op * :: int => _"}, @{term "op * :: nat => _"},
   10.26 -   @{term "op div :: int => _"}, @{term "op div :: nat => _"},
   10.27 -   @{term "op mod :: int => _"}, @{term "op mod :: nat => _"},
   10.28 -   @{term "Int.Bit0"}, @{term "Int.Bit1"},
   10.29 -   @{term "op &"}, @{term "op |"}, @{term "op -->"}, 
   10.30 -   @{term "op = :: int => _"}, @{term "op = :: nat => _"}, @{term "op = :: bool => _"},
   10.31 -   @{term "op < :: int => _"}, @{term "op < :: nat => _"},
   10.32 -   @{term "op <= :: int => _"}, @{term "op <= :: nat => _"},
   10.33 -   @{term "op dvd :: int => _"}, @{term "op dvd :: nat => _"},
   10.34 -   @{term "abs :: int => _"},
   10.35 -   @{term "max :: int => _"}, @{term "max :: nat => _"},
   10.36 -   @{term "min :: int => _"}, @{term "min :: nat => _"},
   10.37 -   @{term "uminus :: int => _"}, (*@ {term "uminus :: nat => _"},*)
   10.38 -   @{term "Not"}, @{term "Suc"},
   10.39 -   @{term "Ex :: (int => _) => _"}, @{term "Ex :: (nat => _) => _"},
   10.40 -   @{term "All :: (int => _) => _"}, @{term "All :: (nat => _) => _"},
   10.41 -   @{term "nat"}, @{term "int"},
   10.42 -   @{term "Int.Bit0"}, @{term "Int.Bit1"},
   10.43 -   @{term "Int.Pls"}, @{term "Int.Min"},
   10.44 -   @{term "Int.number_of :: int => int"}, @{term "Int.number_of :: int => nat"},
   10.45 -   @{term "0::int"}, @{term "1::int"}, @{term "0::nat"}, @{term "1::nat"},
   10.46 -   @{term "True"}, @{term "False"}];
   10.47 -
   10.48 -structure Data = Generic_Data
   10.49 -(
   10.50 -  type T = simpset * term list;
   10.51 -  val empty = (HOL_ss, allowed_consts);
   10.52 -  val extend  = I;
   10.53 -  fun merge ((ss1, ts1), (ss2, ts2)) =
   10.54 -    (merge_ss (ss1, ss2), Library.merge (op aconv) (ts1, ts2));
   10.55 -);
   10.56 -
   10.57 -val get = Data.get o Context.Proof;
   10.58 -
   10.59 -fun add ts = Thm.declaration_attribute (fn th => fn context => 
   10.60 -  context |> Data.map (fn (ss,ts') => 
   10.61 -     (ss addsimps [th], merge (op aconv) (ts',ts) ))) 
   10.62 -
   10.63 -fun del ts = Thm.declaration_attribute (fn th => fn context => 
   10.64 -  context |> Data.map (fn (ss,ts') => 
   10.65 -     (ss delsimps [th], subtract (op aconv) ts' ts ))) 
   10.66 -
   10.67 -
   10.68 -(* theory setup *)
   10.69 -
   10.70 -local
   10.71 -
   10.72 -fun keyword k = Scan.lift (Args.$$$ k -- Args.colon) >> K ();
   10.73 -
   10.74 -val constsN = "consts";
   10.75 -val any_keyword = keyword constsN
   10.76 -val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat;
   10.77 -val terms = thms >> map (term_of o Drule.dest_term);
   10.78 -
   10.79 -fun optional scan = Scan.optional scan [];
   10.80 -
   10.81 -in
   10.82 -
   10.83 -val setup =
   10.84 -  Attrib.setup @{binding presburger}
   10.85 -    ((Scan.lift (Args.$$$ "del") |-- optional (keyword constsN |-- terms)) >> del ||
   10.86 -      optional (keyword constsN |-- terms) >> add) "Cooper data";
   10.87 -
   10.88 -end;
   10.89 -
   10.90 -end;
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/src/HOL/Tools/Qelim/cooper_procedure.ML	Tue May 11 11:02:56 2010 -0700
    11.3 @@ -0,0 +1,2274 @@
    11.4 +(* Generated from Cooper.thy; DO NOT EDIT! *)
    11.5 +
    11.6 +structure Cooper_Procedure : sig
    11.7 +  type 'a eq
    11.8 +  val eq : 'a eq -> 'a -> 'a -> bool
    11.9 +  val eqa : 'a eq -> 'a -> 'a -> bool
   11.10 +  val leta : 'a -> ('a -> 'b) -> 'b
   11.11 +  val suc : IntInf.int -> IntInf.int
   11.12 +  datatype num = C of IntInf.int | Bound of IntInf.int |
   11.13 +    Cn of IntInf.int * IntInf.int * num | Neg of num | Add of num * num |
   11.14 +    Sub of num * num | Mul of IntInf.int * num
   11.15 +  datatype fm = T | F | Lt of num | Le of num | Gt of num | Ge of num |
   11.16 +    Eq of num | NEq of num | Dvd of IntInf.int * num | NDvd of IntInf.int * num
   11.17 +    | Not of fm | And of fm * fm | Or of fm * fm | Imp of fm * fm |
   11.18 +    Iff of fm * fm | E of fm | A of fm | Closed of IntInf.int |
   11.19 +    NClosed of IntInf.int
   11.20 +  val map : ('a -> 'b) -> 'a list -> 'b list
   11.21 +  val append : 'a list -> 'a list -> 'a list
   11.22 +  val disjuncts : fm -> fm list
   11.23 +  val fm_case :
   11.24 +    'a -> 'a -> (num -> 'a) ->
   11.25 +                  (num -> 'a) ->
   11.26 +                    (num -> 'a) ->
   11.27 +                      (num -> 'a) ->
   11.28 +                        (num -> 'a) ->
   11.29 +                          (num -> 'a) ->
   11.30 +                            (IntInf.int -> num -> 'a) ->
   11.31 +                              (IntInf.int -> num -> 'a) ->
   11.32 +                                (fm -> 'a) ->
   11.33 +                                  (fm -> fm -> 'a) ->
   11.34 +                                    (fm -> fm -> 'a) ->
   11.35 +                                      (fm -> fm -> 'a) ->
   11.36 +(fm -> fm -> 'a) ->
   11.37 +  (fm -> 'a) ->
   11.38 +    (fm -> 'a) -> (IntInf.int -> 'a) -> (IntInf.int -> 'a) -> fm -> 'a
   11.39 +  val eq_num : num -> num -> bool
   11.40 +  val eq_fm : fm -> fm -> bool
   11.41 +  val djf : ('a -> fm) -> 'a -> fm -> fm
   11.42 +  val foldr : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
   11.43 +  val evaldjf : ('a -> fm) -> 'a list -> fm
   11.44 +  val dj : (fm -> fm) -> fm -> fm
   11.45 +  val disj : fm -> fm -> fm
   11.46 +  val minus_nat : IntInf.int -> IntInf.int -> IntInf.int
   11.47 +  val decrnum : num -> num
   11.48 +  val decr : fm -> fm
   11.49 +  val concat_map : ('a -> 'b list) -> 'a list -> 'b list
   11.50 +  val numsubst0 : num -> num -> num
   11.51 +  val subst0 : num -> fm -> fm
   11.52 +  val minusinf : fm -> fm
   11.53 +  val eq_int : IntInf.int eq
   11.54 +  val zero_int : IntInf.int
   11.55 +  type 'a zero
   11.56 +  val zero : 'a zero -> 'a
   11.57 +  val zero_inta : IntInf.int zero
   11.58 +  type 'a times
   11.59 +  val times : 'a times -> 'a -> 'a -> 'a
   11.60 +  type 'a no_zero_divisors
   11.61 +  val times_no_zero_divisors : 'a no_zero_divisors -> 'a times
   11.62 +  val zero_no_zero_divisors : 'a no_zero_divisors -> 'a zero
   11.63 +  val times_int : IntInf.int times
   11.64 +  val no_zero_divisors_int : IntInf.int no_zero_divisors
   11.65 +  type 'a one
   11.66 +  val one : 'a one -> 'a
   11.67 +  type 'a zero_neq_one
   11.68 +  val one_zero_neq_one : 'a zero_neq_one -> 'a one
   11.69 +  val zero_zero_neq_one : 'a zero_neq_one -> 'a zero
   11.70 +  type 'a semigroup_mult
   11.71 +  val times_semigroup_mult : 'a semigroup_mult -> 'a times
   11.72 +  type 'a plus
   11.73 +  val plus : 'a plus -> 'a -> 'a -> 'a
   11.74 +  type 'a semigroup_add
   11.75 +  val plus_semigroup_add : 'a semigroup_add -> 'a plus
   11.76 +  type 'a ab_semigroup_add
   11.77 +  val semigroup_add_ab_semigroup_add : 'a ab_semigroup_add -> 'a semigroup_add
   11.78 +  type 'a semiring
   11.79 +  val ab_semigroup_add_semiring : 'a semiring -> 'a ab_semigroup_add
   11.80 +  val semigroup_mult_semiring : 'a semiring -> 'a semigroup_mult
   11.81 +  type 'a mult_zero
   11.82 +  val times_mult_zero : 'a mult_zero -> 'a times
   11.83 +  val zero_mult_zero : 'a mult_zero -> 'a zero
   11.84 +  type 'a monoid_add
   11.85 +  val semigroup_add_monoid_add : 'a monoid_add -> 'a semigroup_add
   11.86 +  val zero_monoid_add : 'a monoid_add -> 'a zero
   11.87 +  type 'a comm_monoid_add
   11.88 +  val ab_semigroup_add_comm_monoid_add :
   11.89 +    'a comm_monoid_add -> 'a ab_semigroup_add
   11.90 +  val monoid_add_comm_monoid_add : 'a comm_monoid_add -> 'a monoid_add
   11.91 +  type 'a semiring_0
   11.92 +  val comm_monoid_add_semiring_0 : 'a semiring_0 -> 'a comm_monoid_add
   11.93 +  val mult_zero_semiring_0 : 'a semiring_0 -> 'a mult_zero
   11.94 +  val semiring_semiring_0 : 'a semiring_0 -> 'a semiring
   11.95 +  type 'a power
   11.96 +  val one_power : 'a power -> 'a one
   11.97 +  val times_power : 'a power -> 'a times
   11.98 +  type 'a monoid_mult
   11.99 +  val semigroup_mult_monoid_mult : 'a monoid_mult -> 'a semigroup_mult
  11.100 +  val power_monoid_mult : 'a monoid_mult -> 'a power
  11.101 +  type 'a semiring_1
  11.102 +  val monoid_mult_semiring_1 : 'a semiring_1 -> 'a monoid_mult
  11.103 +  val semiring_0_semiring_1 : 'a semiring_1 -> 'a semiring_0
  11.104 +  val zero_neq_one_semiring_1 : 'a semiring_1 -> 'a zero_neq_one
  11.105 +  type 'a cancel_semigroup_add
  11.106 +  val semigroup_add_cancel_semigroup_add :
  11.107 +    'a cancel_semigroup_add -> 'a semigroup_add
  11.108 +  type 'a cancel_ab_semigroup_add
  11.109 +  val ab_semigroup_add_cancel_ab_semigroup_add :
  11.110 +    'a cancel_ab_semigroup_add -> 'a ab_semigroup_add
  11.111 +  val cancel_semigroup_add_cancel_ab_semigroup_add :
  11.112 +    'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add
  11.113 +  type 'a cancel_comm_monoid_add
  11.114 +  val cancel_ab_semigroup_add_cancel_comm_monoid_add :
  11.115 +    'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add
  11.116 +  val comm_monoid_add_cancel_comm_monoid_add :
  11.117 +    'a cancel_comm_monoid_add -> 'a comm_monoid_add
  11.118 +  type 'a semiring_0_cancel
  11.119 +  val cancel_comm_monoid_add_semiring_0_cancel :
  11.120 +    'a semiring_0_cancel -> 'a cancel_comm_monoid_add
  11.121 +  val semiring_0_semiring_0_cancel : 'a semiring_0_cancel -> 'a semiring_0
  11.122 +  type 'a semiring_1_cancel
  11.123 +  val semiring_0_cancel_semiring_1_cancel :
  11.124 +    'a semiring_1_cancel -> 'a semiring_0_cancel
  11.125 +  val semiring_1_semiring_1_cancel : 'a semiring_1_cancel -> 'a semiring_1
  11.126 +  type 'a dvd
  11.127 +  val times_dvd : 'a dvd -> 'a times
  11.128 +  type 'a ab_semigroup_mult
  11.129 +  val semigroup_mult_ab_semigroup_mult :
  11.130 +    'a ab_semigroup_mult -> 'a semigroup_mult
  11.131 +  type 'a comm_semiring
  11.132 +  val ab_semigroup_mult_comm_semiring : 'a comm_semiring -> 'a ab_semigroup_mult
  11.133 +  val semiring_comm_semiring : 'a comm_semiring -> 'a semiring
  11.134 +  type 'a comm_semiring_0
  11.135 +  val comm_semiring_comm_semiring_0 : 'a comm_semiring_0 -> 'a comm_semiring
  11.136 +  val semiring_0_comm_semiring_0 : 'a comm_semiring_0 -> 'a semiring_0
  11.137 +  type 'a comm_monoid_mult
  11.138 +  val ab_semigroup_mult_comm_monoid_mult :
  11.139 +    'a comm_monoid_mult -> 'a ab_semigroup_mult
  11.140 +  val monoid_mult_comm_monoid_mult : 'a comm_monoid_mult -> 'a monoid_mult
  11.141 +  type 'a comm_semiring_1
  11.142 +  val comm_monoid_mult_comm_semiring_1 :
  11.143 +    'a comm_semiring_1 -> 'a comm_monoid_mult
  11.144 +  val comm_semiring_0_comm_semiring_1 : 'a comm_semiring_1 -> 'a comm_semiring_0
  11.145 +  val dvd_comm_semiring_1 : 'a comm_semiring_1 -> 'a dvd
  11.146 +  val semiring_1_comm_semiring_1 : 'a comm_semiring_1 -> 'a semiring_1
  11.147 +  type 'a comm_semiring_0_cancel
  11.148 +  val comm_semiring_0_comm_semiring_0_cancel :
  11.149 +    'a comm_semiring_0_cancel -> 'a comm_semiring_0
  11.150 +  val semiring_0_cancel_comm_semiring_0_cancel :
  11.151 +    'a comm_semiring_0_cancel -> 'a semiring_0_cancel
  11.152 +  type 'a comm_semiring_1_cancel
  11.153 +  val comm_semiring_0_cancel_comm_semiring_1_cancel :
  11.154 +    'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel
  11.155 +  val comm_semiring_1_comm_semiring_1_cancel :
  11.156 +    'a comm_semiring_1_cancel -> 'a comm_semiring_1
  11.157 +  val semiring_1_cancel_comm_semiring_1_cancel :
  11.158 +    'a comm_semiring_1_cancel -> 'a semiring_1_cancel
  11.159 +  type 'a diva
  11.160 +  val dvd_div : 'a diva -> 'a dvd
  11.161 +  val diva : 'a diva -> 'a -> 'a -> 'a
  11.162 +  val moda : 'a diva -> 'a -> 'a -> 'a
  11.163 +  type 'a semiring_div
  11.164 +  val div_semiring_div : 'a semiring_div -> 'a diva
  11.165 +  val comm_semiring_1_cancel_semiring_div :
  11.166 +    'a semiring_div -> 'a comm_semiring_1_cancel
  11.167 +  val no_zero_divisors_semiring_div : 'a semiring_div -> 'a no_zero_divisors
  11.168 +  val one_int : IntInf.int
  11.169 +  val one_inta : IntInf.int one
  11.170 +  val zero_neq_one_int : IntInf.int zero_neq_one
  11.171 +  val semigroup_mult_int : IntInf.int semigroup_mult
  11.172 +  val plus_int : IntInf.int plus
  11.173 +  val semigroup_add_int : IntInf.int semigroup_add
  11.174 +  val ab_semigroup_add_int : IntInf.int ab_semigroup_add
  11.175 +  val semiring_int : IntInf.int semiring
  11.176 +  val mult_zero_int : IntInf.int mult_zero
  11.177 +  val monoid_add_int : IntInf.int monoid_add
  11.178 +  val comm_monoid_add_int : IntInf.int comm_monoid_add
  11.179 +  val semiring_0_int : IntInf.int semiring_0
  11.180 +  val power_int : IntInf.int power
  11.181 +  val monoid_mult_int : IntInf.int monoid_mult
  11.182 +  val semiring_1_int : IntInf.int semiring_1
  11.183 +  val cancel_semigroup_add_int : IntInf.int cancel_semigroup_add
  11.184 +  val cancel_ab_semigroup_add_int : IntInf.int cancel_ab_semigroup_add
  11.185 +  val cancel_comm_monoid_add_int : IntInf.int cancel_comm_monoid_add
  11.186 +  val semiring_0_cancel_int : IntInf.int semiring_0_cancel
  11.187 +  val semiring_1_cancel_int : IntInf.int semiring_1_cancel
  11.188 +  val dvd_int : IntInf.int dvd
  11.189 +  val ab_semigroup_mult_int : IntInf.int ab_semigroup_mult
  11.190 +  val comm_semiring_int : IntInf.int comm_semiring
  11.191 +  val comm_semiring_0_int : IntInf.int comm_semiring_0
  11.192 +  val comm_monoid_mult_int : IntInf.int comm_monoid_mult
  11.193 +  val comm_semiring_1_int : IntInf.int comm_semiring_1
  11.194 +  val comm_semiring_0_cancel_int : IntInf.int comm_semiring_0_cancel
  11.195 +  val comm_semiring_1_cancel_int : IntInf.int comm_semiring_1_cancel
  11.196 +  val abs_int : IntInf.int -> IntInf.int
  11.197 +  val split : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
  11.198 +  val sgn_int : IntInf.int -> IntInf.int
  11.199 +  val apsnd : ('a -> 'b) -> 'c * 'a -> 'c * 'b
  11.200 +  val divmod_int : IntInf.int -> IntInf.int -> IntInf.int * IntInf.int
  11.201 +  val snd : 'a * 'b -> 'b
  11.202 +  val mod_int : IntInf.int -> IntInf.int -> IntInf.int
  11.203 +  val fst : 'a * 'b -> 'a
  11.204 +  val div_int : IntInf.int -> IntInf.int -> IntInf.int
  11.205 +  val div_inta : IntInf.int diva
  11.206 +  val semiring_div_int : IntInf.int semiring_div
  11.207 +  val dvd : 'a semiring_div * 'a eq -> 'a -> 'a -> bool
  11.208 +  val num_case :
  11.209 +    (IntInf.int -> 'a) ->
  11.210 +      (IntInf.int -> 'a) ->
  11.211 +        (IntInf.int -> IntInf.int -> num -> 'a) ->
  11.212 +          (num -> 'a) ->
  11.213 +            (num -> num -> 'a) ->
  11.214 +              (num -> num -> 'a) -> (IntInf.int -> num -> 'a) -> num -> 'a
  11.215 +  val nummul : IntInf.int -> num -> num
  11.216 +  val numneg : num -> num
  11.217 +  val numadd : num * num -> num
  11.218 +  val numsub : num -> num -> num
  11.219 +  val simpnum : num -> num
  11.220 +  val nota : fm -> fm
  11.221 +  val iffa : fm -> fm -> fm
  11.222 +  val impa : fm -> fm -> fm
  11.223 +  val conj : fm -> fm -> fm
  11.224 +  val simpfm : fm -> fm
  11.225 +  val iupt : IntInf.int -> IntInf.int -> IntInf.int list
  11.226 +  val mirror : fm -> fm
  11.227 +  val size_list : 'a list -> IntInf.int
  11.228 +  val alpha : fm -> num list
  11.229 +  val beta : fm -> num list
  11.230 +  val eq_numa : num eq
  11.231 +  val member : 'a eq -> 'a -> 'a list -> bool
  11.232 +  val remdups : 'a eq -> 'a list -> 'a list
  11.233 +  val gcd_int : IntInf.int -> IntInf.int -> IntInf.int
  11.234 +  val lcm_int : IntInf.int -> IntInf.int -> IntInf.int
  11.235 +  val delta : fm -> IntInf.int
  11.236 +  val a_beta : fm -> IntInf.int -> fm
  11.237 +  val zeta : fm -> IntInf.int
  11.238 +  val zsplit0 : num -> IntInf.int * num
  11.239 +  val zlfm : fm -> fm
  11.240 +  val unita : fm -> fm * (num list * IntInf.int)
  11.241 +  val cooper : fm -> fm
  11.242 +  val prep : fm -> fm
  11.243 +  val qelim : fm -> (fm -> fm) -> fm
  11.244 +  val pa : fm -> fm
  11.245 +end = struct
  11.246 +
  11.247 +type 'a eq = {eq : 'a -> 'a -> bool};
  11.248 +val eq = #eq : 'a eq -> 'a -> 'a -> bool;
  11.249 +
  11.250 +fun eqa A_ a b = eq A_ a b;
  11.251 +
  11.252 +fun leta s f = f s;
  11.253 +
  11.254 +fun suc n = IntInf.+ (n, (1 : IntInf.int));
  11.255 +
  11.256 +datatype num = C of IntInf.int | Bound of IntInf.int |
  11.257 +  Cn of IntInf.int * IntInf.int * num | Neg of num | Add of num * num |
  11.258 +  Sub of num * num | Mul of IntInf.int * num;
  11.259 +
  11.260 +datatype fm = T | F | Lt of num | Le of num | Gt of num | Ge of num | Eq of num
  11.261 +  | NEq of num | Dvd of IntInf.int * num | NDvd of IntInf.int * num | Not of fm
  11.262 +  | And of fm * fm | Or of fm * fm | Imp of fm * fm | Iff of fm * fm | E of fm |
  11.263 +  A of fm | Closed of IntInf.int | NClosed of IntInf.int;
  11.264 +
  11.265 +fun map f [] = []
  11.266 +  | map f (x :: xs) = f x :: map f xs;
  11.267 +
  11.268 +fun append [] ys = ys
  11.269 +  | append (x :: xs) ys = x :: append xs ys;
  11.270 +
  11.271 +fun disjuncts (Or (p, q)) = append (disjuncts p) (disjuncts q)
  11.272 +  | disjuncts F = []
  11.273 +  | disjuncts T = [T]
  11.274 +  | disjuncts (Lt u) = [Lt u]
  11.275 +  | disjuncts (Le v) = [Le v]
  11.276 +  | disjuncts (Gt w) = [Gt w]
  11.277 +  | disjuncts (Ge x) = [Ge x]
  11.278 +  | disjuncts (Eq y) = [Eq y]
  11.279 +  | disjuncts (NEq z) = [NEq z]
  11.280 +  | disjuncts (Dvd (aa, ab)) = [Dvd (aa, ab)]
  11.281 +  | disjuncts (NDvd (ac, ad)) = [NDvd (ac, ad)]
  11.282 +  | disjuncts (Not ae) = [Not ae]
  11.283 +  | disjuncts (And (af, ag)) = [And (af, ag)]
  11.284 +  | disjuncts (Imp (aj, ak)) = [Imp (aj, ak)]
  11.285 +  | disjuncts (Iff (al, am)) = [Iff (al, am)]
  11.286 +  | disjuncts (E an) = [E an]
  11.287 +  | disjuncts (A ao) = [A ao]
  11.288 +  | disjuncts (Closed ap) = [Closed ap]
  11.289 +  | disjuncts (NClosed aq) = [NClosed aq];
  11.290 +
  11.291 +fun fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.292 +  (NClosed nat) = f19 nat
  11.293 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.294 +    (Closed nat) = f18 nat
  11.295 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.296 +    (A fm) = f17 fm
  11.297 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.298 +    (E fm) = f16 fm
  11.299 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.300 +    (Iff (fm1, fm2)) = f15 fm1 fm2
  11.301 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.302 +    (Imp (fm1, fm2)) = f14 fm1 fm2
  11.303 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.304 +    (Or (fm1, fm2)) = f13 fm1 fm2
  11.305 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.306 +    (And (fm1, fm2)) = f12 fm1 fm2
  11.307 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.308 +    (Not fm) = f11 fm
  11.309 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.310 +    (NDvd (inta, num)) = f10 inta num
  11.311 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.312 +    (Dvd (inta, num)) = f9 inta num
  11.313 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.314 +    (NEq num) = f8 num
  11.315 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.316 +    (Eq num) = f7 num
  11.317 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.318 +    (Ge num) = f6 num
  11.319 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.320 +    (Gt num) = f5 num
  11.321 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.322 +    (Le num) = f4 num
  11.323 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  11.324 +    (Lt num) = f3 num
  11.325 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 F
  11.326 +    = f2
  11.327 +  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 T
  11.328 +    = f1;
  11.329 +
  11.330 +fun eq_num (C intaa) (C inta) = ((intaa : IntInf.int) = inta)
  11.331 +  | eq_num (Bound nata) (Bound nat) = ((nata : IntInf.int) = nat)
  11.332 +  | eq_num (Cn (nata, intaa, numa)) (Cn (nat, inta, num)) =
  11.333 +    ((nata : IntInf.int) = nat) andalso
  11.334 +      (((intaa : IntInf.int) = inta) andalso eq_num numa num)
  11.335 +  | eq_num (Neg numa) (Neg num) = eq_num numa num
  11.336 +  | eq_num (Add (num1a, num2a)) (Add (num1, num2)) =
  11.337 +    eq_num num1a num1 andalso eq_num num2a num2
  11.338 +  | eq_num (Sub (num1a, num2a)) (Sub (num1, num2)) =
  11.339 +    eq_num num1a num1 andalso eq_num num2a num2
  11.340 +  | eq_num (Mul (intaa, numa)) (Mul (inta, num)) =
  11.341 +    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  11.342 +  | eq_num (C inta) (Bound nat) = false
  11.343 +  | eq_num (Bound nat) (C inta) = false
  11.344 +  | eq_num (C intaa) (Cn (nat, inta, num)) = false
  11.345 +  | eq_num (Cn (nat, intaa, num)) (C inta) = false
  11.346 +  | eq_num (C inta) (Neg num) = false
  11.347 +  | eq_num (Neg num) (C inta) = false
  11.348 +  | eq_num (C inta) (Add (num1, num2)) = false
  11.349 +  | eq_num (Add (num1, num2)) (C inta) = false
  11.350 +  | eq_num (C inta) (Sub (num1, num2)) = false
  11.351 +  | eq_num (Sub (num1, num2)) (C inta) = false
  11.352 +  | eq_num (C intaa) (Mul (inta, num)) = false
  11.353 +  | eq_num (Mul (intaa, num)) (C inta) = false
  11.354 +  | eq_num (Bound nata) (Cn (nat, inta, num)) = false
  11.355 +  | eq_num (Cn (nata, inta, num)) (Bound nat) = false
  11.356 +  | eq_num (Bound nat) (Neg num) = false
  11.357 +  | eq_num (Neg num) (Bound nat) = false
  11.358 +  | eq_num (Bound nat) (Add (num1, num2)) = false
  11.359 +  | eq_num (Add (num1, num2)) (Bound nat) = false
  11.360 +  | eq_num (Bound nat) (Sub (num1, num2)) = false
  11.361 +  | eq_num (Sub (num1, num2)) (Bound nat) = false
  11.362 +  | eq_num (Bound nat) (Mul (inta, num)) = false
  11.363 +  | eq_num (Mul (inta, num)) (Bound nat) = false
  11.364 +  | eq_num (Cn (nat, inta, numa)) (Neg num) = false
  11.365 +  | eq_num (Neg numa) (Cn (nat, inta, num)) = false
  11.366 +  | eq_num (Cn (nat, inta, num)) (Add (num1, num2)) = false
  11.367 +  | eq_num (Add (num1, num2)) (Cn (nat, inta, num)) = false
  11.368 +  | eq_num (Cn (nat, inta, num)) (Sub (num1, num2)) = false
  11.369 +  | eq_num (Sub (num1, num2)) (Cn (nat, inta, num)) = false
  11.370 +  | eq_num (Cn (nat, intaa, numa)) (Mul (inta, num)) = false
  11.371 +  | eq_num (Mul (intaa, numa)) (Cn (nat, inta, num)) = false
  11.372 +  | eq_num (Neg num) (Add (num1, num2)) = false
  11.373 +  | eq_num (Add (num1, num2)) (Neg num) = false
  11.374 +  | eq_num (Neg num) (Sub (num1, num2)) = false
  11.375 +  | eq_num (Sub (num1, num2)) (Neg num) = false
  11.376 +  | eq_num (Neg numa) (Mul (inta, num)) = false
  11.377 +  | eq_num (Mul (inta, numa)) (Neg num) = false
  11.378 +  | eq_num (Add (num1a, num2a)) (Sub (num1, num2)) = false
  11.379 +  | eq_num (Sub (num1a, num2a)) (Add (num1, num2)) = false
  11.380 +  | eq_num (Add (num1, num2)) (Mul (inta, num)) = false
  11.381 +  | eq_num (Mul (inta, num)) (Add (num1, num2)) = false
  11.382 +  | eq_num (Sub (num1, num2)) (Mul (inta, num)) = false
  11.383 +  | eq_num (Mul (inta, num)) (Sub (num1, num2)) = false;
  11.384 +
  11.385 +fun eq_fm T T = true
  11.386 +  | eq_fm F F = true
  11.387 +  | eq_fm (Lt numa) (Lt num) = eq_num numa num
  11.388 +  | eq_fm (Le numa) (Le num) = eq_num numa num
  11.389 +  | eq_fm (Gt numa) (Gt num) = eq_num numa num
  11.390 +  | eq_fm (Ge numa) (Ge num) = eq_num numa num
  11.391 +  | eq_fm (Eq numa) (Eq num) = eq_num numa num
  11.392 +  | eq_fm (NEq numa) (NEq num) = eq_num numa num
  11.393 +  | eq_fm (Dvd (intaa, numa)) (Dvd (inta, num)) =
  11.394 +    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  11.395 +  | eq_fm (NDvd (intaa, numa)) (NDvd (inta, num)) =
  11.396 +    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  11.397 +  | eq_fm (Not fma) (Not fm) = eq_fm fma fm
  11.398 +  | eq_fm (And (fm1a, fm2a)) (And (fm1, fm2)) =
  11.399 +    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  11.400 +  | eq_fm (Or (fm1a, fm2a)) (Or (fm1, fm2)) =
  11.401 +    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  11.402 +  | eq_fm (Imp (fm1a, fm2a)) (Imp (fm1, fm2)) =
  11.403 +    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  11.404 +  | eq_fm (Iff (fm1a, fm2a)) (Iff (fm1, fm2)) =
  11.405 +    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  11.406 +  | eq_fm (E fma) (E fm) = eq_fm fma fm
  11.407 +  | eq_fm (A fma) (A fm) = eq_fm fma fm
  11.408 +  | eq_fm (Closed nata) (Closed nat) = ((nata : IntInf.int) = nat)
  11.409 +  | eq_fm (NClosed nata) (NClosed nat) = ((nata : IntInf.int) = nat)
  11.410 +  | eq_fm T F = false
  11.411 +  | eq_fm F T = false
  11.412 +  | eq_fm T (Lt num) = false
  11.413 +  | eq_fm (Lt num) T = false
  11.414 +  | eq_fm T (Le num) = false
  11.415 +  | eq_fm (Le num) T = false
  11.416 +  | eq_fm T (Gt num) = false
  11.417 +  | eq_fm (Gt num) T = false
  11.418 +  | eq_fm T (Ge num) = false
  11.419 +  | eq_fm (Ge num) T = false
  11.420 +  | eq_fm T (Eq num) = false
  11.421 +  | eq_fm (Eq num) T = false
  11.422 +  | eq_fm T (NEq num) = false
  11.423 +  | eq_fm (NEq num) T = false
  11.424 +  | eq_fm T (Dvd (inta, num)) = false
  11.425 +  | eq_fm (Dvd (inta, num)) T = false
  11.426 +  | eq_fm T (NDvd (inta, num)) = false
  11.427 +  | eq_fm (NDvd (inta, num)) T = false
  11.428 +  | eq_fm T (Not fm) = false
  11.429 +  | eq_fm (Not fm) T = false
  11.430 +  | eq_fm T (And (fm1, fm2)) = false
  11.431 +  | eq_fm (And (fm1, fm2)) T = false
  11.432 +  | eq_fm T (Or (fm1, fm2)) = false
  11.433 +  | eq_fm (Or (fm1, fm2)) T = false
  11.434 +  | eq_fm T (Imp (fm1, fm2)) = false
  11.435 +  | eq_fm (Imp (fm1, fm2)) T = false
  11.436 +  | eq_fm T (Iff (fm1, fm2)) = false
  11.437 +  | eq_fm (Iff (fm1, fm2)) T = false
  11.438 +  | eq_fm T (E fm) = false
  11.439 +  | eq_fm (E fm) T = false
  11.440 +  | eq_fm T (A fm) = false
  11.441 +  | eq_fm (A fm) T = false
  11.442 +  | eq_fm T (Closed nat) = false
  11.443 +  | eq_fm (Closed nat) T = false
  11.444 +  | eq_fm T (NClosed nat) = false
  11.445 +  | eq_fm (NClosed nat) T = false
  11.446 +  | eq_fm F (Lt num) = false
  11.447 +  | eq_fm (Lt num) F = false
  11.448 +  | eq_fm F (Le num) = false
  11.449 +  | eq_fm (Le num) F = false
  11.450 +  | eq_fm F (Gt num) = false
  11.451 +  | eq_fm (Gt num) F = false
  11.452 +  | eq_fm F (Ge num) = false
  11.453 +  | eq_fm (Ge num) F = false
  11.454 +  | eq_fm F (Eq num) = false
  11.455 +  | eq_fm (Eq num) F = false
  11.456 +  | eq_fm F (NEq num) = false
  11.457 +  | eq_fm (NEq num) F = false
  11.458 +  | eq_fm F (Dvd (inta, num)) = false
  11.459 +  | eq_fm (Dvd (inta, num)) F = false
  11.460 +  | eq_fm F (NDvd (inta, num)) = false
  11.461 +  | eq_fm (NDvd (inta, num)) F = false
  11.462 +  | eq_fm F (Not fm) = false
  11.463 +  | eq_fm (Not fm) F = false
  11.464 +  | eq_fm F (And (fm1, fm2)) = false
  11.465 +  | eq_fm (And (fm1, fm2)) F = false
  11.466 +  | eq_fm F (Or (fm1, fm2)) = false
  11.467 +  | eq_fm (Or (fm1, fm2)) F = false
  11.468 +  | eq_fm F (Imp (fm1, fm2)) = false
  11.469 +  | eq_fm (Imp (fm1, fm2)) F = false
  11.470 +  | eq_fm F (Iff (fm1, fm2)) = false
  11.471 +  | eq_fm (Iff (fm1, fm2)) F = false
  11.472 +  | eq_fm F (E fm) = false
  11.473 +  | eq_fm (E fm) F = false
  11.474 +  | eq_fm F (A fm) = false
  11.475 +  | eq_fm (A fm) F = false
  11.476 +  | eq_fm F (Closed nat) = false
  11.477 +  | eq_fm (Closed nat) F = false
  11.478 +  | eq_fm F (NClosed nat) = false
  11.479 +  | eq_fm (NClosed nat) F = false
  11.480 +  | eq_fm (Lt numa) (Le num) = false
  11.481 +  | eq_fm (Le numa) (Lt num) = false
  11.482 +  | eq_fm (Lt numa) (Gt num) = false
  11.483 +  | eq_fm (Gt numa) (Lt num) = false
  11.484 +  | eq_fm (Lt numa) (Ge num) = false
  11.485 +  | eq_fm (Ge numa) (Lt num) = false
  11.486 +  | eq_fm (Lt numa) (Eq num) = false
  11.487 +  | eq_fm (Eq numa) (Lt num) = false
  11.488 +  | eq_fm (Lt numa) (NEq num) = false
  11.489 +  | eq_fm (NEq numa) (Lt num) = false
  11.490 +  | eq_fm (Lt numa) (Dvd (inta, num)) = false
  11.491 +  | eq_fm (Dvd (inta, numa)) (Lt num) = false
  11.492 +  | eq_fm (Lt numa) (NDvd (inta, num)) = false
  11.493 +  | eq_fm (NDvd (inta, numa)) (Lt num) = false
  11.494 +  | eq_fm (Lt num) (Not fm) = false
  11.495 +  | eq_fm (Not fm) (Lt num) = false
  11.496 +  | eq_fm (Lt num) (And (fm1, fm2)) = false
  11.497 +  | eq_fm (And (fm1, fm2)) (Lt num) = false
  11.498 +  | eq_fm (Lt num) (Or (fm1, fm2)) = false
  11.499 +  | eq_fm (Or (fm1, fm2)) (Lt num) = false
  11.500 +  | eq_fm (Lt num) (Imp (fm1, fm2)) = false
  11.501 +  | eq_fm (Imp (fm1, fm2)) (Lt num) = false
  11.502 +  | eq_fm (Lt num) (Iff (fm1, fm2)) = false
  11.503 +  | eq_fm (Iff (fm1, fm2)) (Lt num) = false
  11.504 +  | eq_fm (Lt num) (E fm) = false
  11.505 +  | eq_fm (E fm) (Lt num) = false
  11.506 +  | eq_fm (Lt num) (A fm) = false
  11.507 +  | eq_fm (A fm) (Lt num) = false
  11.508 +  | eq_fm (Lt num) (Closed nat) = false
  11.509 +  | eq_fm (Closed nat) (Lt num) = false
  11.510 +  | eq_fm (Lt num) (NClosed nat) = false
  11.511 +  | eq_fm (NClosed nat) (Lt num) = false
  11.512 +  | eq_fm (Le numa) (Gt num) = false
  11.513 +  | eq_fm (Gt numa) (Le num) = false
  11.514 +  | eq_fm (Le numa) (Ge num) = false
  11.515 +  | eq_fm (Ge numa) (Le num) = false
  11.516 +  | eq_fm (Le numa) (Eq num) = false
  11.517 +  | eq_fm (Eq numa) (Le num) = false
  11.518 +  | eq_fm (Le numa) (NEq num) = false
  11.519 +  | eq_fm (NEq numa) (Le num) = false
  11.520 +  | eq_fm (Le numa) (Dvd (inta, num)) = false
  11.521 +  | eq_fm (Dvd (inta, numa)) (Le num) = false
  11.522 +  | eq_fm (Le numa) (NDvd (inta, num)) = false
  11.523 +  | eq_fm (NDvd (inta, numa)) (Le num) = false
  11.524 +  | eq_fm (Le num) (Not fm) = false
  11.525 +  | eq_fm (Not fm) (Le num) = false
  11.526 +  | eq_fm (Le num) (And (fm1, fm2)) = false
  11.527 +  | eq_fm (And (fm1, fm2)) (Le num) = false
  11.528 +  | eq_fm (Le num) (Or (fm1, fm2)) = false
  11.529 +  | eq_fm (Or (fm1, fm2)) (Le num) = false
  11.530 +  | eq_fm (Le num) (Imp (fm1, fm2)) = false
  11.531 +  | eq_fm (Imp (fm1, fm2)) (Le num) = false
  11.532 +  | eq_fm (Le num) (Iff (fm1, fm2)) = false
  11.533 +  | eq_fm (Iff (fm1, fm2)) (Le num) = false
  11.534 +  | eq_fm (Le num) (E fm) = false
  11.535 +  | eq_fm (E fm) (Le num) = false
  11.536 +  | eq_fm (Le num) (A fm) = false
  11.537 +  | eq_fm (A fm) (Le num) = false
  11.538 +  | eq_fm (Le num) (Closed nat) = false
  11.539 +  | eq_fm (Closed nat) (Le num) = false
  11.540 +  | eq_fm (Le num) (NClosed nat) = false
  11.541 +  | eq_fm (NClosed nat) (Le num) = false
  11.542 +  | eq_fm (Gt numa) (Ge num) = false
  11.543 +  | eq_fm (Ge numa) (Gt num) = false
  11.544 +  | eq_fm (Gt numa) (Eq num) = false
  11.545 +  | eq_fm (Eq numa) (Gt num) = false
  11.546 +  | eq_fm (Gt numa) (NEq num) = false
  11.547 +  | eq_fm (NEq numa) (Gt num) = false
  11.548 +  | eq_fm (Gt numa) (Dvd (inta, num)) = false
  11.549 +  | eq_fm (Dvd (inta, numa)) (Gt num) = false
  11.550 +  | eq_fm (Gt numa) (NDvd (inta, num)) = false
  11.551 +  | eq_fm (NDvd (inta, numa)) (Gt num) = false
  11.552 +  | eq_fm (Gt num) (Not fm) = false
  11.553 +  | eq_fm (Not fm) (Gt num) = false
  11.554 +  | eq_fm (Gt num) (And (fm1, fm2)) = false
  11.555 +  | eq_fm (And (fm1, fm2)) (Gt num) = false
  11.556 +  | eq_fm (Gt num) (Or (fm1, fm2)) = false
  11.557 +  | eq_fm (Or (fm1, fm2)) (Gt num) = false
  11.558 +  | eq_fm (Gt num) (Imp (fm1, fm2)) = false
  11.559 +  | eq_fm (Imp (fm1, fm2)) (Gt num) = false
  11.560 +  | eq_fm (Gt num) (Iff (fm1, fm2)) = false
  11.561 +  | eq_fm (Iff (fm1, fm2)) (Gt num) = false
  11.562 +  | eq_fm (Gt num) (E fm) = false
  11.563 +  | eq_fm (E fm) (Gt num) = false
  11.564 +  | eq_fm (Gt num) (A fm) = false
  11.565 +  | eq_fm (A fm) (Gt num) = false
  11.566 +  | eq_fm (Gt num) (Closed nat) = false
  11.567 +  | eq_fm (Closed nat) (Gt num) = false
  11.568 +  | eq_fm (Gt num) (NClosed nat) = false
  11.569 +  | eq_fm (NClosed nat) (Gt num) = false
  11.570 +  | eq_fm (Ge numa) (Eq num) = false
  11.571 +  | eq_fm (Eq numa) (Ge num) = false
  11.572 +  | eq_fm (Ge numa) (NEq num) = false
  11.573 +  | eq_fm (NEq numa) (Ge num) = false
  11.574 +  | eq_fm (Ge numa) (Dvd (inta, num)) = false
  11.575 +  | eq_fm (Dvd (inta, numa)) (Ge num) = false
  11.576 +  | eq_fm (Ge numa) (NDvd (inta, num)) = false
  11.577 +  | eq_fm (NDvd (inta, numa)) (Ge num) = false
  11.578 +  | eq_fm (Ge num) (Not fm) = false
  11.579 +  | eq_fm (Not fm) (Ge num) = false
  11.580 +  | eq_fm (Ge num) (And (fm1, fm2)) = false
  11.581 +  | eq_fm (And (fm1, fm2)) (Ge num) = false
  11.582 +  | eq_fm (Ge num) (Or (fm1, fm2)) = false
  11.583 +  | eq_fm (Or (fm1, fm2)) (Ge num) = false
  11.584 +  | eq_fm (Ge num) (Imp (fm1, fm2)) = false
  11.585 +  | eq_fm (Imp (fm1, fm2)) (Ge num) = false
  11.586 +  | eq_fm (Ge num) (Iff (fm1, fm2)) = false
  11.587 +  | eq_fm (Iff (fm1, fm2)) (Ge num) = false
  11.588 +  | eq_fm (Ge num) (E fm) = false
  11.589 +  | eq_fm (E fm) (Ge num) = false
  11.590 +  | eq_fm (Ge num) (A fm) = false
  11.591 +  | eq_fm (A fm) (Ge num) = false
  11.592 +  | eq_fm (Ge num) (Closed nat) = false
  11.593 +  | eq_fm (Closed nat) (Ge num) = false
  11.594 +  | eq_fm (Ge num) (NClosed nat) = false
  11.595 +  | eq_fm (NClosed nat) (Ge num) = false
  11.596 +  | eq_fm (Eq numa) (NEq num) = false
  11.597 +  | eq_fm (NEq numa) (Eq num) = false
  11.598 +  | eq_fm (Eq numa) (Dvd (inta, num)) = false
  11.599 +  | eq_fm (Dvd (inta, numa)) (Eq num) = false
  11.600 +  | eq_fm (Eq numa) (NDvd (inta, num)) = false
  11.601 +  | eq_fm (NDvd (inta, numa)) (Eq num) = false
  11.602 +  | eq_fm (Eq num) (Not fm) = false
  11.603 +  | eq_fm (Not fm) (Eq num) = false
  11.604 +  | eq_fm (Eq num) (And (fm1, fm2)) = false
  11.605 +  | eq_fm (And (fm1, fm2)) (Eq num) = false
  11.606 +  | eq_fm (Eq num) (Or (fm1, fm2)) = false
  11.607 +  | eq_fm (Or (fm1, fm2)) (Eq num) = false
  11.608 +  | eq_fm (Eq num) (Imp (fm1, fm2)) = false
  11.609 +  | eq_fm (Imp (fm1, fm2)) (Eq num) = false
  11.610 +  | eq_fm (Eq num) (Iff (fm1, fm2)) = false
  11.611 +  | eq_fm (Iff (fm1, fm2)) (Eq num) = false
  11.612 +  | eq_fm (Eq num) (E fm) = false
  11.613 +  | eq_fm (E fm) (Eq num) = false
  11.614 +  | eq_fm (Eq num) (A fm) = false
  11.615 +  | eq_fm (A fm) (Eq num) = false
  11.616 +  | eq_fm (Eq num) (Closed nat) = false
  11.617 +  | eq_fm (Closed nat) (Eq num) = false
  11.618 +  | eq_fm (Eq num) (NClosed nat) = false
  11.619 +  | eq_fm (NClosed nat) (Eq num) = false
  11.620 +  | eq_fm (NEq numa) (Dvd (inta, num)) = false
  11.621 +  | eq_fm (Dvd (inta, numa)) (NEq num) = false
  11.622 +  | eq_fm (NEq numa) (NDvd (inta, num)) = false
  11.623 +  | eq_fm (NDvd (inta, numa)) (NEq num) = false
  11.624 +  | eq_fm (NEq num) (Not fm) = false
  11.625 +  | eq_fm (Not fm) (NEq num) = false
  11.626 +  | eq_fm (NEq num) (And (fm1, fm2)) = false
  11.627 +  | eq_fm (And (fm1, fm2)) (NEq num) = false
  11.628 +  | eq_fm (NEq num) (Or (fm1, fm2)) = false
  11.629 +  | eq_fm (Or (fm1, fm2)) (NEq num) = false
  11.630 +  | eq_fm (NEq num) (Imp (fm1, fm2)) = false
  11.631 +  | eq_fm (Imp (fm1, fm2)) (NEq num) = false
  11.632 +  | eq_fm (NEq num) (Iff (fm1, fm2)) = false
  11.633 +  | eq_fm (Iff (fm1, fm2)) (NEq num) = false
  11.634 +  | eq_fm (NEq num) (E fm) = false
  11.635 +  | eq_fm (E fm) (NEq num) = false
  11.636 +  | eq_fm (NEq num) (A fm) = false
  11.637 +  | eq_fm (A fm) (NEq num) = false
  11.638 +  | eq_fm (NEq num) (Closed nat) = false
  11.639 +  | eq_fm (Closed nat) (NEq num) = false
  11.640 +  | eq_fm (NEq num) (NClosed nat) = false
  11.641 +  | eq_fm (NClosed nat) (NEq num) = false
  11.642 +  | eq_fm (Dvd (intaa, numa)) (NDvd (inta, num)) = false
  11.643 +  | eq_fm (NDvd (intaa, numa)) (Dvd (inta, num)) = false
  11.644 +  | eq_fm (Dvd (inta, num)) (Not fm) = false
  11.645 +  | eq_fm (Not fm) (Dvd (inta, num)) = false
  11.646 +  | eq_fm (Dvd (inta, num)) (And (fm1, fm2)) = false
  11.647 +  | eq_fm (And (fm1, fm2)) (Dvd (inta, num)) = false
  11.648 +  | eq_fm (Dvd (inta, num)) (Or (fm1, fm2)) = false
  11.649 +  | eq_fm (Or (fm1, fm2)) (Dvd (inta, num)) = false
  11.650 +  | eq_fm (Dvd (inta, num)) (Imp (fm1, fm2)) = false
  11.651 +  | eq_fm (Imp (fm1, fm2)) (Dvd (inta, num)) = false
  11.652 +  | eq_fm (Dvd (inta, num)) (Iff (fm1, fm2)) = false
  11.653 +  | eq_fm (Iff (fm1, fm2)) (Dvd (inta, num)) = false
  11.654 +  | eq_fm (Dvd (inta, num)) (E fm) = false
  11.655 +  | eq_fm (E fm) (Dvd (inta, num)) = false
  11.656 +  | eq_fm (Dvd (inta, num)) (A fm) = false
  11.657 +  | eq_fm (A fm) (Dvd (inta, num)) = false
  11.658 +  | eq_fm (Dvd (inta, num)) (Closed nat) = false
  11.659 +  | eq_fm (Closed nat) (Dvd (inta, num)) = false
  11.660 +  | eq_fm (Dvd (inta, num)) (NClosed nat) = false
  11.661 +  | eq_fm (NClosed nat) (Dvd (inta, num)) = false
  11.662 +  | eq_fm (NDvd (inta, num)) (Not fm) = false
  11.663 +  | eq_fm (Not fm) (NDvd (inta, num)) = false
  11.664 +  | eq_fm (NDvd (inta, num)) (And (fm1, fm2)) = false
  11.665 +  | eq_fm (And (fm1, fm2)) (NDvd (inta, num)) = false
  11.666 +  | eq_fm (NDvd (inta, num)) (Or (fm1, fm2)) = false
  11.667 +  | eq_fm (Or (fm1, fm2)) (NDvd (inta, num)) = false
  11.668 +  | eq_fm (NDvd (inta, num)) (Imp (fm1, fm2)) = false
  11.669 +  | eq_fm (Imp (fm1, fm2)) (NDvd (inta, num)) = false
  11.670 +  | eq_fm (NDvd (inta, num)) (Iff (fm1, fm2)) = false
  11.671 +  | eq_fm (Iff (fm1, fm2)) (NDvd (inta, num)) = false
  11.672 +  | eq_fm (NDvd (inta, num)) (E fm) = false
  11.673 +  | eq_fm (E fm) (NDvd (inta, num)) = false
  11.674 +  | eq_fm (NDvd (inta, num)) (A fm) = false
  11.675 +  | eq_fm (A fm) (NDvd (inta, num)) = false
  11.676 +  | eq_fm (NDvd (inta, num)) (Closed nat) = false
  11.677 +  | eq_fm (Closed nat) (NDvd (inta, num)) = false
  11.678 +  | eq_fm (NDvd (inta, num)) (NClosed nat) = false
  11.679 +  | eq_fm (NClosed nat) (NDvd (inta, num)) = false
  11.680 +  | eq_fm (Not fm) (And (fm1, fm2)) = false
  11.681 +  | eq_fm (And (fm1, fm2)) (Not fm) = false
  11.682 +  | eq_fm (Not fm) (Or (fm1, fm2)) = false
  11.683 +  | eq_fm (Or (fm1, fm2)) (Not fm) = false
  11.684 +  | eq_fm (Not fm) (Imp (fm1, fm2)) = false
  11.685 +  | eq_fm (Imp (fm1, fm2)) (Not fm) = false
  11.686 +  | eq_fm (Not fm) (Iff (fm1, fm2)) = false
  11.687 +  | eq_fm (Iff (fm1, fm2)) (Not fm) = false
  11.688 +  | eq_fm (Not fma) (E fm) = false
  11.689 +  | eq_fm (E fma) (Not fm) = false
  11.690 +  | eq_fm (Not fma) (A fm) = false
  11.691 +  | eq_fm (A fma) (Not fm) = false
  11.692 +  | eq_fm (Not fm) (Closed nat) = false
  11.693 +  | eq_fm (Closed nat) (Not fm) = false
  11.694 +  | eq_fm (Not fm) (NClosed nat) = false
  11.695 +  | eq_fm (NClosed nat) (Not fm) = false
  11.696 +  | eq_fm (And (fm1a, fm2a)) (Or (fm1, fm2)) = false
  11.697 +  | eq_fm (Or (fm1a, fm2a)) (And (fm1, fm2)) = false
  11.698 +  | eq_fm (And (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  11.699 +  | eq_fm (Imp (fm1a, fm2a)) (And (fm1, fm2)) = false
  11.700 +  | eq_fm (And (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  11.701 +  | eq_fm (Iff (fm1a, fm2a)) (And (fm1, fm2)) = false
  11.702 +  | eq_fm (And (fm1, fm2)) (E fm) = false
  11.703 +  | eq_fm (E fm) (And (fm1, fm2)) = false
  11.704 +  | eq_fm (And (fm1, fm2)) (A fm) = false
  11.705 +  | eq_fm (A fm) (And (fm1, fm2)) = false
  11.706 +  | eq_fm (And (fm1, fm2)) (Closed nat) = false
  11.707 +  | eq_fm (Closed nat) (And (fm1, fm2)) = false
  11.708 +  | eq_fm (And (fm1, fm2)) (NClosed nat) = false
  11.709 +  | eq_fm (NClosed nat) (And (fm1, fm2)) = false
  11.710 +  | eq_fm (Or (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  11.711 +  | eq_fm (Imp (fm1a, fm2a)) (Or (fm1, fm2)) = false
  11.712 +  | eq_fm (Or (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  11.713 +  | eq_fm (Iff (fm1a, fm2a)) (Or (fm1, fm2)) = false
  11.714 +  | eq_fm (Or (fm1, fm2)) (E fm) = false
  11.715 +  | eq_fm (E fm) (Or (fm1, fm2)) = false
  11.716 +  | eq_fm (Or (fm1, fm2)) (A fm) = false
  11.717 +  | eq_fm (A fm) (Or (fm1, fm2)) = false
  11.718 +  | eq_fm (Or (fm1, fm2)) (Closed nat) = false
  11.719 +  | eq_fm (Closed nat) (Or (fm1, fm2)) = false
  11.720 +  | eq_fm (Or (fm1, fm2)) (NClosed nat) = false
  11.721 +  | eq_fm (NClosed nat) (Or (fm1, fm2)) = false
  11.722 +  | eq_fm (Imp (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  11.723 +  | eq_fm (Iff (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  11.724 +  | eq_fm (Imp (fm1, fm2)) (E fm) = false
  11.725 +  | eq_fm (E fm) (Imp (fm1, fm2)) = false
  11.726 +  | eq_fm (Imp (fm1, fm2)) (A fm) = false
  11.727 +  | eq_fm (A fm) (Imp (fm1, fm2)) = false
  11.728 +  | eq_fm (Imp (fm1, fm2)) (Closed nat) = false
  11.729 +  | eq_fm (Closed nat) (Imp (fm1, fm2)) = false
  11.730 +  | eq_fm (Imp (fm1, fm2)) (NClosed nat) = false
  11.731 +  | eq_fm (NClosed nat) (Imp (fm1, fm2)) = false
  11.732 +  | eq_fm (Iff (fm1, fm2)) (E fm) = false
  11.733 +  | eq_fm (E fm) (Iff (fm1, fm2)) = false
  11.734 +  | eq_fm (Iff (fm1, fm2)) (A fm) = false
  11.735 +  | eq_fm (A fm) (Iff (fm1, fm2)) = false
  11.736 +  | eq_fm (Iff (fm1, fm2)) (Closed nat) = false
  11.737 +  | eq_fm (Closed nat) (Iff (fm1, fm2)) = false
  11.738 +  | eq_fm (Iff (fm1, fm2)) (NClosed nat) = false
  11.739 +  | eq_fm (NClosed nat) (Iff (fm1, fm2)) = false
  11.740 +  | eq_fm (E fma) (A fm) = false
  11.741 +  | eq_fm (A fma) (E fm) = false
  11.742 +  | eq_fm (E fm) (Closed nat) = false
  11.743 +  | eq_fm (Closed nat) (E fm) = false
  11.744 +  | eq_fm (E fm) (NClosed nat) = false
  11.745 +  | eq_fm (NClosed nat) (E fm) = false
  11.746 +  | eq_fm (A fm) (Closed nat) = false
  11.747 +  | eq_fm (Closed nat) (A fm) = false
  11.748 +  | eq_fm (A fm) (NClosed nat) = false
  11.749 +  | eq_fm (NClosed nat) (A fm) = false
  11.750 +  | eq_fm (Closed nata) (NClosed nat) = false
  11.751 +  | eq_fm (NClosed nata) (Closed nat) = false;
  11.752 +
  11.753 +fun djf f p q =
  11.754 +  (if eq_fm q T then T
  11.755 +    else (if eq_fm q F then f p
  11.756 +           else (case f p of T => T | F => q | Lt _ => Or (f p, q)
  11.757 +                  | Le _ => Or (f p, q) | Gt _ => Or (f p, q)
  11.758 +                  | Ge _ => Or (f p, q) | Eq _ => Or (f p, q)
  11.759 +                  | NEq _ => Or (f p, q) | Dvd (_, _) => Or (f p, q)
  11.760 +                  | NDvd (_, _) => Or (f p, q) | Not _ => Or (f p, q)
  11.761 +                  | And (_, _) => Or (f p, q) | Or (_, _) => Or (f p, q)
  11.762 +                  | Imp (_, _) => Or (f p, q) | Iff (_, _) => Or (f p, q)
  11.763 +                  | E _ => Or (f p, q) | A _ => Or (f p, q)
  11.764 +                  | Closed _ => Or (f p, q) | NClosed _ => Or (f p, q))));
  11.765 +
  11.766 +fun foldr f [] a = a
  11.767 +  | foldr f (x :: xs) a = f x (foldr f xs a);
  11.768 +
  11.769 +fun evaldjf f ps = foldr (djf f) ps F;
  11.770 +
  11.771 +fun dj f p = evaldjf f (disjuncts p);
  11.772 +
  11.773 +fun disj p q =
  11.774 +  (if eq_fm p T orelse eq_fm q T then T
  11.775 +    else (if eq_fm p F then q else (if eq_fm q F then p else Or (p, q))));
  11.776 +
  11.777 +fun minus_nat n m = IntInf.max (0, (IntInf.- (n, m)));
  11.778 +
  11.779 +fun decrnum (Bound n) = Bound (minus_nat n (1 : IntInf.int))
  11.780 +  | decrnum (Neg a) = Neg (decrnum a)
  11.781 +  | decrnum (Add (a, b)) = Add (decrnum a, decrnum b)
  11.782 +  | decrnum (Sub (a, b)) = Sub (decrnum a, decrnum b)
  11.783 +  | decrnum (Mul (c, a)) = Mul (c, decrnum a)
  11.784 +  | decrnum (Cn (n, i, a)) = Cn (minus_nat n (1 : IntInf.int), i, decrnum a)
  11.785 +  | decrnum (C u) = C u;
  11.786 +
  11.787 +fun decr (Lt a) = Lt (decrnum a)
  11.788 +  | decr (Le a) = Le (decrnum a)
  11.789 +  | decr (Gt a) = Gt (decrnum a)
  11.790 +  | decr (Ge a) = Ge (decrnum a)
  11.791 +  | decr (Eq a) = Eq (decrnum a)
  11.792 +  | decr (NEq a) = NEq (decrnum a)
  11.793 +  | decr (Dvd (i, a)) = Dvd (i, decrnum a)
  11.794 +  | decr (NDvd (i, a)) = NDvd (i, decrnum a)
  11.795 +  | decr (Not p) = Not (decr p)
  11.796 +  | decr (And (p, q)) = And (decr p, decr q)
  11.797 +  | decr (Or (p, q)) = Or (decr p, decr q)
  11.798 +  | decr (Imp (p, q)) = Imp (decr p, decr q)
  11.799 +  | decr (Iff (p, q)) = Iff (decr p, decr q)
  11.800 +  | decr T = T
  11.801 +  | decr F = F
  11.802 +  | decr (E ao) = E ao
  11.803 +  | decr (A ap) = A ap
  11.804 +  | decr (Closed aq) = Closed aq
  11.805 +  | decr (NClosed ar) = NClosed ar;
  11.806 +
  11.807 +fun concat_map f [] = []
  11.808 +  | concat_map f (x :: xs) = append (f x) (concat_map f xs);
  11.809 +
  11.810 +fun numsubst0 t (C c) = C c
  11.811 +  | numsubst0 t (Bound n) =
  11.812 +    (if ((n : IntInf.int) = (0 : IntInf.int)) then t else Bound n)
  11.813 +  | numsubst0 t (Neg a) = Neg (numsubst0 t a)
  11.814 +  | numsubst0 t (Add (a, b)) = Add (numsubst0 t a, numsubst0 t b)
  11.815 +  | numsubst0 t (Sub (a, b)) = Sub (numsubst0 t a, numsubst0 t b)
  11.816 +  | numsubst0 t (Mul (i, a)) = Mul (i, numsubst0 t a)
  11.817 +  | numsubst0 t (Cn (v, i, a)) =
  11.818 +    (if ((v : IntInf.int) = (0 : IntInf.int))
  11.819 +      then Add (Mul (i, t), numsubst0 t a)
  11.820 +      else Cn (suc (minus_nat v (1 : IntInf.int)), i, numsubst0 t a));
  11.821 +
  11.822 +fun subst0 t T = T
  11.823 +  | subst0 t F = F
  11.824 +  | subst0 t (Lt a) = Lt (numsubst0 t a)
  11.825 +  | subst0 t (Le a) = Le (numsubst0 t a)
  11.826 +  | subst0 t (Gt a) = Gt (numsubst0 t a)
  11.827 +  | subst0 t (Ge a) = Ge (numsubst0 t a)
  11.828 +  | subst0 t (Eq a) = Eq (numsubst0 t a)
  11.829 +  | subst0 t (NEq a) = NEq (numsubst0 t a)
  11.830 +  | subst0 t (Dvd (i, a)) = Dvd (i, numsubst0 t a)
  11.831 +  | subst0 t (NDvd (i, a)) = NDvd (i, numsubst0 t a)
  11.832 +  | subst0 t (Not p) = Not (subst0 t p)
  11.833 +  | subst0 t (And (p, q)) = And (subst0 t p, subst0 t q)
  11.834 +  | subst0 t (Or (p, q)) = Or (subst0 t p, subst0 t q)
  11.835 +  | subst0 t (Imp (p, q)) = Imp (subst0 t p, subst0 t q)
  11.836 +  | subst0 t (Iff (p, q)) = Iff (subst0 t p, subst0 t q)
  11.837 +  | subst0 t (Closed p) = Closed p
  11.838 +  | subst0 t (NClosed p) = NClosed p;
  11.839 +
  11.840 +fun minusinf (And (p, q)) = And (minusinf p, minusinf q)
  11.841 +  | minusinf (Or (p, q)) = Or (minusinf p, minusinf q)
  11.842 +  | minusinf T = T
  11.843 +  | minusinf F = F
  11.844 +  | minusinf (Lt (C bo)) = Lt (C bo)
  11.845 +  | minusinf (Lt (Bound bp)) = Lt (Bound bp)
  11.846 +  | minusinf (Lt (Neg bt)) = Lt (Neg bt)
  11.847 +  | minusinf (Lt (Add (bu, bv))) = Lt (Add (bu, bv))
  11.848 +  | minusinf (Lt (Sub (bw, bx))) = Lt (Sub (bw, bx))
  11.849 +  | minusinf (Lt (Mul (by, bz))) = Lt (Mul (by, bz))
  11.850 +  | minusinf (Le (C co)) = Le (C co)
  11.851 +  | minusinf (Le (Bound cp)) = Le (Bound cp)
  11.852 +  | minusinf (Le (Neg ct)) = Le (Neg ct)
  11.853 +  | minusinf (Le (Add (cu, cv))) = Le (Add (cu, cv))
  11.854 +  | minusinf (Le (Sub (cw, cx))) = Le (Sub (cw, cx))
  11.855 +  | minusinf (Le (Mul (cy, cz))) = Le (Mul (cy, cz))
  11.856 +  | minusinf (Gt (C doa)) = Gt (C doa)
  11.857 +  | minusinf (Gt (Bound dp)) = Gt (Bound dp)
  11.858 +  | minusinf (Gt (Neg dt)) = Gt (Neg dt)
  11.859 +  | minusinf (Gt (Add (du, dv))) = Gt (Add (du, dv))
  11.860 +  | minusinf (Gt (Sub (dw, dx))) = Gt (Sub (dw, dx))
  11.861 +  | minusinf (Gt (Mul (dy, dz))) = Gt (Mul (dy, dz))
  11.862 +  | minusinf (Ge (C eo)) = Ge (C eo)
  11.863 +  | minusinf (Ge (Bound ep)) = Ge (Bound ep)
  11.864 +  | minusinf (Ge (Neg et)) = Ge (Neg et)
  11.865 +  | minusinf (Ge (Add (eu, ev))) = Ge (Add (eu, ev))
  11.866 +  | minusinf (Ge (Sub (ew, ex))) = Ge (Sub (ew, ex))
  11.867 +  | minusinf (Ge (Mul (ey, ez))) = Ge (Mul (ey, ez))
  11.868 +  | minusinf (Eq (C fo)) = Eq (C fo)
  11.869 +  | minusinf (Eq (Bound fp)) = Eq (Bound fp)
  11.870 +  | minusinf (Eq (Neg ft)) = Eq (Neg ft)
  11.871 +  | minusinf (Eq (Add (fu, fv))) = Eq (Add (fu, fv))
  11.872 +  | minusinf (Eq (Sub (fw, fx))) = Eq (Sub (fw, fx))
  11.873 +  | minusinf (Eq (Mul (fy, fz))) = Eq (Mul (fy, fz))
  11.874 +  | minusinf (NEq (C go)) = NEq (C go)
  11.875 +  | minusinf (NEq (Bound gp)) = NEq (Bound gp)
  11.876 +  | minusinf (NEq (Neg gt)) = NEq (Neg gt)
  11.877 +  | minusinf (NEq (Add (gu, gv))) = NEq (Add (gu, gv))
  11.878 +  | minusinf (NEq (Sub (gw, gx))) = NEq (Sub (gw, gx))
  11.879 +  | minusinf (NEq (Mul (gy, gz))) = NEq (Mul (gy, gz))
  11.880 +  | minusinf (Dvd (aa, ab)) = Dvd (aa, ab)
  11.881 +  | minusinf (NDvd (ac, ad)) = NDvd (ac, ad)
  11.882 +  | minusinf (Not ae) = Not ae
  11.883 +  | minusinf (Imp (aj, ak)) = Imp (aj, ak)
  11.884 +  | minusinf (Iff (al, am)) = Iff (al, am)
  11.885 +  | minusinf (E an) = E an
  11.886 +  | minusinf (A ao) = A ao
  11.887 +  | minusinf (Closed ap) = Closed ap
  11.888 +  | minusinf (NClosed aq) = NClosed aq
  11.889 +  | minusinf (Lt (Cn (cm, c, e))) =
  11.890 +    (if ((cm : IntInf.int) = (0 : IntInf.int)) then T
  11.891 +      else Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e)))
  11.892 +  | minusinf (Le (Cn (dm, c, e))) =
  11.893 +    (if ((dm : IntInf.int) = (0 : IntInf.int)) then T
  11.894 +      else Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e)))
  11.895 +  | minusinf (Gt (Cn (em, c, e))) =
  11.896 +    (if ((em : IntInf.int) = (0 : IntInf.int)) then F
  11.897 +      else Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e)))
  11.898 +  | minusinf (Ge (Cn (fm, c, e))) =
  11.899 +    (if ((fm : IntInf.int) = (0 : IntInf.int)) then F
  11.900 +      else Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e)))
  11.901 +  | minusinf (Eq (Cn (gm, c, e))) =
  11.902 +    (if ((gm : IntInf.int) = (0 : IntInf.int)) then F
  11.903 +      else Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e)))
  11.904 +  | minusinf (NEq (Cn (hm, c, e))) =
  11.905 +    (if ((hm : IntInf.int) = (0 : IntInf.int)) then T
  11.906 +      else NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e)));
  11.907 +
  11.908 +val eq_int = {eq = (fn a => fn b => ((a : IntInf.int) = b))} : IntInf.int eq;
  11.909 +
  11.910 +val zero_int : IntInf.int = (0 : IntInf.int);
  11.911 +
  11.912 +type 'a zero = {zero : 'a};
  11.913 +val zero = #zero : 'a zero -> 'a;
  11.914 +
  11.915 +val zero_inta = {zero = zero_int} : IntInf.int zero;
  11.916 +
  11.917 +type 'a times = {times : 'a -> 'a -> 'a};
  11.918 +val times = #times : 'a times -> 'a -> 'a -> 'a;
  11.919 +
  11.920 +type 'a no_zero_divisors =
  11.921 +  {times_no_zero_divisors : 'a times, zero_no_zero_divisors : 'a zero};
  11.922 +val times_no_zero_divisors = #times_no_zero_divisors :
  11.923 +  'a no_zero_divisors -> 'a times;
  11.924 +val zero_no_zero_divisors = #zero_no_zero_divisors :
  11.925 +  'a no_zero_divisors -> 'a zero;
  11.926 +
  11.927 +val times_int = {times = (fn a => fn b => IntInf.* (a, b))} : IntInf.int times;
  11.928 +
  11.929 +val no_zero_divisors_int =
  11.930 +  {times_no_zero_divisors = times_int, zero_no_zero_divisors = zero_inta} :
  11.931 +  IntInf.int no_zero_divisors;
  11.932 +
  11.933 +type 'a one = {one : 'a};
  11.934 +val one = #one : 'a one -> 'a;
  11.935 +
  11.936 +type 'a zero_neq_one = {one_zero_neq_one : 'a one, zero_zero_neq_one : 'a zero};
  11.937 +val one_zero_neq_one = #one_zero_neq_one : 'a zero_neq_one -> 'a one;
  11.938 +val zero_zero_neq_one = #zero_zero_neq_one : 'a zero_neq_one -> 'a zero;
  11.939 +
  11.940 +type 'a semigroup_mult = {times_semigroup_mult : 'a times};
  11.941 +val times_semigroup_mult = #times_semigroup_mult :
  11.942 +  'a semigroup_mult -> 'a times;
  11.943 +
  11.944 +type 'a plus = {plus : 'a -> 'a -> 'a};
  11.945 +val plus = #plus : 'a plus -> 'a -> 'a -> 'a;
  11.946 +
  11.947 +type 'a semigroup_add = {plus_semigroup_add : 'a plus};
  11.948 +val plus_semigroup_add = #plus_semigroup_add : 'a semigroup_add -> 'a plus;
  11.949 +
  11.950 +type 'a ab_semigroup_add = {semigroup_add_ab_semigroup_add : 'a semigroup_add};
  11.951 +val semigroup_add_ab_semigroup_add = #semigroup_add_ab_semigroup_add :
  11.952 +  'a ab_semigroup_add -> 'a semigroup_add;
  11.953 +
  11.954 +type 'a semiring =
  11.955 +  {ab_semigroup_add_semiring : 'a ab_semigroup_add,
  11.956 +    semigroup_mult_semiring : 'a semigroup_mult};
  11.957 +val ab_semigroup_add_semiring = #ab_semigroup_add_semiring :
  11.958 +  'a semiring -> 'a ab_semigroup_add;
  11.959 +val semigroup_mult_semiring = #semigroup_mult_semiring :
  11.960 +  'a semiring -> 'a semigroup_mult;
  11.961 +
  11.962 +type 'a mult_zero = {times_mult_zero : 'a times, zero_mult_zero : 'a zero};
  11.963 +val times_mult_zero = #times_mult_zero : 'a mult_zero -> 'a times;
  11.964 +val zero_mult_zero = #zero_mult_zero : 'a mult_zero -> 'a zero;
  11.965 +
  11.966 +type 'a monoid_add =
  11.967 +  {semigroup_add_monoid_add : 'a semigroup_add, zero_monoid_add : 'a zero};
  11.968 +val semigroup_add_monoid_add = #semigroup_add_monoid_add :
  11.969 +  'a monoid_add -> 'a semigroup_add;
  11.970 +val zero_monoid_add = #zero_monoid_add : 'a monoid_add -> 'a zero;
  11.971 +
  11.972 +type 'a comm_monoid_add =
  11.973 +  {ab_semigroup_add_comm_monoid_add : 'a ab_semigroup_add,
  11.974 +    monoid_add_comm_monoid_add : 'a monoid_add};
  11.975 +val ab_semigroup_add_comm_monoid_add = #ab_semigroup_add_comm_monoid_add :
  11.976 +  'a comm_monoid_add -> 'a ab_semigroup_add;
  11.977 +val monoid_add_comm_monoid_add = #monoid_add_comm_monoid_add :
  11.978 +  'a comm_monoid_add -> 'a monoid_add;
  11.979 +
  11.980 +type 'a semiring_0 =
  11.981 +  {comm_monoid_add_semiring_0 : 'a comm_monoid_add,
  11.982 +    mult_zero_semiring_0 : 'a mult_zero, semiring_semiring_0 : 'a semiring};
  11.983 +val comm_monoid_add_semiring_0 = #comm_monoid_add_semiring_0 :
  11.984 +  'a semiring_0 -> 'a comm_monoid_add;
  11.985 +val mult_zero_semiring_0 = #mult_zero_semiring_0 :
  11.986 +  'a semiring_0 -> 'a mult_zero;
  11.987 +val semiring_semiring_0 = #semiring_semiring_0 : 'a semiring_0 -> 'a semiring;
  11.988 +
  11.989 +type 'a power = {one_power : 'a one, times_power : 'a times};
  11.990 +val one_power = #one_power : 'a power -> 'a one;
  11.991 +val times_power = #times_power : 'a power -> 'a times;
  11.992 +
  11.993 +type 'a monoid_mult =
  11.994 +  {semigroup_mult_monoid_mult : 'a semigroup_mult,
  11.995 +    power_monoid_mult : 'a power};
  11.996 +val semigroup_mult_monoid_mult = #semigroup_mult_monoid_mult :
  11.997 +  'a monoid_mult -> 'a semigroup_mult;
  11.998 +val power_monoid_mult = #power_monoid_mult : 'a monoid_mult -> 'a power;
  11.999 +
 11.1000 +type 'a semiring_1 =
 11.1001 +  {monoid_mult_semiring_1 : 'a monoid_mult,
 11.1002 +    semiring_0_semiring_1 : 'a semiring_0,
 11.1003 +    zero_neq_one_semiring_1 : 'a zero_neq_one};
 11.1004 +val monoid_mult_semiring_1 = #monoid_mult_semiring_1 :
 11.1005 +  'a semiring_1 -> 'a monoid_mult;
 11.1006 +val semiring_0_semiring_1 = #semiring_0_semiring_1 :
 11.1007 +  'a semiring_1 -> 'a semiring_0;
 11.1008 +val zero_neq_one_semiring_1 = #zero_neq_one_semiring_1 :
 11.1009 +  'a semiring_1 -> 'a zero_neq_one;
 11.1010 +
 11.1011 +type 'a cancel_semigroup_add =
 11.1012 +  {semigroup_add_cancel_semigroup_add : 'a semigroup_add};
 11.1013 +val semigroup_add_cancel_semigroup_add = #semigroup_add_cancel_semigroup_add :
 11.1014 +  'a cancel_semigroup_add -> 'a semigroup_add;
 11.1015 +
 11.1016 +type 'a cancel_ab_semigroup_add =
 11.1017 +  {ab_semigroup_add_cancel_ab_semigroup_add : 'a ab_semigroup_add,
 11.1018 +    cancel_semigroup_add_cancel_ab_semigroup_add : 'a cancel_semigroup_add};
 11.1019 +val ab_semigroup_add_cancel_ab_semigroup_add =
 11.1020 +  #ab_semigroup_add_cancel_ab_semigroup_add :
 11.1021 +  'a cancel_ab_semigroup_add -> 'a ab_semigroup_add;
 11.1022 +val cancel_semigroup_add_cancel_ab_semigroup_add =
 11.1023 +  #cancel_semigroup_add_cancel_ab_semigroup_add :
 11.1024 +  'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add;
 11.1025 +
 11.1026 +type 'a cancel_comm_monoid_add =
 11.1027 +  {cancel_ab_semigroup_add_cancel_comm_monoid_add : 'a cancel_ab_semigroup_add,
 11.1028 +    comm_monoid_add_cancel_comm_monoid_add : 'a comm_monoid_add};
 11.1029 +val cancel_ab_semigroup_add_cancel_comm_monoid_add =
 11.1030 +  #cancel_ab_semigroup_add_cancel_comm_monoid_add :
 11.1031 +  'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add;
 11.1032 +val comm_monoid_add_cancel_comm_monoid_add =
 11.1033 +  #comm_monoid_add_cancel_comm_monoid_add :
 11.1034 +  'a cancel_comm_monoid_add -> 'a comm_monoid_add;
 11.1035 +
 11.1036 +type 'a semiring_0_cancel =
 11.1037 +  {cancel_comm_monoid_add_semiring_0_cancel : 'a cancel_comm_monoid_add,
 11.1038 +    semiring_0_semiring_0_cancel : 'a semiring_0};
 11.1039 +val cancel_comm_monoid_add_semiring_0_cancel =
 11.1040 +  #cancel_comm_monoid_add_semiring_0_cancel :
 11.1041 +  'a semiring_0_cancel -> 'a cancel_comm_monoid_add;
 11.1042 +val semiring_0_semiring_0_cancel = #semiring_0_semiring_0_cancel :
 11.1043 +  'a semiring_0_cancel -> 'a semiring_0;
 11.1044 +
 11.1045 +type 'a semiring_1_cancel =
 11.1046 +  {semiring_0_cancel_semiring_1_cancel : 'a semiring_0_cancel,
 11.1047 +    semiring_1_semiring_1_cancel : 'a semiring_1};
 11.1048 +val semiring_0_cancel_semiring_1_cancel = #semiring_0_cancel_semiring_1_cancel :
 11.1049 +  'a semiring_1_cancel -> 'a semiring_0_cancel;
 11.1050 +val semiring_1_semiring_1_cancel = #semiring_1_semiring_1_cancel :
 11.1051 +  'a semiring_1_cancel -> 'a semiring_1;
 11.1052 +
 11.1053 +type 'a dvd = {times_dvd : 'a times};
 11.1054 +val times_dvd = #times_dvd : 'a dvd -> 'a times;
 11.1055 +
 11.1056 +type 'a ab_semigroup_mult =
 11.1057 +  {semigroup_mult_ab_semigroup_mult : 'a semigroup_mult};
 11.1058 +val semigroup_mult_ab_semigroup_mult = #semigroup_mult_ab_semigroup_mult :
 11.1059 +  'a ab_semigroup_mult -> 'a semigroup_mult;
 11.1060 +
 11.1061 +type 'a comm_semiring =
 11.1062 +  {ab_semigroup_mult_comm_semiring : 'a ab_semigroup_mult,
 11.1063 +    semiring_comm_semiring : 'a semiring};
 11.1064 +val ab_semigroup_mult_comm_semiring = #ab_semigroup_mult_comm_semiring :
 11.1065 +  'a comm_semiring -> 'a ab_semigroup_mult;
 11.1066 +val semiring_comm_semiring = #semiring_comm_semiring :
 11.1067 +  'a comm_semiring -> 'a semiring;
 11.1068 +
 11.1069 +type 'a comm_semiring_0 =
 11.1070 +  {comm_semiring_comm_semiring_0 : 'a comm_semiring,
 11.1071 +    semiring_0_comm_semiring_0 : 'a semiring_0};
 11.1072 +val comm_semiring_comm_semiring_0 = #comm_semiring_comm_semiring_0 :
 11.1073 +  'a comm_semiring_0 -> 'a comm_semiring;
 11.1074 +val semiring_0_comm_semiring_0 = #semiring_0_comm_semiring_0 :
 11.1075 +  'a comm_semiring_0 -> 'a semiring_0;
 11.1076 +
 11.1077 +type 'a comm_monoid_mult =
 11.1078 +  {ab_semigroup_mult_comm_monoid_mult : 'a ab_semigroup_mult,
 11.1079 +    monoid_mult_comm_monoid_mult : 'a monoid_mult};
 11.1080 +val ab_semigroup_mult_comm_monoid_mult = #ab_semigroup_mult_comm_monoid_mult :
 11.1081 +  'a comm_monoid_mult -> 'a ab_semigroup_mult;
 11.1082 +val monoid_mult_comm_monoid_mult = #monoid_mult_comm_monoid_mult :
 11.1083 +  'a comm_monoid_mult -> 'a monoid_mult;
 11.1084 +
 11.1085 +type 'a comm_semiring_1 =
 11.1086 +  {comm_monoid_mult_comm_semiring_1 : 'a comm_monoid_mult,
 11.1087 +    comm_semiring_0_comm_semiring_1 : 'a comm_semiring_0,
 11.1088 +    dvd_comm_semiring_1 : 'a dvd, semiring_1_comm_semiring_1 : 'a semiring_1};
 11.1089 +val comm_monoid_mult_comm_semiring_1 = #comm_monoid_mult_comm_semiring_1 :
 11.1090 +  'a comm_semiring_1 -> 'a comm_monoid_mult;
 11.1091 +val comm_semiring_0_comm_semiring_1 = #comm_semiring_0_comm_semiring_1 :
 11.1092 +  'a comm_semiring_1 -> 'a comm_semiring_0;
 11.1093 +val dvd_comm_semiring_1 = #dvd_comm_semiring_1 : 'a comm_semiring_1 -> 'a dvd;
 11.1094 +val semiring_1_comm_semiring_1 = #semiring_1_comm_semiring_1 :
 11.1095 +  'a comm_semiring_1 -> 'a semiring_1;
 11.1096 +
 11.1097 +type 'a comm_semiring_0_cancel =
 11.1098 +  {comm_semiring_0_comm_semiring_0_cancel : 'a comm_semiring_0,
 11.1099 +    semiring_0_cancel_comm_semiring_0_cancel : 'a semiring_0_cancel};
 11.1100 +val comm_semiring_0_comm_semiring_0_cancel =
 11.1101 +  #comm_semiring_0_comm_semiring_0_cancel :
 11.1102 +  'a comm_semiring_0_cancel -> 'a comm_semiring_0;
 11.1103 +val semiring_0_cancel_comm_semiring_0_cancel =
 11.1104 +  #semiring_0_cancel_comm_semiring_0_cancel :
 11.1105 +  'a comm_semiring_0_cancel -> 'a semiring_0_cancel;
 11.1106 +
 11.1107 +type 'a comm_semiring_1_cancel =
 11.1108 +  {comm_semiring_0_cancel_comm_semiring_1_cancel : 'a comm_semiring_0_cancel,
 11.1109 +    comm_semiring_1_comm_semiring_1_cancel : 'a comm_semiring_1,
 11.1110 +    semiring_1_cancel_comm_semiring_1_cancel : 'a semiring_1_cancel};
 11.1111 +val comm_semiring_0_cancel_comm_semiring_1_cancel =
 11.1112 +  #comm_semiring_0_cancel_comm_semiring_1_cancel :
 11.1113 +  'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel;
 11.1114 +val comm_semiring_1_comm_semiring_1_cancel =
 11.1115 +  #comm_semiring_1_comm_semiring_1_cancel :
 11.1116 +  'a comm_semiring_1_cancel -> 'a comm_semiring_1;
 11.1117 +val semiring_1_cancel_comm_semiring_1_cancel =
 11.1118 +  #semiring_1_cancel_comm_semiring_1_cancel :
 11.1119 +  'a comm_semiring_1_cancel -> 'a semiring_1_cancel;
 11.1120 +
 11.1121 +type 'a diva = {dvd_div : 'a dvd, diva : 'a -> 'a -> 'a, moda : 'a -> 'a -> 'a};
 11.1122 +val dvd_div = #dvd_div : 'a diva -> 'a dvd;
 11.1123 +val diva = #diva : 'a diva -> 'a -> 'a -> 'a;
 11.1124 +val moda = #moda : 'a diva -> 'a -> 'a -> 'a;
 11.1125 +
 11.1126 +type 'a semiring_div =
 11.1127 +  {div_semiring_div : 'a diva,
 11.1128 +    comm_semiring_1_cancel_semiring_div : 'a comm_semiring_1_cancel,
 11.1129 +    no_zero_divisors_semiring_div : 'a no_zero_divisors};
 11.1130 +val div_semiring_div = #div_semiring_div : 'a semiring_div -> 'a diva;
 11.1131 +val comm_semiring_1_cancel_semiring_div = #comm_semiring_1_cancel_semiring_div :
 11.1132 +  'a semiring_div -> 'a comm_semiring_1_cancel;
 11.1133 +val no_zero_divisors_semiring_div = #no_zero_divisors_semiring_div :
 11.1134 +  'a semiring_div -> 'a no_zero_divisors;
 11.1135 +
 11.1136 +val one_int : IntInf.int = (1 : IntInf.int);
 11.1137 +
 11.1138 +val one_inta = {one = one_int} : IntInf.int one;
 11.1139 +
 11.1140 +val zero_neq_one_int =
 11.1141 +  {one_zero_neq_one = one_inta, zero_zero_neq_one = zero_inta} :
 11.1142 +  IntInf.int zero_neq_one;
 11.1143 +
 11.1144 +val semigroup_mult_int = {times_semigroup_mult = times_int} :
 11.1145 +  IntInf.int semigroup_mult;
 11.1146 +
 11.1147 +val plus_int = {plus = (fn a => fn b => IntInf.+ (a, b))} : IntInf.int plus;
 11.1148 +
 11.1149 +val semigroup_add_int = {plus_semigroup_add = plus_int} :
 11.1150 +  IntInf.int semigroup_add;
 11.1151 +
 11.1152 +val ab_semigroup_add_int = {semigroup_add_ab_semigroup_add = semigroup_add_int}
 11.1153 +  : IntInf.int ab_semigroup_add;
 11.1154 +
 11.1155 +val semiring_int =
 11.1156 +  {ab_semigroup_add_semiring = ab_semigroup_add_int,
 11.1157 +    semigroup_mult_semiring = semigroup_mult_int}
 11.1158 +  : IntInf.int semiring;
 11.1159 +
 11.1160 +val mult_zero_int = {times_mult_zero = times_int, zero_mult_zero = zero_inta} :
 11.1161 +  IntInf.int mult_zero;
 11.1162 +
 11.1163 +val monoid_add_int =
 11.1164 +  {semigroup_add_monoid_add = semigroup_add_int, zero_monoid_add = zero_inta} :
 11.1165 +  IntInf.int monoid_add;
 11.1166 +
 11.1167 +val comm_monoid_add_int =
 11.1168 +  {ab_semigroup_add_comm_monoid_add = ab_semigroup_add_int,
 11.1169 +    monoid_add_comm_monoid_add = monoid_add_int}
 11.1170 +  : IntInf.int comm_monoid_add;
 11.1171 +
 11.1172 +val semiring_0_int =
 11.1173 +  {comm_monoid_add_semiring_0 = comm_monoid_add_int,
 11.1174 +    mult_zero_semiring_0 = mult_zero_int, semiring_semiring_0 = semiring_int}
 11.1175 +  : IntInf.int semiring_0;
 11.1176 +
 11.1177 +val power_int = {one_power = one_inta, times_power = times_int} :
 11.1178 +  IntInf.int power;
 11.1179 +
 11.1180 +val monoid_mult_int =
 11.1181 +  {semigroup_mult_monoid_mult = semigroup_mult_int,
 11.1182 +    power_monoid_mult = power_int}
 11.1183 +  : IntInf.int monoid_mult;
 11.1184 +
 11.1185 +val semiring_1_int =
 11.1186 +  {monoid_mult_semiring_1 = monoid_mult_int,
 11.1187 +    semiring_0_semiring_1 = semiring_0_int,
 11.1188 +    zero_neq_one_semiring_1 = zero_neq_one_int}
 11.1189 +  : IntInf.int semiring_1;
 11.1190 +
 11.1191 +val cancel_semigroup_add_int =
 11.1192 +  {semigroup_add_cancel_semigroup_add = semigroup_add_int} :
 11.1193 +  IntInf.int cancel_semigroup_add;
 11.1194 +
 11.1195 +val cancel_ab_semigroup_add_int =
 11.1196 +  {ab_semigroup_add_cancel_ab_semigroup_add = ab_semigroup_add_int,
 11.1197 +    cancel_semigroup_add_cancel_ab_semigroup_add = cancel_semigroup_add_int}
 11.1198 +  : IntInf.int cancel_ab_semigroup_add;
 11.1199 +
 11.1200 +val cancel_comm_monoid_add_int =
 11.1201 +  {cancel_ab_semigroup_add_cancel_comm_monoid_add = cancel_ab_semigroup_add_int,
 11.1202 +    comm_monoid_add_cancel_comm_monoid_add = comm_monoid_add_int}
 11.1203 +  : IntInf.int cancel_comm_monoid_add;
 11.1204 +
 11.1205 +val semiring_0_cancel_int =
 11.1206 +  {cancel_comm_monoid_add_semiring_0_cancel = cancel_comm_monoid_add_int,
 11.1207 +    semiring_0_semiring_0_cancel = semiring_0_int}
 11.1208 +  : IntInf.int semiring_0_cancel;
 11.1209 +
 11.1210 +val semiring_1_cancel_int =
 11.1211 +  {semiring_0_cancel_semiring_1_cancel = semiring_0_cancel_int,
 11.1212 +    semiring_1_semiring_1_cancel = semiring_1_int}
 11.1213 +  : IntInf.int semiring_1_cancel;
 11.1214 +
 11.1215 +val dvd_int = {times_dvd = times_int} : IntInf.int dvd;
 11.1216 +
 11.1217 +val ab_semigroup_mult_int =
 11.1218 +  {semigroup_mult_ab_semigroup_mult = semigroup_mult_int} :
 11.1219 +  IntInf.int ab_semigroup_mult;
 11.1220 +
 11.1221 +val comm_semiring_int =
 11.1222 +  {ab_semigroup_mult_comm_semiring = ab_semigroup_mult_int,
 11.1223 +    semiring_comm_semiring = semiring_int}
 11.1224 +  : IntInf.int comm_semiring;
 11.1225 +
 11.1226 +val comm_semiring_0_int =
 11.1227 +  {comm_semiring_comm_semiring_0 = comm_semiring_int,
 11.1228 +    semiring_0_comm_semiring_0 = semiring_0_int}
 11.1229 +  : IntInf.int comm_semiring_0;
 11.1230 +
 11.1231 +val comm_monoid_mult_int =
 11.1232 +  {ab_semigroup_mult_comm_monoid_mult = ab_semigroup_mult_int,
 11.1233 +    monoid_mult_comm_monoid_mult = monoid_mult_int}
 11.1234 +  : IntInf.int comm_monoid_mult;
 11.1235 +
 11.1236 +val comm_semiring_1_int =
 11.1237 +  {comm_monoid_mult_comm_semiring_1 = comm_monoid_mult_int,
 11.1238 +    comm_semiring_0_comm_semiring_1 = comm_semiring_0_int,
 11.1239 +    dvd_comm_semiring_1 = dvd_int, semiring_1_comm_semiring_1 = semiring_1_int}
 11.1240 +  : IntInf.int comm_semiring_1;
 11.1241 +
 11.1242 +val comm_semiring_0_cancel_int =
 11.1243 +  {comm_semiring_0_comm_semiring_0_cancel = comm_semiring_0_int,
 11.1244 +    semiring_0_cancel_comm_semiring_0_cancel = semiring_0_cancel_int}
 11.1245 +  : IntInf.int comm_semiring_0_cancel;
 11.1246 +
 11.1247 +val comm_semiring_1_cancel_int =
 11.1248 +  {comm_semiring_0_cancel_comm_semiring_1_cancel = comm_semiring_0_cancel_int,
 11.1249 +    comm_semiring_1_comm_semiring_1_cancel = comm_semiring_1_int,
 11.1250 +    semiring_1_cancel_comm_semiring_1_cancel = semiring_1_cancel_int}
 11.1251 +  : IntInf.int comm_semiring_1_cancel;
 11.1252 +
 11.1253 +fun abs_int i = (if IntInf.< (i, (0 : IntInf.int)) then IntInf.~ i else i);
 11.1254 +
 11.1255 +fun split f (a, b) = f a b;
 11.1256 +
 11.1257 +fun sgn_int i =
 11.1258 +  (if ((i : IntInf.int) = (0 : IntInf.int)) then (0 : IntInf.int)
 11.1259 +    else (if IntInf.< ((0 : IntInf.int), i) then (1 : IntInf.int)
 11.1260 +           else IntInf.~ (1 : IntInf.int)));
 11.1261 +
 11.1262 +fun apsnd f (x, y) = (x, f y);
 11.1263 +
 11.1264 +fun divmod_int k l =
 11.1265 +  (if ((k : IntInf.int) = (0 : IntInf.int))
 11.1266 +    then ((0 : IntInf.int), (0 : IntInf.int))
 11.1267 +    else (if ((l : IntInf.int) = (0 : IntInf.int)) then ((0 : IntInf.int), k)
 11.1268 +           else apsnd (fn a => IntInf.* (sgn_int l, a))
 11.1269 +                  (if (((sgn_int k) : IntInf.int) = (sgn_int l))
 11.1270 +                    then IntInf.divMod (IntInf.abs k, IntInf.abs l)
 11.1271 +                    else let
 11.1272 +                           val (r, s) =
 11.1273 +                             IntInf.divMod (IntInf.abs k, IntInf.abs l);
 11.1274 +                         in
 11.1275 +                           (if ((s : IntInf.int) = (0 : IntInf.int))
 11.1276 +                             then (IntInf.~ r, (0 : IntInf.int))
 11.1277 +                             else (IntInf.- (IntInf.~ r, (1 : IntInf.int)),
 11.1278 +                                    IntInf.- (abs_int l, s)))
 11.1279 +                         end)));
 11.1280 +
 11.1281 +fun snd (a, b) = b;
 11.1282 +
 11.1283 +fun mod_int a b = snd (divmod_int a b);
 11.1284 +
 11.1285 +fun fst (a, b) = a;
 11.1286 +
 11.1287 +fun div_int a b = fst (divmod_int a b);
 11.1288 +
 11.1289 +val div_inta = {dvd_div = dvd_int, diva = div_int, moda = mod_int} :
 11.1290 +  IntInf.int diva;
 11.1291 +
 11.1292 +val semiring_div_int =
 11.1293 +  {div_semiring_div = div_inta,
 11.1294 +    comm_semiring_1_cancel_semiring_div = comm_semiring_1_cancel_int,
 11.1295 +    no_zero_divisors_semiring_div = no_zero_divisors_int}
 11.1296 +  : IntInf.int semiring_div;
 11.1297 +
 11.1298 +fun dvd (A1_, A2_) a b =
 11.1299 +  eqa A2_ (moda (div_semiring_div A1_) b a)
 11.1300 +    (zero ((zero_no_zero_divisors o no_zero_divisors_semiring_div) A1_));
 11.1301 +
 11.1302 +fun num_case f1 f2 f3 f4 f5 f6 f7 (Mul (inta, num)) = f7 inta num
 11.1303 +  | num_case f1 f2 f3 f4 f5 f6 f7 (Sub (num1, num2)) = f6 num1 num2
 11.1304 +  | num_case f1 f2 f3 f4 f5 f6 f7 (Add (num1, num2)) = f5 num1 num2
 11.1305 +  | num_case f1 f2 f3 f4 f5 f6 f7 (Neg num) = f4 num
 11.1306 +  | num_case f1 f2 f3 f4 f5 f6 f7 (Cn (nat, inta, num)) = f3 nat inta num
 11.1307 +  | num_case f1 f2 f3 f4 f5 f6 f7 (Bound nat) = f2 nat
 11.1308 +  | num_case f1 f2 f3 f4 f5 f6 f7 (C inta) = f1 inta;
 11.1309 +
 11.1310 +fun nummul i (C j) = C (IntInf.* (i, j))
 11.1311 +  | nummul i (Cn (n, c, t)) = Cn (n, IntInf.* (c, i), nummul i t)
 11.1312 +  | nummul i (Bound v) = Mul (i, Bound v)
 11.1313 +  | nummul i (Neg v) = Mul (i, Neg v)
 11.1314 +  | nummul i (Add (v, va)) = Mul (i, Add (v, va))
 11.1315 +  | nummul i (Sub (v, va)) = Mul (i, Sub (v, va))
 11.1316 +  | nummul i (Mul (v, va)) = Mul (i, Mul (v, va));
 11.1317 +
 11.1318 +fun numneg t = nummul (IntInf.~ (1 : IntInf.int)) t;
 11.1319 +
 11.1320 +fun numadd (Cn (n1, c1, r1), Cn (n2, c2, r2)) =
 11.1321 +  (if ((n1 : IntInf.int) = n2)
 11.1322 +    then let
 11.1323 +           val c = IntInf.+ (c1, c2);
 11.1324 +         in
 11.1325 +           (if ((c : IntInf.int) = (0 : IntInf.int)) then numadd (r1, r2)
 11.1326 +             else Cn (n1, c, numadd (r1, r2)))
 11.1327 +         end
 11.1328 +    else (if IntInf.<= (n1, n2)
 11.1329 +           then Cn (n1, c1, numadd (r1, Add (Mul (c2, Bound n2), r2)))
 11.1330 +           else Cn (n2, c2, numadd (Add (Mul (c1, Bound n1), r1), r2))))
 11.1331 +  | numadd (Cn (n1, c1, r1), C dd) = Cn (n1, c1, numadd (r1, C dd))
 11.1332 +  | numadd (Cn (n1, c1, r1), Bound de) = Cn (n1, c1, numadd (r1, Bound de))
 11.1333 +  | numadd (Cn (n1, c1, r1), Neg di) = Cn (n1, c1, numadd (r1, Neg di))
 11.1334 +  | numadd (Cn (n1, c1, r1), Add (dj, dk)) =
 11.1335 +    Cn (n1, c1, numadd (r1, Add (dj, dk)))
 11.1336 +  | numadd (Cn (n1, c1, r1), Sub (dl, dm)) =
 11.1337 +    Cn (n1, c1, numadd (r1, Sub (dl, dm)))
 11.1338 +  | numadd (Cn (n1, c1, r1), Mul (dn, doa)) =
 11.1339 +    Cn (n1, c1, numadd (r1, Mul (dn, doa)))
 11.1340 +  | numadd (C w, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (C w, r2))
 11.1341 +  | numadd (Bound x, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (Bound x, r2))
 11.1342 +  | numadd (Neg ac, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (Neg ac, r2))
 11.1343 +  | numadd (Add (ad, ae), Cn (n2, c2, r2)) =
 11.1344 +    Cn (n2, c2, numadd (Add (ad, ae), r2))
 11.1345 +  | numadd (Sub (af, ag), Cn (n2, c2, r2)) =
 11.1346 +    Cn (n2, c2, numadd (Sub (af, ag), r2))
 11.1347 +  | numadd (Mul (ah, ai), Cn (n2, c2, r2)) =
 11.1348 +    Cn (n2, c2, numadd (Mul (ah, ai), r2))
 11.1349 +  | numadd (C b1, C b2) = C (IntInf.+ (b1, b2))
 11.1350 +  | numadd (C aj, Bound bi) = Add (C aj, Bound bi)
 11.1351 +  | numadd (C aj, Neg bm) = Add (C aj, Neg bm)
 11.1352 +  | numadd (C aj, Add (bn, bo)) = Add (C aj, Add (bn, bo))
 11.1353 +  | numadd (C aj, Sub (bp, bq)) = Add (C aj, Sub (bp, bq))
 11.1354 +  | numadd (C aj, Mul (br, bs)) = Add (C aj, Mul (br, bs))
 11.1355 +  | numadd (Bound ak, C cf) = Add (Bound ak, C cf)
 11.1356 +  | numadd (Bound ak, Bound cg) = Add (Bound ak, Bound cg)
 11.1357 +  | numadd (Bound ak, Neg ck) = Add (Bound ak, Neg ck)
 11.1358 +  | numadd (Bound ak, Add (cl, cm)) = Add (Bound ak, Add (cl, cm))
 11.1359 +  | numadd (Bound ak, Sub (cn, co)) = Add (Bound ak, Sub (cn, co))
 11.1360 +  | numadd (Bound ak, Mul (cp, cq)) = Add (Bound ak, Mul (cp, cq))
 11.1361 +  | numadd (Neg ao, C en) = Add (Neg ao, C en)
 11.1362 +  | numadd (Neg ao, Bound eo) = Add (Neg ao, Bound eo)
 11.1363 +  | numadd (Neg ao, Neg es) = Add (Neg ao, Neg es)
 11.1364 +  | numadd (Neg ao, Add (et, eu)) = Add (Neg ao, Add (et, eu))
 11.1365 +  | numadd (Neg ao, Sub (ev, ew)) = Add (Neg ao, Sub (ev, ew))
 11.1366 +  | numadd (Neg ao, Mul (ex, ey)) = Add (Neg ao, Mul (ex, ey))
 11.1367 +  | numadd (Add (ap, aq), C fl) = Add (Add (ap, aq), C fl)
 11.1368 +  | numadd (Add (ap, aq), Bound fm) = Add (Add (ap, aq), Bound fm)
 11.1369 +  | numadd (Add (ap, aq), Neg fq) = Add (Add (ap, aq), Neg fq)
 11.1370 +  | numadd (Add (ap, aq), Add (fr, fs)) = Add (Add (ap, aq), Add (fr, fs))
 11.1371 +  | numadd (Add (ap, aq), Sub (ft, fu)) = Add (Add (ap, aq), Sub (ft, fu))
 11.1372 +  | numadd (Add (ap, aq), Mul (fv, fw)) = Add (Add (ap, aq), Mul (fv, fw))
 11.1373 +  | numadd (Sub (ar, asa), C gj) = Add (Sub (ar, asa), C gj)
 11.1374 +  | numadd (Sub (ar, asa), Bound gk) = Add (Sub (ar, asa), Bound gk)
 11.1375 +  | numadd (Sub (ar, asa), Neg go) = Add (Sub (ar, asa), Neg go)
 11.1376 +  | numadd (Sub (ar, asa), Add (gp, gq)) = Add (Sub (ar, asa), Add (gp, gq))
 11.1377 +  | numadd (Sub (ar, asa), Sub (gr, gs)) = Add (Sub (ar, asa), Sub (gr, gs))
 11.1378 +  | numadd (Sub (ar, asa), Mul (gt, gu)) = Add (Sub (ar, asa), Mul (gt, gu))
 11.1379 +  | numadd (Mul (at, au), C hh) = Add (Mul (at, au), C hh)
 11.1380 +  | numadd (Mul (at, au), Bound hi) = Add (Mul (at, au), Bound hi)
 11.1381 +  | numadd (Mul (at, au), Neg hm) = Add (Mul (at, au), Neg hm)
 11.1382 +  | numadd (Mul (at, au), Add (hn, ho)) = Add (Mul (at, au), Add (hn, ho))
 11.1383 +  | numadd (Mul (at, au), Sub (hp, hq)) = Add (Mul (at, au), Sub (hp, hq))
 11.1384 +  | numadd (Mul (at, au), Mul (hr, hs)) = Add (Mul (at, au), Mul (hr, hs));
 11.1385 +
 11.1386 +fun numsub s t =
 11.1387 +  (if eq_num s t then C (0 : IntInf.int) else numadd (s, numneg t));
 11.1388 +
 11.1389 +fun simpnum (C j) = C j
 11.1390 +  | simpnum (Bound n) = Cn (n, (1 : IntInf.int), C (0 : IntInf.int))
 11.1391 +  | simpnum (Neg t) = numneg (simpnum t)
 11.1392 +  | simpnum (Add (t, s)) = numadd (simpnum t, simpnum s)
 11.1393 +  | simpnum (Sub (t, s)) = numsub (simpnum t) (simpnum s)
 11.1394 +  | simpnum (Mul (i, t)) =
 11.1395 +    (if ((i : IntInf.int) = (0 : IntInf.int)) then C (0 : IntInf.int)
 11.1396 +      else nummul i (simpnum t))
 11.1397 +  | simpnum (Cn (v, va, vb)) = Cn (v, va, vb);
 11.1398 +
 11.1399 +fun nota (Not p) = p
 11.1400 +  | nota T = F
 11.1401 +  | nota F = T
 11.1402 +  | nota (Lt v) = Not (Lt v)
 11.1403 +  | nota (Le v) = Not (Le v)
 11.1404 +  | nota (Gt v) = Not (Gt v)
 11.1405 +  | nota (Ge v) = Not (Ge v)
 11.1406 +  | nota (Eq v) = Not (Eq v)
 11.1407 +  | nota (NEq v) = Not (NEq v)
 11.1408 +  | nota (Dvd (v, va)) = Not (Dvd (v, va))
 11.1409 +  | nota (NDvd (v, va)) = Not (NDvd (v, va))
 11.1410 +  | nota (And (v, va)) = Not (And (v, va))
 11.1411 +  | nota (Or (v, va)) = Not (Or (v, va))
 11.1412 +  | nota (Imp (v, va)) = Not (Imp (v, va))
 11.1413 +  | nota (Iff (v, va)) = Not (Iff (v, va))
 11.1414 +  | nota (E v) = Not (E v)
 11.1415 +  | nota (A v) = Not (A v)
 11.1416 +  | nota (Closed v) = Not (Closed v)
 11.1417 +  | nota (NClosed v) = Not (NClosed v);
 11.1418 +
 11.1419 +fun iffa p q =
 11.1420 +  (if eq_fm p q then T
 11.1421 +    else (if eq_fm p (nota q) orelse eq_fm (nota p) q then F
 11.1422 +           else (if eq_fm p F then nota q
 11.1423 +                  else (if eq_fm q F then nota p
 11.1424 +                         else (if eq_fm p T then q
 11.1425 +                                else (if eq_fm q T then p else Iff (p, q)))))));
 11.1426 +
 11.1427 +fun impa p q =
 11.1428 +  (if eq_fm p F orelse eq_fm q T then T
 11.1429 +    else (if eq_fm p T then q else (if eq_fm q F then nota p else Imp (p, q))));
 11.1430 +
 11.1431 +fun conj p q =
 11.1432 +  (if eq_fm p F orelse eq_fm q F then F
 11.1433 +    else (if eq_fm p T then q else (if eq_fm q T then p else And (p, q))));
 11.1434 +
 11.1435 +fun simpfm (And (p, q)) = conj (simpfm p) (simpfm q)
 11.1436 +  | simpfm (Or (p, q)) = disj (simpfm p) (simpfm q)
 11.1437 +  | simpfm (Imp (p, q)) = impa (simpfm p) (simpfm q)
 11.1438 +  | simpfm (Iff (p, q)) = iffa (simpfm p) (simpfm q)
 11.1439 +  | simpfm (Not p) = nota (simpfm p)
 11.1440 +  | simpfm (Lt a) =
 11.1441 +    let
 11.1442 +      val aa = simpnum a;
 11.1443 +    in
 11.1444 +      (case aa of C v => (if IntInf.< (v, (0 : IntInf.int)) then T else F)
 11.1445 +        | Bound _ => Lt aa | Cn (_, _, _) => Lt aa | Neg _ => Lt aa
 11.1446 +        | Add (_, _) => Lt aa | Sub (_, _) => Lt aa | Mul (_, _) => Lt aa)
 11.1447 +    end
 11.1448 +  | simpfm (Le a) =
 11.1449 +    let
 11.1450 +      val aa = simpnum a;
 11.1451 +    in
 11.1452 +      (case aa of C v => (if IntInf.<= (v, (0 : IntInf.int)) then T else F)
 11.1453 +        | Bound _ => Le aa | Cn (_, _, _) => Le aa | Neg _ => Le aa
 11.1454 +        | Add (_, _) => Le aa | Sub (_, _) => Le aa | Mul (_, _) => Le aa)
 11.1455 +    end
 11.1456 +  | simpfm (Gt a) =
 11.1457 +    let
 11.1458 +      val aa = simpnum a;
 11.1459 +    in
 11.1460 +      (case aa of C v => (if IntInf.< ((0 : IntInf.int), v) then T else F)
 11.1461 +        | Bound _ => Gt aa | Cn (_, _, _) => Gt aa | Neg _ => Gt aa
 11.1462 +        | Add (_, _) => Gt aa | Sub (_, _) => Gt aa | Mul (_, _) => Gt aa)
 11.1463 +    end
 11.1464 +  | simpfm (Ge a) =
 11.1465 +    let
 11.1466 +      val aa = simpnum a;
 11.1467 +    in
 11.1468 +      (case aa of C v => (if IntInf.<= ((0 : IntInf.int), v) then T else F)
 11.1469 +        | Bound _ => Ge aa | Cn (_, _, _) => Ge aa | Neg _ => Ge aa
 11.1470 +        | Add (_, _) => Ge aa | Sub (_, _) => Ge aa | Mul (_, _) => Ge aa)
 11.1471 +    end
 11.1472 +  | simpfm (Eq a) =
 11.1473 +    let
 11.1474 +      val aa = simpnum a;
 11.1475 +    in
 11.1476 +      (case aa
 11.1477 +        of C v => (if ((v : IntInf.int) = (0 : IntInf.int)) then T else F)
 11.1478 +        | Bound _ => Eq aa | Cn (_, _, _) => Eq aa | Neg _ => Eq aa
 11.1479 +        | Add (_, _) => Eq aa | Sub (_, _) => Eq aa | Mul (_, _) => Eq aa)
 11.1480 +    end
 11.1481 +  | simpfm (NEq a) =
 11.1482 +    let
 11.1483 +      val aa = simpnum a;
 11.1484 +    in
 11.1485 +      (case aa
 11.1486 +        of C v => (if not ((v : IntInf.int) = (0 : IntInf.int)) then T else F)
 11.1487 +        | Bound _ => NEq aa | Cn (_, _, _) => NEq aa | Neg _ => NEq aa
 11.1488 +        | Add (_, _) => NEq aa | Sub (_, _) => NEq aa | Mul (_, _) => NEq aa)
 11.1489 +    end
 11.1490 +  | simpfm (Dvd (i, a)) =
 11.1491 +    (if ((i : IntInf.int) = (0 : IntInf.int)) then simpfm (Eq a)
 11.1492 +      else (if (((abs_int i) : IntInf.int) = (1 : IntInf.int)) then T
 11.1493 +             else let
 11.1494 +                    val aa = simpnum a;
 11.1495 +                  in
 11.1496 +                    (case aa
 11.1497 +                      of C v =>
 11.1498 +                        (if dvd (semiring_div_int, eq_int) i v then T else F)
 11.1499 +                      | Bound _ => Dvd (i, aa) | Cn (_, _, _) => Dvd (i, aa)
 11.1500 +                      | Neg _ => Dvd (i, aa) | Add (_, _) => Dvd (i, aa)
 11.1501 +                      | Sub (_, _) => Dvd (i, aa) | Mul (_, _) => Dvd (i, aa))
 11.1502 +                  end))
 11.1503 +  | simpfm (NDvd (i, a)) =
 11.1504 +    (if ((i : IntInf.int) = (0 : IntInf.int)) then simpfm (NEq a)
 11.1505 +      else (if (((abs_int i) : IntInf.int) = (1 : IntInf.int)) then F
 11.1506 +             else let
 11.1507 +                    val aa = simpnum a;
 11.1508 +                  in
 11.1509 +                    (case aa
 11.1510 +                      of C v =>
 11.1511 +                        (if not (dvd (semiring_div_int, eq_int) i v) then T
 11.1512 +                          else F)
 11.1513 +                      | Bound _ => NDvd (i, aa) | Cn (_, _, _) => NDvd (i, aa)
 11.1514 +                      | Neg _ => NDvd (i, aa) | Add (_, _) => NDvd (i, aa)
 11.1515 +                      | Sub (_, _) => NDvd (i, aa) | Mul (_, _) => NDvd (i, aa))
 11.1516 +                  end))
 11.1517 +  | simpfm T = T
 11.1518 +  | simpfm F = F
 11.1519 +  | simpfm (E v) = E v
 11.1520 +  | simpfm (A v) = A v
 11.1521 +  | simpfm (Closed v) = Closed v
 11.1522 +  | simpfm (NClosed v) = NClosed v;
 11.1523 +
 11.1524 +fun iupt i j =
 11.1525 +  (if IntInf.< (j, i) then []
 11.1526 +    else i :: iupt (IntInf.+ (i, (1 : IntInf.int))) j);
 11.1527 +
 11.1528 +fun mirror (And (p, q)) = And (mirror p, mirror q)
 11.1529 +  | mirror (Or (p, q)) = Or (mirror p, mirror q)
 11.1530 +  | mirror T = T
 11.1531 +  | mirror F = F
 11.1532 +  | mirror (Lt (C bo)) = Lt (C bo)
 11.1533 +  | mirror (Lt (Bound bp)) = Lt (Bound bp)
 11.1534 +  | mirror (Lt (Neg bt)) = Lt (Neg bt)
 11.1535 +  | mirror (Lt (Add (bu, bv))) = Lt (Add (bu, bv))
 11.1536 +  | mirror (Lt (Sub (bw, bx))) = Lt (Sub (bw, bx))
 11.1537 +  | mirror (Lt (Mul (by, bz))) = Lt (Mul (by, bz))
 11.1538 +  | mirror (Le (C co)) = Le (C co)
 11.1539 +  | mirror (Le (Bound cp)) = Le (Bound cp)
 11.1540 +  | mirror (Le (Neg ct)) = Le (Neg ct)
 11.1541 +  | mirror (Le (Add (cu, cv))) = Le (Add (cu, cv))
 11.1542 +  | mirror (Le (Sub (cw, cx))) = Le (Sub (cw, cx))
 11.1543 +  | mirror (Le (Mul (cy, cz))) = Le (Mul (cy, cz))
 11.1544 +  | mirror (Gt (C doa)) = Gt (C doa)
 11.1545 +  | mirror (Gt (Bound dp)) = Gt (Bound dp)
 11.1546 +  | mirror (Gt (Neg dt)) = Gt (Neg dt)
 11.1547 +  | mirror (Gt (Add (du, dv))) = Gt (Add (du, dv))
 11.1548 +  | mirror (Gt (Sub (dw, dx))) = Gt (Sub (dw, dx))
 11.1549 +  | mirror (Gt (Mul (dy, dz))) = Gt (Mul (dy, dz))
 11.1550 +  | mirror (Ge (C eo)) = Ge (C eo)
 11.1551 +  | mirror (Ge (Bound ep)) = Ge (Bound ep)
 11.1552 +  | mirror (Ge (Neg et)) = Ge (Neg et)
 11.1553 +  | mirror (Ge (Add (eu, ev))) = Ge (Add (eu, ev))
 11.1554 +  | mirror (Ge (Sub (ew, ex))) = Ge (Sub (ew, ex))
 11.1555 +  | mirror (Ge (Mul (ey, ez))) = Ge (Mul (ey, ez))
 11.1556 +  | mirror (Eq (C fo)) = Eq (C fo)
 11.1557 +  | mirror (Eq (Bound fp)) = Eq (Bound fp)
 11.1558 +  | mirror (Eq (Neg ft)) = Eq (Neg ft)
 11.1559 +  | mirror (Eq (Add (fu, fv))) = Eq (Add (fu, fv))
 11.1560 +  | mirror (Eq (Sub (fw, fx))) = Eq (Sub (fw, fx))
 11.1561 +  | mirror (Eq (Mul (fy, fz))) = Eq (Mul (fy, fz))
 11.1562 +  | mirror (NEq (C go)) = NEq (C go)
 11.1563 +  | mirror (NEq (Bound gp)) = NEq (Bound gp)
 11.1564 +  | mirror (NEq (Neg gt)) = NEq (Neg gt)
 11.1565 +  | mirror (NEq (Add (gu, gv))) = NEq (Add (gu, gv))
 11.1566 +  | mirror (NEq (Sub (gw, gx))) = NEq (Sub (gw, gx))
 11.1567 +  | mirror (NEq (Mul (gy, gz))) = NEq (Mul (gy, gz))
 11.1568 +  | mirror (Dvd (aa, C ho)) = Dvd (aa, C ho)
 11.1569 +  | mirror (Dvd (aa, Bound hp)) = Dvd (aa, Bound hp)
 11.1570 +  | mirror (Dvd (aa, Neg ht)) = Dvd (aa, Neg ht)
 11.1571 +  | mirror (Dvd (aa, Add (hu, hv))) = Dvd (aa, Add (hu, hv))
 11.1572 +  | mirror (Dvd (aa, Sub (hw, hx))) = Dvd (aa, Sub (hw, hx))
 11.1573 +  | mirror (Dvd (aa, Mul (hy, hz))) = Dvd (aa, Mul (hy, hz))
 11.1574 +  | mirror (NDvd (ac, C io)) = NDvd (ac, C io)
 11.1575 +  | mirror (NDvd (ac, Bound ip)) = NDvd (ac, Bound ip)
 11.1576 +  | mirror (NDvd (ac, Neg it)) = NDvd (ac, Neg it)
 11.1577 +  | mirror (NDvd (ac, Add (iu, iv))) = NDvd (ac, Add (iu, iv))
 11.1578 +  | mirror (NDvd (ac, Sub (iw, ix))) = NDvd (ac, Sub (iw, ix))
 11.1579 +  | mirror (NDvd (ac, Mul (iy, iz))) = NDvd (ac, Mul (iy, iz))
 11.1580 +  | mirror (Not ae) = Not ae
 11.1581 +  | mirror (Imp (aj, ak)) = Imp (aj, ak)
 11.1582 +  | mirror (Iff (al, am)) = Iff (al, am)
 11.1583 +  | mirror (E an) = E an
 11.1584 +  | mirror (A ao) = A ao
 11.1585 +  | mirror (Closed ap) = Closed ap
 11.1586 +  | mirror (NClosed aq) = NClosed aq
 11.1587 +  | mirror (Lt (Cn (cm, c, e))) =
 11.1588 +    (if ((cm : IntInf.int) = (0 : IntInf.int))
 11.1589 +      then Gt (Cn ((0 : IntInf.int), c, Neg e))
 11.1590 +      else Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e)))
 11.1591 +  | mirror (Le (Cn (dm, c, e))) =
 11.1592 +    (if ((dm : IntInf.int) = (0 : IntInf.int))
 11.1593 +      then Ge (Cn ((0 : IntInf.int), c, Neg e))
 11.1594 +      else Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e)))
 11.1595 +  | mirror (Gt (Cn (em, c, e))) =
 11.1596 +    (if ((em : IntInf.int) = (0 : IntInf.int))
 11.1597 +      then Lt (Cn ((0 : IntInf.int), c, Neg e))
 11.1598 +      else Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e)))
 11.1599 +  | mirror (Ge (Cn (fm, c, e))) =
 11.1600 +    (if ((fm : IntInf.int) = (0 : IntInf.int))
 11.1601 +      then Le (Cn ((0 : IntInf.int), c, Neg e))
 11.1602 +      else Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e)))
 11.1603 +  | mirror (Eq (Cn (gm, c, e))) =
 11.1604 +    (if ((gm : IntInf.int) = (0 : IntInf.int))
 11.1605 +      then Eq (Cn ((0 : IntInf.int), c, Neg e))
 11.1606 +      else Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e)))
 11.1607 +  | mirror (NEq (Cn (hm, c, e))) =
 11.1608 +    (if ((hm : IntInf.int) = (0 : IntInf.int))
 11.1609 +      then NEq (Cn ((0 : IntInf.int), c, Neg e))
 11.1610 +      else NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e)))
 11.1611 +  | mirror (Dvd (i, Cn (im, c, e))) =
 11.1612 +    (if ((im : IntInf.int) = (0 : IntInf.int))
 11.1613 +      then Dvd (i, Cn ((0 : IntInf.int), c, Neg e))
 11.1614 +      else Dvd (i, Cn (suc (minus_nat im (1 : IntInf.int)), c, e)))
 11.1615 +  | mirror (NDvd (i, Cn (jm, c, e))) =
 11.1616 +    (if ((jm : IntInf.int) = (0 : IntInf.int))
 11.1617 +      then NDvd (i, Cn ((0 : IntInf.int), c, Neg e))
 11.1618 +      else NDvd (i, Cn (suc (minus_nat jm (1 : IntInf.int)), c, e)));
 11.1619 +
 11.1620 +fun size_list [] = (0 : IntInf.int)
 11.1621 +  | size_list (a :: lista) = IntInf.+ (size_list lista, suc (0 : IntInf.int));
 11.1622 +
 11.1623 +fun alpha (And (p, q)) = append (alpha p) (alpha q)
 11.1624 +  | alpha (Or (p, q)) = append (alpha p) (alpha q)
 11.1625 +  | alpha T = []
 11.1626 +  | alpha F = []
 11.1627 +  | alpha (Lt (C bo)) = []
 11.1628 +  | alpha (Lt (Bound bp)) = []
 11.1629 +  | alpha (Lt (Neg bt)) = []
 11.1630 +  | alpha (Lt (Add (bu, bv))) = []
 11.1631 +  | alpha (Lt (Sub (bw, bx))) = []
 11.1632 +  | alpha (Lt (Mul (by, bz))) = []
 11.1633 +  | alpha (Le (C co)) = []
 11.1634 +  | alpha (Le (Bound cp)) = []
 11.1635 +  | alpha (Le (Neg ct)) = []
 11.1636 +  | alpha (Le (Add (cu, cv))) = []
 11.1637 +  | alpha (Le (Sub (cw, cx))) = []
 11.1638 +  | alpha (Le (Mul (cy, cz))) = []
 11.1639 +  | alpha (Gt (C doa)) = []
 11.1640 +  | alpha (Gt (Bound dp)) = []
 11.1641 +  | alpha (Gt (Neg dt)) = []
 11.1642 +  | alpha (Gt (Add (du, dv))) = []
 11.1643 +  | alpha (Gt (Sub (dw, dx))) = []
 11.1644 +  | alpha (Gt (Mul (dy, dz))) = []
 11.1645 +  | alpha (Ge (C eo)) = []
 11.1646 +  | alpha (Ge (Bound ep)) = []
 11.1647 +  | alpha (Ge (Neg et)) = []
 11.1648 +  | alpha (Ge (Add (eu, ev))) = []
 11.1649 +  | alpha (Ge (Sub (ew, ex))) = []
 11.1650 +  | alpha (Ge (Mul (ey, ez))) = []
 11.1651 +  | alpha (Eq (C fo)) = []
 11.1652 +  | alpha (Eq (Bound fp)) = []
 11.1653 +  | alpha (Eq (Neg ft)) = []
 11.1654 +  | alpha (Eq (Add (fu, fv))) = []
 11.1655 +  | alpha (Eq (Sub (fw, fx))) = []
 11.1656 +  | alpha (Eq (Mul (fy, fz))) = []
 11.1657 +  | alpha (NEq (C go)) = []
 11.1658 +  | alpha (NEq (Bound gp)) = []
 11.1659 +  | alpha (NEq (Neg gt)) = []
 11.1660 +  | alpha (NEq (Add (gu, gv))) = []
 11.1661 +  | alpha (NEq (Sub (gw, gx))) = []
 11.1662 +  | alpha (NEq (Mul (gy, gz))) = []
 11.1663 +  | alpha (Dvd (aa, ab)) = []
 11.1664 +  | alpha (NDvd (ac, ad)) = []
 11.1665 +  | alpha (Not ae) = []
 11.1666 +  | alpha (Imp (aj, ak)) = []
 11.1667 +  | alpha (Iff (al, am)) = []
 11.1668 +  | alpha (E an) = []
 11.1669 +  | alpha (A ao) = []
 11.1670 +  | alpha (Closed ap) = []
 11.1671 +  | alpha (NClosed aq) = []
 11.1672 +  | alpha (Lt (Cn (cm, c, e))) =
 11.1673 +    (if ((cm : IntInf.int) = (0 : IntInf.int)) then [e] else [])
 11.1674 +  | alpha (Le (Cn (dm, c, e))) =
 11.1675 +    (if ((dm : IntInf.int) = (0 : IntInf.int))
 11.1676 +      then [Add (C (~1 : IntInf.int), e)] else [])
 11.1677 +  | alpha (Gt (Cn (em, c, e))) =
 11.1678 +    (if ((em : IntInf.int) = (0 : IntInf.int)) then [] else [])
 11.1679 +  | alpha (Ge (Cn (fm, c, e))) =
 11.1680 +    (if ((fm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 11.1681 +  | alpha (Eq (Cn (gm, c, e))) =
 11.1682 +    (if ((gm : IntInf.int) = (0 : IntInf.int))
 11.1683 +      then [Add (C (~1 : IntInf.int), e)] else [])
 11.1684 +  | alpha (NEq (Cn (hm, c, e))) =
 11.1685 +    (if ((hm : IntInf.int) = (0 : IntInf.int)) then [e] else []);
 11.1686 +
 11.1687 +fun beta (And (p, q)) = append (beta p) (beta q)
 11.1688 +  | beta (Or (p, q)) = append (beta p) (beta q)
 11.1689 +  | beta T = []
 11.1690 +  | beta F = []
 11.1691 +  | beta (Lt (C bo)) = []
 11.1692 +  | beta (Lt (Bound bp)) = []
 11.1693 +  | beta (Lt (Neg bt)) = []
 11.1694 +  | beta (Lt (Add (bu, bv))) = []
 11.1695 +  | beta (Lt (Sub (bw, bx))) = []
 11.1696 +  | beta (Lt (Mul (by, bz))) = []
 11.1697 +  | beta (Le (C co)) = []
 11.1698 +  | beta (Le (Bound cp)) = []
 11.1699 +  | beta (Le (Neg ct)) = []
 11.1700 +  | beta (Le (Add (cu, cv))) = []
 11.1701 +  | beta (Le (Sub (cw, cx))) = []
 11.1702 +  | beta (Le (Mul (cy, cz))) = []
 11.1703 +  | beta (Gt (C doa)) = []
 11.1704 +  | beta (Gt (Bound dp)) = []
 11.1705 +  | beta (Gt (Neg dt)) = []
 11.1706 +  | beta (Gt (Add (du, dv))) = []
 11.1707 +  | beta (Gt (Sub (dw, dx))) = []
 11.1708 +  | beta (Gt (Mul (dy, dz))) = []
 11.1709 +  | beta (Ge (C eo)) = []
 11.1710 +  | beta (Ge (Bound ep)) = []
 11.1711 +  | beta (Ge (Neg et)) = []
 11.1712 +  | beta (Ge (Add (eu, ev))) = []
 11.1713 +  | beta (Ge (Sub (ew, ex))) = []
 11.1714 +  | beta (Ge (Mul (ey, ez))) = []
 11.1715 +  | beta (Eq (C fo)) = []
 11.1716 +  | beta (Eq (Bound fp)) = []
 11.1717 +  | beta (Eq (Neg ft)) = []
 11.1718 +  | beta (Eq (Add (fu, fv))) = []
 11.1719 +  | beta (Eq (Sub (fw, fx))) = []
 11.1720 +  | beta (Eq (Mul (fy, fz))) = []
 11.1721 +  | beta (NEq (C go)) = []
 11.1722 +  | beta (NEq (Bound gp)) = []
 11.1723 +  | beta (NEq (Neg gt)) = []
 11.1724 +  | beta (NEq (Add (gu, gv))) = []
 11.1725 +  | beta (NEq (Sub (gw, gx))) = []
 11.1726 +  | beta (NEq (Mul (gy, gz))) = []
 11.1727 +  | beta (Dvd (aa, ab)) = []
 11.1728 +  | beta (NDvd (ac, ad)) = []
 11.1729 +  | beta (Not ae) = []
 11.1730 +  | beta (Imp (aj, ak)) = []
 11.1731 +  | beta (Iff (al, am)) = []
 11.1732 +  | beta (E an) = []
 11.1733 +  | beta (A ao) = []
 11.1734 +  | beta (Closed ap) = []
 11.1735 +  | beta (NClosed aq) = []
 11.1736 +  | beta (Lt (Cn (cm, c, e))) =
 11.1737 +    (if ((cm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 11.1738 +  | beta (Le (Cn (dm, c, e))) =
 11.1739 +    (if ((dm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 11.1740 +  | beta (Gt (Cn (em, c, e))) =
 11.1741 +    (if ((em : IntInf.int) = (0 : IntInf.int)) then [Neg e] else [])
 11.1742 +  | beta (Ge (Cn (fm, c, e))) =
 11.1743 +    (if ((fm : IntInf.int) = (0 : IntInf.int))
 11.1744 +      then [Sub (C (~1 : IntInf.int), e)] else [])
 11.1745 +  | beta (Eq (Cn (gm, c, e))) =
 11.1746 +    (if ((gm : IntInf.int) = (0 : IntInf.int))
 11.1747 +      then [Sub (C (~1 : IntInf.int), e)] else [])
 11.1748 +  | beta (NEq (Cn (hm, c, e))) =
 11.1749 +    (if ((hm : IntInf.int) = (0 : IntInf.int)) then [Neg e] else []);
 11.1750 +
 11.1751 +val eq_numa = {eq = eq_num} : num eq;
 11.1752 +
 11.1753 +fun member A_ x [] = false
 11.1754 +  | member A_ x (y :: ys) = eqa A_ x y orelse member A_ x ys;
 11.1755 +
 11.1756 +fun remdups A_ [] = []
 11.1757 +  | remdups A_ (x :: xs) =
 11.1758 +    (if member A_ x xs then remdups A_ xs else x :: remdups A_ xs);
 11.1759 +
 11.1760 +fun gcd_int k l =
 11.1761 +  abs_int
 11.1762 +    (if ((l : IntInf.int) = (0 : IntInf.int)) then k
 11.1763 +      else gcd_int l (mod_int (abs_int k) (abs_int l)));
 11.1764 +
 11.1765 +fun lcm_int a b = div_int (IntInf.* (abs_int a, abs_int b)) (gcd_int a b);
 11.1766 +
 11.1767 +fun delta (And (p, q)) = lcm_int (delta p) (delta q)
 11.1768 +  | delta (Or (p, q)) = lcm_int (delta p) (delta q)
 11.1769 +  | delta T = (1 : IntInf.int)
 11.1770 +  | delta F = (1 : IntInf.int)
 11.1771 +  | delta (Lt u) = (1 : IntInf.int)
 11.1772 +  | delta (Le v) = (1 : IntInf.int)
 11.1773 +  | delta (Gt w) = (1 : IntInf.int)
 11.1774 +  | delta (Ge x) = (1 : IntInf.int)
 11.1775 +  | delta (Eq y) = (1 : IntInf.int)
 11.1776 +  | delta (NEq z) = (1 : IntInf.int)
 11.1777 +  | delta (Dvd (aa, C bo)) = (1 : IntInf.int)
 11.1778 +  | delta (Dvd (aa, Bound bp)) = (1 : IntInf.int)
 11.1779 +  | delta (Dvd (aa, Neg bt)) = (1 : IntInf.int)
 11.1780 +  | delta (Dvd (aa, Add (bu, bv))) = (1 : IntInf.int)
 11.1781 +  | delta (Dvd (aa, Sub (bw, bx))) = (1 : IntInf.int)
 11.1782 +  | delta (Dvd (aa, Mul (by, bz))) = (1 : IntInf.int)
 11.1783 +  | delta (NDvd (ac, C co)) = (1 : IntInf.int)
 11.1784 +  | delta (NDvd (ac, Bound cp)) = (1 : IntInf.int)
 11.1785 +  | delta (NDvd (ac, Neg ct)) = (1 : IntInf.int)
 11.1786 +  | delta (NDvd (ac, Add (cu, cv))) = (1 : IntInf.int)
 11.1787 +  | delta (NDvd (ac, Sub (cw, cx))) = (1 : IntInf.int)
 11.1788 +  | delta (NDvd (ac, Mul (cy, cz))) = (1 : IntInf.int)
 11.1789 +  | delta (Not ae) = (1 : IntInf.int)
 11.1790 +  | delta (Imp (aj, ak)) = (1 : IntInf.int)
 11.1791 +  | delta (Iff (al, am)) = (1 : IntInf.int)
 11.1792 +  | delta (E an) = (1 : IntInf.int)
 11.1793 +  | delta (A ao) = (1 : IntInf.int)
 11.1794 +  | delta (Closed ap) = (1 : IntInf.int)
 11.1795 +  | delta (NClosed aq) = (1 : IntInf.int)
 11.1796 +  | delta (Dvd (i, Cn (cm, c, e))) =
 11.1797 +    (if ((cm : IntInf.int) = (0 : IntInf.int)) then i else (1 : IntInf.int))
 11.1798 +  | delta (NDvd (i, Cn (dm, c, e))) =
 11.1799 +    (if ((dm : IntInf.int) = (0 : IntInf.int)) then i else (1 : IntInf.int));
 11.1800 +
 11.1801 +fun a_beta (And (p, q)) = (fn k => And (a_beta p k, a_beta q k))
 11.1802 +  | a_beta (Or (p, q)) = (fn k => Or (a_beta p k, a_beta q k))
 11.1803 +  | a_beta T = (fn _ => T)
 11.1804 +  | a_beta F = (fn _ => F)
 11.1805 +  | a_beta (Lt (C bo)) = (fn _ => Lt (C bo))
 11.1806 +  | a_beta (Lt (Bound bp)) = (fn _ => Lt (Bound bp))
 11.1807 +  | a_beta (Lt (Neg bt)) = (fn _ => Lt (Neg bt))
 11.1808 +  | a_beta (Lt (Add (bu, bv))) = (fn _ => Lt (Add (bu, bv)))
 11.1809 +  | a_beta (Lt (Sub (bw, bx))) = (fn _ => Lt (Sub (bw, bx)))
 11.1810 +  | a_beta (Lt (Mul (by, bz))) = (fn _ => Lt (Mul (by, bz)))
 11.1811 +  | a_beta (Le (C co)) = (fn _ => Le (C co))
 11.1812 +  | a_beta (Le (Bound cp)) = (fn _ => Le (Bound cp))
 11.1813 +  | a_beta (Le (Neg ct)) = (fn _ => Le (Neg ct))
 11.1814 +  | a_beta (Le (Add (cu, cv))) = (fn _ => Le (Add (cu, cv)))
 11.1815 +  | a_beta (Le (Sub (cw, cx))) = (fn _ => Le (Sub (cw, cx)))
 11.1816 +  | a_beta (Le (Mul (cy, cz))) = (fn _ => Le (Mul (cy, cz)))
 11.1817 +  | a_beta (Gt (C doa)) = (fn _ => Gt (C doa))
 11.1818 +  | a_beta (Gt (Bound dp)) = (fn _ => Gt (Bound dp))
 11.1819 +  | a_beta (Gt (Neg dt)) = (fn _ => Gt (Neg dt))
 11.1820 +  | a_beta (Gt (Add (du, dv))) = (fn _ => Gt (Add (du, dv)))
 11.1821 +  | a_beta (Gt (Sub (dw, dx))) = (fn _ => Gt (Sub (dw, dx)))
 11.1822 +  | a_beta (Gt (Mul (dy, dz))) = (fn _ => Gt (Mul (dy, dz)))
 11.1823 +  | a_beta (Ge (C eo)) = (fn _ => Ge (C eo))
 11.1824 +  | a_beta (Ge (Bound ep)) = (fn _ => Ge (Bound ep))
 11.1825 +  | a_beta (Ge (Neg et)) = (fn _ => Ge (Neg et))
 11.1826 +  | a_beta (Ge (Add (eu, ev))) = (fn _ => Ge (Add (eu, ev)))
 11.1827 +  | a_beta (Ge (Sub (ew, ex))) = (fn _ => Ge (Sub (ew, ex)))
 11.1828 +  | a_beta (Ge (Mul (ey, ez))) = (fn _ => Ge (Mul (ey, ez)))
 11.1829 +  | a_beta (Eq (C fo)) = (fn _ => Eq (C fo))
 11.1830 +  | a_beta (Eq (Bound fp)) = (fn _ => Eq (Bound fp))
 11.1831 +  | a_beta (Eq (Neg ft)) = (fn _ => Eq (Neg ft))
 11.1832 +  | a_beta (Eq (Add (fu, fv))) = (fn _ => Eq (Add (fu, fv)))
 11.1833 +  | a_beta (Eq (Sub (fw, fx))) = (fn _ => Eq (Sub (fw, fx)))
 11.1834 +  | a_beta (Eq (Mul (fy, fz))) = (fn _ => Eq (Mul (fy, fz)))
 11.1835 +  | a_beta (NEq (C go)) = (fn _ => NEq (C go))
 11.1836 +  | a_beta (NEq (Bound gp)) = (fn _ => NEq (Bound gp))
 11.1837 +  | a_beta (NEq (Neg gt)) = (fn _ => NEq (Neg gt))
 11.1838 +  | a_beta (NEq (Add (gu, gv))) = (fn _ => NEq (Add (gu, gv)))
 11.1839 +  | a_beta (NEq (Sub (gw, gx))) = (fn _ => NEq (Sub (gw, gx)))
 11.1840 +  | a_beta (NEq (Mul (gy, gz))) = (fn _ => NEq (Mul (gy, gz)))
 11.1841 +  | a_beta (Dvd (aa, C ho)) = (fn _ => Dvd (aa, C ho))
 11.1842 +  | a_beta (Dvd (aa, Bound hp)) = (fn _ => Dvd (aa, Bound hp))
 11.1843 +  | a_beta (Dvd (aa, Neg ht)) = (fn _ => Dvd (aa, Neg ht))
 11.1844 +  | a_beta (Dvd (aa, Add (hu, hv))) = (fn _ => Dvd (aa, Add (hu, hv)))
 11.1845 +  | a_beta (Dvd (aa, Sub (hw, hx))) = (fn _ => Dvd (aa, Sub (hw, hx)))
 11.1846 +  | a_beta (Dvd (aa, Mul (hy, hz))) = (fn _ => Dvd (aa, Mul (hy, hz)))
 11.1847 +  | a_beta (NDvd (ac, C io)) = (fn _ => NDvd (ac, C io))
 11.1848 +  | a_beta (NDvd (ac, Bound ip)) = (fn _ => NDvd (ac, Bound ip))
 11.1849 +  | a_beta (NDvd (ac, Neg it)) = (fn _ => NDvd (ac, Neg it))
 11.1850 +  | a_beta (NDvd (ac, Add (iu, iv))) = (fn _ => NDvd (ac, Add (iu, iv)))
 11.1851 +  | a_beta (NDvd (ac, Sub (iw, ix))) = (fn _ => NDvd (ac, Sub (iw, ix)))
 11.1852 +  | a_beta (NDvd (ac, Mul (iy, iz))) = (fn _ => NDvd (ac, Mul (iy, iz)))
 11.1853 +  | a_beta (Not ae) = (fn _ => Not ae)
 11.1854 +  | a_beta (Imp (aj, ak)) = (fn _ => Imp (aj, ak))
 11.1855 +  | a_beta (Iff (al, am)) = (fn _ => Iff (al, am))
 11.1856 +  | a_beta (E an) = (fn _ => E an)
 11.1857 +  | a_beta (A ao) = (fn _ => A ao)
 11.1858 +  | a_beta (Closed ap) = (fn _ => Closed ap)
 11.1859 +  | a_beta (NClosed aq) = (fn _ => NClosed aq)
 11.1860 +  | a_beta (Lt (Cn (cm, c, e))) =
 11.1861 +    (if ((cm : IntInf.int) = (0 : IntInf.int))
 11.1862 +      then (fn k =>
 11.1863 +             Lt (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 11.1864 +      else (fn _ => Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e))))
 11.1865 +  | a_beta (Le (Cn (dm, c, e))) =
 11.1866 +    (if ((dm : IntInf.int) = (0 : IntInf.int))
 11.1867 +      then (fn k =>
 11.1868 +             Le (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 11.1869 +      else (fn _ => Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e))))
 11.1870 +  | a_beta (Gt (Cn (em, c, e))) =
 11.1871 +    (if ((em : IntInf.int) = (0 : IntInf.int))
 11.1872 +      then (fn k =>
 11.1873 +             Gt (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 11.1874 +      else (fn _ => Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e))))
 11.1875 +  | a_beta (Ge (Cn (fm, c, e))) =
 11.1876 +    (if ((fm : IntInf.int) = (0 : IntInf.int))
 11.1877 +      then (fn k =>
 11.1878 +             Ge (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 11.1879 +      else (fn _ => Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e))))
 11.1880 +  | a_beta (Eq (Cn (gm, c, e))) =
 11.1881 +    (if ((gm : IntInf.int) = (0 : IntInf.int))
 11.1882 +      then (fn k =>
 11.1883 +             Eq (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 11.1884 +      else (fn _ => Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e))))
 11.1885 +  | a_beta (NEq (Cn (hm, c, e))) =
 11.1886 +    (if ((hm : IntInf.int) = (0 : IntInf.int))
 11.1887 +      then (fn k =>
 11.1888 +             NEq (Cn ((0 : IntInf.int), (1 : IntInf.int),
 11.1889 +                       Mul (div_int k c, e))))
 11.1890 +      else (fn _ => NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e))))
 11.1891 +  | a_beta (Dvd (i, Cn (im, c, e))) =
 11.1892 +    (if ((im : IntInf.int) = (0 : IntInf.int))
 11.1893 +      then (fn k =>
 11.1894 +             Dvd (IntInf.* (div_int k c, i),
 11.1895 +                   Cn ((0 : IntInf.int), (1 : IntInf.int),
 11.1896 +                        Mul (div_int k c, e))))
 11.1897 +      else (fn _ => Dvd (i, Cn (suc (minus_nat im (1 : IntInf.int)), c, e))))
 11.1898 +  | a_beta (NDvd (i, Cn (jm, c, e))) =
 11.1899 +    (if ((jm : IntInf.int) = (0 : IntInf.int))
 11.1900 +      then (fn k =>
 11.1901 +             NDvd (IntInf.* (div_int k c, i),
 11.1902 +                    Cn ((0 : IntInf.int), (1 : IntInf.int),
 11.1903 +                         Mul (div_int k c, e))))
 11.1904 +      else (fn _ => NDvd (i, Cn (suc (minus_nat jm (1 : IntInf.int)), c, e))));
 11.1905 +
 11.1906 +fun zeta (And (p, q)) = lcm_int (zeta p) (zeta q)
 11.1907 +  | zeta (Or (p, q)) = lcm_int (zeta p) (zeta q)
 11.1908 +  | zeta T = (1 : IntInf.int)
 11.1909 +  | zeta F = (1 : IntInf.int)
 11.1910 +  | zeta (Lt (C bo)) = (1 : IntInf.int)
 11.1911 +  | zeta (Lt (Bound bp)) = (1 : IntInf.int)
 11.1912 +  | zeta (Lt (Neg bt)) = (1 : IntInf.int)
 11.1913 +  | zeta (Lt (Add (bu, bv))) = (1 : IntInf.int)
 11.1914 +  | zeta (Lt (Sub (bw, bx))) = (1 : IntInf.int)
 11.1915 +  | zeta (Lt (Mul (by, bz))) = (1 : IntInf.int)
 11.1916 +  | zeta (Le (C co)) = (1 : IntInf.int)
 11.1917 +  | zeta (Le (Bound cp)) = (1 : IntInf.int)
 11.1918 +  | zeta (Le (Neg ct)) = (1 : IntInf.int)
 11.1919 +  | zeta (Le (Add (cu, cv))) = (1 : IntInf.int)
 11.1920 +  | zeta (Le (Sub (cw, cx))) = (1 : IntInf.int)
 11.1921 +  | zeta (Le (Mul (cy, cz))) = (1 : IntInf.int)
 11.1922 +  | zeta (Gt (C doa)) = (1 : IntInf.int)
 11.1923 +  | zeta (Gt (Bound dp)) = (1 : IntInf.int)
 11.1924 +  | zeta (Gt (Neg dt)) = (1 : IntInf.int)
 11.1925 +  | zeta (Gt (Add (du, dv))) = (1 : IntInf.int)
 11.1926 +  | zeta (Gt (Sub (dw, dx))) = (1 : IntInf.int)
 11.1927 +  | zeta (Gt (Mul (dy, dz))) = (1 : IntInf.int)
 11.1928 +  | zeta (Ge (C eo)) = (1 : IntInf.int)
 11.1929 +  | zeta (Ge (Bound ep)) = (1 : IntInf.int)
 11.1930 +  | zeta (Ge (Neg et)) = (1 : IntInf.int)
 11.1931 +  | zeta (Ge (Add (eu, ev))) = (1 : IntInf.int)
 11.1932 +  | zeta (Ge (Sub (ew, ex))) = (1 : IntInf.int)
 11.1933 +  | zeta (Ge (Mul (ey, ez))) = (1 : IntInf.int)
 11.1934 +  | zeta (Eq (C fo)) = (1 : IntInf.int)
 11.1935 +  | zeta (Eq (Bound fp)) = (1 : IntInf.int)
 11.1936 +  | zeta (Eq (Neg ft)) = (1 : IntInf.int)
 11.1937 +  | zeta (Eq (Add (fu, fv))) = (1 : IntInf.int)
 11.1938 +  | zeta (Eq (Sub (fw, fx))) = (1 : IntInf.int)
 11.1939 +  | zeta (Eq (Mul (fy, fz))) = (1 : IntInf.int)
 11.1940 +  | zeta (NEq (C go)) = (1 : IntInf.int)
 11.1941 +  | zeta (NEq (Bound gp)) = (1 : IntInf.int)
 11.1942 +  | zeta (NEq (Neg gt)) = (1 : IntInf.int)
 11.1943 +  | zeta (NEq (Add (gu, gv))) = (1 : IntInf.int)
 11.1944 +  | zeta (NEq (Sub (gw, gx))) = (1 : IntInf.int)
 11.1945 +  | zeta (NEq (Mul (gy, gz))) = (1 : IntInf.int)
 11.1946 +  | zeta (Dvd (aa, C ho)) = (1 : IntInf.int)
 11.1947 +  | zeta (Dvd (aa, Bound hp)) = (1 : IntInf.int)
 11.1948 +  | zeta (Dvd (aa, Neg ht)) = (1 : IntInf.int)
 11.1949 +  | zeta (Dvd (aa, Add (hu, hv))) = (1 : IntInf.int)
 11.1950 +  | zeta (Dvd (aa, Sub (hw, hx))) = (1 : IntInf.int)
 11.1951 +  | zeta (Dvd (aa, Mul (hy, hz))) = (1 : IntInf.int)
 11.1952 +  | zeta (NDvd (ac, C io)) = (1 : IntInf.int)
 11.1953 +  | zeta (NDvd (ac, Bound ip)) = (1 : IntInf.int)
 11.1954 +  | zeta (NDvd (ac, Neg it)) = (1 : IntInf.int)
 11.1955 +  | zeta (NDvd (ac, Add (iu, iv))) = (1 : IntInf.int)
 11.1956 +  | zeta (NDvd (ac, Sub (iw, ix))) = (1 : IntInf.int)
 11.1957 +  | zeta (NDvd (ac, Mul (iy, iz))) = (1 : IntInf.int)
 11.1958 +  | zeta (Not ae) = (1 : IntInf.int)
 11.1959 +  | zeta (Imp (aj, ak)) = (1 : IntInf.int)
 11.1960 +  | zeta (Iff (al, am)) = (1 : IntInf.int)
 11.1961 +  | zeta (E an) = (1 : IntInf.int)
 11.1962 +  | zeta (A ao) = (1 : IntInf.int)
 11.1963 +  | zeta (Closed ap) = (1 : IntInf.int)
 11.1964 +  | zeta (NClosed aq) = (1 : IntInf.int)
 11.1965 +  | zeta (Lt (Cn (cm, c, e))) =
 11.1966 +    (if ((cm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1967 +  | zeta (Le (Cn (dm, c, e))) =
 11.1968 +    (if ((dm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1969 +  | zeta (Gt (Cn (em, c, e))) =
 11.1970 +    (if ((em : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1971 +  | zeta (Ge (Cn (fm, c, e))) =
 11.1972 +    (if ((fm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1973 +  | zeta (Eq (Cn (gm, c, e))) =
 11.1974 +    (if ((gm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1975 +  | zeta (NEq (Cn (hm, c, e))) =
 11.1976 +    (if ((hm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1977 +  | zeta (Dvd (i, Cn (im, c, e))) =
 11.1978 +    (if ((im : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 11.1979 +  | zeta (NDvd (i, Cn (jm, c, e))) =
 11.1980 +    (if ((jm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int));
 11.1981 +
 11.1982 +fun zsplit0 (C c) = ((0 : IntInf.int), C c)
 11.1983 +  | zsplit0 (Bound n) =
 11.1984 +    (if ((n : IntInf.int) = (0 : IntInf.int))
 11.1985 +      then ((1 : IntInf.int), C (0 : IntInf.int))
 11.1986 +      else ((0 : IntInf.int), Bound n))
 11.1987 +  | zsplit0 (Cn (n, i, a)) =
 11.1988 +    let
 11.1989 +      val (ia, aa) = zsplit0 a;
 11.1990 +    in
 11.1991 +      (if ((n : IntInf.int) = (0 : IntInf.int)) then (IntInf.+ (i, ia), aa)
 11.1992 +        else (ia, Cn (n, i, aa)))
 11.1993 +    end
 11.1994 +  | zsplit0 (Neg a) =
 11.1995 +    let
 11.1996 +      val (i, aa) = zsplit0 a;
 11.1997 +    in
 11.1998 +      (IntInf.~ i, Neg aa)
 11.1999 +    end
 11.2000 +  | zsplit0 (Add (a, b)) =
 11.2001 +    let
 11.2002 +      val (ia, aa) = zsplit0 a;
 11.2003 +      val (ib, ba) = zsplit0 b;
 11.2004 +    in
 11.2005 +      (IntInf.+ (ia, ib), Add (aa, ba))
 11.2006 +    end
 11.2007 +  | zsplit0 (Sub (a, b)) =
 11.2008 +    let
 11.2009 +      val (ia, aa) = zsplit0 a;
 11.2010 +      val (ib, ba) = zsplit0 b;
 11.2011 +    in
 11.2012 +      (IntInf.- (ia, ib), Sub (aa, ba))
 11.2013 +    end
 11.2014 +  | zsplit0 (Mul (i, a)) =
 11.2015 +    let
 11.2016 +      val (ia, aa) = zsplit0 a;
 11.2017 +    in
 11.2018 +      (IntInf.* (i, ia), Mul (i, aa))
 11.2019 +    end;
 11.2020 +
 11.2021 +fun zlfm (And (p, q)) = And (zlfm p, zlfm q)
 11.2022 +  | zlfm (Or (p, q)) = Or (zlfm p, zlfm q)
 11.2023 +  | zlfm (Imp (p, q)) = Or (zlfm (Not p), zlfm q)
 11.2024 +  | zlfm (Iff (p, q)) =
 11.2025 +    Or (And (zlfm p, zlfm q), And (zlfm (Not p), zlfm (Not q)))
 11.2026 +  | zlfm (Lt a) =
 11.2027 +    let
 11.2028 +      val (c, r) = zsplit0 a;
 11.2029 +    in
 11.2030 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then Lt r
 11.2031 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2032 +               then Lt (Cn ((0 : IntInf.int), c, r))
 11.2033 +               else Gt (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2034 +    end
 11.2035 +  | zlfm (Le a) =
 11.2036 +    let
 11.2037 +      val (c, r) = zsplit0 a;
 11.2038 +    in
 11.2039 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then Le r
 11.2040 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2041 +               then Le (Cn ((0 : IntInf.int), c, r))
 11.2042 +               else Ge (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2043 +    end
 11.2044 +  | zlfm (Gt a) =
 11.2045 +    let
 11.2046 +      val (c, r) = zsplit0 a;
 11.2047 +    in
 11.2048 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then Gt r
 11.2049 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2050 +               then Gt (Cn ((0 : IntInf.int), c, r))
 11.2051 +               else Lt (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2052 +    end
 11.2053 +  | zlfm (Ge a) =
 11.2054 +    let
 11.2055 +      val (c, r) = zsplit0 a;
 11.2056 +    in
 11.2057 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then Ge r
 11.2058 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2059 +               then Ge (Cn ((0 : IntInf.int), c, r))
 11.2060 +               else Le (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2061 +    end
 11.2062 +  | zlfm (Eq a) =
 11.2063 +    let
 11.2064 +      val (c, r) = zsplit0 a;
 11.2065 +    in
 11.2066 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then Eq r
 11.2067 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2068 +               then Eq (Cn ((0 : IntInf.int), c, r))
 11.2069 +               else Eq (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2070 +    end
 11.2071 +  | zlfm (NEq a) =
 11.2072 +    let
 11.2073 +      val (c, r) = zsplit0 a;
 11.2074 +    in
 11.2075 +      (if ((c : IntInf.int) = (0 : IntInf.int)) then NEq r
 11.2076 +        else (if IntInf.< ((0 : IntInf.int), c)
 11.2077 +               then NEq (Cn ((0 : IntInf.int), c, r))
 11.2078 +               else NEq (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2079 +    end
 11.2080 +  | zlfm (Dvd (i, a)) =
 11.2081 +    (if ((i : IntInf.int) = (0 : IntInf.int)) then zlfm (Eq a)
 11.2082 +      else let
 11.2083 +             val (c, r) = zsplit0 a;
 11.2084 +           in
 11.2085 +             (if ((c : IntInf.int) = (0 : IntInf.int)) then Dvd (abs_int i, r)
 11.2086 +               else (if IntInf.< ((0 : IntInf.int), c)
 11.2087 +                      then Dvd (abs_int i, Cn ((0 : IntInf.int), c, r))
 11.2088 +                      else Dvd (abs_int i,
 11.2089 +                                 Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2090 +           end)
 11.2091 +  | zlfm (NDvd (i, a)) =
 11.2092 +    (if ((i : IntInf.int) = (0 : IntInf.int)) then zlfm (NEq a)
 11.2093 +      else let
 11.2094 +             val (c, r) = zsplit0 a;
 11.2095 +           in
 11.2096 +             (if ((c : IntInf.int) = (0 : IntInf.int)) then NDvd (abs_int i, r)
 11.2097 +               else (if IntInf.< ((0 : IntInf.int), c)
 11.2098 +                      then NDvd (abs_int i, Cn ((0 : IntInf.int), c, r))
 11.2099 +                      else NDvd (abs_int i,
 11.2100 +                                  Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 11.2101 +           end)
 11.2102 +  | zlfm (Not (And (p, q))) = Or (zlfm (Not p), zlfm (Not q))
 11.2103 +  | zlfm (Not (Or (p, q))) = And (zlfm (Not p), zlfm (Not q))
 11.2104 +  | zlfm (Not (Imp (p, q))) = And (zlfm p, zlfm (Not q))
 11.2105 +  | zlfm (Not (Iff (p, q))) =
 11.2106 +    Or (And (zlfm p, zlfm (Not q)), And (zlfm (Not p), zlfm q))
 11.2107 +  | zlfm (Not (Not p)) = zlfm p
 11.2108 +  | zlfm (Not T) = F
 11.2109 +  | zlfm (Not F) = T
 11.2110 +  | zlfm (Not (Lt a)) = zlfm (Ge a)
 11.2111 +  | zlfm (Not (Le a)) = zlfm (Gt a)
 11.2112 +  | zlfm (Not (Gt a)) = zlfm (Le a)
 11.2113 +  | zlfm (Not (Ge a)) = zlfm (Lt a)
 11.2114 +  | zlfm (Not (Eq a)) = zlfm (NEq a)
 11.2115 +  | zlfm (Not (NEq a)) = zlfm (Eq a)
 11.2116 +  | zlfm (Not (Dvd (i, a))) = zlfm (NDvd (i, a))
 11.2117 +  | zlfm (Not (NDvd (i, a))) = zlfm (Dvd (i, a))
 11.2118 +  | zlfm (Not (Closed p)) = NClosed p
 11.2119 +  | zlfm (Not (NClosed p)) = Closed p
 11.2120 +  | zlfm T = T
 11.2121 +  | zlfm F = F
 11.2122 +  | zlfm (Not (E ci)) = Not (E ci)
 11.2123 +  | zlfm (Not (A cj)) = Not (A cj)
 11.2124 +  | zlfm (E ao) = E ao
 11.2125 +  | zlfm (A ap) = A ap
 11.2126 +  | zlfm (Closed aq) = Closed aq
 11.2127 +  | zlfm (NClosed ar) = NClosed ar;
 11.2128 +
 11.2129 +fun unita p =
 11.2130 +  let
 11.2131 +    val pa = zlfm p;
 11.2132 +    val l = zeta pa;
 11.2133 +    val q =
 11.2134 +      And (Dvd (l, Cn ((0 : IntInf.int), (1 : IntInf.int), C (0 : IntInf.int))),
 11.2135 +            a_beta pa l);
 11.2136 +    val d = delta q;
 11.2137 +    val b = remdups eq_numa (map simpnum (beta q));
 11.2138 +    val a = remdups eq_numa (map simpnum (alpha q));
 11.2139 +  in
 11.2140 +    (if IntInf.<= (size_list b, size_list a) then (q, (b, d))
 11.2141 +      else (mirror q, (a, d)))
 11.2142 +  end;
 11.2143 +
 11.2144 +fun cooper p =
 11.2145 +  let
 11.2146 +    val (q, (b, d)) = unita p;
 11.2147 +    val js = iupt (1 : IntInf.int) d;
 11.2148 +    val mq = simpfm (minusinf q);
 11.2149 +    val md = evaldjf (fn j => simpfm (subst0 (C j) mq)) js;
 11.2150 +  in
 11.2151 +    (if eq_fm md T then T
 11.2152 +      else let
 11.2153 +             val qd =
 11.2154 +               evaldjf (fn (ba, j) => simpfm (subst0 (Add (ba, C j)) q))
 11.2155 +                 (concat_map (fn ba => map (fn a => (ba, a)) js) b);
 11.2156 +           in
 11.2157 +             decr (disj md qd)
 11.2158 +           end)
 11.2159 +  end;
 11.2160 +
 11.2161 +fun prep (E T) = T
 11.2162 +  | prep (E F) = F
 11.2163 +  | prep (E (Or (p, q))) = Or (prep (E p), prep (E q))
 11.2164 +  | prep (E (Imp (p, q))) = Or (prep (E (Not p)), prep (E q))
 11.2165 +  | prep (E (Iff (p, q))) =
 11.2166 +    Or (prep (E (And (p, q))), prep (E (And (Not p, Not q))))
 11.2167 +  | prep (E (Not (And (p, q)))) = Or (prep (E (Not p)), prep (E (Not q)))
 11.2168 +  | prep (E (Not (Imp (p, q)))) = prep (E (And (p, Not q)))
 11.2169 +  | prep (E (Not (Iff (p, q)))) =
 11.2170 +    Or (prep (E (And (p, Not q))), prep (E (And (Not p, q))))
 11.2171 +  | prep (E (Lt ef)) = E (prep (Lt ef))
 11.2172 +  | prep (E (Le eg)) = E (prep (Le eg))
 11.2173 +  | prep (E (Gt eh)) = E (prep (Gt eh))
 11.2174 +  | prep (E (Ge ei)) = E (prep (Ge ei))
 11.2175 +  | prep (E (Eq ej)) = E (prep (Eq ej))
 11.2176 +  | prep (E (NEq ek)) = E (prep (NEq ek))
 11.2177 +  | prep (E (Dvd (el, em))) = E (prep (Dvd (el, em)))
 11.2178 +  | prep (E (NDvd (en, eo))) = E (prep (NDvd (en, eo)))
 11.2179 +  | prep (E (Not T)) = E (prep (Not T))
 11.2180 +  | prep (E (Not F)) = E (prep (Not F))
 11.2181 +  | prep (E (Not (Lt gw))) = E (prep (Not (Lt gw)))
 11.2182 +  | prep (E (Not (Le gx))) = E (prep (Not (Le gx)))
 11.2183 +  | prep (E (Not (Gt gy))) = E (prep (Not (Gt gy)))
 11.2184 +  | prep (E (Not (Ge gz))) = E (prep (Not (Ge gz)))
 11.2185 +  | prep (E (Not (Eq ha))) = E (prep (Not (Eq ha)))
 11.2186 +  | prep (E (Not (NEq hb))) = E (prep (Not (NEq hb)))
 11.2187 +  | prep (E (Not (Dvd (hc, hd)))) = E (prep (Not (Dvd (hc, hd))))
 11.2188 +  | prep (E (Not (NDvd (he, hf)))) = E (prep (Not (NDvd (he, hf))))
 11.2189 +  | prep (E (Not (Not hg))) = E (prep (Not (Not hg)))
 11.2190 +  | prep (E (Not (Or (hj, hk)))) = E (prep (Not (Or (hj, hk))))
 11.2191 +  | prep (E (Not (E hp))) = E (prep (Not (E hp)))
 11.2192 +  | prep (E (Not (A hq))) = E (prep (Not (A hq)))
 11.2193 +  | prep (E (Not (Closed hr))) = E (prep (Not (Closed hr)))
 11.2194 +  | prep (E (Not (NClosed hs))) = E (prep (Not (NClosed hs)))
 11.2195 +  | prep (E (And (eq, er))) = E (prep (And (eq, er)))
 11.2196 +  | prep (E (E ey)) = E (prep (E ey))
 11.2197 +  | prep (E (A ez)) = E (prep (A ez))
 11.2198 +  | prep (E (Closed fa)) = E (prep (Closed fa))
 11.2199 +  | prep (E (NClosed fb)) = E (prep (NClosed fb))
 11.2200 +  | prep (A (And (p, q))) = And (prep (A p), prep (A q))
 11.2201 +  | prep (A T) = prep (Not (E (Not T)))
 11.2202 +  | prep (A F) = prep (Not (E (Not F)))
 11.2203 +  | prep (A (Lt jn)) = prep (Not (E (Not (Lt jn))))
 11.2204 +  | prep (A (Le jo)) = prep (Not (E (Not (Le jo))))
 11.2205 +  | prep (A (Gt jp)) = prep (Not (E (Not (Gt jp))))
 11.2206 +  | prep (A (Ge jq)) = prep (Not (E (Not (Ge jq))))
 11.2207 +  | prep (A (Eq jr)) = prep (Not (E (Not (Eq jr))))
 11.2208 +  | prep (A (NEq js)) = prep (Not (E (Not (NEq js))))
 11.2209 +  | prep (A (Dvd (jt, ju))) = prep (Not (E (Not (Dvd (jt, ju)))))
 11.2210 +  | prep (A (NDvd (jv, jw))) = prep (Not (E (Not (NDvd (jv, jw)))))
 11.2211 +  | prep (A (Not jx)) = prep (Not (E (Not (Not jx))))
 11.2212 +  | prep (A (Or (ka, kb))) = prep (Not (E (Not (Or (ka, kb)))))
 11.2213 +  | prep (A (Imp (kc, kd))) = prep (Not (E (Not (Imp (kc, kd)))))
 11.2214 +  | prep (A (Iff (ke, kf))) = prep (Not (E (Not (Iff (ke, kf)))))
 11.2215 +  | prep (A (E kg)) = prep (Not (E (Not (E kg))))
 11.2216 +  | prep (A (A kh)) = prep (Not (E (Not (A kh))))
 11.2217 +  | prep (A (Closed ki)) = prep (Not (E (Not (Closed ki))))
 11.2218 +  | prep (A (NClosed kj)) = prep (Not (E (Not (NClosed kj))))
 11.2219 +  | prep (Not (Not p)) = prep p
 11.2220 +  | prep (Not (And (p, q))) = Or (prep (Not p), prep (Not q))
 11.2221 +  | prep (Not (A p)) = prep (E (Not p))
 11.2222 +  | prep (Not (Or (p, q))) = And (prep (Not p), prep (Not q))
 11.2223 +  | prep (Not (Imp (p, q))) = And (prep p, prep (Not q))
 11.2224 +  | prep (Not (Iff (p, q))) = Or (prep (And (p, Not q)), prep (And (Not p, q)))
 11.2225 +  | prep (Not T) = Not (prep T)
 11.2226 +  | prep (Not F) = Not (prep F)
 11.2227 +  | prep (Not (Lt bo)) = Not (prep (Lt bo))
 11.2228 +  | prep (Not (Le bp)) = Not (prep (Le bp))
 11.2229 +  | prep (Not (Gt bq)) = Not (prep (Gt bq))
 11.2230 +  | prep (Not (Ge br)) = Not (prep (Ge br))
 11.2231 +  | prep (Not (Eq bs)) = Not (prep (Eq bs))
 11.2232 +  | prep (Not (NEq bt)) = Not (prep (NEq bt))
 11.2233 +  | prep (Not (Dvd (bu, bv))) = Not (prep (Dvd (bu, bv)))
 11.2234 +  | prep (Not (NDvd (bw, bx))) = Not (prep (NDvd (bw, bx)))
 11.2235 +  | prep (Not (E ch)) = Not (prep (E ch))
 11.2236 +  | prep (Not (Closed cj)) = Not (prep (Closed cj))
 11.2237 +  | prep (Not (NClosed ck)) = Not (prep (NClosed ck))
 11.2238 +  | prep (Or (p, q)) = Or (prep p, prep q)
 11.2239 +  | prep (And (p, q)) = And (prep p, prep q)
 11.2240 +  | prep (Imp (p, q)) = prep (Or (Not p, q))
 11.2241 +  | prep (Iff (p, q)) = Or (prep (And (p, q)), prep (And (Not p, Not q)))
 11.2242 +  | prep T = T
 11.2243 +  | prep F = F
 11.2244 +  | prep (Lt u) = Lt u
 11.2245 +  | prep (Le v) = Le v
 11.2246 +  | prep (Gt w) = Gt w
 11.2247 +  | prep (Ge x) = Ge x
 11.2248 +  | prep (Eq y) = Eq y
 11.2249 +  | prep (NEq z) = NEq z
 11.2250 +  | prep (Dvd (aa, ab)) = Dvd (aa, ab)
 11.2251 +  | prep (NDvd (ac, ad)) = NDvd (ac, ad)
 11.2252 +  | prep (Closed ap) = Closed ap
 11.2253 +  | prep (NClosed aq) = NClosed aq;
 11.2254 +
 11.2255 +fun qelim (E p) = (fn qe => dj qe (qelim p qe))
 11.2256 +  | qelim (A p) = (fn qe => nota (qe (qelim (Not p) qe)))
 11.2257 +  | qelim (Not p) = (fn qe => nota (qelim p qe))
 11.2258 +  | qelim (And (p, q)) = (fn qe => conj (qelim p qe) (qelim q qe))
 11.2259 +  | qelim (Or (p, q)) = (fn qe => disj (qelim p qe) (qelim q qe))
 11.2260 +  | qelim (Imp (p, q)) = (fn qe => impa (qelim p qe) (qelim q qe))
 11.2261 +  | qelim (Iff (p, q)) = (fn qe => iffa (qelim p qe) (qelim q qe))
 11.2262 +  | qelim T = (fn _ => simpfm T)
 11.2263 +  | qelim F = (fn _ => simpfm F)
 11.2264 +  | qelim (Lt u) = (fn _ => simpfm (Lt u))
 11.2265 +  | qelim (Le v) = (fn _ => simpfm (Le v))
 11.2266 +  | qelim (Gt w) = (fn _ => simpfm (Gt w))
 11.2267 +  | qelim (Ge x) = (fn _ => simpfm (Ge x))
 11.2268 +  | qelim (Eq y) = (fn _ => simpfm (Eq y))
 11.2269 +  | qelim (NEq z) = (fn _ => simpfm (NEq z))
 11.2270 +  | qelim (Dvd (aa, ab)) = (fn _ => simpfm (Dvd (aa, ab)))
 11.2271 +  | qelim (NDvd (ac, ad)) = (fn _ => simpfm (NDvd (ac, ad)))
 11.2272 +  | qelim (Closed ap) = (fn _ => simpfm (Closed ap))
 11.2273 +  | qelim (NClosed aq) = (fn _ => simpfm (NClosed aq));
 11.2274 +
 11.2275 +fun pa p = qelim (prep p) cooper;
 11.2276 +
 11.2277 +end; (*struct Cooper_Procedure*)
    12.1 --- a/src/HOL/Tools/Qelim/generated_cooper.ML	Tue May 11 09:10:31 2010 -0700
    12.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.3 @@ -1,2274 +0,0 @@
    12.4 -(* Generated from Cooper.thy; DO NOT EDIT! *)
    12.5 -
    12.6 -structure Generated_Cooper : sig
    12.7 -  type 'a eq
    12.8 -  val eq : 'a eq -> 'a -> 'a -> bool
    12.9 -  val eqa : 'a eq -> 'a -> 'a -> bool
   12.10 -  val leta : 'a -> ('a -> 'b) -> 'b
   12.11 -  val suc : IntInf.int -> IntInf.int
   12.12 -  datatype num = C of IntInf.int | Bound of IntInf.int |
   12.13 -    Cn of IntInf.int * IntInf.int * num | Neg of num | Add of num * num |
   12.14 -    Sub of num * num | Mul of IntInf.int * num
   12.15 -  datatype fm = T | F | Lt of num | Le of num | Gt of num | Ge of num |
   12.16 -    Eq of num | NEq of num | Dvd of IntInf.int * num | NDvd of IntInf.int * num
   12.17 -    | Not of fm | And of fm * fm | Or of fm * fm | Imp of fm * fm |
   12.18 -    Iff of fm * fm | E of fm | A of fm | Closed of IntInf.int |
   12.19 -    NClosed of IntInf.int
   12.20 -  val map : ('a -> 'b) -> 'a list -> 'b list
   12.21 -  val append : 'a list -> 'a list -> 'a list
   12.22 -  val disjuncts : fm -> fm list
   12.23 -  val fm_case :
   12.24 -    'a -> 'a -> (num -> 'a) ->
   12.25 -                  (num -> 'a) ->
   12.26 -                    (num -> 'a) ->
   12.27 -                      (num -> 'a) ->
   12.28 -                        (num -> 'a) ->
   12.29 -                          (num -> 'a) ->
   12.30 -                            (IntInf.int -> num -> 'a) ->
   12.31 -                              (IntInf.int -> num -> 'a) ->
   12.32 -                                (fm -> 'a) ->
   12.33 -                                  (fm -> fm -> 'a) ->
   12.34 -                                    (fm -> fm -> 'a) ->
   12.35 -                                      (fm -> fm -> 'a) ->
   12.36 -(fm -> fm -> 'a) ->
   12.37 -  (fm -> 'a) ->
   12.38 -    (fm -> 'a) -> (IntInf.int -> 'a) -> (IntInf.int -> 'a) -> fm -> 'a
   12.39 -  val eq_num : num -> num -> bool
   12.40 -  val eq_fm : fm -> fm -> bool
   12.41 -  val djf : ('a -> fm) -> 'a -> fm -> fm
   12.42 -  val foldr : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
   12.43 -  val evaldjf : ('a -> fm) -> 'a list -> fm
   12.44 -  val dj : (fm -> fm) -> fm -> fm
   12.45 -  val disj : fm -> fm -> fm
   12.46 -  val minus_nat : IntInf.int -> IntInf.int -> IntInf.int
   12.47 -  val decrnum : num -> num
   12.48 -  val decr : fm -> fm
   12.49 -  val concat_map : ('a -> 'b list) -> 'a list -> 'b list
   12.50 -  val numsubst0 : num -> num -> num
   12.51 -  val subst0 : num -> fm -> fm
   12.52 -  val minusinf : fm -> fm
   12.53 -  val eq_int : IntInf.int eq
   12.54 -  val zero_int : IntInf.int
   12.55 -  type 'a zero
   12.56 -  val zero : 'a zero -> 'a
   12.57 -  val zero_inta : IntInf.int zero
   12.58 -  type 'a times
   12.59 -  val times : 'a times -> 'a -> 'a -> 'a
   12.60 -  type 'a no_zero_divisors
   12.61 -  val times_no_zero_divisors : 'a no_zero_divisors -> 'a times
   12.62 -  val zero_no_zero_divisors : 'a no_zero_divisors -> 'a zero
   12.63 -  val times_int : IntInf.int times
   12.64 -  val no_zero_divisors_int : IntInf.int no_zero_divisors
   12.65 -  type 'a one
   12.66 -  val one : 'a one -> 'a
   12.67 -  type 'a zero_neq_one
   12.68 -  val one_zero_neq_one : 'a zero_neq_one -> 'a one
   12.69 -  val zero_zero_neq_one : 'a zero_neq_one -> 'a zero
   12.70 -  type 'a semigroup_mult
   12.71 -  val times_semigroup_mult : 'a semigroup_mult -> 'a times
   12.72 -  type 'a plus
   12.73 -  val plus : 'a plus -> 'a -> 'a -> 'a
   12.74 -  type 'a semigroup_add
   12.75 -  val plus_semigroup_add : 'a semigroup_add -> 'a plus
   12.76 -  type 'a ab_semigroup_add
   12.77 -  val semigroup_add_ab_semigroup_add : 'a ab_semigroup_add -> 'a semigroup_add
   12.78 -  type 'a semiring
   12.79 -  val ab_semigroup_add_semiring : 'a semiring -> 'a ab_semigroup_add
   12.80 -  val semigroup_mult_semiring : 'a semiring -> 'a semigroup_mult
   12.81 -  type 'a mult_zero
   12.82 -  val times_mult_zero : 'a mult_zero -> 'a times
   12.83 -  val zero_mult_zero : 'a mult_zero -> 'a zero
   12.84 -  type 'a monoid_add
   12.85 -  val semigroup_add_monoid_add : 'a monoid_add -> 'a semigroup_add
   12.86 -  val zero_monoid_add : 'a monoid_add -> 'a zero
   12.87 -  type 'a comm_monoid_add
   12.88 -  val ab_semigroup_add_comm_monoid_add :
   12.89 -    'a comm_monoid_add -> 'a ab_semigroup_add
   12.90 -  val monoid_add_comm_monoid_add : 'a comm_monoid_add -> 'a monoid_add
   12.91 -  type 'a semiring_0
   12.92 -  val comm_monoid_add_semiring_0 : 'a semiring_0 -> 'a comm_monoid_add
   12.93 -  val mult_zero_semiring_0 : 'a semiring_0 -> 'a mult_zero
   12.94 -  val semiring_semiring_0 : 'a semiring_0 -> 'a semiring
   12.95 -  type 'a power
   12.96 -  val one_power : 'a power -> 'a one
   12.97 -  val times_power : 'a power -> 'a times
   12.98 -  type 'a monoid_mult
   12.99 -  val semigroup_mult_monoid_mult : 'a monoid_mult -> 'a semigroup_mult
  12.100 -  val power_monoid_mult : 'a monoid_mult -> 'a power
  12.101 -  type 'a semiring_1
  12.102 -  val monoid_mult_semiring_1 : 'a semiring_1 -> 'a monoid_mult
  12.103 -  val semiring_0_semiring_1 : 'a semiring_1 -> 'a semiring_0
  12.104 -  val zero_neq_one_semiring_1 : 'a semiring_1 -> 'a zero_neq_one
  12.105 -  type 'a cancel_semigroup_add
  12.106 -  val semigroup_add_cancel_semigroup_add :
  12.107 -    'a cancel_semigroup_add -> 'a semigroup_add
  12.108 -  type 'a cancel_ab_semigroup_add
  12.109 -  val ab_semigroup_add_cancel_ab_semigroup_add :
  12.110 -    'a cancel_ab_semigroup_add -> 'a ab_semigroup_add
  12.111 -  val cancel_semigroup_add_cancel_ab_semigroup_add :
  12.112 -    'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add
  12.113 -  type 'a cancel_comm_monoid_add
  12.114 -  val cancel_ab_semigroup_add_cancel_comm_monoid_add :
  12.115 -    'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add
  12.116 -  val comm_monoid_add_cancel_comm_monoid_add :
  12.117 -    'a cancel_comm_monoid_add -> 'a comm_monoid_add
  12.118 -  type 'a semiring_0_cancel
  12.119 -  val cancel_comm_monoid_add_semiring_0_cancel :
  12.120 -    'a semiring_0_cancel -> 'a cancel_comm_monoid_add
  12.121 -  val semiring_0_semiring_0_cancel : 'a semiring_0_cancel -> 'a semiring_0
  12.122 -  type 'a semiring_1_cancel
  12.123 -  val semiring_0_cancel_semiring_1_cancel :
  12.124 -    'a semiring_1_cancel -> 'a semiring_0_cancel
  12.125 -  val semiring_1_semiring_1_cancel : 'a semiring_1_cancel -> 'a semiring_1
  12.126 -  type 'a dvd
  12.127 -  val times_dvd : 'a dvd -> 'a times
  12.128 -  type 'a ab_semigroup_mult
  12.129 -  val semigroup_mult_ab_semigroup_mult :
  12.130 -    'a ab_semigroup_mult -> 'a semigroup_mult
  12.131 -  type 'a comm_semiring
  12.132 -  val ab_semigroup_mult_comm_semiring : 'a comm_semiring -> 'a ab_semigroup_mult
  12.133 -  val semiring_comm_semiring : 'a comm_semiring -> 'a semiring
  12.134 -  type 'a comm_semiring_0
  12.135 -  val comm_semiring_comm_semiring_0 : 'a comm_semiring_0 -> 'a comm_semiring
  12.136 -  val semiring_0_comm_semiring_0 : 'a comm_semiring_0 -> 'a semiring_0
  12.137 -  type 'a comm_monoid_mult
  12.138 -  val ab_semigroup_mult_comm_monoid_mult :
  12.139 -    'a comm_monoid_mult -> 'a ab_semigroup_mult
  12.140 -  val monoid_mult_comm_monoid_mult : 'a comm_monoid_mult -> 'a monoid_mult
  12.141 -  type 'a comm_semiring_1
  12.142 -  val comm_monoid_mult_comm_semiring_1 :
  12.143 -    'a comm_semiring_1 -> 'a comm_monoid_mult
  12.144 -  val comm_semiring_0_comm_semiring_1 : 'a comm_semiring_1 -> 'a comm_semiring_0
  12.145 -  val dvd_comm_semiring_1 : 'a comm_semiring_1 -> 'a dvd
  12.146 -  val semiring_1_comm_semiring_1 : 'a comm_semiring_1 -> 'a semiring_1
  12.147 -  type 'a comm_semiring_0_cancel
  12.148 -  val comm_semiring_0_comm_semiring_0_cancel :
  12.149 -    'a comm_semiring_0_cancel -> 'a comm_semiring_0
  12.150 -  val semiring_0_cancel_comm_semiring_0_cancel :
  12.151 -    'a comm_semiring_0_cancel -> 'a semiring_0_cancel
  12.152 -  type 'a comm_semiring_1_cancel
  12.153 -  val comm_semiring_0_cancel_comm_semiring_1_cancel :
  12.154 -    'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel
  12.155 -  val comm_semiring_1_comm_semiring_1_cancel :
  12.156 -    'a comm_semiring_1_cancel -> 'a comm_semiring_1
  12.157 -  val semiring_1_cancel_comm_semiring_1_cancel :
  12.158 -    'a comm_semiring_1_cancel -> 'a semiring_1_cancel
  12.159 -  type 'a diva
  12.160 -  val dvd_div : 'a diva -> 'a dvd
  12.161 -  val diva : 'a diva -> 'a -> 'a -> 'a
  12.162 -  val moda : 'a diva -> 'a -> 'a -> 'a
  12.163 -  type 'a semiring_div
  12.164 -  val div_semiring_div : 'a semiring_div -> 'a diva
  12.165 -  val comm_semiring_1_cancel_semiring_div :
  12.166 -    'a semiring_div -> 'a comm_semiring_1_cancel
  12.167 -  val no_zero_divisors_semiring_div : 'a semiring_div -> 'a no_zero_divisors
  12.168 -  val one_int : IntInf.int
  12.169 -  val one_inta : IntInf.int one
  12.170 -  val zero_neq_one_int : IntInf.int zero_neq_one
  12.171 -  val semigroup_mult_int : IntInf.int semigroup_mult
  12.172 -  val plus_int : IntInf.int plus
  12.173 -  val semigroup_add_int : IntInf.int semigroup_add
  12.174 -  val ab_semigroup_add_int : IntInf.int ab_semigroup_add
  12.175 -  val semiring_int : IntInf.int semiring
  12.176 -  val mult_zero_int : IntInf.int mult_zero
  12.177 -  val monoid_add_int : IntInf.int monoid_add
  12.178 -  val comm_monoid_add_int : IntInf.int comm_monoid_add
  12.179 -  val semiring_0_int : IntInf.int semiring_0
  12.180 -  val power_int : IntInf.int power
  12.181 -  val monoid_mult_int : IntInf.int monoid_mult
  12.182 -  val semiring_1_int : IntInf.int semiring_1
  12.183 -  val cancel_semigroup_add_int : IntInf.int cancel_semigroup_add
  12.184 -  val cancel_ab_semigroup_add_int : IntInf.int cancel_ab_semigroup_add
  12.185 -  val cancel_comm_monoid_add_int : IntInf.int cancel_comm_monoid_add
  12.186 -  val semiring_0_cancel_int : IntInf.int semiring_0_cancel
  12.187 -  val semiring_1_cancel_int : IntInf.int semiring_1_cancel
  12.188 -  val dvd_int : IntInf.int dvd
  12.189 -  val ab_semigroup_mult_int : IntInf.int ab_semigroup_mult
  12.190 -  val comm_semiring_int : IntInf.int comm_semiring
  12.191 -  val comm_semiring_0_int : IntInf.int comm_semiring_0
  12.192 -  val comm_monoid_mult_int : IntInf.int comm_monoid_mult
  12.193 -  val comm_semiring_1_int : IntInf.int comm_semiring_1
  12.194 -  val comm_semiring_0_cancel_int : IntInf.int comm_semiring_0_cancel
  12.195 -  val comm_semiring_1_cancel_int : IntInf.int comm_semiring_1_cancel
  12.196 -  val abs_int : IntInf.int -> IntInf.int
  12.197 -  val split : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
  12.198 -  val sgn_int : IntInf.int -> IntInf.int
  12.199 -  val apsnd : ('a -> 'b) -> 'c * 'a -> 'c * 'b
  12.200 -  val divmod_int : IntInf.int -> IntInf.int -> IntInf.int * IntInf.int
  12.201 -  val snd : 'a * 'b -> 'b
  12.202 -  val mod_int : IntInf.int -> IntInf.int -> IntInf.int
  12.203 -  val fst : 'a * 'b -> 'a
  12.204 -  val div_int : IntInf.int -> IntInf.int -> IntInf.int
  12.205 -  val div_inta : IntInf.int diva
  12.206 -  val semiring_div_int : IntInf.int semiring_div
  12.207 -  val dvd : 'a semiring_div * 'a eq -> 'a -> 'a -> bool
  12.208 -  val num_case :
  12.209 -    (IntInf.int -> 'a) ->
  12.210 -      (IntInf.int -> 'a) ->
  12.211 -        (IntInf.int -> IntInf.int -> num -> 'a) ->
  12.212 -          (num -> 'a) ->
  12.213 -            (num -> num -> 'a) ->
  12.214 -              (num -> num -> 'a) -> (IntInf.int -> num -> 'a) -> num -> 'a
  12.215 -  val nummul : IntInf.int -> num -> num
  12.216 -  val numneg : num -> num
  12.217 -  val numadd : num * num -> num
  12.218 -  val numsub : num -> num -> num
  12.219 -  val simpnum : num -> num
  12.220 -  val nota : fm -> fm
  12.221 -  val iffa : fm -> fm -> fm
  12.222 -  val impa : fm -> fm -> fm
  12.223 -  val conj : fm -> fm -> fm
  12.224 -  val simpfm : fm -> fm
  12.225 -  val iupt : IntInf.int -> IntInf.int -> IntInf.int list
  12.226 -  val mirror : fm -> fm
  12.227 -  val size_list : 'a list -> IntInf.int
  12.228 -  val alpha : fm -> num list
  12.229 -  val beta : fm -> num list
  12.230 -  val eq_numa : num eq
  12.231 -  val member : 'a eq -> 'a -> 'a list -> bool
  12.232 -  val remdups : 'a eq -> 'a list -> 'a list
  12.233 -  val gcd_int : IntInf.int -> IntInf.int -> IntInf.int
  12.234 -  val lcm_int : IntInf.int -> IntInf.int -> IntInf.int
  12.235 -  val delta : fm -> IntInf.int
  12.236 -  val a_beta : fm -> IntInf.int -> fm
  12.237 -  val zeta : fm -> IntInf.int
  12.238 -  val zsplit0 : num -> IntInf.int * num
  12.239 -  val zlfm : fm -> fm
  12.240 -  val unita : fm -> fm * (num list * IntInf.int)
  12.241 -  val cooper : fm -> fm
  12.242 -  val prep : fm -> fm
  12.243 -  val qelim : fm -> (fm -> fm) -> fm
  12.244 -  val pa : fm -> fm
  12.245 -end = struct
  12.246 -
  12.247 -type 'a eq = {eq : 'a -> 'a -> bool};
  12.248 -val eq = #eq : 'a eq -> 'a -> 'a -> bool;
  12.249 -
  12.250 -fun eqa A_ a b = eq A_ a b;
  12.251 -
  12.252 -fun leta s f = f s;
  12.253 -
  12.254 -fun suc n = IntInf.+ (n, (1 : IntInf.int));
  12.255 -
  12.256 -datatype num = C of IntInf.int | Bound of IntInf.int |
  12.257 -  Cn of IntInf.int * IntInf.int * num | Neg of num | Add of num * num |
  12.258 -  Sub of num * num | Mul of IntInf.int * num;
  12.259 -
  12.260 -datatype fm = T | F | Lt of num | Le of num | Gt of num | Ge of num | Eq of num
  12.261 -  | NEq of num | Dvd of IntInf.int * num | NDvd of IntInf.int * num | Not of fm
  12.262 -  | And of fm * fm | Or of fm * fm | Imp of fm * fm | Iff of fm * fm | E of fm |
  12.263 -  A of fm | Closed of IntInf.int | NClosed of IntInf.int;
  12.264 -
  12.265 -fun map f [] = []
  12.266 -  | map f (x :: xs) = f x :: map f xs;
  12.267 -
  12.268 -fun append [] ys = ys
  12.269 -  | append (x :: xs) ys = x :: append xs ys;
  12.270 -
  12.271 -fun disjuncts (Or (p, q)) = append (disjuncts p) (disjuncts q)
  12.272 -  | disjuncts F = []
  12.273 -  | disjuncts T = [T]
  12.274 -  | disjuncts (Lt u) = [Lt u]
  12.275 -  | disjuncts (Le v) = [Le v]
  12.276 -  | disjuncts (Gt w) = [Gt w]
  12.277 -  | disjuncts (Ge x) = [Ge x]
  12.278 -  | disjuncts (Eq y) = [Eq y]
  12.279 -  | disjuncts (NEq z) = [NEq z]
  12.280 -  | disjuncts (Dvd (aa, ab)) = [Dvd (aa, ab)]
  12.281 -  | disjuncts (NDvd (ac, ad)) = [NDvd (ac, ad)]
  12.282 -  | disjuncts (Not ae) = [Not ae]
  12.283 -  | disjuncts (And (af, ag)) = [And (af, ag)]
  12.284 -  | disjuncts (Imp (aj, ak)) = [Imp (aj, ak)]
  12.285 -  | disjuncts (Iff (al, am)) = [Iff (al, am)]
  12.286 -  | disjuncts (E an) = [E an]
  12.287 -  | disjuncts (A ao) = [A ao]
  12.288 -  | disjuncts (Closed ap) = [Closed ap]
  12.289 -  | disjuncts (NClosed aq) = [NClosed aq];
  12.290 -
  12.291 -fun fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.292 -  (NClosed nat) = f19 nat
  12.293 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.294 -    (Closed nat) = f18 nat
  12.295 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.296 -    (A fm) = f17 fm
  12.297 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.298 -    (E fm) = f16 fm
  12.299 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.300 -    (Iff (fm1, fm2)) = f15 fm1 fm2
  12.301 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.302 -    (Imp (fm1, fm2)) = f14 fm1 fm2
  12.303 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.304 -    (Or (fm1, fm2)) = f13 fm1 fm2
  12.305 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.306 -    (And (fm1, fm2)) = f12 fm1 fm2
  12.307 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.308 -    (Not fm) = f11 fm
  12.309 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.310 -    (NDvd (inta, num)) = f10 inta num
  12.311 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.312 -    (Dvd (inta, num)) = f9 inta num
  12.313 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.314 -    (NEq num) = f8 num
  12.315 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.316 -    (Eq num) = f7 num
  12.317 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.318 -    (Ge num) = f6 num
  12.319 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.320 -    (Gt num) = f5 num
  12.321 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.322 -    (Le num) = f4 num
  12.323 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19
  12.324 -    (Lt num) = f3 num
  12.325 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 F
  12.326 -    = f2
  12.327 -  | fm_case f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 T
  12.328 -    = f1;
  12.329 -
  12.330 -fun eq_num (C intaa) (C inta) = ((intaa : IntInf.int) = inta)
  12.331 -  | eq_num (Bound nata) (Bound nat) = ((nata : IntInf.int) = nat)
  12.332 -  | eq_num (Cn (nata, intaa, numa)) (Cn (nat, inta, num)) =
  12.333 -    ((nata : IntInf.int) = nat) andalso
  12.334 -      (((intaa : IntInf.int) = inta) andalso eq_num numa num)
  12.335 -  | eq_num (Neg numa) (Neg num) = eq_num numa num
  12.336 -  | eq_num (Add (num1a, num2a)) (Add (num1, num2)) =
  12.337 -    eq_num num1a num1 andalso eq_num num2a num2
  12.338 -  | eq_num (Sub (num1a, num2a)) (Sub (num1, num2)) =
  12.339 -    eq_num num1a num1 andalso eq_num num2a num2
  12.340 -  | eq_num (Mul (intaa, numa)) (Mul (inta, num)) =
  12.341 -    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  12.342 -  | eq_num (C inta) (Bound nat) = false
  12.343 -  | eq_num (Bound nat) (C inta) = false
  12.344 -  | eq_num (C intaa) (Cn (nat, inta, num)) = false
  12.345 -  | eq_num (Cn (nat, intaa, num)) (C inta) = false
  12.346 -  | eq_num (C inta) (Neg num) = false
  12.347 -  | eq_num (Neg num) (C inta) = false
  12.348 -  | eq_num (C inta) (Add (num1, num2)) = false
  12.349 -  | eq_num (Add (num1, num2)) (C inta) = false
  12.350 -  | eq_num (C inta) (Sub (num1, num2)) = false
  12.351 -  | eq_num (Sub (num1, num2)) (C inta) = false
  12.352 -  | eq_num (C intaa) (Mul (inta, num)) = false
  12.353 -  | eq_num (Mul (intaa, num)) (C inta) = false
  12.354 -  | eq_num (Bound nata) (Cn (nat, inta, num)) = false
  12.355 -  | eq_num (Cn (nata, inta, num)) (Bound nat) = false
  12.356 -  | eq_num (Bound nat) (Neg num) = false
  12.357 -  | eq_num (Neg num) (Bound nat) = false
  12.358 -  | eq_num (Bound nat) (Add (num1, num2)) = false
  12.359 -  | eq_num (Add (num1, num2)) (Bound nat) = false
  12.360 -  | eq_num (Bound nat) (Sub (num1, num2)) = false
  12.361 -  | eq_num (Sub (num1, num2)) (Bound nat) = false
  12.362 -  | eq_num (Bound nat) (Mul (inta, num)) = false
  12.363 -  | eq_num (Mul (inta, num)) (Bound nat) = false
  12.364 -  | eq_num (Cn (nat, inta, numa)) (Neg num) = false
  12.365 -  | eq_num (Neg numa) (Cn (nat, inta, num)) = false
  12.366 -  | eq_num (Cn (nat, inta, num)) (Add (num1, num2)) = false
  12.367 -  | eq_num (Add (num1, num2)) (Cn (nat, inta, num)) = false
  12.368 -  | eq_num (Cn (nat, inta, num)) (Sub (num1, num2)) = false
  12.369 -  | eq_num (Sub (num1, num2)) (Cn (nat, inta, num)) = false
  12.370 -  | eq_num (Cn (nat, intaa, numa)) (Mul (inta, num)) = false
  12.371 -  | eq_num (Mul (intaa, numa)) (Cn (nat, inta, num)) = false
  12.372 -  | eq_num (Neg num) (Add (num1, num2)) = false
  12.373 -  | eq_num (Add (num1, num2)) (Neg num) = false
  12.374 -  | eq_num (Neg num) (Sub (num1, num2)) = false
  12.375 -  | eq_num (Sub (num1, num2)) (Neg num) = false
  12.376 -  | eq_num (Neg numa) (Mul (inta, num)) = false
  12.377 -  | eq_num (Mul (inta, numa)) (Neg num) = false
  12.378 -  | eq_num (Add (num1a, num2a)) (Sub (num1, num2)) = false
  12.379 -  | eq_num (Sub (num1a, num2a)) (Add (num1, num2)) = false
  12.380 -  | eq_num (Add (num1, num2)) (Mul (inta, num)) = false
  12.381 -  | eq_num (Mul (inta, num)) (Add (num1, num2)) = false
  12.382 -  | eq_num (Sub (num1, num2)) (Mul (inta, num)) = false
  12.383 -  | eq_num (Mul (inta, num)) (Sub (num1, num2)) = false;
  12.384 -
  12.385 -fun eq_fm T T = true
  12.386 -  | eq_fm F F = true
  12.387 -  | eq_fm (Lt numa) (Lt num) = eq_num numa num
  12.388 -  | eq_fm (Le numa) (Le num) = eq_num numa num
  12.389 -  | eq_fm (Gt numa) (Gt num) = eq_num numa num
  12.390 -  | eq_fm (Ge numa) (Ge num) = eq_num numa num
  12.391 -  | eq_fm (Eq numa) (Eq num) = eq_num numa num
  12.392 -  | eq_fm (NEq numa) (NEq num) = eq_num numa num
  12.393 -  | eq_fm (Dvd (intaa, numa)) (Dvd (inta, num)) =
  12.394 -    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  12.395 -  | eq_fm (NDvd (intaa, numa)) (NDvd (inta, num)) =
  12.396 -    ((intaa : IntInf.int) = inta) andalso eq_num numa num
  12.397 -  | eq_fm (Not fma) (Not fm) = eq_fm fma fm
  12.398 -  | eq_fm (And (fm1a, fm2a)) (And (fm1, fm2)) =
  12.399 -    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  12.400 -  | eq_fm (Or (fm1a, fm2a)) (Or (fm1, fm2)) =
  12.401 -    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  12.402 -  | eq_fm (Imp (fm1a, fm2a)) (Imp (fm1, fm2)) =
  12.403 -    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  12.404 -  | eq_fm (Iff (fm1a, fm2a)) (Iff (fm1, fm2)) =
  12.405 -    eq_fm fm1a fm1 andalso eq_fm fm2a fm2
  12.406 -  | eq_fm (E fma) (E fm) = eq_fm fma fm
  12.407 -  | eq_fm (A fma) (A fm) = eq_fm fma fm
  12.408 -  | eq_fm (Closed nata) (Closed nat) = ((nata : IntInf.int) = nat)
  12.409 -  | eq_fm (NClosed nata) (NClosed nat) = ((nata : IntInf.int) = nat)
  12.410 -  | eq_fm T F = false
  12.411 -  | eq_fm F T = false
  12.412 -  | eq_fm T (Lt num) = false
  12.413 -  | eq_fm (Lt num) T = false
  12.414 -  | eq_fm T (Le num) = false
  12.415 -  | eq_fm (Le num) T = false
  12.416 -  | eq_fm T (Gt num) = false
  12.417 -  | eq_fm (Gt num) T = false
  12.418 -  | eq_fm T (Ge num) = false
  12.419 -  | eq_fm (Ge num) T = false
  12.420 -  | eq_fm T (Eq num) = false
  12.421 -  | eq_fm (Eq num) T = false
  12.422 -  | eq_fm T (NEq num) = false
  12.423 -  | eq_fm (NEq num) T = false
  12.424 -  | eq_fm T (Dvd (inta, num)) = false
  12.425 -  | eq_fm (Dvd (inta, num)) T = false
  12.426 -  | eq_fm T (NDvd (inta, num)) = false
  12.427 -  | eq_fm (NDvd (inta, num)) T = false
  12.428 -  | eq_fm T (Not fm) = false
  12.429 -  | eq_fm (Not fm) T = false
  12.430 -  | eq_fm T (And (fm1, fm2)) = false
  12.431 -  | eq_fm (And (fm1, fm2)) T = false
  12.432 -  | eq_fm T (Or (fm1, fm2)) = false
  12.433 -  | eq_fm (Or (fm1, fm2)) T = false
  12.434 -  | eq_fm T (Imp (fm1, fm2)) = false
  12.435 -  | eq_fm (Imp (fm1, fm2)) T = false
  12.436 -  | eq_fm T (Iff (fm1, fm2)) = false
  12.437 -  | eq_fm (Iff (fm1, fm2)) T = false
  12.438 -  | eq_fm T (E fm) = false
  12.439 -  | eq_fm (E fm) T = false
  12.440 -  | eq_fm T (A fm) = false
  12.441 -  | eq_fm (A fm) T = false
  12.442 -  | eq_fm T (Closed nat) = false
  12.443 -  | eq_fm (Closed nat) T = false
  12.444 -  | eq_fm T (NClosed nat) = false
  12.445 -  | eq_fm (NClosed nat) T = false
  12.446 -  | eq_fm F (Lt num) = false
  12.447 -  | eq_fm (Lt num) F = false
  12.448 -  | eq_fm F (Le num) = false
  12.449 -  | eq_fm (Le num) F = false
  12.450 -  | eq_fm F (Gt num) = false
  12.451 -  | eq_fm (Gt num) F = false
  12.452 -  | eq_fm F (Ge num) = false
  12.453 -  | eq_fm (Ge num) F = false
  12.454 -  | eq_fm F (Eq num) = false
  12.455 -  | eq_fm (Eq num) F = false
  12.456 -  | eq_fm F (NEq num) = false
  12.457 -  | eq_fm (NEq num) F = false
  12.458 -  | eq_fm F (Dvd (inta, num)) = false
  12.459 -  | eq_fm (Dvd (inta, num)) F = false
  12.460 -  | eq_fm F (NDvd (inta, num)) = false
  12.461 -  | eq_fm (NDvd (inta, num)) F = false
  12.462 -  | eq_fm F (Not fm) = false
  12.463 -  | eq_fm (Not fm) F = false
  12.464 -  | eq_fm F (And (fm1, fm2)) = false
  12.465 -  | eq_fm (And (fm1, fm2)) F = false
  12.466 -  | eq_fm F (Or (fm1, fm2)) = false
  12.467 -  | eq_fm (Or (fm1, fm2)) F = false
  12.468 -  | eq_fm F (Imp (fm1, fm2)) = false
  12.469 -  | eq_fm (Imp (fm1, fm2)) F = false
  12.470 -  | eq_fm F (Iff (fm1, fm2)) = false
  12.471 -  | eq_fm (Iff (fm1, fm2)) F = false
  12.472 -  | eq_fm F (E fm) = false
  12.473 -  | eq_fm (E fm) F = false
  12.474 -  | eq_fm F (A fm) = false
  12.475 -  | eq_fm (A fm) F = false
  12.476 -  | eq_fm F (Closed nat) = false
  12.477 -  | eq_fm (Closed nat) F = false
  12.478 -  | eq_fm F (NClosed nat) = false
  12.479 -  | eq_fm (NClosed nat) F = false
  12.480 -  | eq_fm (Lt numa) (Le num) = false
  12.481 -  | eq_fm (Le numa) (Lt num) = false
  12.482 -  | eq_fm (Lt numa) (Gt num) = false
  12.483 -  | eq_fm (Gt numa) (Lt num) = false
  12.484 -  | eq_fm (Lt numa) (Ge num) = false
  12.485 -  | eq_fm (Ge numa) (Lt num) = false
  12.486 -  | eq_fm (Lt numa) (Eq num) = false
  12.487 -  | eq_fm (Eq numa) (Lt num) = false
  12.488 -  | eq_fm (Lt numa) (NEq num) = false
  12.489 -  | eq_fm (NEq numa) (Lt num) = false
  12.490 -  | eq_fm (Lt numa) (Dvd (inta, num)) = false
  12.491 -  | eq_fm (Dvd (inta, numa)) (Lt num) = false
  12.492 -  | eq_fm (Lt numa) (NDvd (inta, num)) = false
  12.493 -  | eq_fm (NDvd (inta, numa)) (Lt num) = false
  12.494 -  | eq_fm (Lt num) (Not fm) = false
  12.495 -  | eq_fm (Not fm) (Lt num) = false
  12.496 -  | eq_fm (Lt num) (And (fm1, fm2)) = false
  12.497 -  | eq_fm (And (fm1, fm2)) (Lt num) = false
  12.498 -  | eq_fm (Lt num) (Or (fm1, fm2)) = false
  12.499 -  | eq_fm (Or (fm1, fm2)) (Lt num) = false
  12.500 -  | eq_fm (Lt num) (Imp (fm1, fm2)) = false
  12.501 -  | eq_fm (Imp (fm1, fm2)) (Lt num) = false
  12.502 -  | eq_fm (Lt num) (Iff (fm1, fm2)) = false
  12.503 -  | eq_fm (Iff (fm1, fm2)) (Lt num) = false
  12.504 -  | eq_fm (Lt num) (E fm) = false
  12.505 -  | eq_fm (E fm) (Lt num) = false
  12.506 -  | eq_fm (Lt num) (A fm) = false
  12.507 -  | eq_fm (A fm) (Lt num) = false
  12.508 -  | eq_fm (Lt num) (Closed nat) = false
  12.509 -  | eq_fm (Closed nat) (Lt num) = false
  12.510 -  | eq_fm (Lt num) (NClosed nat) = false
  12.511 -  | eq_fm (NClosed nat) (Lt num) = false
  12.512 -  | eq_fm (Le numa) (Gt num) = false
  12.513 -  | eq_fm (Gt numa) (Le num) = false
  12.514 -  | eq_fm (Le numa) (Ge num) = false
  12.515 -  | eq_fm (Ge numa) (Le num) = false
  12.516 -  | eq_fm (Le numa) (Eq num) = false
  12.517 -  | eq_fm (Eq numa) (Le num) = false
  12.518 -  | eq_fm (Le numa) (NEq num) = false
  12.519 -  | eq_fm (NEq numa) (Le num) = false
  12.520 -  | eq_fm (Le numa) (Dvd (inta, num)) = false
  12.521 -  | eq_fm (Dvd (inta, numa)) (Le num) = false
  12.522 -  | eq_fm (Le numa) (NDvd (inta, num)) = false
  12.523 -  | eq_fm (NDvd (inta, numa)) (Le num) = false
  12.524 -  | eq_fm (Le num) (Not fm) = false
  12.525 -  | eq_fm (Not fm) (Le num) = false
  12.526 -  | eq_fm (Le num) (And (fm1, fm2)) = false
  12.527 -  | eq_fm (And (fm1, fm2)) (Le num) = false
  12.528 -  | eq_fm (Le num) (Or (fm1, fm2)) = false
  12.529 -  | eq_fm (Or (fm1, fm2)) (Le num) = false
  12.530 -  | eq_fm (Le num) (Imp (fm1, fm2)) = false
  12.531 -  | eq_fm (Imp (fm1, fm2)) (Le num) = false
  12.532 -  | eq_fm (Le num) (Iff (fm1, fm2)) = false
  12.533 -  | eq_fm (Iff (fm1, fm2)) (Le num) = false
  12.534 -  | eq_fm (Le num) (E fm) = false
  12.535 -  | eq_fm (E fm) (Le num) = false
  12.536 -  | eq_fm (Le num) (A fm) = false
  12.537 -  | eq_fm (A fm) (Le num) = false
  12.538 -  | eq_fm (Le num) (Closed nat) = false
  12.539 -  | eq_fm (Closed nat) (Le num) = false
  12.540 -  | eq_fm (Le num) (NClosed nat) = false
  12.541 -  | eq_fm (NClosed nat) (Le num) = false
  12.542 -  | eq_fm (Gt numa) (Ge num) = false
  12.543 -  | eq_fm (Ge numa) (Gt num) = false
  12.544 -  | eq_fm (Gt numa) (Eq num) = false
  12.545 -  | eq_fm (Eq numa) (Gt num) = false
  12.546 -  | eq_fm (Gt numa) (NEq num) = false
  12.547 -  | eq_fm (NEq numa) (Gt num) = false
  12.548 -  | eq_fm (Gt numa) (Dvd (inta, num)) = false
  12.549 -  | eq_fm (Dvd (inta, numa)) (Gt num) = false
  12.550 -  | eq_fm (Gt numa) (NDvd (inta, num)) = false
  12.551 -  | eq_fm (NDvd (inta, numa)) (Gt num) = false
  12.552 -  | eq_fm (Gt num) (Not fm) = false
  12.553 -  | eq_fm (Not fm) (Gt num) = false
  12.554 -  | eq_fm (Gt num) (And (fm1, fm2)) = false
  12.555 -  | eq_fm (And (fm1, fm2)) (Gt num) = false
  12.556 -  | eq_fm (Gt num) (Or (fm1, fm2)) = false
  12.557 -  | eq_fm (Or (fm1, fm2)) (Gt num) = false
  12.558 -  | eq_fm (Gt num) (Imp (fm1, fm2)) = false
  12.559 -  | eq_fm (Imp (fm1, fm2)) (Gt num) = false
  12.560 -  | eq_fm (Gt num) (Iff (fm1, fm2)) = false
  12.561 -  | eq_fm (Iff (fm1, fm2)) (Gt num) = false
  12.562 -  | eq_fm (Gt num) (E fm) = false
  12.563 -  | eq_fm (E fm) (Gt num) = false
  12.564 -  | eq_fm (Gt num) (A fm) = false
  12.565 -  | eq_fm (A fm) (Gt num) = false
  12.566 -  | eq_fm (Gt num) (Closed nat) = false
  12.567 -  | eq_fm (Closed nat) (Gt num) = false
  12.568 -  | eq_fm (Gt num) (NClosed nat) = false
  12.569 -  | eq_fm (NClosed nat) (Gt num) = false
  12.570 -  | eq_fm (Ge numa) (Eq num) = false
  12.571 -  | eq_fm (Eq numa) (Ge num) = false
  12.572 -  | eq_fm (Ge numa) (NEq num) = false
  12.573 -  | eq_fm (NEq numa) (Ge num) = false
  12.574 -  | eq_fm (Ge numa) (Dvd (inta, num)) = false
  12.575 -  | eq_fm (Dvd (inta, numa)) (Ge num) = false
  12.576 -  | eq_fm (Ge numa) (NDvd (inta, num)) = false
  12.577 -  | eq_fm (NDvd (inta, numa)) (Ge num) = false
  12.578 -  | eq_fm (Ge num) (Not fm) = false
  12.579 -  | eq_fm (Not fm) (Ge num) = false
  12.580 -  | eq_fm (Ge num) (And (fm1, fm2)) = false
  12.581 -  | eq_fm (And (fm1, fm2)) (Ge num) = false
  12.582 -  | eq_fm (Ge num) (Or (fm1, fm2)) = false
  12.583 -  | eq_fm (Or (fm1, fm2)) (Ge num) = false
  12.584 -  | eq_fm (Ge num) (Imp (fm1, fm2)) = false
  12.585 -  | eq_fm (Imp (fm1, fm2)) (Ge num) = false
  12.586 -  | eq_fm (Ge num) (Iff (fm1, fm2)) = false
  12.587 -  | eq_fm (Iff (fm1, fm2)) (Ge num) = false
  12.588 -  | eq_fm (Ge num) (E fm) = false
  12.589 -  | eq_fm (E fm) (Ge num) = false
  12.590 -  | eq_fm (Ge num) (A fm) = false
  12.591 -  | eq_fm (A fm) (Ge num) = false
  12.592 -  | eq_fm (Ge num) (Closed nat) = false
  12.593 -  | eq_fm (Closed nat) (Ge num) = false
  12.594 -  | eq_fm (Ge num) (NClosed nat) = false
  12.595 -  | eq_fm (NClosed nat) (Ge num) = false
  12.596 -  | eq_fm (Eq numa) (NEq num) = false
  12.597 -  | eq_fm (NEq numa) (Eq num) = false
  12.598 -  | eq_fm (Eq numa) (Dvd (inta, num)) = false
  12.599 -  | eq_fm (Dvd (inta, numa)) (Eq num) = false
  12.600 -  | eq_fm (Eq numa) (NDvd (inta, num)) = false
  12.601 -  | eq_fm (NDvd (inta, numa)) (Eq num) = false
  12.602 -  | eq_fm (Eq num) (Not fm) = false
  12.603 -  | eq_fm (Not fm) (Eq num) = false
  12.604 -  | eq_fm (Eq num) (And (fm1, fm2)) = false
  12.605 -  | eq_fm (And (fm1, fm2)) (Eq num) = false
  12.606 -  | eq_fm (Eq num) (Or (fm1, fm2)) = false
  12.607 -  | eq_fm (Or (fm1, fm2)) (Eq num) = false
  12.608 -  | eq_fm (Eq num) (Imp (fm1, fm2)) = false
  12.609 -  | eq_fm (Imp (fm1, fm2)) (Eq num) = false
  12.610 -  | eq_fm (Eq num) (Iff (fm1, fm2)) = false
  12.611 -  | eq_fm (Iff (fm1, fm2)) (Eq num) = false
  12.612 -  | eq_fm (Eq num) (E fm) = false
  12.613 -  | eq_fm (E fm) (Eq num) = false
  12.614 -  | eq_fm (Eq num) (A fm) = false
  12.615 -  | eq_fm (A fm) (Eq num) = false
  12.616 -  | eq_fm (Eq num) (Closed nat) = false
  12.617 -  | eq_fm (Closed nat) (Eq num) = false
  12.618 -  | eq_fm (Eq num) (NClosed nat) = false
  12.619 -  | eq_fm (NClosed nat) (Eq num) = false
  12.620 -  | eq_fm (NEq numa) (Dvd (inta, num)) = false
  12.621 -  | eq_fm (Dvd (inta, numa)) (NEq num) = false
  12.622 -  | eq_fm (NEq numa) (NDvd (inta, num)) = false
  12.623 -  | eq_fm (NDvd (inta, numa)) (NEq num) = false
  12.624 -  | eq_fm (NEq num) (Not fm) = false
  12.625 -  | eq_fm (Not fm) (NEq num) = false
  12.626 -  | eq_fm (NEq num) (And (fm1, fm2)) = false
  12.627 -  | eq_fm (And (fm1, fm2)) (NEq num) = false
  12.628 -  | eq_fm (NEq num) (Or (fm1, fm2)) = false
  12.629 -  | eq_fm (Or (fm1, fm2)) (NEq num) = false
  12.630 -  | eq_fm (NEq num) (Imp (fm1, fm2)) = false
  12.631 -  | eq_fm (Imp (fm1, fm2)) (NEq num) = false
  12.632 -  | eq_fm (NEq num) (Iff (fm1, fm2)) = false
  12.633 -  | eq_fm (Iff (fm1, fm2)) (NEq num) = false
  12.634 -  | eq_fm (NEq num) (E fm) = false
  12.635 -  | eq_fm (E fm) (NEq num) = false
  12.636 -  | eq_fm (NEq num) (A fm) = false
  12.637 -  | eq_fm (A fm) (NEq num) = false
  12.638 -  | eq_fm (NEq num) (Closed nat) = false
  12.639 -  | eq_fm (Closed nat) (NEq num) = false
  12.640 -  | eq_fm (NEq num) (NClosed nat) = false
  12.641 -  | eq_fm (NClosed nat) (NEq num) = false
  12.642 -  | eq_fm (Dvd (intaa, numa)) (NDvd (inta, num)) = false
  12.643 -  | eq_fm (NDvd (intaa, numa)) (Dvd (inta, num)) = false
  12.644 -  | eq_fm (Dvd (inta, num)) (Not fm) = false
  12.645 -  | eq_fm (Not fm) (Dvd (inta, num)) = false
  12.646 -  | eq_fm (Dvd (inta, num)) (And (fm1, fm2)) = false
  12.647 -  | eq_fm (And (fm1, fm2)) (Dvd (inta, num)) = false
  12.648 -  | eq_fm (Dvd (inta, num)) (Or (fm1, fm2)) = false
  12.649 -  | eq_fm (Or (fm1, fm2)) (Dvd (inta, num)) = false
  12.650 -  | eq_fm (Dvd (inta, num)) (Imp (fm1, fm2)) = false
  12.651 -  | eq_fm (Imp (fm1, fm2)) (Dvd (inta, num)) = false
  12.652 -  | eq_fm (Dvd (inta, num)) (Iff (fm1, fm2)) = false
  12.653 -  | eq_fm (Iff (fm1, fm2)) (Dvd (inta, num)) = false
  12.654 -  | eq_fm (Dvd (inta, num)) (E fm) = false
  12.655 -  | eq_fm (E fm) (Dvd (inta, num)) = false
  12.656 -  | eq_fm (Dvd (inta, num)) (A fm) = false
  12.657 -  | eq_fm (A fm) (Dvd (inta, num)) = false
  12.658 -  | eq_fm (Dvd (inta, num)) (Closed nat) = false
  12.659 -  | eq_fm (Closed nat) (Dvd (inta, num)) = false
  12.660 -  | eq_fm (Dvd (inta, num)) (NClosed nat) = false
  12.661 -  | eq_fm (NClosed nat) (Dvd (inta, num)) = false
  12.662 -  | eq_fm (NDvd (inta, num)) (Not fm) = false
  12.663 -  | eq_fm (Not fm) (NDvd (inta, num)) = false
  12.664 -  | eq_fm (NDvd (inta, num)) (And (fm1, fm2)) = false
  12.665 -  | eq_fm (And (fm1, fm2)) (NDvd (inta, num)) = false
  12.666 -  | eq_fm (NDvd (inta, num)) (Or (fm1, fm2)) = false
  12.667 -  | eq_fm (Or (fm1, fm2)) (NDvd (inta, num)) = false
  12.668 -  | eq_fm (NDvd (inta, num)) (Imp (fm1, fm2)) = false
  12.669 -  | eq_fm (Imp (fm1, fm2)) (NDvd (inta, num)) = false
  12.670 -  | eq_fm (NDvd (inta, num)) (Iff (fm1, fm2)) = false
  12.671 -  | eq_fm (Iff (fm1, fm2)) (NDvd (inta, num)) = false
  12.672 -  | eq_fm (NDvd (inta, num)) (E fm) = false
  12.673 -  | eq_fm (E fm) (NDvd (inta, num)) = false
  12.674 -  | eq_fm (NDvd (inta, num)) (A fm) = false
  12.675 -  | eq_fm (A fm) (NDvd (inta, num)) = false
  12.676 -  | eq_fm (NDvd (inta, num)) (Closed nat) = false
  12.677 -  | eq_fm (Closed nat) (NDvd (inta, num)) = false
  12.678 -  | eq_fm (NDvd (inta, num)) (NClosed nat) = false
  12.679 -  | eq_fm (NClosed nat) (NDvd (inta, num)) = false
  12.680 -  | eq_fm (Not fm) (And (fm1, fm2)) = false
  12.681 -  | eq_fm (And (fm1, fm2)) (Not fm) = false
  12.682 -  | eq_fm (Not fm) (Or (fm1, fm2)) = false
  12.683 -  | eq_fm (Or (fm1, fm2)) (Not fm) = false
  12.684 -  | eq_fm (Not fm) (Imp (fm1, fm2)) = false
  12.685 -  | eq_fm (Imp (fm1, fm2)) (Not fm) = false
  12.686 -  | eq_fm (Not fm) (Iff (fm1, fm2)) = false
  12.687 -  | eq_fm (Iff (fm1, fm2)) (Not fm) = false
  12.688 -  | eq_fm (Not fma) (E fm) = false
  12.689 -  | eq_fm (E fma) (Not fm) = false
  12.690 -  | eq_fm (Not fma) (A fm) = false
  12.691 -  | eq_fm (A fma) (Not fm) = false
  12.692 -  | eq_fm (Not fm) (Closed nat) = false
  12.693 -  | eq_fm (Closed nat) (Not fm) = false
  12.694 -  | eq_fm (Not fm) (NClosed nat) = false
  12.695 -  | eq_fm (NClosed nat) (Not fm) = false
  12.696 -  | eq_fm (And (fm1a, fm2a)) (Or (fm1, fm2)) = false
  12.697 -  | eq_fm (Or (fm1a, fm2a)) (And (fm1, fm2)) = false
  12.698 -  | eq_fm (And (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  12.699 -  | eq_fm (Imp (fm1a, fm2a)) (And (fm1, fm2)) = false
  12.700 -  | eq_fm (And (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  12.701 -  | eq_fm (Iff (fm1a, fm2a)) (And (fm1, fm2)) = false
  12.702 -  | eq_fm (And (fm1, fm2)) (E fm) = false
  12.703 -  | eq_fm (E fm) (And (fm1, fm2)) = false
  12.704 -  | eq_fm (And (fm1, fm2)) (A fm) = false
  12.705 -  | eq_fm (A fm) (And (fm1, fm2)) = false
  12.706 -  | eq_fm (And (fm1, fm2)) (Closed nat) = false
  12.707 -  | eq_fm (Closed nat) (And (fm1, fm2)) = false
  12.708 -  | eq_fm (And (fm1, fm2)) (NClosed nat) = false
  12.709 -  | eq_fm (NClosed nat) (And (fm1, fm2)) = false
  12.710 -  | eq_fm (Or (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  12.711 -  | eq_fm (Imp (fm1a, fm2a)) (Or (fm1, fm2)) = false
  12.712 -  | eq_fm (Or (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  12.713 -  | eq_fm (Iff (fm1a, fm2a)) (Or (fm1, fm2)) = false
  12.714 -  | eq_fm (Or (fm1, fm2)) (E fm) = false
  12.715 -  | eq_fm (E fm) (Or (fm1, fm2)) = false
  12.716 -  | eq_fm (Or (fm1, fm2)) (A fm) = false
  12.717 -  | eq_fm (A fm) (Or (fm1, fm2)) = false
  12.718 -  | eq_fm (Or (fm1, fm2)) (Closed nat) = false
  12.719 -  | eq_fm (Closed nat) (Or (fm1, fm2)) = false
  12.720 -  | eq_fm (Or (fm1, fm2)) (NClosed nat) = false
  12.721 -  | eq_fm (NClosed nat) (Or (fm1, fm2)) = false
  12.722 -  | eq_fm (Imp (fm1a, fm2a)) (Iff (fm1, fm2)) = false
  12.723 -  | eq_fm (Iff (fm1a, fm2a)) (Imp (fm1, fm2)) = false
  12.724 -  | eq_fm (Imp (fm1, fm2)) (E fm) = false
  12.725 -  | eq_fm (E fm) (Imp (fm1, fm2)) = false
  12.726 -  | eq_fm (Imp (fm1, fm2)) (A fm) = false
  12.727 -  | eq_fm (A fm) (Imp (fm1, fm2)) = false
  12.728 -  | eq_fm (Imp (fm1, fm2)) (Closed nat) = false
  12.729 -  | eq_fm (Closed nat) (Imp (fm1, fm2)) = false
  12.730 -  | eq_fm (Imp (fm1, fm2)) (NClosed nat) = false
  12.731 -  | eq_fm (NClosed nat) (Imp (fm1, fm2)) = false
  12.732 -  | eq_fm (Iff (fm1, fm2)) (E fm) = false
  12.733 -  | eq_fm (E fm) (Iff (fm1, fm2)) = false
  12.734 -  | eq_fm (Iff (fm1, fm2)) (A fm) = false
  12.735 -  | eq_fm (A fm) (Iff (fm1, fm2)) = false
  12.736 -  | eq_fm (Iff (fm1, fm2)) (Closed nat) = false
  12.737 -  | eq_fm (Closed nat) (Iff (fm1, fm2)) = false
  12.738 -  | eq_fm (Iff (fm1, fm2)) (NClosed nat) = false
  12.739 -  | eq_fm (NClosed nat) (Iff (fm1, fm2)) = false
  12.740 -  | eq_fm (E fma) (A fm) = false
  12.741 -  | eq_fm (A fma) (E fm) = false
  12.742 -  | eq_fm (E fm) (Closed nat) = false
  12.743 -  | eq_fm (Closed nat) (E fm) = false
  12.744 -  | eq_fm (E fm) (NClosed nat) = false
  12.745 -  | eq_fm (NClosed nat) (E fm) = false
  12.746 -  | eq_fm (A fm) (Closed nat) = false
  12.747 -  | eq_fm (Closed nat) (A fm) = false
  12.748 -  | eq_fm (A fm) (NClosed nat) = false
  12.749 -  | eq_fm (NClosed nat) (A fm) = false
  12.750 -  | eq_fm (Closed nata) (NClosed nat) = false
  12.751 -  | eq_fm (NClosed nata) (Closed nat) = false;
  12.752 -
  12.753 -fun djf f p q =
  12.754 -  (if eq_fm q T then T
  12.755 -    else (if eq_fm q F then f p
  12.756 -           else (case f p of T => T | F => q | Lt _ => Or (f p, q)
  12.757 -                  | Le _ => Or (f p, q) | Gt _ => Or (f p, q)
  12.758 -                  | Ge _ => Or (f p, q) | Eq _ => Or (f p, q)
  12.759 -                  | NEq _ => Or (f p, q) | Dvd (_, _) => Or (f p, q)
  12.760 -                  | NDvd (_, _) => Or (f p, q) | Not _ => Or (f p, q)
  12.761 -                  | And (_, _) => Or (f p, q) | Or (_, _) => Or (f p, q)
  12.762 -                  | Imp (_, _) => Or (f p, q) | Iff (_, _) => Or (f p, q)
  12.763 -                  | E _ => Or (f p, q) | A _ => Or (f p, q)
  12.764 -                  | Closed _ => Or (f p, q) | NClosed _ => Or (f p, q))));
  12.765 -
  12.766 -fun foldr f [] a = a
  12.767 -  | foldr f (x :: xs) a = f x (foldr f xs a);
  12.768 -
  12.769 -fun evaldjf f ps = foldr (djf f) ps F;
  12.770 -
  12.771 -fun dj f p = evaldjf f (disjuncts p);
  12.772 -
  12.773 -fun disj p q =
  12.774 -  (if eq_fm p T orelse eq_fm q T then T
  12.775 -    else (if eq_fm p F then q else (if eq_fm q F then p else Or (p, q))));
  12.776 -
  12.777 -fun minus_nat n m = IntInf.max (0, (IntInf.- (n, m)));
  12.778 -
  12.779 -fun decrnum (Bound n) = Bound (minus_nat n (1 : IntInf.int))
  12.780 -  | decrnum (Neg a) = Neg (decrnum a)
  12.781 -  | decrnum (Add (a, b)) = Add (decrnum a, decrnum b)
  12.782 -  | decrnum (Sub (a, b)) = Sub (decrnum a, decrnum b)
  12.783 -  | decrnum (Mul (c, a)) = Mul (c, decrnum a)
  12.784 -  | decrnum (Cn (n, i, a)) = Cn (minus_nat n (1 : IntInf.int), i, decrnum a)
  12.785 -  | decrnum (C u) = C u;
  12.786 -
  12.787 -fun decr (Lt a) = Lt (decrnum a)
  12.788 -  | decr (Le a) = Le (decrnum a)
  12.789 -  | decr (Gt a) = Gt (decrnum a)
  12.790 -  | decr (Ge a) = Ge (decrnum a)
  12.791 -  | decr (Eq a) = Eq (decrnum a)
  12.792 -  | decr (NEq a) = NEq (decrnum a)
  12.793 -  | decr (Dvd (i, a)) = Dvd (i, decrnum a)
  12.794 -  | decr (NDvd (i, a)) = NDvd (i, decrnum a)
  12.795 -  | decr (Not p) = Not (decr p)
  12.796 -  | decr (And (p, q)) = And (decr p, decr q)
  12.797 -  | decr (Or (p, q)) = Or (decr p, decr q)
  12.798 -  | decr (Imp (p, q)) = Imp (decr p, decr q)
  12.799 -  | decr (Iff (p, q)) = Iff (decr p, decr q)
  12.800 -  | decr T = T
  12.801 -  | decr F = F
  12.802 -  | decr (E ao) = E ao
  12.803 -  | decr (A ap) = A ap
  12.804 -  | decr (Closed aq) = Closed aq
  12.805 -  | decr (NClosed ar) = NClosed ar;
  12.806 -
  12.807 -fun concat_map f [] = []
  12.808 -  | concat_map f (x :: xs) = append (f x) (concat_map f xs);
  12.809 -
  12.810 -fun numsubst0 t (C c) = C c
  12.811 -  | numsubst0 t (Bound n) =
  12.812 -    (if ((n : IntInf.int) = (0 : IntInf.int)) then t else Bound n)
  12.813 -  | numsubst0 t (Neg a) = Neg (numsubst0 t a)
  12.814 -  | numsubst0 t (Add (a, b)) = Add (numsubst0 t a, numsubst0 t b)
  12.815 -  | numsubst0 t (Sub (a, b)) = Sub (numsubst0 t a, numsubst0 t b)
  12.816 -  | numsubst0 t (Mul (i, a)) = Mul (i, numsubst0 t a)
  12.817 -  | numsubst0 t (Cn (v, i, a)) =
  12.818 -    (if ((v : IntInf.int) = (0 : IntInf.int))
  12.819 -      then Add (Mul (i, t), numsubst0 t a)
  12.820 -      else Cn (suc (minus_nat v (1 : IntInf.int)), i, numsubst0 t a));
  12.821 -
  12.822 -fun subst0 t T = T
  12.823 -  | subst0 t F = F
  12.824 -  | subst0 t (Lt a) = Lt (numsubst0 t a)
  12.825 -  | subst0 t (Le a) = Le (numsubst0 t a)
  12.826 -  | subst0 t (Gt a) = Gt (numsubst0 t a)
  12.827 -  | subst0 t (Ge a) = Ge (numsubst0 t a)
  12.828 -  | subst0 t (Eq a) = Eq (numsubst0 t a)
  12.829 -  | subst0 t (NEq a) = NEq (numsubst0 t a)
  12.830 -  | subst0 t (Dvd (i, a)) = Dvd (i, numsubst0 t a)
  12.831 -  | subst0 t (NDvd (i, a)) = NDvd (i, numsubst0 t a)
  12.832 -  | subst0 t (Not p) = Not (subst0 t p)
  12.833 -  | subst0 t (And (p, q)) = And (subst0 t p, subst0 t q)
  12.834 -  | subst0 t (Or (p, q)) = Or (subst0 t p, subst0 t q)
  12.835 -  | subst0 t (Imp (p, q)) = Imp (subst0 t p, subst0 t q)
  12.836 -  | subst0 t (Iff (p, q)) = Iff (subst0 t p, subst0 t q)
  12.837 -  | subst0 t (Closed p) = Closed p
  12.838 -  | subst0 t (NClosed p) = NClosed p;
  12.839 -
  12.840 -fun minusinf (And (p, q)) = And (minusinf p, minusinf q)
  12.841 -  | minusinf (Or (p, q)) = Or (minusinf p, minusinf q)
  12.842 -  | minusinf T = T
  12.843 -  | minusinf F = F
  12.844 -  | minusinf (Lt (C bo)) = Lt (C bo)
  12.845 -  | minusinf (Lt (Bound bp)) = Lt (Bound bp)
  12.846 -  | minusinf (Lt (Neg bt)) = Lt (Neg bt)
  12.847 -  | minusinf (Lt (Add (bu, bv))) = Lt (Add (bu, bv))
  12.848 -  | minusinf (Lt (Sub (bw, bx))) = Lt (Sub (bw, bx))
  12.849 -  | minusinf (Lt (Mul (by, bz))) = Lt (Mul (by, bz))
  12.850 -  | minusinf (Le (C co)) = Le (C co)
  12.851 -  | minusinf (Le (Bound cp)) = Le (Bound cp)
  12.852 -  | minusinf (Le (Neg ct)) = Le (Neg ct)
  12.853 -  | minusinf (Le (Add (cu, cv))) = Le (Add (cu, cv))
  12.854 -  | minusinf (Le (Sub (cw, cx))) = Le (Sub (cw, cx))
  12.855 -  | minusinf (Le (Mul (cy, cz))) = Le (Mul (cy, cz))
  12.856 -  | minusinf (Gt (C doa)) = Gt (C doa)
  12.857 -  | minusinf (Gt (Bound dp)) = Gt (Bound dp)
  12.858 -  | minusinf (Gt (Neg dt)) = Gt (Neg dt)
  12.859 -  | minusinf (Gt (Add (du, dv))) = Gt (Add (du, dv))
  12.860 -  | minusinf (Gt (Sub (dw, dx))) = Gt (Sub (dw, dx))
  12.861 -  | minusinf (Gt (Mul (dy, dz))) = Gt (Mul (dy, dz))
  12.862 -  | minusinf (Ge (C eo)) = Ge (C eo)
  12.863 -  | minusinf (Ge (Bound ep)) = Ge (Bound ep)
  12.864 -  | minusinf (Ge (Neg et)) = Ge (Neg et)
  12.865 -  | minusinf (Ge (Add (eu, ev))) = Ge (Add (eu, ev))
  12.866 -  | minusinf (Ge (Sub (ew, ex))) = Ge (Sub (ew, ex))
  12.867 -  | minusinf (Ge (Mul (ey, ez))) = Ge (Mul (ey, ez))
  12.868 -  | minusinf (Eq (C fo)) = Eq (C fo)
  12.869 -  | minusinf (Eq (Bound fp)) = Eq (Bound fp)
  12.870 -  | minusinf (Eq (Neg ft)) = Eq (Neg ft)
  12.871 -  | minusinf (Eq (Add (fu, fv))) = Eq (Add (fu, fv))
  12.872 -  | minusinf (Eq (Sub (fw, fx))) = Eq (Sub (fw, fx))
  12.873 -  | minusinf (Eq (Mul (fy, fz))) = Eq (Mul (fy, fz))
  12.874 -  | minusinf (NEq (C go)) = NEq (C go)
  12.875 -  | minusinf (NEq (Bound gp)) = NEq (Bound gp)
  12.876 -  | minusinf (NEq (Neg gt)) = NEq (Neg gt)
  12.877 -  | minusinf (NEq (Add (gu, gv))) = NEq (Add (gu, gv))
  12.878 -  | minusinf (NEq (Sub (gw, gx))) = NEq (Sub (gw, gx))
  12.879 -  | minusinf (NEq (Mul (gy, gz))) = NEq (Mul (gy, gz))
  12.880 -  | minusinf (Dvd (aa, ab)) = Dvd (aa, ab)
  12.881 -  | minusinf (NDvd (ac, ad)) = NDvd (ac, ad)
  12.882 -  | minusinf (Not ae) = Not ae
  12.883 -  | minusinf (Imp (aj, ak)) = Imp (aj, ak)
  12.884 -  | minusinf (Iff (al, am)) = Iff (al, am)
  12.885 -  | minusinf (E an) = E an
  12.886 -  | minusinf (A ao) = A ao
  12.887 -  | minusinf (Closed ap) = Closed ap
  12.888 -  | minusinf (NClosed aq) = NClosed aq
  12.889 -  | minusinf (Lt (Cn (cm, c, e))) =
  12.890 -    (if ((cm : IntInf.int) = (0 : IntInf.int)) then T
  12.891 -      else Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e)))
  12.892 -  | minusinf (Le (Cn (dm, c, e))) =
  12.893 -    (if ((dm : IntInf.int) = (0 : IntInf.int)) then T
  12.894 -      else Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e)))
  12.895 -  | minusinf (Gt (Cn (em, c, e))) =
  12.896 -    (if ((em : IntInf.int) = (0 : IntInf.int)) then F
  12.897 -      else Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e)))
  12.898 -  | minusinf (Ge (Cn (fm, c, e))) =
  12.899 -    (if ((fm : IntInf.int) = (0 : IntInf.int)) then F
  12.900 -      else Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e)))
  12.901 -  | minusinf (Eq (Cn (gm, c, e))) =
  12.902 -    (if ((gm : IntInf.int) = (0 : IntInf.int)) then F
  12.903 -      else Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e)))
  12.904 -  | minusinf (NEq (Cn (hm, c, e))) =
  12.905 -    (if ((hm : IntInf.int) = (0 : IntInf.int)) then T
  12.906 -      else NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e)));
  12.907 -
  12.908 -val eq_int = {eq = (fn a => fn b => ((a : IntInf.int) = b))} : IntInf.int eq;
  12.909 -
  12.910 -val zero_int : IntInf.int = (0 : IntInf.int);
  12.911 -
  12.912 -type 'a zero = {zero : 'a};
  12.913 -val zero = #zero : 'a zero -> 'a;
  12.914 -
  12.915 -val zero_inta = {zero = zero_int} : IntInf.int zero;
  12.916 -
  12.917 -type 'a times = {times : 'a -> 'a -> 'a};
  12.918 -val times = #times : 'a times -> 'a -> 'a -> 'a;
  12.919 -
  12.920 -type 'a no_zero_divisors =
  12.921 -  {times_no_zero_divisors : 'a times, zero_no_zero_divisors : 'a zero};
  12.922 -val times_no_zero_divisors = #times_no_zero_divisors :
  12.923 -  'a no_zero_divisors -> 'a times;
  12.924 -val zero_no_zero_divisors = #zero_no_zero_divisors :
  12.925 -  'a no_zero_divisors -> 'a zero;
  12.926 -
  12.927 -val times_int = {times = (fn a => fn b => IntInf.* (a, b))} : IntInf.int times;
  12.928 -
  12.929 -val no_zero_divisors_int =
  12.930 -  {times_no_zero_divisors = times_int, zero_no_zero_divisors = zero_inta} :
  12.931 -  IntInf.int no_zero_divisors;
  12.932 -
  12.933 -type 'a one = {one : 'a};
  12.934 -val one = #one : 'a one -> 'a;
  12.935 -
  12.936 -type 'a zero_neq_one = {one_zero_neq_one : 'a one, zero_zero_neq_one : 'a zero};
  12.937 -val one_zero_neq_one = #one_zero_neq_one : 'a zero_neq_one -> 'a one;
  12.938 -val zero_zero_neq_one = #zero_zero_neq_one : 'a zero_neq_one -> 'a zero;
  12.939 -
  12.940 -type 'a semigroup_mult = {times_semigroup_mult : 'a times};
  12.941 -val times_semigroup_mult = #times_semigroup_mult :
  12.942 -  'a semigroup_mult -> 'a times;
  12.943 -
  12.944 -type 'a plus = {plus : 'a -> 'a -> 'a};
  12.945 -val plus = #plus : 'a plus -> 'a -> 'a -> 'a;
  12.946 -
  12.947 -type 'a semigroup_add = {plus_semigroup_add : 'a plus};
  12.948 -val plus_semigroup_add = #plus_semigroup_add : 'a semigroup_add -> 'a plus;
  12.949 -
  12.950 -type 'a ab_semigroup_add = {semigroup_add_ab_semigroup_add : 'a semigroup_add};
  12.951 -val semigroup_add_ab_semigroup_add = #semigroup_add_ab_semigroup_add :
  12.952 -  'a ab_semigroup_add -> 'a semigroup_add;
  12.953 -
  12.954 -type 'a semiring =
  12.955 -  {ab_semigroup_add_semiring : 'a ab_semigroup_add,
  12.956 -    semigroup_mult_semiring : 'a semigroup_mult};
  12.957 -val ab_semigroup_add_semiring = #ab_semigroup_add_semiring :
  12.958 -  'a semiring -> 'a ab_semigroup_add;
  12.959 -val semigroup_mult_semiring = #semigroup_mult_semiring :
  12.960 -  'a semiring -> 'a semigroup_mult;
  12.961 -
  12.962 -type 'a mult_zero = {times_mult_zero : 'a times, zero_mult_zero : 'a zero};
  12.963 -val times_mult_zero = #times_mult_zero : 'a mult_zero -> 'a times;
  12.964 -val zero_mult_zero = #zero_mult_zero : 'a mult_zero -> 'a zero;
  12.965 -
  12.966 -type 'a monoid_add =
  12.967 -  {semigroup_add_monoid_add : 'a semigroup_add, zero_monoid_add : 'a zero};
  12.968 -val semigroup_add_monoid_add = #semigroup_add_monoid_add :
  12.969 -  'a monoid_add -> 'a semigroup_add;
  12.970 -val zero_monoid_add = #zero_monoid_add : 'a monoid_add -> 'a zero;
  12.971 -
  12.972 -type 'a comm_monoid_add =
  12.973 -  {ab_semigroup_add_comm_monoid_add : 'a ab_semigroup_add,
  12.974 -    monoid_add_comm_monoid_add : 'a monoid_add};
  12.975 -val ab_semigroup_add_comm_monoid_add = #ab_semigroup_add_comm_monoid_add :
  12.976 -  'a comm_monoid_add -> 'a ab_semigroup_add;
  12.977 -val monoid_add_comm_monoid_add = #monoid_add_comm_monoid_add :
  12.978 -  'a comm_monoid_add -> 'a monoid_add;
  12.979 -
  12.980 -type 'a semiring_0 =
  12.981 -  {comm_monoid_add_semiring_0 : 'a comm_monoid_add,
  12.982 -    mult_zero_semiring_0 : 'a mult_zero, semiring_semiring_0 : 'a semiring};
  12.983 -val comm_monoid_add_semiring_0 = #comm_monoid_add_semiring_0 :
  12.984 -  'a semiring_0 -> 'a comm_monoid_add;
  12.985 -val mult_zero_semiring_0 = #mult_zero_semiring_0 :
  12.986 -  'a semiring_0 -> 'a mult_zero;
  12.987 -val semiring_semiring_0 = #semiring_semiring_0 : 'a semiring_0 -> 'a semiring;
  12.988 -
  12.989 -type 'a power = {one_power : 'a one, times_power : 'a times};
  12.990 -val one_power = #one_power : 'a power -> 'a one;
  12.991 -val times_power = #times_power : 'a power -> 'a times;
  12.992 -
  12.993 -type 'a monoid_mult =
  12.994 -  {semigroup_mult_monoid_mult : 'a semigroup_mult,
  12.995 -    power_monoid_mult : 'a power};
  12.996 -val semigroup_mult_monoid_mult = #semigroup_mult_monoid_mult :
  12.997 -  'a monoid_mult -> 'a semigroup_mult;
  12.998 -val power_monoid_mult = #power_monoid_mult : 'a monoid_mult -> 'a power;
  12.999 -
 12.1000 -type 'a semiring_1 =
 12.1001 -  {monoid_mult_semiring_1 : 'a monoid_mult,
 12.1002 -    semiring_0_semiring_1 : 'a semiring_0,
 12.1003 -    zero_neq_one_semiring_1 : 'a zero_neq_one};
 12.1004 -val monoid_mult_semiring_1 = #monoid_mult_semiring_1 :
 12.1005 -  'a semiring_1 -> 'a monoid_mult;
 12.1006 -val semiring_0_semiring_1 = #semiring_0_semiring_1 :
 12.1007 -  'a semiring_1 -> 'a semiring_0;
 12.1008 -val zero_neq_one_semiring_1 = #zero_neq_one_semiring_1 :
 12.1009 -  'a semiring_1 -> 'a zero_neq_one;
 12.1010 -
 12.1011 -type 'a cancel_semigroup_add =
 12.1012 -  {semigroup_add_cancel_semigroup_add : 'a semigroup_add};
 12.1013 -val semigroup_add_cancel_semigroup_add = #semigroup_add_cancel_semigroup_add :
 12.1014 -  'a cancel_semigroup_add -> 'a semigroup_add;
 12.1015 -
 12.1016 -type 'a cancel_ab_semigroup_add =
 12.1017 -  {ab_semigroup_add_cancel_ab_semigroup_add : 'a ab_semigroup_add,
 12.1018 -    cancel_semigroup_add_cancel_ab_semigroup_add : 'a cancel_semigroup_add};
 12.1019 -val ab_semigroup_add_cancel_ab_semigroup_add =
 12.1020 -  #ab_semigroup_add_cancel_ab_semigroup_add :
 12.1021 -  'a cancel_ab_semigroup_add -> 'a ab_semigroup_add;
 12.1022 -val cancel_semigroup_add_cancel_ab_semigroup_add =
 12.1023 -  #cancel_semigroup_add_cancel_ab_semigroup_add :
 12.1024 -  'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add;
 12.1025 -
 12.1026 -type 'a cancel_comm_monoid_add =
 12.1027 -  {cancel_ab_semigroup_add_cancel_comm_monoid_add : 'a cancel_ab_semigroup_add,
 12.1028 -    comm_monoid_add_cancel_comm_monoid_add : 'a comm_monoid_add};
 12.1029 -val cancel_ab_semigroup_add_cancel_comm_monoid_add =
 12.1030 -  #cancel_ab_semigroup_add_cancel_comm_monoid_add :
 12.1031 -  'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add;
 12.1032 -val comm_monoid_add_cancel_comm_monoid_add =
 12.1033 -  #comm_monoid_add_cancel_comm_monoid_add :
 12.1034 -  'a cancel_comm_monoid_add -> 'a comm_monoid_add;
 12.1035 -
 12.1036 -type 'a semiring_0_cancel =
 12.1037 -  {cancel_comm_monoid_add_semiring_0_cancel : 'a cancel_comm_monoid_add,
 12.1038 -    semiring_0_semiring_0_cancel : 'a semiring_0};
 12.1039 -val cancel_comm_monoid_add_semiring_0_cancel =
 12.1040 -  #cancel_comm_monoid_add_semiring_0_cancel :
 12.1041 -  'a semiring_0_cancel -> 'a cancel_comm_monoid_add;
 12.1042 -val semiring_0_semiring_0_cancel = #semiring_0_semiring_0_cancel :
 12.1043 -  'a semiring_0_cancel -> 'a semiring_0;
 12.1044 -
 12.1045 -type 'a semiring_1_cancel =
 12.1046 -  {semiring_0_cancel_semiring_1_cancel : 'a semiring_0_cancel,
 12.1047 -    semiring_1_semiring_1_cancel : 'a semiring_1};
 12.1048 -val semiring_0_cancel_semiring_1_cancel = #semiring_0_cancel_semiring_1_cancel :
 12.1049 -  'a semiring_1_cancel -> 'a semiring_0_cancel;
 12.1050 -val semiring_1_semiring_1_cancel = #semiring_1_semiring_1_cancel :
 12.1051 -  'a semiring_1_cancel -> 'a semiring_1;
 12.1052 -
 12.1053 -type 'a dvd = {times_dvd : 'a times};
 12.1054 -val times_dvd = #times_dvd : 'a dvd -> 'a times;
 12.1055 -
 12.1056 -type 'a ab_semigroup_mult =
 12.1057 -  {semigroup_mult_ab_semigroup_mult : 'a semigroup_mult};
 12.1058 -val semigroup_mult_ab_semigroup_mult = #semigroup_mult_ab_semigroup_mult :
 12.1059 -  'a ab_semigroup_mult -> 'a semigroup_mult;
 12.1060 -
 12.1061 -type 'a comm_semiring =
 12.1062 -  {ab_semigroup_mult_comm_semiring : 'a ab_semigroup_mult,
 12.1063 -    semiring_comm_semiring : 'a semiring};
 12.1064 -val ab_semigroup_mult_comm_semiring = #ab_semigroup_mult_comm_semiring :
 12.1065 -  'a comm_semiring -> 'a ab_semigroup_mult;
 12.1066 -val semiring_comm_semiring = #semiring_comm_semiring :
 12.1067 -  'a comm_semiring -> 'a semiring;
 12.1068 -
 12.1069 -type 'a comm_semiring_0 =
 12.1070 -  {comm_semiring_comm_semiring_0 : 'a comm_semiring,
 12.1071 -    semiring_0_comm_semiring_0 : 'a semiring_0};
 12.1072 -val comm_semiring_comm_semiring_0 = #comm_semiring_comm_semiring_0 :
 12.1073 -  'a comm_semiring_0 -> 'a comm_semiring;
 12.1074 -val semiring_0_comm_semiring_0 = #semiring_0_comm_semiring_0 :
 12.1075 -  'a comm_semiring_0 -> 'a semiring_0;
 12.1076 -
 12.1077 -type 'a comm_monoid_mult =
 12.1078 -  {ab_semigroup_mult_comm_monoid_mult : 'a ab_semigroup_mult,
 12.1079 -    monoid_mult_comm_monoid_mult : 'a monoid_mult};
 12.1080 -val ab_semigroup_mult_comm_monoid_mult = #ab_semigroup_mult_comm_monoid_mult :
 12.1081 -  'a comm_monoid_mult -> 'a ab_semigroup_mult;
 12.1082 -val monoid_mult_comm_monoid_mult = #monoid_mult_comm_monoid_mult :
 12.1083 -  'a comm_monoid_mult -> 'a monoid_mult;
 12.1084 -
 12.1085 -type 'a comm_semiring_1 =
 12.1086 -  {comm_monoid_mult_comm_semiring_1 : 'a comm_monoid_mult,
 12.1087 -    comm_semiring_0_comm_semiring_1 : 'a comm_semiring_0,
 12.1088 -    dvd_comm_semiring_1 : 'a dvd, semiring_1_comm_semiring_1 : 'a semiring_1};
 12.1089 -val comm_monoid_mult_comm_semiring_1 = #comm_monoid_mult_comm_semiring_1 :
 12.1090 -  'a comm_semiring_1 -> 'a comm_monoid_mult;
 12.1091 -val comm_semiring_0_comm_semiring_1 = #comm_semiring_0_comm_semiring_1 :
 12.1092 -  'a comm_semiring_1 -> 'a comm_semiring_0;
 12.1093 -val dvd_comm_semiring_1 = #dvd_comm_semiring_1 : 'a comm_semiring_1 -> 'a dvd;
 12.1094 -val semiring_1_comm_semiring_1 = #semiring_1_comm_semiring_1 :
 12.1095 -  'a comm_semiring_1 -> 'a semiring_1;
 12.1096 -
 12.1097 -type 'a comm_semiring_0_cancel =
 12.1098 -  {comm_semiring_0_comm_semiring_0_cancel : 'a comm_semiring_0,
 12.1099 -    semiring_0_cancel_comm_semiring_0_cancel : 'a semiring_0_cancel};
 12.1100 -val comm_semiring_0_comm_semiring_0_cancel =
 12.1101 -  #comm_semiring_0_comm_semiring_0_cancel :
 12.1102 -  'a comm_semiring_0_cancel -> 'a comm_semiring_0;
 12.1103 -val semiring_0_cancel_comm_semiring_0_cancel =
 12.1104 -  #semiring_0_cancel_comm_semiring_0_cancel :
 12.1105 -  'a comm_semiring_0_cancel -> 'a semiring_0_cancel;
 12.1106 -
 12.1107 -type 'a comm_semiring_1_cancel =
 12.1108 -  {comm_semiring_0_cancel_comm_semiring_1_cancel : 'a comm_semiring_0_cancel,
 12.1109 -    comm_semiring_1_comm_semiring_1_cancel : 'a comm_semiring_1,
 12.1110 -    semiring_1_cancel_comm_semiring_1_cancel : 'a semiring_1_cancel};
 12.1111 -val comm_semiring_0_cancel_comm_semiring_1_cancel =
 12.1112 -  #comm_semiring_0_cancel_comm_semiring_1_cancel :
 12.1113 -  'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel;
 12.1114 -val comm_semiring_1_comm_semiring_1_cancel =
 12.1115 -  #comm_semiring_1_comm_semiring_1_cancel :
 12.1116 -  'a comm_semiring_1_cancel -> 'a comm_semiring_1;
 12.1117 -val semiring_1_cancel_comm_semiring_1_cancel =
 12.1118 -  #semiring_1_cancel_comm_semiring_1_cancel :
 12.1119 -  'a comm_semiring_1_cancel -> 'a semiring_1_cancel;
 12.1120 -
 12.1121 -type 'a diva = {dvd_div : 'a dvd, diva : 'a -> 'a -> 'a, moda : 'a -> 'a -> 'a};
 12.1122 -val dvd_div = #dvd_div : 'a diva -> 'a dvd;
 12.1123 -val diva = #diva : 'a diva -> 'a -> 'a -> 'a;
 12.1124 -val moda = #moda : 'a diva -> 'a -> 'a -> 'a;
 12.1125 -
 12.1126 -type 'a semiring_div =
 12.1127 -  {div_semiring_div : 'a diva,
 12.1128 -    comm_semiring_1_cancel_semiring_div : 'a comm_semiring_1_cancel,
 12.1129 -    no_zero_divisors_semiring_div : 'a no_zero_divisors};
 12.1130 -val div_semiring_div = #div_semiring_div : 'a semiring_div -> 'a diva;
 12.1131 -val comm_semiring_1_cancel_semiring_div = #comm_semiring_1_cancel_semiring_div :
 12.1132 -  'a semiring_div -> 'a comm_semiring_1_cancel;
 12.1133 -val no_zero_divisors_semiring_div = #no_zero_divisors_semiring_div :
 12.1134 -  'a semiring_div -> 'a no_zero_divisors;
 12.1135 -
 12.1136 -val one_int : IntInf.int = (1 : IntInf.int);
 12.1137 -
 12.1138 -val one_inta = {one = one_int} : IntInf.int one;
 12.1139 -
 12.1140 -val zero_neq_one_int =
 12.1141 -  {one_zero_neq_one = one_inta, zero_zero_neq_one = zero_inta} :
 12.1142 -  IntInf.int zero_neq_one;
 12.1143 -
 12.1144 -val semigroup_mult_int = {times_semigroup_mult = times_int} :
 12.1145 -  IntInf.int semigroup_mult;
 12.1146 -
 12.1147 -val plus_int = {plus = (fn a => fn b => IntInf.+ (a, b))} : IntInf.int plus;
 12.1148 -
 12.1149 -val semigroup_add_int = {plus_semigroup_add = plus_int} :
 12.1150 -  IntInf.int semigroup_add;
 12.1151 -
 12.1152 -val ab_semigroup_add_int = {semigroup_add_ab_semigroup_add = semigroup_add_int}
 12.1153 -  : IntInf.int ab_semigroup_add;
 12.1154 -
 12.1155 -val semiring_int =
 12.1156 -  {ab_semigroup_add_semiring = ab_semigroup_add_int,
 12.1157 -    semigroup_mult_semiring = semigroup_mult_int}
 12.1158 -  : IntInf.int semiring;
 12.1159 -
 12.1160 -val mult_zero_int = {times_mult_zero = times_int, zero_mult_zero = zero_inta} :
 12.1161 -  IntInf.int mult_zero;
 12.1162 -
 12.1163 -val monoid_add_int =
 12.1164 -  {semigroup_add_monoid_add = semigroup_add_int, zero_monoid_add = zero_inta} :
 12.1165 -  IntInf.int monoid_add;
 12.1166 -
 12.1167 -val comm_monoid_add_int =
 12.1168 -  {ab_semigroup_add_comm_monoid_add = ab_semigroup_add_int,
 12.1169 -    monoid_add_comm_monoid_add = monoid_add_int}
 12.1170 -  : IntInf.int comm_monoid_add;
 12.1171 -
 12.1172 -val semiring_0_int =
 12.1173 -  {comm_monoid_add_semiring_0 = comm_monoid_add_int,
 12.1174 -    mult_zero_semiring_0 = mult_zero_int, semiring_semiring_0 = semiring_int}
 12.1175 -  : IntInf.int semiring_0;
 12.1176 -
 12.1177 -val power_int = {one_power = one_inta, times_power = times_int} :
 12.1178 -  IntInf.int power;
 12.1179 -
 12.1180 -val monoid_mult_int =
 12.1181 -  {semigroup_mult_monoid_mult = semigroup_mult_int,
 12.1182 -    power_monoid_mult = power_int}
 12.1183 -  : IntInf.int monoid_mult;
 12.1184 -
 12.1185 -val semiring_1_int =
 12.1186 -  {monoid_mult_semiring_1 = monoid_mult_int,
 12.1187 -    semiring_0_semiring_1 = semiring_0_int,
 12.1188 -    zero_neq_one_semiring_1 = zero_neq_one_int}
 12.1189 -  : IntInf.int semiring_1;
 12.1190 -
 12.1191 -val cancel_semigroup_add_int =
 12.1192 -  {semigroup_add_cancel_semigroup_add = semigroup_add_int} :
 12.1193 -  IntInf.int cancel_semigroup_add;
 12.1194 -
 12.1195 -val cancel_ab_semigroup_add_int =
 12.1196 -  {ab_semigroup_add_cancel_ab_semigroup_add = ab_semigroup_add_int,
 12.1197 -    cancel_semigroup_add_cancel_ab_semigroup_add = cancel_semigroup_add_int}
 12.1198 -  : IntInf.int cancel_ab_semigroup_add;
 12.1199 -
 12.1200 -val cancel_comm_monoid_add_int =
 12.1201 -  {cancel_ab_semigroup_add_cancel_comm_monoid_add = cancel_ab_semigroup_add_int,
 12.1202 -    comm_monoid_add_cancel_comm_monoid_add = comm_monoid_add_int}
 12.1203 -  : IntInf.int cancel_comm_monoid_add;
 12.1204 -
 12.1205 -val semiring_0_cancel_int =
 12.1206 -  {cancel_comm_monoid_add_semiring_0_cancel = cancel_comm_monoid_add_int,
 12.1207 -    semiring_0_semiring_0_cancel = semiring_0_int}
 12.1208 -  : IntInf.int semiring_0_cancel;
 12.1209 -
 12.1210 -val semiring_1_cancel_int =
 12.1211 -  {semiring_0_cancel_semiring_1_cancel = semiring_0_cancel_int,
 12.1212 -    semiring_1_semiring_1_cancel = semiring_1_int}
 12.1213 -  : IntInf.int semiring_1_cancel;
 12.1214 -
 12.1215 -val dvd_int = {times_dvd = times_int} : IntInf.int dvd;
 12.1216 -
 12.1217 -val ab_semigroup_mult_int =
 12.1218 -  {semigroup_mult_ab_semigroup_mult = semigroup_mult_int} :
 12.1219 -  IntInf.int ab_semigroup_mult;
 12.1220 -
 12.1221 -val comm_semiring_int =
 12.1222 -  {ab_semigroup_mult_comm_semiring = ab_semigroup_mult_int,
 12.1223 -    semiring_comm_semiring = semiring_int}
 12.1224 -  : IntInf.int comm_semiring;
 12.1225 -
 12.1226 -val comm_semiring_0_int =
 12.1227 -  {comm_semiring_comm_semiring_0 = comm_semiring_int,
 12.1228 -    semiring_0_comm_semiring_0 = semiring_0_int}
 12.1229 -  : IntInf.int comm_semiring_0;
 12.1230 -
 12.1231 -val comm_monoid_mult_int =
 12.1232 -  {ab_semigroup_mult_comm_monoid_mult = ab_semigroup_mult_int,
 12.1233 -    monoid_mult_comm_monoid_mult = monoid_mult_int}
 12.1234 -  : IntInf.int comm_monoid_mult;
 12.1235 -
 12.1236 -val comm_semiring_1_int =
 12.1237 -  {comm_monoid_mult_comm_semiring_1 = comm_monoid_mult_int,
 12.1238 -    comm_semiring_0_comm_semiring_1 = comm_semiring_0_int,
 12.1239 -    dvd_comm_semiring_1 = dvd_int, semiring_1_comm_semiring_1 = semiring_1_int}
 12.1240 -  : IntInf.int comm_semiring_1;
 12.1241 -
 12.1242 -val comm_semiring_0_cancel_int =
 12.1243 -  {comm_semiring_0_comm_semiring_0_cancel = comm_semiring_0_int,
 12.1244 -    semiring_0_cancel_comm_semiring_0_cancel = semiring_0_cancel_int}
 12.1245 -  : IntInf.int comm_semiring_0_cancel;
 12.1246 -
 12.1247 -val comm_semiring_1_cancel_int =
 12.1248 -  {comm_semiring_0_cancel_comm_semiring_1_cancel = comm_semiring_0_cancel_int,
 12.1249 -    comm_semiring_1_comm_semiring_1_cancel = comm_semiring_1_int,
 12.1250 -    semiring_1_cancel_comm_semiring_1_cancel = semiring_1_cancel_int}
 12.1251 -  : IntInf.int comm_semiring_1_cancel;
 12.1252 -
 12.1253 -fun abs_int i = (if IntInf.< (i, (0 : IntInf.int)) then IntInf.~ i else i);
 12.1254 -
 12.1255 -fun split f (a, b) = f a b;
 12.1256 -
 12.1257 -fun sgn_int i =
 12.1258 -  (if ((i : IntInf.int) = (0 : IntInf.int)) then (0 : IntInf.int)
 12.1259 -    else (if IntInf.< ((0 : IntInf.int), i) then (1 : IntInf.int)
 12.1260 -           else IntInf.~ (1 : IntInf.int)));
 12.1261 -
 12.1262 -fun apsnd f (x, y) = (x, f y);
 12.1263 -
 12.1264 -fun divmod_int k l =
 12.1265 -  (if ((k : IntInf.int) = (0 : IntInf.int))
 12.1266 -    then ((0 : IntInf.int), (0 : IntInf.int))
 12.1267 -    else (if ((l : IntInf.int) = (0 : IntInf.int)) then ((0 : IntInf.int), k)
 12.1268 -           else apsnd (fn a => IntInf.* (sgn_int l, a))
 12.1269 -                  (if (((sgn_int k) : IntInf.int) = (sgn_int l))
 12.1270 -                    then IntInf.divMod (IntInf.abs k, IntInf.abs l)
 12.1271 -                    else let
 12.1272 -                           val (r, s) =
 12.1273 -                             IntInf.divMod (IntInf.abs k, IntInf.abs l);
 12.1274 -                         in
 12.1275 -                           (if ((s : IntInf.int) = (0 : IntInf.int))
 12.1276 -                             then (IntInf.~ r, (0 : IntInf.int))
 12.1277 -                             else (IntInf.- (IntInf.~ r, (1 : IntInf.int)),
 12.1278 -                                    IntInf.- (abs_int l, s)))
 12.1279 -                         end)));
 12.1280 -
 12.1281 -fun snd (a, b) = b;
 12.1282 -
 12.1283 -fun mod_int a b = snd (divmod_int a b);
 12.1284 -
 12.1285 -fun fst (a, b) = a;
 12.1286 -
 12.1287 -fun div_int a b = fst (divmod_int a b);
 12.1288 -
 12.1289 -val div_inta = {dvd_div = dvd_int, diva = div_int, moda = mod_int} :
 12.1290 -  IntInf.int diva;
 12.1291 -
 12.1292 -val semiring_div_int =
 12.1293 -  {div_semiring_div = div_inta,
 12.1294 -    comm_semiring_1_cancel_semiring_div = comm_semiring_1_cancel_int,
 12.1295 -    no_zero_divisors_semiring_div = no_zero_divisors_int}
 12.1296 -  : IntInf.int semiring_div;
 12.1297 -
 12.1298 -fun dvd (A1_, A2_) a b =
 12.1299 -  eqa A2_ (moda (div_semiring_div A1_) b a)
 12.1300 -    (zero ((zero_no_zero_divisors o no_zero_divisors_semiring_div) A1_));
 12.1301 -
 12.1302 -fun num_case f1 f2 f3 f4 f5 f6 f7 (Mul (inta, num)) = f7 inta num
 12.1303 -  | num_case f1 f2 f3 f4 f5 f6 f7 (Sub (num1, num2)) = f6 num1 num2
 12.1304 -  | num_case f1 f2 f3 f4 f5 f6 f7 (Add (num1, num2)) = f5 num1 num2
 12.1305 -  | num_case f1 f2 f3 f4 f5 f6 f7 (Neg num) = f4 num
 12.1306 -  | num_case f1 f2 f3 f4 f5 f6 f7 (Cn (nat, inta, num)) = f3 nat inta num
 12.1307 -  | num_case f1 f2 f3 f4 f5 f6 f7 (Bound nat) = f2 nat
 12.1308 -  | num_case f1 f2 f3 f4 f5 f6 f7 (C inta) = f1 inta;
 12.1309 -
 12.1310 -fun nummul i (C j) = C (IntInf.* (i, j))
 12.1311 -  | nummul i (Cn (n, c, t)) = Cn (n, IntInf.* (c, i), nummul i t)
 12.1312 -  | nummul i (Bound v) = Mul (i, Bound v)
 12.1313 -  | nummul i (Neg v) = Mul (i, Neg v)
 12.1314 -  | nummul i (Add (v, va)) = Mul (i, Add (v, va))
 12.1315 -  | nummul i (Sub (v, va)) = Mul (i, Sub (v, va))
 12.1316 -  | nummul i (Mul (v, va)) = Mul (i, Mul (v, va));
 12.1317 -
 12.1318 -fun numneg t = nummul (IntInf.~ (1 : IntInf.int)) t;
 12.1319 -
 12.1320 -fun numadd (Cn (n1, c1, r1), Cn (n2, c2, r2)) =
 12.1321 -  (if ((n1 : IntInf.int) = n2)
 12.1322 -    then let
 12.1323 -           val c = IntInf.+ (c1, c2);
 12.1324 -         in
 12.1325 -           (if ((c : IntInf.int) = (0 : IntInf.int)) then numadd (r1, r2)
 12.1326 -             else Cn (n1, c, numadd (r1, r2)))
 12.1327 -         end
 12.1328 -    else (if IntInf.<= (n1, n2)
 12.1329 -           then Cn (n1, c1, numadd (r1, Add (Mul (c2, Bound n2), r2)))
 12.1330 -           else Cn (n2, c2, numadd (Add (Mul (c1, Bound n1), r1), r2))))
 12.1331 -  | numadd (Cn (n1, c1, r1), C dd) = Cn (n1, c1, numadd (r1, C dd))
 12.1332 -  | numadd (Cn (n1, c1, r1), Bound de) = Cn (n1, c1, numadd (r1, Bound de))
 12.1333 -  | numadd (Cn (n1, c1, r1), Neg di) = Cn (n1, c1, numadd (r1, Neg di))
 12.1334 -  | numadd (Cn (n1, c1, r1), Add (dj, dk)) =
 12.1335 -    Cn (n1, c1, numadd (r1, Add (dj, dk)))
 12.1336 -  | numadd (Cn (n1, c1, r1), Sub (dl, dm)) =
 12.1337 -    Cn (n1, c1, numadd (r1, Sub (dl, dm)))
 12.1338 -  | numadd (Cn (n1, c1, r1), Mul (dn, doa)) =
 12.1339 -    Cn (n1, c1, numadd (r1, Mul (dn, doa)))
 12.1340 -  | numadd (C w, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (C w, r2))
 12.1341 -  | numadd (Bound x, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (Bound x, r2))
 12.1342 -  | numadd (Neg ac, Cn (n2, c2, r2)) = Cn (n2, c2, numadd (Neg ac, r2))
 12.1343 -  | numadd (Add (ad, ae), Cn (n2, c2, r2)) =
 12.1344 -    Cn (n2, c2, numadd (Add (ad, ae), r2))
 12.1345 -  | numadd (Sub (af, ag), Cn (n2, c2, r2)) =
 12.1346 -    Cn (n2, c2, numadd (Sub (af, ag), r2))
 12.1347 -  | numadd (Mul (ah, ai), Cn (n2, c2, r2)) =
 12.1348 -    Cn (n2, c2, numadd (Mul (ah, ai), r2))
 12.1349 -  | numadd (C b1, C b2) = C (IntInf.+ (b1, b2))
 12.1350 -  | numadd (C aj, Bound bi) = Add (C aj, Bound bi)
 12.1351 -  | numadd (C aj, Neg bm) = Add (C aj, Neg bm)
 12.1352 -  | numadd (C aj, Add (bn, bo)) = Add (C aj, Add (bn, bo))
 12.1353 -  | numadd (C aj, Sub (bp, bq)) = Add (C aj, Sub (bp, bq))
 12.1354 -  | numadd (C aj, Mul (br, bs)) = Add (C aj, Mul (br, bs))
 12.1355 -  | numadd (Bound ak, C cf) = Add (Bound ak, C cf)
 12.1356 -  | numadd (Bound ak, Bound cg) = Add (Bound ak, Bound cg)
 12.1357 -  | numadd (Bound ak, Neg ck) = Add (Bound ak, Neg ck)
 12.1358 -  | numadd (Bound ak, Add (cl, cm)) = Add (Bound ak, Add (cl, cm))
 12.1359 -  | numadd (Bound ak, Sub (cn, co)) = Add (Bound ak, Sub (cn, co))
 12.1360 -  | numadd (Bound ak, Mul (cp, cq)) = Add (Bound ak, Mul (cp, cq))
 12.1361 -  | numadd (Neg ao, C en) = Add (Neg ao, C en)
 12.1362 -  | numadd (Neg ao, Bound eo) = Add (Neg ao, Bound eo)
 12.1363 -  | numadd (Neg ao, Neg es) = Add (Neg ao, Neg es)
 12.1364 -  | numadd (Neg ao, Add (et, eu)) = Add (Neg ao, Add (et, eu))
 12.1365 -  | numadd (Neg ao, Sub (ev, ew)) = Add (Neg ao, Sub (ev, ew))
 12.1366 -  | numadd (Neg ao, Mul (ex, ey)) = Add (Neg ao, Mul (ex, ey))
 12.1367 -  | numadd (Add (ap, aq), C fl) = Add (Add (ap, aq), C fl)
 12.1368 -  | numadd (Add (ap, aq), Bound fm) = Add (Add (ap, aq), Bound fm)
 12.1369 -  | numadd (Add (ap, aq), Neg fq) = Add (Add (ap, aq), Neg fq)
 12.1370 -  | numadd (Add (ap, aq), Add (fr, fs)) = Add (Add (ap, aq), Add (fr, fs))
 12.1371 -  | numadd (Add (ap, aq), Sub (ft, fu)) = Add (Add (ap, aq), Sub (ft, fu))
 12.1372 -  | numadd (Add (ap, aq), Mul (fv, fw)) = Add (Add (ap, aq), Mul (fv, fw))
 12.1373 -  | numadd (Sub (ar, asa), C gj) = Add (Sub (ar, asa), C gj)
 12.1374 -  | numadd (Sub (ar, asa), Bound gk) = Add (Sub (ar, asa), Bound gk)
 12.1375 -  | numadd (Sub (ar, asa), Neg go) = Add (Sub (ar, asa), Neg go)
 12.1376 -  | numadd (Sub (ar, asa), Add (gp, gq)) = Add (Sub (ar, asa), Add (gp, gq))
 12.1377 -  | numadd (Sub (ar, asa), Sub (gr, gs)) = Add (Sub (ar, asa), Sub (gr, gs))
 12.1378 -  | numadd (Sub (ar, asa), Mul (gt, gu)) = Add (Sub (ar, asa), Mul (gt, gu))
 12.1379 -  | numadd (Mul (at, au), C hh) = Add (Mul (at, au), C hh)
 12.1380 -  | numadd (Mul (at, au), Bound hi) = Add (Mul (at, au), Bound hi)
 12.1381 -  | numadd (Mul (at, au), Neg hm) = Add (Mul (at, au), Neg hm)
 12.1382 -  | numadd (Mul (at, au), Add (hn, ho)) = Add (Mul (at, au), Add (hn, ho))
 12.1383 -  | numadd (Mul (at, au), Sub (hp, hq)) = Add (Mul (at, au), Sub (hp, hq))
 12.1384 -  | numadd (Mul (at, au), Mul (hr, hs)) = Add (Mul (at, au), Mul (hr, hs));
 12.1385 -
 12.1386 -fun numsub s t =
 12.1387 -  (if eq_num s t then C (0 : IntInf.int) else numadd (s, numneg t));
 12.1388 -
 12.1389 -fun simpnum (C j) = C j
 12.1390 -  | simpnum (Bound n) = Cn (n, (1 : IntInf.int), C (0 : IntInf.int))
 12.1391 -  | simpnum (Neg t) = numneg (simpnum t)
 12.1392 -  | simpnum (Add (t, s)) = numadd (simpnum t, simpnum s)
 12.1393 -  | simpnum (Sub (t, s)) = numsub (simpnum t) (simpnum s)
 12.1394 -  | simpnum (Mul (i, t)) =
 12.1395 -    (if ((i : IntInf.int) = (0 : IntInf.int)) then C (0 : IntInf.int)
 12.1396 -      else nummul i (simpnum t))
 12.1397 -  | simpnum (Cn (v, va, vb)) = Cn (v, va, vb);
 12.1398 -
 12.1399 -fun nota (Not p) = p
 12.1400 -  | nota T = F
 12.1401 -  | nota F = T
 12.1402 -  | nota (Lt v) = Not (Lt v)
 12.1403 -  | nota (Le v) = Not (Le v)
 12.1404 -  | nota (Gt v) = Not (Gt v)
 12.1405 -  | nota (Ge v) = Not (Ge v)
 12.1406 -  | nota (Eq v) = Not (Eq v)
 12.1407 -  | nota (NEq v) = Not (NEq v)
 12.1408 -  | nota (Dvd (v, va)) = Not (Dvd (v, va))
 12.1409 -  | nota (NDvd (v, va)) = Not (NDvd (v, va))
 12.1410 -  | nota (And (v, va)) = Not (And (v, va))
 12.1411 -  | nota (Or (v, va)) = Not (Or (v, va))
 12.1412 -  | nota (Imp (v, va)) = Not (Imp (v, va))
 12.1413 -  | nota (Iff (v, va)) = Not (Iff (v, va))
 12.1414 -  | nota (E v) = Not (E v)
 12.1415 -  | nota (A v) = Not (A v)
 12.1416 -  | nota (Closed v) = Not (Closed v)
 12.1417 -  | nota (NClosed v) = Not (NClosed v);
 12.1418 -
 12.1419 -fun iffa p q =
 12.1420 -  (if eq_fm p q then T
 12.1421 -    else (if eq_fm p (nota q) orelse eq_fm (nota p) q then F
 12.1422 -           else (if eq_fm p F then nota q
 12.1423 -                  else (if eq_fm q F then nota p
 12.1424 -                         else (if eq_fm p T then q
 12.1425 -                                else (if eq_fm q T then p else Iff (p, q)))))));
 12.1426 -
 12.1427 -fun impa p q =
 12.1428 -  (if eq_fm p F orelse eq_fm q T then T
 12.1429 -    else (if eq_fm p T then q else (if eq_fm q F then nota p else Imp (p, q))));
 12.1430 -
 12.1431 -fun conj p q =
 12.1432 -  (if eq_fm p F orelse eq_fm q F then F
 12.1433 -    else (if eq_fm p T then q else (if eq_fm q T then p else And (p, q))));
 12.1434 -
 12.1435 -fun simpfm (And (p, q)) = conj (simpfm p) (simpfm q)
 12.1436 -  | simpfm (Or (p, q)) = disj (simpfm p) (simpfm q)
 12.1437 -  | simpfm (Imp (p, q)) = impa (simpfm p) (simpfm q)
 12.1438 -  | simpfm (Iff (p, q)) = iffa (simpfm p) (simpfm q)
 12.1439 -  | simpfm (Not p) = nota (simpfm p)
 12.1440 -  | simpfm (Lt a) =
 12.1441 -    let
 12.1442 -      val aa = simpnum a;
 12.1443 -    in
 12.1444 -      (case aa of C v => (if IntInf.< (v, (0 : IntInf.int)) then T else F)
 12.1445 -        | Bound _ => Lt aa | Cn (_, _, _) => Lt aa | Neg _ => Lt aa
 12.1446 -        | Add (_, _) => Lt aa | Sub (_, _) => Lt aa | Mul (_, _) => Lt aa)
 12.1447 -    end
 12.1448 -  | simpfm (Le a) =
 12.1449 -    let
 12.1450 -      val aa = simpnum a;
 12.1451 -    in
 12.1452 -      (case aa of C v => (if IntInf.<= (v, (0 : IntInf.int)) then T else F)
 12.1453 -        | Bound _ => Le aa | Cn (_, _, _) => Le aa | Neg _ => Le aa
 12.1454 -        | Add (_, _) => Le aa | Sub (_, _) => Le aa | Mul (_, _) => Le aa)
 12.1455 -    end
 12.1456 -  | simpfm (Gt a) =
 12.1457 -    let
 12.1458 -      val aa = simpnum a;
 12.1459 -    in
 12.1460 -      (case aa of C v => (if IntInf.< ((0 : IntInf.int), v) then T else F)
 12.1461 -        | Bound _ => Gt aa | Cn (_, _, _) => Gt aa | Neg _ => Gt aa
 12.1462 -        | Add (_, _) => Gt aa | Sub (_, _) => Gt aa | Mul (_, _) => Gt aa)
 12.1463 -    end
 12.1464 -  | simpfm (Ge a) =
 12.1465 -    let
 12.1466 -      val aa = simpnum a;
 12.1467 -    in
 12.1468 -      (case aa of C v => (if IntInf.<= ((0 : IntInf.int), v) then T else F)
 12.1469 -        | Bound _ => Ge aa | Cn (_, _, _) => Ge aa | Neg _ => Ge aa
 12.1470 -        | Add (_, _) => Ge aa | Sub (_, _) => Ge aa | Mul (_, _) => Ge aa)
 12.1471 -    end
 12.1472 -  | simpfm (Eq a) =
 12.1473 -    let
 12.1474 -      val aa = simpnum a;
 12.1475 -    in
 12.1476 -      (case aa
 12.1477 -        of C v => (if ((v : IntInf.int) = (0 : IntInf.int)) then T else F)
 12.1478 -        | Bound _ => Eq aa | Cn (_, _, _) => Eq aa | Neg _ => Eq aa
 12.1479 -        | Add (_, _) => Eq aa | Sub (_, _) => Eq aa | Mul (_, _) => Eq aa)
 12.1480 -    end
 12.1481 -  | simpfm (NEq a) =
 12.1482 -    let
 12.1483 -      val aa = simpnum a;
 12.1484 -    in
 12.1485 -      (case aa
 12.1486 -        of C v => (if not ((v : IntInf.int) = (0 : IntInf.int)) then T else F)
 12.1487 -        | Bound _ => NEq aa | Cn (_, _, _) => NEq aa | Neg _ => NEq aa
 12.1488 -        | Add (_, _) => NEq aa | Sub (_, _) => NEq aa | Mul (_, _) => NEq aa)
 12.1489 -    end
 12.1490 -  | simpfm (Dvd (i, a)) =
 12.1491 -    (if ((i : IntInf.int) = (0 : IntInf.int)) then simpfm (Eq a)
 12.1492 -      else (if (((abs_int i) : IntInf.int) = (1 : IntInf.int)) then T
 12.1493 -             else let
 12.1494 -                    val aa = simpnum a;
 12.1495 -                  in
 12.1496 -                    (case aa
 12.1497 -                      of C v =>
 12.1498 -                        (if dvd (semiring_div_int, eq_int) i v then T else F)
 12.1499 -                      | Bound _ => Dvd (i, aa) | Cn (_, _, _) => Dvd (i, aa)
 12.1500 -                      | Neg _ => Dvd (i, aa) | Add (_, _) => Dvd (i, aa)
 12.1501 -                      | Sub (_, _) => Dvd (i, aa) | Mul (_, _) => Dvd (i, aa))
 12.1502 -                  end))
 12.1503 -  | simpfm (NDvd (i, a)) =
 12.1504 -    (if ((i : IntInf.int) = (0 : IntInf.int)) then simpfm (NEq a)
 12.1505 -      else (if (((abs_int i) : IntInf.int) = (1 : IntInf.int)) then F
 12.1506 -             else let
 12.1507 -                    val aa = simpnum a;
 12.1508 -                  in
 12.1509 -                    (case aa
 12.1510 -                      of C v =>
 12.1511 -                        (if not (dvd (semiring_div_int, eq_int) i v) then T
 12.1512 -                          else F)
 12.1513 -                      | Bound _ => NDvd (i, aa) | Cn (_, _, _) => NDvd (i, aa)
 12.1514 -                      | Neg _ => NDvd (i, aa) | Add (_, _) => NDvd (i, aa)
 12.1515 -                      | Sub (_, _) => NDvd (i, aa) | Mul (_, _) => NDvd (i, aa))
 12.1516 -                  end))
 12.1517 -  | simpfm T = T
 12.1518 -  | simpfm F = F
 12.1519 -  | simpfm (E v) = E v
 12.1520 -  | simpfm (A v) = A v
 12.1521 -  | simpfm (Closed v) = Closed v
 12.1522 -  | simpfm (NClosed v) = NClosed v;
 12.1523 -
 12.1524 -fun iupt i j =
 12.1525 -  (if IntInf.< (j, i) then []
 12.1526 -    else i :: iupt (IntInf.+ (i, (1 : IntInf.int))) j);
 12.1527 -
 12.1528 -fun mirror (And (p, q)) = And (mirror p, mirror q)
 12.1529 -  | mirror (Or (p, q)) = Or (mirror p, mirror q)
 12.1530 -  | mirror T = T
 12.1531 -  | mirror F = F
 12.1532 -  | mirror (Lt (C bo)) = Lt (C bo)
 12.1533 -  | mirror (Lt (Bound bp)) = Lt (Bound bp)
 12.1534 -  | mirror (Lt (Neg bt)) = Lt (Neg bt)
 12.1535 -  | mirror (Lt (Add (bu, bv))) = Lt (Add (bu, bv))
 12.1536 -  | mirror (Lt (Sub (bw, bx))) = Lt (Sub (bw, bx))
 12.1537 -  | mirror (Lt (Mul (by, bz))) = Lt (Mul (by, bz))
 12.1538 -  | mirror (Le (C co)) = Le (C co)
 12.1539 -  | mirror (Le (Bound cp)) = Le (Bound cp)
 12.1540 -  | mirror (Le (Neg ct)) = Le (Neg ct)
 12.1541 -  | mirror (Le (Add (cu, cv))) = Le (Add (cu, cv))
 12.1542 -  | mirror (Le (Sub (cw, cx))) = Le (Sub (cw, cx))
 12.1543 -  | mirror (Le (Mul (cy, cz))) = Le (Mul (cy, cz))
 12.1544 -  | mirror (Gt (C doa)) = Gt (C doa)
 12.1545 -  | mirror (Gt (Bound dp)) = Gt (Bound dp)
 12.1546 -  | mirror (Gt (Neg dt)) = Gt (Neg dt)
 12.1547 -  | mirror (Gt (Add (du, dv))) = Gt (Add (du, dv))
 12.1548 -  | mirror (Gt (Sub (dw, dx))) = Gt (Sub (dw, dx))
 12.1549 -  | mirror (Gt (Mul (dy, dz))) = Gt (Mul (dy, dz))
 12.1550 -  | mirror (Ge (C eo)) = Ge (C eo)
 12.1551 -  | mirror (Ge (Bound ep)) = Ge (Bound ep)
 12.1552 -  | mirror (Ge (Neg et)) = Ge (Neg et)
 12.1553 -  | mirror (Ge (Add (eu, ev))) = Ge (Add (eu, ev))
 12.1554 -  | mirror (Ge (Sub (ew, ex))) = Ge (Sub (ew, ex))
 12.1555 -  | mirror (Ge (Mul (ey, ez))) = Ge (Mul (ey, ez))
 12.1556 -  | mirror (Eq (C fo)) = Eq (C fo)
 12.1557 -  | mirror (Eq (Bound fp)) = Eq (Bound fp)
 12.1558 -  | mirror (Eq (Neg ft)) = Eq (Neg ft)
 12.1559 -  | mirror (Eq (Add (fu, fv))) = Eq (Add (fu, fv))
 12.1560 -  | mirror (Eq (Sub (fw, fx))) = Eq (Sub (fw, fx))
 12.1561 -  | mirror (Eq (Mul (fy, fz))) = Eq (Mul (fy, fz))
 12.1562 -  | mirror (NEq (C go)) = NEq (C go)
 12.1563 -  | mirror (NEq (Bound gp)) = NEq (Bound gp)
 12.1564 -  | mirror (NEq (Neg gt)) = NEq (Neg gt)
 12.1565 -  | mirror (NEq (Add (gu, gv))) = NEq (Add (gu, gv))
 12.1566 -  | mirror (NEq (Sub (gw, gx))) = NEq (Sub (gw, gx))
 12.1567 -  | mirror (NEq (Mul (gy, gz))) = NEq (Mul (gy, gz))
 12.1568 -  | mirror (Dvd (aa, C ho)) = Dvd (aa, C ho)
 12.1569 -  | mirror (Dvd (aa, Bound hp)) = Dvd (aa, Bound hp)
 12.1570 -  | mirror (Dvd (aa, Neg ht)) = Dvd (aa, Neg ht)
 12.1571 -  | mirror (Dvd (aa, Add (hu, hv))) = Dvd (aa, Add (hu, hv))
 12.1572 -  | mirror (Dvd (aa, Sub (hw, hx))) = Dvd (aa, Sub (hw, hx))
 12.1573 -  | mirror (Dvd (aa, Mul (hy, hz))) = Dvd (aa, Mul (hy, hz))
 12.1574 -  | mirror (NDvd (ac, C io)) = NDvd (ac, C io)
 12.1575 -  | mirror (NDvd (ac, Bound ip)) = NDvd (ac, Bound ip)
 12.1576 -  | mirror (NDvd (ac, Neg it)) = NDvd (ac, Neg it)
 12.1577 -  | mirror (NDvd (ac, Add (iu, iv))) = NDvd (ac, Add (iu, iv))
 12.1578 -  | mirror (NDvd (ac, Sub (iw, ix))) = NDvd (ac, Sub (iw, ix))
 12.1579 -  | mirror (NDvd (ac, Mul (iy, iz))) = NDvd (ac, Mul (iy, iz))
 12.1580 -  | mirror (Not ae) = Not ae
 12.1581 -  | mirror (Imp (aj, ak)) = Imp (aj, ak)
 12.1582 -  | mirror (Iff (al, am)) = Iff (al, am)
 12.1583 -  | mirror (E an) = E an
 12.1584 -  | mirror (A ao) = A ao
 12.1585 -  | mirror (Closed ap) = Closed ap
 12.1586 -  | mirror (NClosed aq) = NClosed aq
 12.1587 -  | mirror (Lt (Cn (cm, c, e))) =
 12.1588 -    (if ((cm : IntInf.int) = (0 : IntInf.int))
 12.1589 -      then Gt (Cn ((0 : IntInf.int), c, Neg e))
 12.1590 -      else Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e)))
 12.1591 -  | mirror (Le (Cn (dm, c, e))) =
 12.1592 -    (if ((dm : IntInf.int) = (0 : IntInf.int))
 12.1593 -      then Ge (Cn ((0 : IntInf.int), c, Neg e))
 12.1594 -      else Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e)))
 12.1595 -  | mirror (Gt (Cn (em, c, e))) =
 12.1596 -    (if ((em : IntInf.int) = (0 : IntInf.int))
 12.1597 -      then Lt (Cn ((0 : IntInf.int), c, Neg e))
 12.1598 -      else Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e)))
 12.1599 -  | mirror (Ge (Cn (fm, c, e))) =
 12.1600 -    (if ((fm : IntInf.int) = (0 : IntInf.int))
 12.1601 -      then Le (Cn ((0 : IntInf.int), c, Neg e))
 12.1602 -      else Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e)))
 12.1603 -  | mirror (Eq (Cn (gm, c, e))) =
 12.1604 -    (if ((gm : IntInf.int) = (0 : IntInf.int))
 12.1605 -      then Eq (Cn ((0 : IntInf.int), c, Neg e))
 12.1606 -      else Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e)))
 12.1607 -  | mirror (NEq (Cn (hm, c, e))) =
 12.1608 -    (if ((hm : IntInf.int) = (0 : IntInf.int))
 12.1609 -      then NEq (Cn ((0 : IntInf.int), c, Neg e))
 12.1610 -      else NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e)))
 12.1611 -  | mirror (Dvd (i, Cn (im, c, e))) =
 12.1612 -    (if ((im : IntInf.int) = (0 : IntInf.int))
 12.1613 -      then Dvd (i, Cn ((0 : IntInf.int), c, Neg e))
 12.1614 -      else Dvd (i, Cn (suc (minus_nat im (1 : IntInf.int)), c, e)))
 12.1615 -  | mirror (NDvd (i, Cn (jm, c, e))) =
 12.1616 -    (if ((jm : IntInf.int) = (0 : IntInf.int))
 12.1617 -      then NDvd (i, Cn ((0 : IntInf.int), c, Neg e))
 12.1618 -      else NDvd (i, Cn (suc (minus_nat jm (1 : IntInf.int)), c, e)));
 12.1619 -
 12.1620 -fun size_list [] = (0 : IntInf.int)
 12.1621 -  | size_list (a :: lista) = IntInf.+ (size_list lista, suc (0 : IntInf.int));
 12.1622 -
 12.1623 -fun alpha (And (p, q)) = append (alpha p) (alpha q)
 12.1624 -  | alpha (Or (p, q)) = append (alpha p) (alpha q)
 12.1625 -  | alpha T = []
 12.1626 -  | alpha F = []
 12.1627 -  | alpha (Lt (C bo)) = []
 12.1628 -  | alpha (Lt (Bound bp)) = []
 12.1629 -  | alpha (Lt (Neg bt)) = []
 12.1630 -  | alpha (Lt (Add (bu, bv))) = []
 12.1631 -  | alpha (Lt (Sub (bw, bx))) = []
 12.1632 -  | alpha (Lt (Mul (by, bz))) = []
 12.1633 -  | alpha (Le (C co)) = []
 12.1634 -  | alpha (Le (Bound cp)) = []
 12.1635 -  | alpha (Le (Neg ct)) = []
 12.1636 -  | alpha (Le (Add (cu, cv))) = []
 12.1637 -  | alpha (Le (Sub (cw, cx))) = []
 12.1638 -  | alpha (Le (Mul (cy, cz))) = []
 12.1639 -  | alpha (Gt (C doa)) = []
 12.1640 -  | alpha (Gt (Bound dp)) = []
 12.1641 -  | alpha (Gt (Neg dt)) = []
 12.1642 -  | alpha (Gt (Add (du, dv))) = []
 12.1643 -  | alpha (Gt (Sub (dw, dx))) = []
 12.1644 -  | alpha (Gt (Mul (dy, dz))) = []
 12.1645 -  | alpha (Ge (C eo)) = []
 12.1646 -  | alpha (Ge (Bound ep)) = []
 12.1647 -  | alpha (Ge (Neg et)) = []
 12.1648 -  | alpha (Ge (Add (eu, ev))) = []
 12.1649 -  | alpha (Ge (Sub (ew, ex))) = []
 12.1650 -  | alpha (Ge (Mul (ey, ez))) = []
 12.1651 -  | alpha (Eq (C fo)) = []
 12.1652 -  | alpha (Eq (Bound fp)) = []
 12.1653 -  | alpha (Eq (Neg ft)) = []
 12.1654 -  | alpha (Eq (Add (fu, fv))) = []
 12.1655 -  | alpha (Eq (Sub (fw, fx))) = []
 12.1656 -  | alpha (Eq (Mul (fy, fz))) = []
 12.1657 -  | alpha (NEq (C go)) = []
 12.1658 -  | alpha (NEq (Bound gp)) = []
 12.1659 -  | alpha (NEq (Neg gt)) = []
 12.1660 -  | alpha (NEq (Add (gu, gv))) = []
 12.1661 -  | alpha (NEq (Sub (gw, gx))) = []
 12.1662 -  | alpha (NEq (Mul (gy, gz))) = []
 12.1663 -  | alpha (Dvd (aa, ab)) = []
 12.1664 -  | alpha (NDvd (ac, ad)) = []
 12.1665 -  | alpha (Not ae) = []
 12.1666 -  | alpha (Imp (aj, ak)) = []
 12.1667 -  | alpha (Iff (al, am)) = []
 12.1668 -  | alpha (E an) = []
 12.1669 -  | alpha (A ao) = []
 12.1670 -  | alpha (Closed ap) = []
 12.1671 -  | alpha (NClosed aq) = []
 12.1672 -  | alpha (Lt (Cn (cm, c, e))) =
 12.1673 -    (if ((cm : IntInf.int) = (0 : IntInf.int)) then [e] else [])
 12.1674 -  | alpha (Le (Cn (dm, c, e))) =
 12.1675 -    (if ((dm : IntInf.int) = (0 : IntInf.int))
 12.1676 -      then [Add (C (~1 : IntInf.int), e)] else [])
 12.1677 -  | alpha (Gt (Cn (em, c, e))) =
 12.1678 -    (if ((em : IntInf.int) = (0 : IntInf.int)) then [] else [])
 12.1679 -  | alpha (Ge (Cn (fm, c, e))) =
 12.1680 -    (if ((fm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 12.1681 -  | alpha (Eq (Cn (gm, c, e))) =
 12.1682 -    (if ((gm : IntInf.int) = (0 : IntInf.int))
 12.1683 -      then [Add (C (~1 : IntInf.int), e)] else [])
 12.1684 -  | alpha (NEq (Cn (hm, c, e))) =
 12.1685 -    (if ((hm : IntInf.int) = (0 : IntInf.int)) then [e] else []);
 12.1686 -
 12.1687 -fun beta (And (p, q)) = append (beta p) (beta q)
 12.1688 -  | beta (Or (p, q)) = append (beta p) (beta q)
 12.1689 -  | beta T = []
 12.1690 -  | beta F = []
 12.1691 -  | beta (Lt (C bo)) = []
 12.1692 -  | beta (Lt (Bound bp)) = []
 12.1693 -  | beta (Lt (Neg bt)) = []
 12.1694 -  | beta (Lt (Add (bu, bv))) = []
 12.1695 -  | beta (Lt (Sub (bw, bx))) = []
 12.1696 -  | beta (Lt (Mul (by, bz))) = []
 12.1697 -  | beta (Le (C co)) = []
 12.1698 -  | beta (Le (Bound cp)) = []
 12.1699 -  | beta (Le (Neg ct)) = []
 12.1700 -  | beta (Le (Add (cu, cv))) = []
 12.1701 -  | beta (Le (Sub (cw, cx))) = []
 12.1702 -  | beta (Le (Mul (cy, cz))) = []
 12.1703 -  | beta (Gt (C doa)) = []
 12.1704 -  | beta (Gt (Bound dp)) = []
 12.1705 -  | beta (Gt (Neg dt)) = []
 12.1706 -  | beta (Gt (Add (du, dv))) = []
 12.1707 -  | beta (Gt (Sub (dw, dx))) = []
 12.1708 -  | beta (Gt (Mul (dy, dz))) = []
 12.1709 -  | beta (Ge (C eo)) = []
 12.1710 -  | beta (Ge (Bound ep)) = []
 12.1711 -  | beta (Ge (Neg et)) = []
 12.1712 -  | beta (Ge (Add (eu, ev))) = []
 12.1713 -  | beta (Ge (Sub (ew, ex))) = []
 12.1714 -  | beta (Ge (Mul (ey, ez))) = []
 12.1715 -  | beta (Eq (C fo)) = []
 12.1716 -  | beta (Eq (Bound fp)) = []
 12.1717 -  | beta (Eq (Neg ft)) = []
 12.1718 -  | beta (Eq (Add (fu, fv))) = []
 12.1719 -  | beta (Eq (Sub (fw, fx))) = []
 12.1720 -  | beta (Eq (Mul (fy, fz))) = []
 12.1721 -  | beta (NEq (C go)) = []
 12.1722 -  | beta (NEq (Bound gp)) = []
 12.1723 -  | beta (NEq (Neg gt)) = []
 12.1724 -  | beta (NEq (Add (gu, gv))) = []
 12.1725 -  | beta (NEq (Sub (gw, gx))) = []
 12.1726 -  | beta (NEq (Mul (gy, gz))) = []
 12.1727 -  | beta (Dvd (aa, ab)) = []
 12.1728 -  | beta (NDvd (ac, ad)) = []
 12.1729 -  | beta (Not ae) = []
 12.1730 -  | beta (Imp (aj, ak)) = []
 12.1731 -  | beta (Iff (al, am)) = []
 12.1732 -  | beta (E an) = []
 12.1733 -  | beta (A ao) = []
 12.1734 -  | beta (Closed ap) = []
 12.1735 -  | beta (NClosed aq) = []
 12.1736 -  | beta (Lt (Cn (cm, c, e))) =
 12.1737 -    (if ((cm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 12.1738 -  | beta (Le (Cn (dm, c, e))) =
 12.1739 -    (if ((dm : IntInf.int) = (0 : IntInf.int)) then [] else [])
 12.1740 -  | beta (Gt (Cn (em, c, e))) =
 12.1741 -    (if ((em : IntInf.int) = (0 : IntInf.int)) then [Neg e] else [])
 12.1742 -  | beta (Ge (Cn (fm, c, e))) =
 12.1743 -    (if ((fm : IntInf.int) = (0 : IntInf.int))
 12.1744 -      then [Sub (C (~1 : IntInf.int), e)] else [])
 12.1745 -  | beta (Eq (Cn (gm, c, e))) =
 12.1746 -    (if ((gm : IntInf.int) = (0 : IntInf.int))
 12.1747 -      then [Sub (C (~1 : IntInf.int), e)] else [])
 12.1748 -  | beta (NEq (Cn (hm, c, e))) =
 12.1749 -    (if ((hm : IntInf.int) = (0 : IntInf.int)) then [Neg e] else []);
 12.1750 -
 12.1751 -val eq_numa = {eq = eq_num} : num eq;
 12.1752 -
 12.1753 -fun member A_ x [] = false
 12.1754 -  | member A_ x (y :: ys) = eqa A_ x y orelse member A_ x ys;
 12.1755 -
 12.1756 -fun remdups A_ [] = []
 12.1757 -  | remdups A_ (x :: xs) =
 12.1758 -    (if member A_ x xs then remdups A_ xs else x :: remdups A_ xs);
 12.1759 -
 12.1760 -fun gcd_int k l =
 12.1761 -  abs_int
 12.1762 -    (if ((l : IntInf.int) = (0 : IntInf.int)) then k
 12.1763 -      else gcd_int l (mod_int (abs_int k) (abs_int l)));
 12.1764 -
 12.1765 -fun lcm_int a b = div_int (IntInf.* (abs_int a, abs_int b)) (gcd_int a b);
 12.1766 -
 12.1767 -fun delta (And (p, q)) = lcm_int (delta p) (delta q)
 12.1768 -  | delta (Or (p, q)) = lcm_int (delta p) (delta q)
 12.1769 -  | delta T = (1 : IntInf.int)
 12.1770 -  | delta F = (1 : IntInf.int)
 12.1771 -  | delta (Lt u) = (1 : IntInf.int)
 12.1772 -  | delta (Le v) = (1 : IntInf.int)
 12.1773 -  | delta (Gt w) = (1 : IntInf.int)
 12.1774 -  | delta (Ge x) = (1 : IntInf.int)
 12.1775 -  | delta (Eq y) = (1 : IntInf.int)
 12.1776 -  | delta (NEq z) = (1 : IntInf.int)
 12.1777 -  | delta (Dvd (aa, C bo)) = (1 : IntInf.int)
 12.1778 -  | delta (Dvd (aa, Bound bp)) = (1 : IntInf.int)
 12.1779 -  | delta (Dvd (aa, Neg bt)) = (1 : IntInf.int)
 12.1780 -  | delta (Dvd (aa, Add (bu, bv))) = (1 : IntInf.int)
 12.1781 -  | delta (Dvd (aa, Sub (bw, bx))) = (1 : IntInf.int)
 12.1782 -  | delta (Dvd (aa, Mul (by, bz))) = (1 : IntInf.int)
 12.1783 -  | delta (NDvd (ac, C co)) = (1 : IntInf.int)
 12.1784 -  | delta (NDvd (ac, Bound cp)) = (1 : IntInf.int)
 12.1785 -  | delta (NDvd (ac, Neg ct)) = (1 : IntInf.int)
 12.1786 -  | delta (NDvd (ac, Add (cu, cv))) = (1 : IntInf.int)
 12.1787 -  | delta (NDvd (ac, Sub (cw, cx))) = (1 : IntInf.int)
 12.1788 -  | delta (NDvd (ac, Mul (cy, cz))) = (1 : IntInf.int)
 12.1789 -  | delta (Not ae) = (1 : IntInf.int)
 12.1790 -  | delta (Imp (aj, ak)) = (1 : IntInf.int)
 12.1791 -  | delta (Iff (al, am)) = (1 : IntInf.int)
 12.1792 -  | delta (E an) = (1 : IntInf.int)
 12.1793 -  | delta (A ao) = (1 : IntInf.int)
 12.1794 -  | delta (Closed ap) = (1 : IntInf.int)
 12.1795 -  | delta (NClosed aq) = (1 : IntInf.int)
 12.1796 -  | delta (Dvd (i, Cn (cm, c, e))) =
 12.1797 -    (if ((cm : IntInf.int) = (0 : IntInf.int)) then i else (1 : IntInf.int))
 12.1798 -  | delta (NDvd (i, Cn (dm, c, e))) =
 12.1799 -    (if ((dm : IntInf.int) = (0 : IntInf.int)) then i else (1 : IntInf.int));
 12.1800 -
 12.1801 -fun a_beta (And (p, q)) = (fn k => And (a_beta p k, a_beta q k))
 12.1802 -  | a_beta (Or (p, q)) = (fn k => Or (a_beta p k, a_beta q k))
 12.1803 -  | a_beta T = (fn _ => T)
 12.1804 -  | a_beta F = (fn _ => F)
 12.1805 -  | a_beta (Lt (C bo)) = (fn _ => Lt (C bo))
 12.1806 -  | a_beta (Lt (Bound bp)) = (fn _ => Lt (Bound bp))
 12.1807 -  | a_beta (Lt (Neg bt)) = (fn _ => Lt (Neg bt))
 12.1808 -  | a_beta (Lt (Add (bu, bv))) = (fn _ => Lt (Add (bu, bv)))
 12.1809 -  | a_beta (Lt (Sub (bw, bx))) = (fn _ => Lt (Sub (bw, bx)))
 12.1810 -  | a_beta (Lt (Mul (by, bz))) = (fn _ => Lt (Mul (by, bz)))
 12.1811 -  | a_beta (Le (C co)) = (fn _ => Le (C co))
 12.1812 -  | a_beta (Le (Bound cp)) = (fn _ => Le (Bound cp))
 12.1813 -  | a_beta (Le (Neg ct)) = (fn _ => Le (Neg ct))
 12.1814 -  | a_beta (Le (Add (cu, cv))) = (fn _ => Le (Add (cu, cv)))
 12.1815 -  | a_beta (Le (Sub (cw, cx))) = (fn _ => Le (Sub (cw, cx)))
 12.1816 -  | a_beta (Le (Mul (cy, cz))) = (fn _ => Le (Mul (cy, cz)))
 12.1817 -  | a_beta (Gt (C doa)) = (fn _ => Gt (C doa))
 12.1818 -  | a_beta (Gt (Bound dp)) = (fn _ => Gt (Bound dp))
 12.1819 -  | a_beta (Gt (Neg dt)) = (fn _ => Gt (Neg dt))
 12.1820 -  | a_beta (Gt (Add (du, dv))) = (fn _ => Gt (Add (du, dv)))
 12.1821 -  | a_beta (Gt (Sub (dw, dx))) = (fn _ => Gt (Sub (dw, dx)))
 12.1822 -  | a_beta (Gt (Mul (dy, dz))) = (fn _ => Gt (Mul (dy, dz)))
 12.1823 -  | a_beta (Ge (C eo)) = (fn _ => Ge (C eo))
 12.1824 -  | a_beta (Ge (Bound ep)) = (fn _ => Ge (Bound ep))
 12.1825 -  | a_beta (Ge (Neg et)) = (fn _ => Ge (Neg et))
 12.1826 -  | a_beta (Ge (Add (eu, ev))) = (fn _ => Ge (Add (eu, ev)))
 12.1827 -  | a_beta (Ge (Sub (ew, ex))) = (fn _ => Ge (Sub (ew, ex)))
 12.1828 -  | a_beta (Ge (Mul (ey, ez))) = (fn _ => Ge (Mul (ey, ez)))
 12.1829 -  | a_beta (Eq (C fo)) = (fn _ => Eq (C fo))
 12.1830 -  | a_beta (Eq (Bound fp)) = (fn _ => Eq (Bound fp))
 12.1831 -  | a_beta (Eq (Neg ft)) = (fn _ => Eq (Neg ft))
 12.1832 -  | a_beta (Eq (Add (fu, fv))) = (fn _ => Eq (Add (fu, fv)))
 12.1833 -  | a_beta (Eq (Sub (fw, fx))) = (fn _ => Eq (Sub (fw, fx)))
 12.1834 -  | a_beta (Eq (Mul (fy, fz))) = (fn _ => Eq (Mul (fy, fz)))
 12.1835 -  | a_beta (NEq (C go)) = (fn _ => NEq (C go))
 12.1836 -  | a_beta (NEq (Bound gp)) = (fn _ => NEq (Bound gp))
 12.1837 -  | a_beta (NEq (Neg gt)) = (fn _ => NEq (Neg gt))
 12.1838 -  | a_beta (NEq (Add (gu, gv))) = (fn _ => NEq (Add (gu, gv)))
 12.1839 -  | a_beta (NEq (Sub (gw, gx))) = (fn _ => NEq (Sub (gw, gx)))
 12.1840 -  | a_beta (NEq (Mul (gy, gz))) = (fn _ => NEq (Mul (gy, gz)))
 12.1841 -  | a_beta (Dvd (aa, C ho)) = (fn _ => Dvd (aa, C ho))
 12.1842 -  | a_beta (Dvd (aa, Bound hp)) = (fn _ => Dvd (aa, Bound hp))
 12.1843 -  | a_beta (Dvd (aa, Neg ht)) = (fn _ => Dvd (aa, Neg ht))
 12.1844 -  | a_beta (Dvd (aa, Add (hu, hv))) = (fn _ => Dvd (aa, Add (hu, hv)))
 12.1845 -  | a_beta (Dvd (aa, Sub (hw, hx))) = (fn _ => Dvd (aa, Sub (hw, hx)))
 12.1846 -  | a_beta (Dvd (aa, Mul (hy, hz))) = (fn _ => Dvd (aa, Mul (hy, hz)))
 12.1847 -  | a_beta (NDvd (ac, C io)) = (fn _ => NDvd (ac, C io))
 12.1848 -  | a_beta (NDvd (ac, Bound ip)) = (fn _ => NDvd (ac, Bound ip))
 12.1849 -  | a_beta (NDvd (ac, Neg it)) = (fn _ => NDvd (ac, Neg it))
 12.1850 -  | a_beta (NDvd (ac, Add (iu, iv))) = (fn _ => NDvd (ac, Add (iu, iv)))
 12.1851 -  | a_beta (NDvd (ac, Sub (iw, ix))) = (fn _ => NDvd (ac, Sub (iw, ix)))
 12.1852 -  | a_beta (NDvd (ac, Mul (iy, iz))) = (fn _ => NDvd (ac, Mul (iy, iz)))
 12.1853 -  | a_beta (Not ae) = (fn _ => Not ae)
 12.1854 -  | a_beta (Imp (aj, ak)) = (fn _ => Imp (aj, ak))
 12.1855 -  | a_beta (Iff (al, am)) = (fn _ => Iff (al, am))
 12.1856 -  | a_beta (E an) = (fn _ => E an)
 12.1857 -  | a_beta (A ao) = (fn _ => A ao)
 12.1858 -  | a_beta (Closed ap) = (fn _ => Closed ap)
 12.1859 -  | a_beta (NClosed aq) = (fn _ => NClosed aq)
 12.1860 -  | a_beta (Lt (Cn (cm, c, e))) =
 12.1861 -    (if ((cm : IntInf.int) = (0 : IntInf.int))
 12.1862 -      then (fn k =>
 12.1863 -             Lt (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 12.1864 -      else (fn _ => Lt (Cn (suc (minus_nat cm (1 : IntInf.int)), c, e))))
 12.1865 -  | a_beta (Le (Cn (dm, c, e))) =
 12.1866 -    (if ((dm : IntInf.int) = (0 : IntInf.int))
 12.1867 -      then (fn k =>
 12.1868 -             Le (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 12.1869 -      else (fn _ => Le (Cn (suc (minus_nat dm (1 : IntInf.int)), c, e))))
 12.1870 -  | a_beta (Gt (Cn (em, c, e))) =
 12.1871 -    (if ((em : IntInf.int) = (0 : IntInf.int))
 12.1872 -      then (fn k =>
 12.1873 -             Gt (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 12.1874 -      else (fn _ => Gt (Cn (suc (minus_nat em (1 : IntInf.int)), c, e))))
 12.1875 -  | a_beta (Ge (Cn (fm, c, e))) =
 12.1876 -    (if ((fm : IntInf.int) = (0 : IntInf.int))
 12.1877 -      then (fn k =>
 12.1878 -             Ge (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 12.1879 -      else (fn _ => Ge (Cn (suc (minus_nat fm (1 : IntInf.int)), c, e))))
 12.1880 -  | a_beta (Eq (Cn (gm, c, e))) =
 12.1881 -    (if ((gm : IntInf.int) = (0 : IntInf.int))
 12.1882 -      then (fn k =>
 12.1883 -             Eq (Cn ((0 : IntInf.int), (1 : IntInf.int), Mul (div_int k c, e))))
 12.1884 -      else (fn _ => Eq (Cn (suc (minus_nat gm (1 : IntInf.int)), c, e))))
 12.1885 -  | a_beta (NEq (Cn (hm, c, e))) =
 12.1886 -    (if ((hm : IntInf.int) = (0 : IntInf.int))
 12.1887 -      then (fn k =>
 12.1888 -             NEq (Cn ((0 : IntInf.int), (1 : IntInf.int),
 12.1889 -                       Mul (div_int k c, e))))
 12.1890 -      else (fn _ => NEq (Cn (suc (minus_nat hm (1 : IntInf.int)), c, e))))
 12.1891 -  | a_beta (Dvd (i, Cn (im, c, e))) =
 12.1892 -    (if ((im : IntInf.int) = (0 : IntInf.int))
 12.1893 -      then (fn k =>
 12.1894 -             Dvd (IntInf.* (div_int k c, i),
 12.1895 -                   Cn ((0 : IntInf.int), (1 : IntInf.int),
 12.1896 -                        Mul (div_int k c, e))))
 12.1897 -      else (fn _ => Dvd (i, Cn (suc (minus_nat im (1 : IntInf.int)), c, e))))
 12.1898 -  | a_beta (NDvd (i, Cn (jm, c, e))) =
 12.1899 -    (if ((jm : IntInf.int) = (0 : IntInf.int))
 12.1900 -      then (fn k =>
 12.1901 -             NDvd (IntInf.* (div_int k c, i),
 12.1902 -                    Cn ((0 : IntInf.int), (1 : IntInf.int),
 12.1903 -                         Mul (div_int k c, e))))
 12.1904 -      else (fn _ => NDvd (i, Cn (suc (minus_nat jm (1 : IntInf.int)), c, e))));
 12.1905 -
 12.1906 -fun zeta (And (p, q)) = lcm_int (zeta p) (zeta q)
 12.1907 -  | zeta (Or (p, q)) = lcm_int (zeta p) (zeta q)
 12.1908 -  | zeta T = (1 : IntInf.int)
 12.1909 -  | zeta F = (1 : IntInf.int)
 12.1910 -  | zeta (Lt (C bo)) = (1 : IntInf.int)
 12.1911 -  | zeta (Lt (Bound bp)) = (1 : IntInf.int)
 12.1912 -  | zeta (Lt (Neg bt)) = (1 : IntInf.int)
 12.1913 -  | zeta (Lt (Add (bu, bv))) = (1 : IntInf.int)
 12.1914 -  | zeta (Lt (Sub (bw, bx))) = (1 : IntInf.int)
 12.1915 -  | zeta (Lt (Mul (by, bz))) = (1 : IntInf.int)
 12.1916 -  | zeta (Le (C co)) = (1 : IntInf.int)
 12.1917 -  | zeta (Le (Bound cp)) = (1 : IntInf.int)
 12.1918 -  | zeta (Le (Neg ct)) = (1 : IntInf.int)
 12.1919 -  | zeta (Le (Add (cu, cv))) = (1 : IntInf.int)
 12.1920 -  | zeta (Le (Sub (cw, cx))) = (1 : IntInf.int)
 12.1921 -  | zeta (Le (Mul (cy, cz))) = (1 : IntInf.int)
 12.1922 -  | zeta (Gt (C doa)) = (1 : IntInf.int)
 12.1923 -  | zeta (Gt (Bound dp)) = (1 : IntInf.int)
 12.1924 -  | zeta (Gt (Neg dt)) = (1 : IntInf.int)
 12.1925 -  | zeta (Gt (Add (du, dv))) = (1 : IntInf.int)
 12.1926 -  | zeta (Gt (Sub (dw, dx))) = (1 : IntInf.int)
 12.1927 -  | zeta (Gt (Mul (dy, dz))) = (1 : IntInf.int)
 12.1928 -  | zeta (Ge (C eo)) = (1 : IntInf.int)
 12.1929 -  | zeta (Ge (Bound ep)) = (1 : IntInf.int)
 12.1930 -  | zeta (Ge (Neg et)) = (1 : IntInf.int)
 12.1931 -  | zeta (Ge (Add (eu, ev))) = (1 : IntInf.int)
 12.1932 -  | zeta (Ge (Sub (ew, ex))) = (1 : IntInf.int)
 12.1933 -  | zeta (Ge (Mul (ey, ez))) = (1 : IntInf.int)
 12.1934 -  | zeta (Eq (C fo)) = (1 : IntInf.int)
 12.1935 -  | zeta (Eq (Bound fp)) = (1 : IntInf.int)
 12.1936 -  | zeta (Eq (Neg ft)) = (1 : IntInf.int)
 12.1937 -  | zeta (Eq (Add (fu, fv))) = (1 : IntInf.int)
 12.1938 -  | zeta (Eq (Sub (fw, fx))) = (1 : IntInf.int)
 12.1939 -  | zeta (Eq (Mul (fy, fz))) = (1 : IntInf.int)
 12.1940 -  | zeta (NEq (C go)) = (1 : IntInf.int)
 12.1941 -  | zeta (NEq (Bound gp)) = (1 : IntInf.int)
 12.1942 -  | zeta (NEq (Neg gt)) = (1 : IntInf.int)
 12.1943 -  | zeta (NEq (Add (gu, gv))) = (1 : IntInf.int)
 12.1944 -  | zeta (NEq (Sub (gw, gx))) = (1 : IntInf.int)
 12.1945 -  | zeta (NEq (Mul (gy, gz))) = (1 : IntInf.int)
 12.1946 -  | zeta (Dvd (aa, C ho)) = (1 : IntInf.int)
 12.1947 -  | zeta (Dvd (aa, Bound hp)) = (1 : IntInf.int)
 12.1948 -  | zeta (Dvd (aa, Neg ht)) = (1 : IntInf.int)
 12.1949 -  | zeta (Dvd (aa, Add (hu, hv))) = (1 : IntInf.int)
 12.1950 -  | zeta (Dvd (aa, Sub (hw, hx))) = (1 : IntInf.int)
 12.1951 -  | zeta (Dvd (aa, Mul (hy, hz))) = (1 : IntInf.int)
 12.1952 -  | zeta (NDvd (ac, C io)) = (1 : IntInf.int)
 12.1953 -  | zeta (NDvd (ac, Bound ip)) = (1 : IntInf.int)
 12.1954 -  | zeta (NDvd (ac, Neg it)) = (1 : IntInf.int)
 12.1955 -  | zeta (NDvd (ac, Add (iu, iv))) = (1 : IntInf.int)
 12.1956 -  | zeta (NDvd (ac, Sub (iw, ix))) = (1 : IntInf.int)
 12.1957 -  | zeta (NDvd (ac, Mul (iy, iz))) = (1 : IntInf.int)
 12.1958 -  | zeta (Not ae) = (1 : IntInf.int)
 12.1959 -  | zeta (Imp (aj, ak)) = (1 : IntInf.int)
 12.1960 -  | zeta (Iff (al, am)) = (1 : IntInf.int)
 12.1961 -  | zeta (E an) = (1 : IntInf.int)
 12.1962 -  | zeta (A ao) = (1 : IntInf.int)
 12.1963 -  | zeta (Closed ap) = (1 : IntInf.int)
 12.1964 -  | zeta (NClosed aq) = (1 : IntInf.int)
 12.1965 -  | zeta (Lt (Cn (cm, c, e))) =
 12.1966 -    (if ((cm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1967 -  | zeta (Le (Cn (dm, c, e))) =
 12.1968 -    (if ((dm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1969 -  | zeta (Gt (Cn (em, c, e))) =
 12.1970 -    (if ((em : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1971 -  | zeta (Ge (Cn (fm, c, e))) =
 12.1972 -    (if ((fm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1973 -  | zeta (Eq (Cn (gm, c, e))) =
 12.1974 -    (if ((gm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1975 -  | zeta (NEq (Cn (hm, c, e))) =
 12.1976 -    (if ((hm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1977 -  | zeta (Dvd (i, Cn (im, c, e))) =
 12.1978 -    (if ((im : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int))
 12.1979 -  | zeta (NDvd (i, Cn (jm, c, e))) =
 12.1980 -    (if ((jm : IntInf.int) = (0 : IntInf.int)) then c else (1 : IntInf.int));
 12.1981 -
 12.1982 -fun zsplit0 (C c) = ((0 : IntInf.int), C c)
 12.1983 -  | zsplit0 (Bound n) =
 12.1984 -    (if ((n : IntInf.int) = (0 : IntInf.int))
 12.1985 -      then ((1 : IntInf.int), C (0 : IntInf.int))
 12.1986 -      else ((0 : IntInf.int), Bound n))
 12.1987 -  | zsplit0 (Cn (n, i, a)) =
 12.1988 -    let
 12.1989 -      val (ia, aa) = zsplit0 a;
 12.1990 -    in
 12.1991 -      (if ((n : IntInf.int) = (0 : IntInf.int)) then (IntInf.+ (i, ia), aa)
 12.1992 -        else (ia, Cn (n, i, aa)))
 12.1993 -    end
 12.1994 -  | zsplit0 (Neg a) =
 12.1995 -    let
 12.1996 -      val (i, aa) = zsplit0 a;
 12.1997 -    in
 12.1998 -      (IntInf.~ i, Neg aa)
 12.1999 -    end
 12.2000 -  | zsplit0 (Add (a, b)) =
 12.2001 -    let
 12.2002 -      val (ia, aa) = zsplit0 a;
 12.2003 -      val (ib, ba) = zsplit0 b;
 12.2004 -    in
 12.2005 -      (IntInf.+ (ia, ib), Add (aa, ba))
 12.2006 -    end
 12.2007 -  | zsplit0 (Sub (a, b)) =
 12.2008 -    let
 12.2009 -      val (ia, aa) = zsplit0 a;
 12.2010 -      val (ib, ba) = zsplit0 b;
 12.2011 -    in
 12.2012 -      (IntInf.- (ia, ib), Sub (aa, ba))
 12.2013 -    end
 12.2014 -  | zsplit0 (Mul (i, a)) =
 12.2015 -    let
 12.2016 -      val (ia, aa) = zsplit0 a;
 12.2017 -    in
 12.2018 -      (IntInf.* (i, ia), Mul (i, aa))
 12.2019 -    end;
 12.2020 -
 12.2021 -fun zlfm (And (p, q)) = And (zlfm p, zlfm q)
 12.2022 -  | zlfm (Or (p, q)) = Or (zlfm p, zlfm q)
 12.2023 -  | zlfm (Imp (p, q)) = Or (zlfm (Not p), zlfm q)
 12.2024 -  | zlfm (Iff (p, q)) =
 12.2025 -    Or (And (zlfm p, zlfm q), And (zlfm (Not p), zlfm (Not q)))
 12.2026 -  | zlfm (Lt a) =
 12.2027 -    let
 12.2028 -      val (c, r) = zsplit0 a;
 12.2029 -    in
 12.2030 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then Lt r
 12.2031 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2032 -               then Lt (Cn ((0 : IntInf.int), c, r))
 12.2033 -               else Gt (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2034 -    end
 12.2035 -  | zlfm (Le a) =
 12.2036 -    let
 12.2037 -      val (c, r) = zsplit0 a;
 12.2038 -    in
 12.2039 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then Le r
 12.2040 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2041 -               then Le (Cn ((0 : IntInf.int), c, r))
 12.2042 -               else Ge (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2043 -    end
 12.2044 -  | zlfm (Gt a) =
 12.2045 -    let
 12.2046 -      val (c, r) = zsplit0 a;
 12.2047 -    in
 12.2048 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then Gt r
 12.2049 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2050 -               then Gt (Cn ((0 : IntInf.int), c, r))
 12.2051 -               else Lt (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2052 -    end
 12.2053 -  | zlfm (Ge a) =
 12.2054 -    let
 12.2055 -      val (c, r) = zsplit0 a;
 12.2056 -    in
 12.2057 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then Ge r
 12.2058 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2059 -               then Ge (Cn ((0 : IntInf.int), c, r))
 12.2060 -               else Le (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2061 -    end
 12.2062 -  | zlfm (Eq a) =
 12.2063 -    let
 12.2064 -      val (c, r) = zsplit0 a;
 12.2065 -    in
 12.2066 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then Eq r
 12.2067 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2068 -               then Eq (Cn ((0 : IntInf.int), c, r))
 12.2069 -               else Eq (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2070 -    end
 12.2071 -  | zlfm (NEq a) =
 12.2072 -    let
 12.2073 -      val (c, r) = zsplit0 a;
 12.2074 -    in
 12.2075 -      (if ((c : IntInf.int) = (0 : IntInf.int)) then NEq r
 12.2076 -        else (if IntInf.< ((0 : IntInf.int), c)
 12.2077 -               then NEq (Cn ((0 : IntInf.int), c, r))
 12.2078 -               else NEq (Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2079 -    end
 12.2080 -  | zlfm (Dvd (i, a)) =
 12.2081 -    (if ((i : IntInf.int) = (0 : IntInf.int)) then zlfm (Eq a)
 12.2082 -      else let
 12.2083 -             val (c, r) = zsplit0 a;
 12.2084 -           in
 12.2085 -             (if ((c : IntInf.int) = (0 : IntInf.int)) then Dvd (abs_int i, r)
 12.2086 -               else (if IntInf.< ((0 : IntInf.int), c)
 12.2087 -                      then Dvd (abs_int i, Cn ((0 : IntInf.int), c, r))
 12.2088 -                      else Dvd (abs_int i,
 12.2089 -                                 Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2090 -           end)
 12.2091 -  | zlfm (NDvd (i, a)) =
 12.2092 -    (if ((i : IntInf.int) = (0 : IntInf.int)) then zlfm (NEq a)
 12.2093 -      else let
 12.2094 -             val (c, r) = zsplit0 a;
 12.2095 -           in
 12.2096 -             (if ((c : IntInf.int) = (0 : IntInf.int)) then NDvd (abs_int i, r)
 12.2097 -               else (if IntInf.< ((0 : IntInf.int), c)
 12.2098 -                      then NDvd (abs_int i, Cn ((0 : IntInf.int), c, r))
 12.2099 -                      else NDvd (abs_int i,
 12.2100 -                                  Cn ((0 : IntInf.int), IntInf.~ c, Neg r))))
 12.2101 -           end)
 12.2102 -  | zlfm (Not (And (p, q))) = Or (zlfm (Not p), zlfm (Not q))
 12.2103 -  | zlfm (Not (Or (p, q))) = And (zlfm (Not p), zlfm (Not q))
 12.2104 -  | zlfm (Not (Imp (p, q))) = And (zlfm p, zlfm (Not q))
 12.2105 -  | zlfm (Not (Iff (p, q))) =
 12.2106 -    Or (And (zlfm p, zlfm (Not q)), And (zlfm (Not p), zlfm q))
 12.2107 -  | zlfm (Not (Not p)) = zlfm p
 12.2108 -  | zlfm (Not T) = F
 12.2109 -  | zlfm (Not F) = T
 12.2110 -  | zlfm (Not (Lt a)) = zlfm (Ge a)
 12.2111 -  | zlfm (Not (Le a)) = zlfm (Gt a)
 12.2112 -  | zlfm (Not (Gt a)) = zlfm (Le a)
 12.2113 -  | zlfm (Not (Ge a)) = zlfm (Lt a)
 12.2114 -  | zlfm (Not (Eq a)) = zlfm (NEq a)
 12.2115 -  | zlfm (Not (NEq a)) = zlfm (Eq a)
 12.2116 -  | zlfm (Not (Dvd (i, a))) = zlfm (NDvd (i, a))
 12.2117 -  | zlfm (Not (NDvd (i, a))) = zlfm (Dvd (i, a))
 12.2118 -  | zlfm (Not (Closed p)) = NClosed p
 12.2119 -  | zlfm (Not (NClosed p)) = Closed p
 12.2120 -  | zlfm T = T
 12.2121 -  | zlfm F = F
 12.2122 -  | zlfm (Not (E ci)) = Not (E ci)
 12.2123 -  | zlfm (Not (A cj)) = Not (A cj)
 12.2124 -  | zlfm (E ao) = E ao
 12.2125 -  | zlfm (A ap) = A ap
 12.2126 -  | zlfm (Closed aq) = Closed aq
 12.2127 -  | zlfm (NClosed ar) = NClosed ar;
 12.2128 -
 12.2129 -fun unita p =
 12.2130 -  let
 12.2131 -    val pa = zlfm p;
 12.2132 -    val l = zeta pa;
 12.2133 -    val q =
 12.2134 -      And (Dvd (l, Cn ((0 : IntInf.int), (1 : IntInf.int), C (0 : IntInf.int))),
 12.2135 -            a_beta pa l);
 12.2136 -    val d = delta q;
 12.2137 -    val b = remdups eq_numa (map simpnum (beta q));
 12.2138 -    val a = remdups eq_numa (map simpnum (alpha q));
 12.2139 -  in
 12.2140 -    (if IntInf.<= (size_list b, size_list a) then (q, (b, d))
 12.2141 -      else (mirror q, (a, d)))
 12.2142 -  end;
 12.2143 -
 12.2144 -fun cooper p =
 12.2145 -  let
 12.2146 -    val (q, (b, d)) = unita p;
 12.2147 -    val js = iupt (1 : IntInf.int) d;
 12.2148 -    val mq = simpfm (minusinf q);
 12.2149 -    val md = evaldjf (fn j => simpfm (subst0 (C j) mq)) js;
 12.2150 -  in
 12.2151 -    (if eq_fm md T then T
 12.2152 -      else let
 12.2153 -             val qd =
 12.2154 -               evaldjf (fn (ba, j) => simpfm (subst0 (Add (ba, C j)) q))
 12.2155 -                 (concat_map (fn ba => map (fn a => (ba, a)) js) b);
 12.2156 -           in
 12.2157 -             decr (disj md qd)
 12.2158 -           end)
 12.2159 -  end;
 12.2160 -
 12.2161 -fun prep (E T) = T
 12.2162 -  | prep (E F) = F
 12.2163 -  | prep (E (Or (p, q))) = Or (prep (E p), prep (E q))
 12.2164 -  | prep (E (Imp (p, q))) = Or (prep (E (Not p)), prep (E q))
 12.2165 -  | prep (E (Iff (p, q))) =
 12.2166 -    Or (prep (E (And (p, q))), prep (E (And (Not p, Not q))))
 12.2167 -  | prep (E (Not (And (p, q)))) = Or (prep (E (Not p)), prep (E (Not q)))
 12.2168 -  | prep (E (Not (Imp (p, q)))) = prep (E (And (p, Not q)))
 12.2169 -  | prep (E (Not (Iff (p, q)))) =
 12.2170 -    Or (prep (E (And (p, Not q))), prep (E (And (Not p, q))))
 12.2171 -  | prep (E (Lt ef)) = E (prep (Lt ef))
 12.2172 -  | prep (E (Le eg)) = E (prep (Le eg))
 12.2173 -  | prep (E (Gt eh)) = E (prep (Gt eh))
 12.2174 -  | prep (E (Ge ei)) = E (prep (Ge ei))
 12.2175 -  | prep (E (Eq ej)) = E (prep (Eq ej))
 12.2176 -  | prep (E (NEq ek)) = E (prep (NEq ek))
 12.2177 -  | prep (E (Dvd (el, em))) = E (prep (Dvd (el, em)))
 12.2178 -  | prep (E (NDvd (en, eo))) = E (prep (NDvd (en, eo)))
 12.2179 -  | prep (E (Not T)) = E (prep (Not T))
 12.2180 -  | prep (E (Not F)) = E (prep (Not F))
 12.2181 -  | prep (E (Not (Lt gw))) = E (prep (Not (Lt gw)))
 12.2182 -  | prep (E (Not (Le gx))) = E (prep (Not (Le gx)))
 12.2183 -  | prep (E (Not (Gt gy))) = E (prep (Not (Gt gy)))
 12.2184 -  | prep (E (Not (Ge gz))) = E (prep (Not (Ge gz)))
 12.2185 -  | prep (E (Not (Eq ha))) = E (prep (Not (Eq ha)))
 12.2186 -  | prep (E (Not (NEq hb))) = E (prep (Not (NEq hb)))
 12.2187 -  | prep (E (Not (Dvd (hc, hd)))) = E (prep (Not (Dvd (hc, hd))))
 12.2188 -  | prep (E (Not (NDvd (he, hf)))) = E (prep (Not (NDvd (he, hf))))
 12.2189 -  | prep (E (Not (Not hg))) = E (prep (Not (Not hg)))
 12.2190 -  | prep (E (Not (Or (hj, hk)))) = E (prep (Not (Or (hj, hk))))
 12.2191 -  | prep (E (Not (E hp))) = E (prep (Not (E hp)))
 12.2192 -  | prep (E (Not (A hq))) = E (prep (Not (A hq)))
 12.2193 -  | prep (E (Not (Closed hr))) = E (prep (Not (Closed hr)))
 12.2194 -  | prep (E (Not (NClosed hs))) = E (prep (Not (NClosed hs)))
 12.2195 -  | prep (E (And (eq, er))) = E (prep (And (eq, er)))
 12.2196 -  | prep (E (E ey)) = E (prep (E ey))
 12.2197 -  | prep (E (A ez)) = E (prep (A ez))
 12.2198 -  | prep (E (Closed fa)) = E (prep (Closed fa))
 12.2199 -  | prep (E (NClosed fb)) = E (prep (NClosed fb))
 12.2200 -  | prep (A (And (p, q))) = And (prep (A p), prep (A q))
 12.2201 -  | prep (A T) = prep (Not (E (Not T)))
 12.2202 -  | prep (A F) = prep (Not (E (Not F)))
 12.2203 -  | prep (A (Lt jn)) = prep (Not (E (Not (Lt jn))))
 12.2204 -  | prep (A (Le jo)) = prep (Not (E (Not (Le jo))))
 12.2205 -  | prep (A (Gt jp)) = prep (Not (E (Not (Gt jp))))
 12.2206 -  | prep (A (Ge jq)) = prep (Not (E (Not (Ge jq))))
 12.2207 -  | prep (A (Eq jr)) = prep (Not (E (Not (Eq jr))))
 12.2208 -  | prep (A (NEq js)) = prep (Not (E (Not (NEq js))))
 12.2209 -  | prep (A (Dvd (jt, ju))) = prep (Not (E (Not (Dvd (jt, ju)))))
 12.2210 -  | prep (A (NDvd (jv, jw))) = prep (Not (E (Not (NDvd (jv, jw)))))
 12.2211 -  | prep (A (Not jx)) = prep (Not (E (Not (Not jx))))
 12.2212 -  | prep (A (Or (ka, kb))) = prep (Not (E (Not (Or (ka, kb)))))
 12.2213 -  | prep (A (Imp (kc, kd))) = prep (Not (E (Not (Imp (kc, kd)))))
 12.2214 -  | prep (A (Iff (ke, kf))) = prep (Not (E (Not (Iff (ke, kf)))))
 12.2215 -  | prep (A (E kg)) = prep (Not (E (Not (E kg))))
 12.2216 -  | prep (A (A kh)) = prep (Not (E (Not (A kh))))
 12.2217 -  | prep (A (Closed ki)) = prep (Not (E (Not (Closed ki))))
 12.2218 -  | prep (A (NClosed kj)) = prep (Not (E (Not (NClosed kj))))
 12.2219 -  | prep (Not (Not p)) = prep p
 12.2220 -  | prep (Not (And (p, q))) = Or (prep (Not p), prep (Not q))
 12.2221 -  | prep (Not (A p)) = prep (E (Not p))
 12.2222 -  | prep (Not (Or (p, q))) = And (prep (Not p), prep (Not q))
 12.2223 -  | prep (Not (Imp (p, q))) = And (prep p, prep (Not q))
 12.2224 -  | prep (Not (Iff (p, q))) = Or (prep (And (p, Not q)), prep (And (Not p, q)))
 12.2225 -  | prep (Not T) = Not (prep T)
 12.2226 -  | prep (Not F) = Not (prep F)
 12.2227 -  | prep (Not (Lt bo)) = Not (prep (Lt bo))
 12.2228 -  | prep (Not (Le bp)) = Not (prep (Le bp))
 12.2229 -  | prep (Not (Gt bq)) = Not (prep (Gt bq))
 12.2230 -  | prep (Not (Ge br)) = Not (prep (Ge br))
 12.2231 -  | prep (Not (Eq bs)) = Not (prep (Eq bs))
 12.2232 -  | prep (Not (NEq bt)) = Not (prep (NEq bt))
 12.2233 -  | prep (Not (Dvd (bu, bv))) = Not (prep (Dvd (bu, bv)))
 12.2234 -  | prep (Not (NDvd (bw, bx))) = Not (prep (NDvd (bw, bx)))
 12.2235 -  | prep (Not (E ch)) = Not (prep (E ch))
 12.2236 -  | prep (Not (Closed cj)) = Not (prep (Closed cj))
 12.2237 -  | prep (Not (NClosed ck)) = Not (prep (NClosed ck))
 12.2238 -  | prep (Or (p, q)) = Or (prep p, prep q)
 12.2239 -  | prep (And (p, q)) = And (prep p, prep q)
 12.2240 -  | prep (Imp (p, q)) = prep (Or (Not p, q))
 12.2241 -  | prep (Iff (p, q)) = Or (prep (And (p, q)), prep (And (Not p, Not q)))
 12.2242 -  | prep T = T
 12.2243 -  | prep F = F
 12.2244 -  | prep (Lt u) = Lt u
 12.2245 -  | prep (Le v) = Le v
 12.2246 -  | prep (Gt w) = Gt w
 12.2247 -  | prep (Ge x) = Ge x
 12.2248 -  | prep (Eq y) = Eq y
 12.2249 -  | prep (NEq z) = NEq z
 12.2250 -  | prep (Dvd (aa, ab)) = Dvd (aa, ab)
 12.2251 -  | prep (NDvd (ac, ad)) = NDvd (ac, ad)
 12.2252 -  | prep (Closed ap) = Closed ap
 12.2253 -  | prep (NClosed aq) = NClosed aq;
 12.2254 -
 12.2255 -fun qelim (E p) = (fn qe => dj qe (qelim p qe))
 12.2256 -  | qelim (A p) = (fn qe => nota (qe (qelim (Not p) qe)))
 12.2257 -  | qelim (Not p) = (fn qe => nota (qelim p qe))
 12.2258 -  | qelim (And (p, q)) = (fn qe => conj (qelim p qe) (qelim q qe))
 12.2259 -  | qelim (Or (p, q)) = (fn qe => disj (qelim p qe) (qelim q qe))
 12.2260 -  | qelim (Imp (p, q)) = (fn qe => impa (qelim p qe) (qelim q qe))
 12.2261 -  | qelim (Iff (p, q)) = (fn qe => iffa (qelim p qe) (qelim q qe))
 12.2262 -  | qelim T = (fn _ => simpfm T)
 12.2263 -  | qelim F = (fn _ => simpfm F)
 12.2264 -  | qelim (Lt u) = (fn _ => simpfm (Lt u))
 12.2265 -  | qelim (Le v) = (fn _ => simpfm (Le v))
 12.2266 -  | qelim (Gt w) = (fn _ => simpfm (Gt w))
 12.2267 -  | qelim (Ge x) = (fn _ => simpfm (Ge x))
 12.2268 -  | qelim (Eq y) = (fn _ => simpfm (Eq y))
 12.2269 -  | qelim (NEq z) = (fn _ => simpfm (NEq z))
 12.2270 -  | qelim (Dvd (aa, ab)) = (fn _ => simpfm (Dvd (aa, ab)))
 12.2271 -  | qelim (NDvd (ac, ad)) = (fn _ => simpfm (NDvd (ac, ad)))
 12.2272 -  | qelim (Closed ap) = (fn _ => simpfm (Closed ap))
 12.2273 -  | qelim (NClosed aq) = (fn _ => simpfm (NClosed aq));
 12.2274 -
 12.2275 -fun pa p = qelim (prep p) cooper;
 12.2276 -
 12.2277 -end; (*struct Generated_Cooper*)
    13.1 --- a/src/HOL/Tools/Qelim/presburger.ML	Tue May 11 09:10:31 2010 -0700
    13.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.3 @@ -1,185 +0,0 @@
    13.4 -(*  Title:      HOL/Tools/Qelim/presburger.ML
    13.5 -    Author:     Amine Chaieb, TU Muenchen
    13.6 -*)
    13.7 -
    13.8 -signature PRESBURGER =
    13.9 -sig
   13.10 -  val cooper_tac: bool -> thm list -> thm list -> Proof.context -> int -> tactic
   13.11 -end;
   13.12 -
   13.13 -structure Presburger : PRESBURGER = 
   13.14 -struct
   13.15 -
   13.16 -open Conv;
   13.17 -val comp_ss = HOL_ss addsimps @{thms semiring_norm};
   13.18 -
   13.19 -fun strip_objimp ct =
   13.20 -  (case Thm.term_of ct of
   13.21 -    Const ("op -->", _) $ _ $ _ =>
   13.22 -      let val (A, B) = Thm.dest_binop ct
   13.23 -      in A :: strip_objimp B end
   13.24 -  | _ => [ct]);
   13.25 -
   13.26 -fun strip_objall ct = 
   13.27 - case term_of ct of 
   13.28 -  Const ("All", _) $ Abs (xn,xT,p) => 
   13.29 -   let val (a,(v,t')) = (apsnd (Thm.dest_abs (SOME xn)) o Thm.dest_comb) ct
   13.30 -   in apfst (cons (a,v)) (strip_objall t')
   13.31 -   end
   13.32 -| _ => ([],ct);
   13.33 -
   13.34 -local
   13.35 -  val all_maxscope_ss = 
   13.36 -     HOL_basic_ss addsimps map (fn th => th RS sym) @{thms "all_simps"}
   13.37 -in
   13.38 -fun thin_prems_tac P = simp_tac all_maxscope_ss THEN'
   13.39 -  CSUBGOAL (fn (p', i) =>
   13.40 -    let
   13.41 -     val (qvs, p) = strip_objall (Thm.dest_arg p')
   13.42 -     val (ps, c) = split_last (strip_objimp p)
   13.43 -     val qs = filter P ps
   13.44 -     val q = if P c then c else @{cterm "False"}
   13.45 -     val ng = fold_rev (fn (a,v) => fn t => Thm.capply a (Thm.cabs v t)) qvs 
   13.46 -         (fold_rev (fn p => fn q => Thm.capply (Thm.capply @{cterm "op -->"} p) q) qs q)
   13.47 -     val g = Thm.capply (Thm.capply @{cterm "op ==>"} (Thm.capply @{cterm "Trueprop"} ng)) p'
   13.48 -     val ntac = (case qs of [] => q aconvc @{cterm "False"}
   13.49 -                         | _ => false)
   13.50 -    in 
   13.51 -    if ntac then no_tac
   13.52 -      else rtac (Goal.prove_internal [] g (K (blast_tac HOL_cs 1))) i
   13.53 -    end)
   13.54 -end;
   13.55 -
   13.56 -local
   13.57 - fun isnum t = case t of 
   13.58 -   Const(@{const_name Groups.zero},_) => true
   13.59 - | Const(@{const_name Groups.one},_) => true
   13.60 - | @{term "Suc"}$s => isnum s
   13.61 - | @{term "nat"}$s => isnum s
   13.62 - | @{term "int"}$s => isnum s
   13.63 - | Const(@{const_name Groups.uminus},_)$s => isnum s
   13.64 - | Const(@{const_name Groups.plus},_)$l$r => isnum l andalso isnum r
   13.65 - | Const(@{const_name Groups.times},_)$l$r => isnum l andalso isnum r
   13.66 - | Const(@{const_name Groups.minus},_)$l$r => isnum l andalso isnum r
   13.67 - | Const(@{const_name Power.power},_)$l$r => isnum l andalso isnum r
   13.68 - | Const(@{const_name Divides.mod},_)$l$r => isnum l andalso isnum r
   13.69 - | Const(@{const_name Divides.div},_)$l$r => isnum l andalso isnum r
   13.70 - | _ => can HOLogic.dest_number t orelse can HOLogic.dest_nat t
   13.71 -
   13.72 - fun ty cts t = 
   13.73 - if not (member (op =) [HOLogic.intT, HOLogic.natT, HOLogic.boolT] (typ_of (ctyp_of_term t))) then false 
   13.74 -    else case term_of t of 
   13.75 -      c$l$r => if member (op =) [@{term"op *::int => _"}, @{term"op *::nat => _"}] c
   13.76 -               then not (isnum l orelse isnum r)
   13.77 -               else not (member (op aconv) cts c)
   13.78 -    | c$_ => not (member (op aconv) cts c)
   13.79 -    | c => not (member (op aconv) cts c)
   13.80 -
   13.81 - val term_constants =
   13.82 -  let fun h acc t = case t of
   13.83 -    Const _ => insert (op aconv) t acc
   13.84 -  | a$b => h (h acc a) b
   13.85 -  | Abs (_,_,t) => h acc t
   13.86 -  | _ => acc
   13.87 - in h [] end;
   13.88 -in 
   13.89 -fun is_relevant ctxt ct = 
   13.90 - subset (op aconv) (term_constants (term_of ct) , snd (CooperData.get ctxt))
   13.91 - andalso forall (fn Free (_,T) => member (op =) [@{typ int}, @{typ nat}] T) (OldTerm.term_frees (term_of ct))
   13.92 - andalso forall (fn Var (_,T) => member (op =) [@{typ int}, @{typ nat}] T) (OldTerm.term_vars (term_of ct));
   13.93 -
   13.94 -fun int_nat_terms ctxt ct =
   13.95 - let 
   13.96 -  val cts = snd (CooperData.get ctxt)
   13.97 -  fun h acc t = if ty cts t then insert (op aconvc) t acc else
   13.98 -   case (term_of t) of
   13.99 -    _$_ => h (h acc (Thm.dest_arg t)) (Thm.dest_fun t)
  13.100 -  | Abs(_,_,_) => Thm.dest_abs NONE t ||> h acc |> uncurry (remove (op aconvc))
  13.101 -  | _ => acc
  13.102 - in h [] ct end
  13.103 -end;
  13.104 -
  13.105 -fun generalize_tac f = CSUBGOAL (fn (p, i) => PRIMITIVE (fn st =>
  13.106 - let 
  13.107 -   fun all T = Drule.cterm_rule (instantiate' [SOME T] []) @{cpat "all"}
  13.108 -   fun gen x t = Thm.capply (all (ctyp_of_term x)) (Thm.cabs x t)
  13.109 -   val ts = sort (fn (a,b) => Term_Ord.fast_term_ord (term_of a, term_of b)) (f p)
  13.110 -   val p' = fold_rev gen ts p
  13.111 - in implies_intr p' (implies_elim st (fold forall_elim ts (assume p'))) end));
  13.112 -
  13.113 -local
  13.114 -val ss1 = comp_ss
  13.115 -  addsimps @{thms simp_thms} @ [@{thm "nat_number_of_def"}, @{thm "zdvd_int"}] 
  13.116 -      @ map (fn r => r RS sym) 
  13.117 -        [@{thm "int_int_eq"}, @{thm "zle_int"}, @{thm "zless_int"}, @{thm "zadd_int"}, 
  13.118 -         @{thm "zmult_int"}]
  13.119 -    addsplits [@{thm "zdiff_int_split"}]
  13.120 -
  13.121 -val ss2 = HOL_basic_ss
  13.122 -  addsimps [@{thm "nat_0_le"}, @{thm "int_nat_number_of"},
  13.123 -            @{thm "all_nat"}, @{thm "ex_nat"}, @{thm "number_of1"}, 
  13.124 -            @{thm "number_of2"}, @{thm "int_0"}, @{thm "int_1"}, @{thm "Suc_eq_plus1"}]
  13.125 -  addcongs [@{thm "conj_le_cong"}, @{thm "imp_le_cong"}]
  13.126 -val div_mod_ss = HOL_basic_ss addsimps @{thms simp_thms}
  13.127 -  @ map (symmetric o mk_meta_eq) 
  13.128 -    [@{thm "dvd_eq_mod_eq_0"},
  13.129 -     @{thm "mod_add_left_eq"}, @{thm "mod_add_right_eq"}, 
  13.130 -     @{thm "mod_add_eq"}, @{thm "div_add1_eq"}, @{thm "zdiv_zadd1_eq"}]
  13.131 -  @ [@{thm "mod_self"}, @{thm "zmod_self"}, @{thm "mod_by_0"}, 
  13.132 -     @{thm "div_by_0"}, @{thm "DIVISION_BY_ZERO"} RS conjunct1, 
  13.133 -     @{thm "DIVISION_BY_ZERO"} RS conjunct2, @{thm "zdiv_zero"}, @{thm "zmod_zero"}, 
  13.134 -     @{thm "div_0"}, @{thm "mod_0"}, @{thm "div_by_1"}, @{thm "mod_by_1"}, @{thm "div_1"}, 
  13.135 -     @{thm "mod_1"}, @{thm "Suc_eq_plus1"}]
  13.136 -  @ @{thms add_ac}
  13.137 - addsimprocs [cancel_div_mod_nat_proc, cancel_div_mod_int_proc]
  13.138 - val splits_ss = comp_ss addsimps [@{thm "mod_div_equality'"}] addsplits 
  13.139 -     [@{thm "split_zdiv"}, @{thm "split_zmod"}, @{thm "split_div'"}, 
  13.140 -      @{thm "split_min"}, @{thm "split_max"}, @{thm "abs_split"}]
  13.141 -in
  13.142 -fun nat_to_int_tac ctxt = 
  13.143 -  simp_tac (Simplifier.context ctxt ss1) THEN_ALL_NEW
  13.144 -  simp_tac (Simplifier.context ctxt ss2) THEN_ALL_NEW
  13.145 -  simp_tac (Simplifier.context ctxt comp_ss);
  13.146 -
  13.147 -fun div_mod_tac ctxt i = simp_tac (Simplifier.context ctxt div_mod_ss) i;
  13.148 -fun splits_tac ctxt i = simp_tac (Simplifier.context ctxt splits_ss) i;
  13.149 -end;
  13.150 -
  13.151 -
  13.152 -fun core_cooper_tac ctxt = CSUBGOAL (fn (p, i) =>
  13.153 -   let 
  13.154 -    val cpth = 
  13.155 -       if !quick_and_dirty 
  13.156 -       then linzqe_oracle (Thm.cterm_of (ProofContext.theory_of ctxt)
  13.157 -             (Envir.beta_norm (Pattern.eta_long [] (term_of (Thm.dest_arg p)))))
  13.158 -       else arg_conv (Cooper.cooper_conv ctxt) p
  13.159 -    val p' = Thm.rhs_of cpth
  13.160 -    val th = implies_intr p' (equal_elim (symmetric cpth) (assume p'))
  13.161 -   in rtac th i end
  13.162 -   handle Cooper.COOPER _ => no_tac);
  13.163 -
  13.164 -fun finish_tac q = SUBGOAL (fn (_, i) =>
  13.165 -  (if q then I else TRY) (rtac TrueI i));
  13.166 -
  13.167 -fun cooper_tac elim add_ths del_ths ctxt =
  13.168 -let val ss = Simplifier.context ctxt (fst (CooperData.get ctxt)) delsimps del_ths addsimps add_ths
  13.169 -    val aprems = Arith_Data.get_arith_facts ctxt
  13.170 -in
  13.171 -  Method.insert_tac aprems
  13.172 -  THEN_ALL_NEW Object_Logic.full_atomize_tac
  13.173 -  THEN_ALL_NEW CONVERSION Thm.eta_long_conversion
  13.174 -  THEN_ALL_NEW simp_tac ss
  13.175 -  THEN_ALL_NEW (TRY o generalize_tac (int_nat_terms ctxt))
  13.176 -  THEN_ALL_NEW Object_Logic.full_atomize_tac
  13.177 -  THEN_ALL_NEW (thin_prems_tac (is_relevant ctxt))
  13.178 -  THEN_ALL_NEW Object_Logic.full_atomize_tac
  13.179 -  THEN_ALL_NEW div_mod_tac ctxt
  13.180 -  THEN_ALL_NEW splits_tac ctxt
  13.181 -  THEN_ALL_NEW simp_tac ss
  13.182 -  THEN_ALL_NEW CONVERSION Thm.eta_long_conversion
  13.183 -  THEN_ALL_NEW nat_to_int_tac ctxt
  13.184 -  THEN_ALL_NEW (core_cooper_tac ctxt)
  13.185 -  THEN_ALL_NEW finish_tac elim
  13.186 -end;
  13.187 -
  13.188 -end;
    14.1 --- a/src/HOL/ex/Landau.thy	Tue May 11 09:10:31 2010 -0700
    14.2 +++ b/src/HOL/ex/Landau.thy	Tue May 11 11:02:56 2010 -0700
    14.3 @@ -8,8 +8,8 @@
    14.4  begin
    14.5  
    14.6  text {*
    14.7 -  We establish a preorder releation @{text "\<lesssim>"} on functions
    14.8 -  from @{text "\<nat>"} to @{text "\<nat>"} such that @{text "f \<lesssim> g \<longleftrightarrow> f \<in> O(g)"}.
    14.9 +  We establish a preorder releation @{text "\<lesssim>"} on functions from
   14.10 +  @{text "\<nat>"} to @{text "\<nat>"} such that @{text "f \<lesssim> g \<longleftrightarrow> f \<in> O(g)"}.
   14.11  *}
   14.12  
   14.13  subsection {* Auxiliary *}
   14.14 @@ -175,12 +175,12 @@
   14.15  
   14.16  text {*
   14.17    We would like to show (or refute) that @{text "f \<prec> g \<longleftrightarrow> f \<in> o(g)"},
   14.18 -  i.e.~@{prop "f \<prec> g \<longleftrightarrow> (\<forall>c. \<exists>n. \<forall>m>n. f m < Suc c * g m)"} but did not manage to
   14.19 -  do so.
   14.20 +  i.e.~@{prop "f \<prec> g \<longleftrightarrow> (\<forall>c. \<exists>n. \<forall>m>n. f m < Suc c * g m)"} but did not
   14.21 +  manage to do so.
   14.22  *}
   14.23  
   14.24  
   14.25 -subsection {* Assert that @{text "\<lesssim>"} is ineed a preorder *}
   14.26 +subsection {* Assert that @{text "\<lesssim>"} is indeed a preorder *}
   14.27  
   14.28  interpretation fun_order: preorder_equiv less_eq_fun less_fun
   14.29    where "preorder_equiv.equiv less_eq_fun = equiv_fun"
    15.1 --- a/src/Provers/blast.ML	Tue May 11 09:10:31 2010 -0700
    15.2 +++ b/src/Provers/blast.ML	Tue May 11 11:02:56 2010 -0700
    15.3 @@ -1278,7 +1278,7 @@
    15.4  val (depth_limit, setup_depth_limit) = Attrib.config_int_global "blast_depth_limit" (K 20);
    15.5  
    15.6  fun blast_tac cs i st =
    15.7 -    ((DEEPEN (1, Config.get_thy (Thm.theory_of_thm st) depth_limit)
    15.8 +    ((DEEPEN (1, Config.get_global (Thm.theory_of_thm st) depth_limit)
    15.9          (timing_depth_tac (start_timing ()) cs) 0) i
   15.10       THEN flexflex_tac) st
   15.11      handle TRANS s =>
    16.1 --- a/src/Pure/Isar/attrib.ML	Tue May 11 09:10:31 2010 -0700
    16.2 +++ b/src/Pure/Isar/attrib.ML	Tue May 11 11:02:56 2010 -0700
    16.3 @@ -355,7 +355,7 @@
    16.4    | scan_value (Config.String _) = equals |-- Args.name >> Config.String;
    16.5  
    16.6  fun scan_config thy config =
    16.7 -  let val config_type = Config.get_thy thy config
    16.8 +  let val config_type = Config.get_global thy config
    16.9    in scan_value config_type >> (K o Thm.declaration_attribute o K o Config.put_generic config) end;
   16.10  
   16.11  in
    17.1 --- a/src/Pure/System/isabelle_system.scala	Tue May 11 09:10:31 2010 -0700
    17.2 +++ b/src/Pure/System/isabelle_system.scala	Tue May 11 11:02:56 2010 -0700
    17.3 @@ -318,7 +318,7 @@
    17.4  
    17.5    val font_family = "IsabelleText"
    17.6  
    17.7 -  def get_font(bold: Boolean = false, size: Int = 1): Font =
    17.8 +  def get_font(size: Int = 1, bold: Boolean = false): Font =
    17.9      new Font(font_family, if (bold) Font.BOLD else Font.PLAIN, size)
   17.10  
   17.11    def install_fonts()
   17.12 @@ -330,7 +330,7 @@
   17.13          else "$ISABELLE_HOME/lib/fonts/IsabelleText.ttf"
   17.14        Font.createFont(Font.TRUETYPE_FONT, platform_file(name))
   17.15      }
   17.16 -    def check_font() = get_font(false).getFamily == font_family
   17.17 +    def check_font() = get_font().getFamily == font_family
   17.18  
   17.19      if (!check_font()) {
   17.20        val font = create_font(false)
    18.1 --- a/src/Pure/config.ML	Tue May 11 09:10:31 2010 -0700
    18.2 +++ b/src/Pure/config.ML	Tue May 11 11:02:56 2010 -0700
    18.3 @@ -16,9 +16,9 @@
    18.4    val get: Proof.context -> 'a T -> 'a
    18.5    val map: 'a T -> ('a -> 'a) -> Proof.context -> Proof.context
    18.6    val put: 'a T -> 'a -> Proof.context -> Proof.context
    18.7 -  val get_thy: theory -> 'a T -> 'a
    18.8 -  val map_thy: 'a T -> ('a -> 'a) -> theory -> theory
    18.9 -  val put_thy: 'a T -> 'a -> theory -> theory
   18.10 +  val get_global: theory -> 'a T -> 'a
   18.11 +  val map_global: 'a T -> ('a -> 'a) -> theory -> theory
   18.12 +  val put_global: 'a T -> 'a -> theory -> theory
   18.13    val get_generic: Context.generic -> 'a T -> 'a
   18.14    val map_generic: 'a T -> ('a -> 'a) -> Context.generic -> Context.generic
   18.15    val put_generic: 'a T -> 'a -> Context.generic -> Context.generic
   18.16 @@ -83,9 +83,9 @@
   18.17  fun map_ctxt config f = Context.proof_map (map_generic config f);
   18.18  fun put_ctxt config value = map_ctxt config (K value);
   18.19  
   18.20 -fun get_thy thy = get_generic (Context.Theory thy);
   18.21 -fun map_thy config f = Context.theory_map (map_generic config f);
   18.22 -fun put_thy config value = map_thy config (K value);
   18.23 +fun get_global thy = get_generic (Context.Theory thy);
   18.24 +fun map_global config f = Context.theory_map (map_generic config f);
   18.25 +fun put_global config value = map_global config (K value);
   18.26  
   18.27  
   18.28  (* context information *)
    19.1 --- a/src/Pure/library.scala	Tue May 11 09:10:31 2010 -0700
    19.2 +++ b/src/Pure/library.scala	Tue May 11 11:02:56 2010 -0700
    19.3 @@ -76,9 +76,11 @@
    19.4    private def simple_dialog(kind: Int, default_title: String)
    19.5      (parent: Component, title: String, message: Any*)
    19.6    {
    19.7 -    JOptionPane.showMessageDialog(parent,
    19.8 -      message.toArray.asInstanceOf[Array[AnyRef]],
    19.9 -      if (title == null) default_title else title, kind)
   19.10 +    Swing_Thread.now {
   19.11 +      JOptionPane.showMessageDialog(parent,
   19.12 +        message.toArray.asInstanceOf[Array[AnyRef]],
   19.13 +        if (title == null) default_title else title, kind)
   19.14 +    }
   19.15    }
   19.16  
   19.17    def dialog = simple_dialog(JOptionPane.PLAIN_MESSAGE, null) _
    20.1 --- a/src/Pure/unify.ML	Tue May 11 09:10:31 2010 -0700
    20.2 +++ b/src/Pure/unify.ML	Tue May 11 11:02:56 2010 -0700
    20.3 @@ -349,7 +349,7 @@
    20.4  fun matchcopy thy vname = let fun mc(rbinder, targs, u, ed as (env,dpairs))
    20.5    : (term * (Envir.env * dpair list))Seq.seq =
    20.6  let
    20.7 -  val trace_tps = Config.get_thy thy trace_types;
    20.8 +  val trace_tps = Config.get_global thy trace_types;
    20.9    (*Produce copies of uarg and cons them in front of uargs*)
   20.10    fun copycons uarg (uargs, (env, dpairs)) =
   20.11    Seq.map(fn (uarg', ed') => (uarg'::uargs, ed'))
   20.12 @@ -584,9 +584,9 @@
   20.13  fun hounifiers (thy,env, tus : (term*term)list)
   20.14    : (Envir.env * (term*term)list)Seq.seq =
   20.15    let
   20.16 -    val trace_bnd = Config.get_thy thy trace_bound;
   20.17 -    val search_bnd = Config.get_thy thy search_bound;
   20.18 -    val trace_smp = Config.get_thy thy trace_simp;
   20.19 +    val trace_bnd = Config.get_global thy trace_bound;
   20.20 +    val search_bnd = Config.get_global thy search_bound;
   20.21 +    val trace_smp = Config.get_global thy trace_simp;
   20.22      fun add_unify tdepth ((env,dpairs), reseq) =
   20.23      Seq.make (fn()=>
   20.24      let val (env',flexflex,flexrigid) =
    21.1 --- a/src/Tools/jEdit/README_BUILD	Tue May 11 09:10:31 2010 -0700
    21.2 +++ b/src/Tools/jEdit/README_BUILD	Tue May 11 11:02:56 2010 -0700
    21.3 @@ -8,10 +8,10 @@
    21.4  * Netbeans 6.8
    21.5    http://www.netbeans.org/downloads/index.html
    21.6  
    21.7 -* Scala for Netbeans: version 6.8v1.1
    21.8 -  http://sourceforge.net/project/showfiles.php?group_id=192439&package_id=256544
    21.9 +* Scala for Netbeans: version 6.8v1.1.0rc2
   21.10 +  http://wiki.netbeans.org/Scala
   21.11 +  http://sourceforge.net/projects/erlybird/files/nb-scala/6.8v1.1.0rc2
   21.12    http://blogtrader.net/dcaoyuan/category/NetBeans
   21.13 -  http://wiki.netbeans.org/Scala
   21.14  
   21.15  * jEdit 4.3.1 or 4.3.2
   21.16    http://www.jedit.org/
    22.1 --- a/src/Tools/jEdit/dist-template/properties/jedit.props	Tue May 11 09:10:31 2010 -0700
    22.2 +++ b/src/Tools/jEdit/dist-template/properties/jedit.props	Tue May 11 11:02:56 2010 -0700
    22.3 @@ -185,6 +185,7 @@
    22.4  sidekick.complete-delay=300
    22.5  sidekick.splitter.location=721
    22.6  tip.show=false
    22.7 +twoStageSave=false
    22.8  view.antiAlias=standard
    22.9  view.blockCaret=true
   22.10  view.caretBlink=false
    23.1 --- a/src/Tools/jEdit/nbproject/build-impl.xml	Tue May 11 09:10:31 2010 -0700
    23.2 +++ b/src/Tools/jEdit/nbproject/build-impl.xml	Tue May 11 11:02:56 2010 -0700
    23.3 @@ -230,7 +230,7 @@
    23.4              <attribute default="" name="sourcepath"/>
    23.5              <element name="customize" optional="true"/>
    23.6              <sequential>
    23.7 -                <scalac addparams="-make:transitive -dependencyfile ${basedir}/${build.dir}/.scala_dependencies @{addparams}" deprecation="${scalac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" extdirs="@{extdirs}" force="yes" fork="true" includes="@{includes}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="jvm-${javac.target}" unchecked="${scalac.unchecked}">
    23.8 +                <scalac addparams="-make:transitive -dependencyfile &quot;${basedir}/${build.dir}/.scala_dependencies&quot; @{addparams}" deprecation="${scalac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" extdirs="@{extdirs}" force="yes" fork="true" includes="@{includes}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="jvm-${javac.target}" unchecked="${scalac.unchecked}">
    23.9                      <classpath>
   23.10                          <path>
   23.11                              <pathelement path="@{classpath}"/>
   23.12 @@ -549,7 +549,7 @@
   23.13              -->
   23.14      <target depends="init" name="-javadoc-build">
   23.15          <mkdir dir="${dist.javadoc.dir}"/>
   23.16 -        <scaladoc addparams="${javadoc.additionalparam}" deprecation="yes" destdir="${dist.javadoc.dir}" doctitle="${javadoc.windowtitle}" encoding="${javadoc.encoding.used}" srcdir="${src.dir}" unchecked="yes" windowtitle="${javadoc.windowtitle}">
   23.17 +        <scaladoc addparams="${javadoc.additionalparam}" deprecation="yes" destdir="${dist.javadoc.dir}" doctitle="${javadoc.windowtitle}" encoding="${javadoc.encoding.used}" srcdir="${src.dir}" unchecked="yes">
   23.18              <classpath>
   23.19                  <path path="${javac.classpath}"/>
   23.20                  <fileset dir="${scala.lib}">
    24.1 --- a/src/Tools/jEdit/nbproject/genfiles.properties	Tue May 11 09:10:31 2010 -0700
    24.2 +++ b/src/Tools/jEdit/nbproject/genfiles.properties	Tue May 11 11:02:56 2010 -0700
    24.3 @@ -4,5 +4,5 @@
    24.4  # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
    24.5  # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
    24.6  nbproject/build-impl.xml.data.CRC32=8f41dcce
    24.7 -nbproject/build-impl.xml.script.CRC32=1c29c971
    24.8 -nbproject/build-impl.xml.stylesheet.CRC32=8c3c03dd@1.3.4
    24.9 +nbproject/build-impl.xml.script.CRC32=e3e2a5d5
   24.10 +nbproject/build-impl.xml.stylesheet.CRC32=5220179f@1.3.5
    25.1 --- a/src/Tools/jEdit/plugin/Isabelle.props	Tue May 11 09:10:31 2010 -0700
    25.2 +++ b/src/Tools/jEdit/plugin/Isabelle.props	Tue May 11 11:02:56 2010 -0700
    25.3 @@ -25,8 +25,10 @@
    25.4  options.isabelle.label=Isabelle
    25.5  options.isabelle.code=new isabelle.jedit.Isabelle_Options();
    25.6  options.isabelle.logic.title=Logic
    25.7 -options.isabelle.font-size.title=Font Size
    25.8 -options.isabelle.font-size=14
    25.9 +options.isabelle.relative-font-size.title=Relative Font Size
   25.10 +options.isabelle.relative-font-size=100
   25.11 +options.isabelle.relative-margin.title=Relative Margin
   25.12 +options.isabelle.relative-margin=90
   25.13  options.isabelle.startup-timeout=10000
   25.14  
   25.15  #menu actions
    26.1 --- a/src/Tools/jEdit/src/jedit/html_panel.scala	Tue May 11 09:10:31 2010 -0700
    26.2 +++ b/src/Tools/jEdit/src/jedit/html_panel.scala	Tue May 11 11:02:56 2010 -0700
    26.3 @@ -10,7 +10,7 @@
    26.4  import isabelle._
    26.5  
    26.6  import java.io.StringReader
    26.7 -import java.awt.{BorderLayout, Dimension}
    26.8 +import java.awt.{BorderLayout, Dimension, GraphicsEnvironment, Toolkit}
    26.9  import java.awt.event.MouseEvent
   26.10  
   26.11  import javax.swing.{JButton, JPanel, JScrollPane}
   26.12 @@ -40,7 +40,7 @@
   26.13  
   26.14  class HTML_Panel(
   26.15    sys: Isabelle_System,
   26.16 -  initial_font_size: Int,
   26.17 +  font_size0: Int, relative_margin0: Int,
   26.18    handler: PartialFunction[HTML_Panel.Event, Unit]) extends HtmlPanel
   26.19  {
   26.20    // global logging
   26.21 @@ -56,6 +56,15 @@
   26.22    }
   26.23  
   26.24    private def template(font_size: Int): String =
   26.25 +  {
   26.26 +    // re-adjustment according to org.lobobrowser.html.style.HtmlValues.getFontSize
   26.27 +    val dpi =
   26.28 +      if (GraphicsEnvironment.isHeadless()) 72
   26.29 +      else Toolkit.getDefaultToolkit().getScreenResolution()
   26.30 +
   26.31 +    val size0 = font_size * dpi / 96
   26.32 +    val size = if (size0 * 96 / dpi == font_size) size0 else size0 + 1
   26.33 +
   26.34      """<?xml version="1.0" encoding="utf-8"?>
   26.35  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   26.36    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   26.37 @@ -65,13 +74,24 @@
   26.38  """ +
   26.39    try_file("$ISABELLE_HOME/lib/html/isabelle.css") + "\n" +
   26.40    try_file("$ISABELLE_HOME_USER/etc/isabelle.css") + "\n" +
   26.41 -  "body { font-family: " + sys.font_family + "; font-size: " + font_size + "px }" +
   26.42 +  "body { font-family: " + sys.font_family + "; font-size: " + size + "px }" +
   26.43  """
   26.44  </style>
   26.45  </head>
   26.46  <body/>
   26.47  </html>
   26.48  """
   26.49 +  }
   26.50 +
   26.51 +
   26.52 +  def panel_width(font_size: Int, relative_margin: Int): Int =
   26.53 +  {
   26.54 +    val font = sys.get_font(font_size)
   26.55 +    Swing_Thread.now {
   26.56 +      val char_width = (getFontMetrics(font).stringWidth("mix") / 3) max 1
   26.57 +      ((getWidth() * relative_margin) / (100 * char_width)) max 20
   26.58 +    }
   26.59 +  }
   26.60  
   26.61  
   26.62    /* actor with local state */
   26.63 @@ -98,7 +118,7 @@
   26.64  
   26.65    private val builder = new DocumentBuilderImpl(ucontext, rcontext)
   26.66  
   26.67 -  private case class Init(font_size: Int)
   26.68 +  private case class Init(font_size: Int, relative_margin: Int)
   26.69    private case class Render(body: List[XML.Tree])
   26.70  
   26.71    private val main_actor = actor {
   26.72 @@ -106,9 +126,15 @@
   26.73      var doc1: org.w3c.dom.Document = null
   26.74      var doc2: org.w3c.dom.Document = null
   26.75  
   26.76 +    var current_font_size = 16
   26.77 +    var current_relative_margin = 90
   26.78 +
   26.79      loop {
   26.80        react {
   26.81 -        case Init(font_size) =>
   26.82 +        case Init(font_size, relative_margin) =>
   26.83 +          current_font_size = font_size
   26.84 +          current_relative_margin = relative_margin
   26.85 +
   26.86            val src = template(font_size)
   26.87            def parse() =
   26.88              builder.parse(new InputSourceImpl(new StringReader(src), "http://localhost"))
   26.89 @@ -118,7 +144,9 @@
   26.90            
   26.91          case Render(body) =>
   26.92            val doc = doc2
   26.93 -          val html_body = Pretty.formatted(body).map(t => XML.elem(HTML.PRE, HTML.spans(t)))
   26.94 +          val html_body =
   26.95 +            Pretty.formatted(body, panel_width(current_font_size, current_relative_margin))
   26.96 +              .map(t => XML.elem(HTML.PRE, HTML.spans(t)))
   26.97            val node = XML.document_node(doc, XML.elem(HTML.BODY, html_body))
   26.98            doc.removeChild(doc.getLastChild())
   26.99            doc.appendChild(node)
  26.100 @@ -131,11 +159,11 @@
  26.101      }
  26.102    }
  26.103  
  26.104 -  main_actor ! Init(initial_font_size)
  26.105 -  
  26.106  
  26.107    /* main method wrappers */
  26.108    
  26.109 -  def init(font_size: Int) { main_actor ! Init(font_size) }
  26.110 +  def init(font_size: Int, relative_margin: Int) { main_actor ! Init(font_size, relative_margin) }
  26.111    def render(body: List[XML.Tree]) { main_actor ! Render(body) }
  26.112 +
  26.113 +  init(font_size0, relative_margin0)
  26.114  }
    27.1 --- a/src/Tools/jEdit/src/jedit/isabelle_options.scala	Tue May 11 09:10:31 2010 -0700
    27.2 +++ b/src/Tools/jEdit/src/jedit/isabelle_options.scala	Tue May 11 11:02:56 2010 -0700
    27.3 @@ -15,7 +15,8 @@
    27.4  class Isabelle_Options extends AbstractOptionPane("isabelle")
    27.5  {
    27.6    private val logic_name = new JComboBox()
    27.7 -  private val font_size = new JSpinner()
    27.8 +  private val relative_font_size = new JSpinner()
    27.9 +  private val relative_margin = new JSpinner()
   27.10  
   27.11    private class List_Item(val name: String, val descr: String) {
   27.12      def this(name: String) = this(name, name)
   27.13 @@ -36,18 +37,26 @@
   27.14        logic_name
   27.15      })
   27.16  
   27.17 -    addComponent(Isabelle.Property("font-size.title"), {
   27.18 -      font_size.setValue(Isabelle.Int_Property("font-size"))
   27.19 -      font_size
   27.20 +    addComponent(Isabelle.Property("relative-font-size.title"), {
   27.21 +      relative_font_size.setValue(Isabelle.Int_Property("relative-font-size"))
   27.22 +      relative_font_size
   27.23 +    })
   27.24 +
   27.25 +    addComponent(Isabelle.Property("relative-margin.title"), {
   27.26 +      relative_margin.setValue(Isabelle.Int_Property("relative-margin"))
   27.27 +      relative_margin
   27.28      })
   27.29    }
   27.30  
   27.31    override def _save()
   27.32    {
   27.33 -    val logic = logic_name.getSelectedItem.asInstanceOf[List_Item].name
   27.34 -    Isabelle.Property("logic") = logic
   27.35 +    Isabelle.Property("logic") =
   27.36 +      logic_name.getSelectedItem.asInstanceOf[List_Item].name
   27.37  
   27.38 -    val size = font_size.getValue().asInstanceOf[Int]
   27.39 -    Isabelle.Int_Property("font-size") = size
   27.40 +    Isabelle.Int_Property("relative-font-size") =
   27.41 +      relative_font_size.getValue().asInstanceOf[Int]
   27.42 +
   27.43 +    Isabelle.Int_Property("relative-margin") =
   27.44 +      relative_margin.getValue().asInstanceOf[Int]
   27.45    }
   27.46  }
    28.1 --- a/src/Tools/jEdit/src/jedit/output_dockable.scala	Tue May 11 09:10:31 2010 -0700
    28.2 +++ b/src/Tools/jEdit/src/jedit/output_dockable.scala	Tue May 11 11:02:56 2010 -0700
    28.3 @@ -24,8 +24,9 @@
    28.4    if (position == DockableWindowManager.FLOATING)
    28.5      setPreferredSize(new Dimension(500, 250))
    28.6  
    28.7 -  private val html_panel =
    28.8 -    new HTML_Panel(Isabelle.system, Isabelle.Int_Property("font-size"), null)
    28.9 +  val html_panel =
   28.10 +    new HTML_Panel(Isabelle.system,
   28.11 +      Isabelle.font_size(), Isabelle.Int_Property("relative-margin"), null)
   28.12    add(html_panel, BorderLayout.CENTER)
   28.13  
   28.14  
   28.15 @@ -43,7 +44,7 @@
   28.16            }
   28.17  
   28.18          case Session.Global_Settings =>
   28.19 -          html_panel.init(Isabelle.Int_Property("font-size"))
   28.20 +          html_panel.init(Isabelle.font_size(), Isabelle.Int_Property("relative-margin"))
   28.21            
   28.22          case bad => System.err.println("output_actor: ignoring bad message " + bad)
   28.23        }
    29.1 --- a/src/Tools/jEdit/src/jedit/plugin.scala	Tue May 11 09:10:31 2010 -0700
    29.2 +++ b/src/Tools/jEdit/src/jedit/plugin.scala	Tue May 11 11:02:56 2010 -0700
    29.3 @@ -42,22 +42,37 @@
    29.4  
    29.5    object Property
    29.6    {
    29.7 -    def apply(name: String): String = jEdit.getProperty(OPTION_PREFIX + name)
    29.8 -    def update(name: String, value: String) = jEdit.setProperty(OPTION_PREFIX + name, value)
    29.9 +    def apply(name: String): String =
   29.10 +      jEdit.getProperty(OPTION_PREFIX + name)
   29.11 +    def apply(name: String, default: String): String =
   29.12 +      jEdit.getProperty(OPTION_PREFIX + name, default)
   29.13 +    def update(name: String, value: String) =
   29.14 +      jEdit.setProperty(OPTION_PREFIX + name, value)
   29.15    }
   29.16  
   29.17    object Boolean_Property
   29.18    {
   29.19 -    def apply(name: String): Boolean = jEdit.getBooleanProperty(OPTION_PREFIX + name)
   29.20 -    def update(name: String, value: Boolean) = jEdit.setBooleanProperty(OPTION_PREFIX + name, value)
   29.21 +    def apply(name: String): Boolean =
   29.22 +      jEdit.getBooleanProperty(OPTION_PREFIX + name)
   29.23 +    def apply(name: String, default: Boolean): Boolean =
   29.24 +      jEdit.getBooleanProperty(OPTION_PREFIX + name, default)
   29.25 +    def update(name: String, value: Boolean) =
   29.26 +      jEdit.setBooleanProperty(OPTION_PREFIX + name, value)
   29.27    }
   29.28  
   29.29    object Int_Property
   29.30    {
   29.31 -    def apply(name: String): Int = jEdit.getIntegerProperty(OPTION_PREFIX + name)
   29.32 -    def update(name: String, value: Int) = jEdit.setIntegerProperty(OPTION_PREFIX + name, value)
   29.33 +    def apply(name: String): Int =
   29.34 +      jEdit.getIntegerProperty(OPTION_PREFIX + name)
   29.35 +    def apply(name: String, default: Int): Int =
   29.36 +      jEdit.getIntegerProperty(OPTION_PREFIX + name, default)
   29.37 +    def update(name: String, value: Int) =
   29.38 +      jEdit.setIntegerProperty(OPTION_PREFIX + name, value)
   29.39    }
   29.40  
   29.41 +  def font_size(): Int =
   29.42 +    (jEdit.getIntegerProperty("view.fontsize", 16) * Int_Property("relative-font-size", 100)) / 100
   29.43 +
   29.44  
   29.45    /* settings */
   29.46