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 "${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.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