structure Cooper_Procedure : sig datatype inta = Int_of_integer of int val integer_of_int : inta -> int type nat val integer_of_nat : nat -> int datatype numa = C of inta | Bound of nat | CN of nat * inta * numa |
Neg of numa | Add of numa * numa | Subof numa * numa | Mul of inta * numa datatype fm = T | F | Lt of numa | Le of numa | Gt of numa | Ge of numa |
Eq of numa | NEq of numa | Dvd of inta * numa | NDvd of inta * numa | Notof fm | Andof fm * fm | Orof fm * fm | Imp of fm * fm | Iff of fm * fm
| E of fm | A of fm | Closed of nat | NClosed of nat val pa : fm -> fm val nat_of_integer : int -> nat end = struct
datatype inta = Int_of_integer of int;
fun integer_of_int (Int_of_integer k) = k;
fun equal_inta k l = integer_of_int k = integer_of_int l;
type'a equal = {equal : 'a -> 'a -> bool}; val equal = #equal : 'a equal -> 'a -> 'a -> bool;
val equal_int = {equal = equal_inta} : inta equal;
fun times_inta k l = Int_of_integer (integer_of_int k * integer_of_int l);
type'a times = {times : 'a -> 'a -> 'a}; val times = #times : 'a times -> 'a -> 'a -> 'a;
type'a dvd = {times_dvd : 'a times}; val times_dvd = #times_dvd : 'a dvd -> 'a times;
val times_int = {times = times_inta} : inta times;
val dvd_int = {times_dvd = times_int} : inta dvd;
datatype num = One | Bit0 of num | Bit1 of num;
val one_inta : inta = Int_of_integer (1 : IntInf.int);
type'a one = {one : 'a}; val one = #one : 'a one -> 'a;
val one_int = {one = one_inta} : inta one;
fun plus_inta k l = Int_of_integer (integer_of_int k + integer_of_int l);
type'a plus = {plus : 'a -> 'a -> 'a}; val plus = #plus : 'a plus -> 'a -> 'a -> 'a;
val plus_int = {plus = plus_inta} : inta plus;
val zero_inta : inta = Int_of_integer (0 : IntInf.int);
type'a zero = {zero : 'a}; val zero = #zero : 'a zero -> 'a;
val zero_int = {zero = zero_inta} : inta zero;
type'a semigroup_add = {plus_semigroup_add : 'a plus}; val plus_semigroup_add = #plus_semigroup_add : 'a semigroup_add -> 'a plus;
type'a numeral =
{one_numeral : 'a one, semigroup_add_numeral : 'a semigroup_add}; val one_numeral = #one_numeral : 'a numeral -> 'a one; val semigroup_add_numeral = #semigroup_add_numeral : 'a numeral -> 'a semigroup_add;
val semigroup_add_int = {plus_semigroup_add = plus_int} : inta semigroup_add;
type'a power = {one_power : 'a one, times_power : 'a times}; val one_power = #one_power : 'a power -> 'a one; val times_power = #times_power : 'a power -> 'a times;
fun minus_inta k l = Int_of_integer (integer_of_int k - integer_of_int l);
type'a minus = {minus : 'a -> 'a -> 'a}; val minus = #minus : 'a minus -> 'a -> 'a -> 'a;
val minus_int = {minus = minus_inta} : inta minus;
fun apsnd f (x, y) = (x, f y);
fun divmod_integer k l =
(if k = (0 : IntInf.int) then ((0 : IntInf.int), (0 : IntInf.int)) else (if (0 : IntInf.int) < l then (if (0 : IntInf.int) < k then Integer.div_mod (abs k) (abs l) elselet val (r, s) = Integer.div_mod (abs k) (abs l); in
(if s = (0 : IntInf.int) then (~ r, (0 : IntInf.int)) else (~ r - (1 : IntInf.int), l - s)) end) else (if l = (0 : IntInf.int) then ((0 : IntInf.int), k) else apsnd (fn a => ~ a)
(if k < (0 : IntInf.int) then Integer.div_mod (abs k) (abs l) elselet val (r, s) = Integer.div_mod (abs k) (abs l); in
(if s = (0 : IntInf.int) then (~ r, (0 : IntInf.int)) else (~ r - (1 : IntInf.int), ~ l - s)) end))));
fun fst (x1, x2) = x1;
fun divide_integer k l = fst (divmod_integer k l);
fun divide_inta k l =
Int_of_integer (divide_integer (integer_of_int k) (integer_of_int l));
type'a divide = {divide : 'a -> 'a -> 'a}; val divide = #divide : 'a divide -> 'a -> 'a -> 'a;
val divide_int = {divide = divide_inta} : inta divide;
fun snd (x1, x2) = x2;
fun modulo_integer k l = snd (divmod_integer k l);
fun modulo_inta k l =
Int_of_integer (modulo_integer (integer_of_int k) (integer_of_int l));
type'a modulo =
{divide_modulo : 'a divide, dvd_modulo : 'a dvd, modulo : 'a -> 'a -> 'a}; val divide_modulo = #divide_modulo : 'a modulo -> 'a divide; val dvd_modulo = #dvd_modulo : 'a modulo -> 'a dvd; val modulo = #modulo : 'a modulo -> 'a -> 'a -> 'a;
type'a ab_semigroup_add = {semigroup_add_ab_semigroup_add : 'a semigroup_add}; val semigroup_add_ab_semigroup_add = #semigroup_add_ab_semigroup_add : 'a ab_semigroup_add -> 'a semigroup_add;
type'a monoid_add =
{semigroup_add_monoid_add : 'a semigroup_add, zero_monoid_add : 'a zero}; val semigroup_add_monoid_add = #semigroup_add_monoid_add : 'a monoid_add -> 'a semigroup_add; val zero_monoid_add = #zero_monoid_add : 'a monoid_add -> 'a zero;
type'a comm_monoid_add =
{ab_semigroup_add_comm_monoid_add : 'a ab_semigroup_add,
monoid_add_comm_monoid_add : 'a monoid_add}; val ab_semigroup_add_comm_monoid_add = #ab_semigroup_add_comm_monoid_add : 'a comm_monoid_add -> 'a ab_semigroup_add; val monoid_add_comm_monoid_add = #monoid_add_comm_monoid_add : 'a comm_monoid_add -> 'a monoid_add;
type'a mult_zero = {times_mult_zero : 'a times, zero_mult_zero : 'a zero}; val times_mult_zero = #times_mult_zero : 'a mult_zero -> 'a times; val zero_mult_zero = #zero_mult_zero : 'a mult_zero -> 'a zero;
type'a semigroup_mult = {times_semigroup_mult : 'a times}; val times_semigroup_mult = #times_semigroup_mult : 'a semigroup_mult -> 'a times;
type'a semiring =
{ab_semigroup_add_semiring : 'a ab_semigroup_add,
semigroup_mult_semiring : 'a semigroup_mult}; val ab_semigroup_add_semiring = #ab_semigroup_add_semiring : 'a semiring -> 'a ab_semigroup_add; val semigroup_mult_semiring = #semigroup_mult_semiring : 'a semiring -> 'a semigroup_mult;
type'a semiring_0 =
{comm_monoid_add_semiring_0 : 'a comm_monoid_add,
mult_zero_semiring_0 : 'a mult_zero, semiring_semiring_0 : 'a semiring}; val comm_monoid_add_semiring_0 = #comm_monoid_add_semiring_0 : 'a semiring_0 -> 'a comm_monoid_add; val mult_zero_semiring_0 = #mult_zero_semiring_0 : 'a semiring_0 -> 'a mult_zero; val semiring_semiring_0 = #semiring_semiring_0 : 'a semiring_0 -> 'a semiring;
type'a semiring_no_zero_divisors =
{semiring_0_semiring_no_zero_divisors : 'a semiring_0}; val semiring_0_semiring_no_zero_divisors = #semiring_0_semiring_no_zero_divisors
: 'a semiring_no_zero_divisors -> 'a semiring_0;
type'a monoid_mult =
{semigroup_mult_monoid_mult : 'a semigroup_mult,
power_monoid_mult : 'a power}; val semigroup_mult_monoid_mult = #semigroup_mult_monoid_mult : 'a monoid_mult -> 'a semigroup_mult; val power_monoid_mult = #power_monoid_mult : 'a monoid_mult -> 'a power;
type'a semiring_numeral =
{monoid_mult_semiring_numeral : 'a monoid_mult,
numeral_semiring_numeral : 'a numeral,
semiring_semiring_numeral : 'a semiring}; val monoid_mult_semiring_numeral = #monoid_mult_semiring_numeral : 'a semiring_numeral -> 'a monoid_mult; val numeral_semiring_numeral = #numeral_semiring_numeral : 'a semiring_numeral -> 'a numeral; val semiring_semiring_numeral = #semiring_semiring_numeral : 'a semiring_numeral -> 'a semiring;
type'a zero_neq_one = {one_zero_neq_one : 'a one, zero_zero_neq_one : 'a zero}; val one_zero_neq_one = #one_zero_neq_one : 'a zero_neq_one -> 'a one; val zero_zero_neq_one = #zero_zero_neq_one : 'a zero_neq_one -> 'a zero;
type'a semiring_1 =
{semiring_numeral_semiring_1 : 'a semiring_numeral,
semiring_0_semiring_1 : 'a semiring_0,
zero_neq_one_semiring_1 : 'a zero_neq_one}; val semiring_numeral_semiring_1 = #semiring_numeral_semiring_1 : 'a semiring_1 -> 'a semiring_numeral; val semiring_0_semiring_1 = #semiring_0_semiring_1 : 'a semiring_1 -> 'a semiring_0; val zero_neq_one_semiring_1 = #zero_neq_one_semiring_1 : 'a semiring_1 -> 'a zero_neq_one;
type'a semiring_1_no_zero_divisors =
{semiring_1_semiring_1_no_zero_divisors : 'a semiring_1,
semiring_no_zero_divisors_semiring_1_no_zero_divisors : 'a semiring_no_zero_divisors}; val semiring_1_semiring_1_no_zero_divisors =
#semiring_1_semiring_1_no_zero_divisors : 'a semiring_1_no_zero_divisors -> 'a semiring_1; val semiring_no_zero_divisors_semiring_1_no_zero_divisors =
#semiring_no_zero_divisors_semiring_1_no_zero_divisors : 'a semiring_1_no_zero_divisors -> 'a semiring_no_zero_divisors;
type'a cancel_semigroup_add =
{semigroup_add_cancel_semigroup_add : 'a semigroup_add}; val semigroup_add_cancel_semigroup_add = #semigroup_add_cancel_semigroup_add : 'a cancel_semigroup_add -> 'a semigroup_add;
type'a cancel_ab_semigroup_add =
{ab_semigroup_add_cancel_ab_semigroup_add : 'a ab_semigroup_add,
cancel_semigroup_add_cancel_ab_semigroup_add : 'a cancel_semigroup_add,
minus_cancel_ab_semigroup_add : 'a minus}; val ab_semigroup_add_cancel_ab_semigroup_add =
#ab_semigroup_add_cancel_ab_semigroup_add : 'a cancel_ab_semigroup_add -> 'a ab_semigroup_add; val cancel_semigroup_add_cancel_ab_semigroup_add =
#cancel_semigroup_add_cancel_ab_semigroup_add : 'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add; val minus_cancel_ab_semigroup_add = #minus_cancel_ab_semigroup_add : 'a cancel_ab_semigroup_add -> 'a minus;
type'a cancel_comm_monoid_add =
{cancel_ab_semigroup_add_cancel_comm_monoid_add : 'a cancel_ab_semigroup_add,
comm_monoid_add_cancel_comm_monoid_add : 'a comm_monoid_add}; val cancel_ab_semigroup_add_cancel_comm_monoid_add =
#cancel_ab_semigroup_add_cancel_comm_monoid_add : 'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add; val comm_monoid_add_cancel_comm_monoid_add =
#comm_monoid_add_cancel_comm_monoid_add : 'a cancel_comm_monoid_add -> 'a comm_monoid_add;
type'a semiring_0_cancel =
{cancel_comm_monoid_add_semiring_0_cancel : 'a cancel_comm_monoid_add,
semiring_0_semiring_0_cancel : 'a semiring_0}; val cancel_comm_monoid_add_semiring_0_cancel =
#cancel_comm_monoid_add_semiring_0_cancel : 'a semiring_0_cancel -> 'a cancel_comm_monoid_add; val semiring_0_semiring_0_cancel = #semiring_0_semiring_0_cancel : 'a semiring_0_cancel -> 'a semiring_0;
type'a ab_semigroup_mult =
{semigroup_mult_ab_semigroup_mult : 'a semigroup_mult}; val semigroup_mult_ab_semigroup_mult = #semigroup_mult_ab_semigroup_mult : 'a ab_semigroup_mult -> 'a semigroup_mult;
type'a comm_semiring =
{ab_semigroup_mult_comm_semiring : 'a ab_semigroup_mult,
semiring_comm_semiring : 'a semiring}; val ab_semigroup_mult_comm_semiring = #ab_semigroup_mult_comm_semiring : 'a comm_semiring -> 'a ab_semigroup_mult; val semiring_comm_semiring = #semiring_comm_semiring : 'a comm_semiring -> 'a semiring;
type'a comm_semiring_0 =
{comm_semiring_comm_semiring_0 : 'a comm_semiring,
semiring_0_comm_semiring_0 : 'a semiring_0}; val comm_semiring_comm_semiring_0 = #comm_semiring_comm_semiring_0 : 'a comm_semiring_0 -> 'a comm_semiring; val semiring_0_comm_semiring_0 = #semiring_0_comm_semiring_0 : 'a comm_semiring_0 -> 'a semiring_0;
type'a comm_semiring_0_cancel =
{comm_semiring_0_comm_semiring_0_cancel : 'a comm_semiring_0,
semiring_0_cancel_comm_semiring_0_cancel : 'a semiring_0_cancel}; val comm_semiring_0_comm_semiring_0_cancel =
#comm_semiring_0_comm_semiring_0_cancel : 'a comm_semiring_0_cancel -> 'a comm_semiring_0; val semiring_0_cancel_comm_semiring_0_cancel =
#semiring_0_cancel_comm_semiring_0_cancel : 'a comm_semiring_0_cancel -> 'a semiring_0_cancel;
type'a semiring_1_cancel =
{semiring_0_cancel_semiring_1_cancel : 'a semiring_0_cancel,
semiring_1_semiring_1_cancel : 'a semiring_1}; val semiring_0_cancel_semiring_1_cancel = #semiring_0_cancel_semiring_1_cancel : 'a semiring_1_cancel -> 'a semiring_0_cancel; val semiring_1_semiring_1_cancel = #semiring_1_semiring_1_cancel : 'a semiring_1_cancel -> 'a semiring_1;
type'a comm_monoid_mult =
{ab_semigroup_mult_comm_monoid_mult : 'a ab_semigroup_mult,
monoid_mult_comm_monoid_mult : 'a monoid_mult,
dvd_comm_monoid_mult : 'a dvd}; val ab_semigroup_mult_comm_monoid_mult = #ab_semigroup_mult_comm_monoid_mult : 'a comm_monoid_mult -> 'a ab_semigroup_mult; val monoid_mult_comm_monoid_mult = #monoid_mult_comm_monoid_mult : 'a comm_monoid_mult -> 'a monoid_mult; val dvd_comm_monoid_mult = #dvd_comm_monoid_mult : 'a comm_monoid_mult -> 'a dvd;
type'a comm_semiring_1 =
{comm_monoid_mult_comm_semiring_1 : 'a comm_monoid_mult,
comm_semiring_0_comm_semiring_1 : 'a comm_semiring_0,
semiring_1_comm_semiring_1 : 'a semiring_1}; val comm_monoid_mult_comm_semiring_1 = #comm_monoid_mult_comm_semiring_1 : 'a comm_semiring_1 -> 'a comm_monoid_mult; val comm_semiring_0_comm_semiring_1 = #comm_semiring_0_comm_semiring_1 : 'a comm_semiring_1 -> 'a comm_semiring_0; val semiring_1_comm_semiring_1 = #semiring_1_comm_semiring_1 : 'a comm_semiring_1 -> 'a semiring_1;
type'a comm_semiring_1_cancel =
{comm_semiring_0_cancel_comm_semiring_1_cancel : 'a comm_semiring_0_cancel,
comm_semiring_1_comm_semiring_1_cancel : 'a comm_semiring_1,
semiring_1_cancel_comm_semiring_1_cancel : 'a semiring_1_cancel}; val comm_semiring_0_cancel_comm_semiring_1_cancel =
#comm_semiring_0_cancel_comm_semiring_1_cancel : 'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel; val comm_semiring_1_comm_semiring_1_cancel =
#comm_semiring_1_comm_semiring_1_cancel : 'a comm_semiring_1_cancel -> 'a comm_semiring_1; val semiring_1_cancel_comm_semiring_1_cancel =
#semiring_1_cancel_comm_semiring_1_cancel : 'a comm_semiring_1_cancel -> 'a semiring_1_cancel;
type'a semidom =
{comm_semiring_1_cancel_semidom : 'a comm_semiring_1_cancel,
semiring_1_no_zero_divisors_semidom : 'a semiring_1_no_zero_divisors}; val comm_semiring_1_cancel_semidom = #comm_semiring_1_cancel_semidom : 'a semidom -> 'a comm_semiring_1_cancel; val semiring_1_no_zero_divisors_semidom = #semiring_1_no_zero_divisors_semidom : 'a semidom -> 'a semiring_1_no_zero_divisors;
val ab_semigroup_add_int = {semigroup_add_ab_semigroup_add = semigroup_add_int}
: inta ab_semigroup_add;
type'a divide_trivial =
{one_divide_trivial : 'a one, zero_divide_trivial : 'a zero,
divide_divide_trivial : 'a divide}; val one_divide_trivial = #one_divide_trivial : 'a divide_trivial -> 'a one; val zero_divide_trivial = #zero_divide_trivial : 'a divide_trivial -> 'a zero; val divide_divide_trivial = #divide_divide_trivial : 'a divide_trivial -> 'a divide;
type'a semiring_no_zero_divisors_cancel =
{semiring_no_zero_divisors_semiring_no_zero_divisors_cancel : 'a semiring_no_zero_divisors}; val semiring_no_zero_divisors_semiring_no_zero_divisors_cancel =
#semiring_no_zero_divisors_semiring_no_zero_divisors_cancel : 'a semiring_no_zero_divisors_cancel -> 'a semiring_no_zero_divisors;
type'a semidom_divide =
{divide_trivial_semidom_divide : 'a divide_trivial,
semidom_semidom_divide : 'a semidom,
semiring_no_zero_divisors_cancel_semidom_divide : 'a semiring_no_zero_divisors_cancel}; val divide_trivial_semidom_divide = #divide_trivial_semidom_divide : 'a semidom_divide -> 'a divide_trivial; val semidom_semidom_divide = #semidom_semidom_divide : 'a semidom_divide -> 'a semidom; val semiring_no_zero_divisors_cancel_semidom_divide =
#semiring_no_zero_divisors_cancel_semidom_divide : 'a semidom_divide -> 'a semiring_no_zero_divisors_cancel;
val semiring_no_zero_divisors_cancel_int =
{semiring_no_zero_divisors_semiring_no_zero_divisors_cancel =
semiring_no_zero_divisors_int}
: inta semiring_no_zero_divisors_cancel;
type'a semiring_modulo =
{comm_semiring_1_cancel_semiring_modulo : 'a comm_semiring_1_cancel,
modulo_semiring_modulo : 'a modulo}; val comm_semiring_1_cancel_semiring_modulo =
#comm_semiring_1_cancel_semiring_modulo : 'a semiring_modulo -> 'a comm_semiring_1_cancel; val modulo_semiring_modulo = #modulo_semiring_modulo : 'a semiring_modulo -> 'a modulo;
type'a semiring_modulo_trivial =
{divide_trivial_semiring_modulo_trivial : 'a divide_trivial,
semiring_modulo_semiring_modulo_trivial : 'a semiring_modulo}; val divide_trivial_semiring_modulo_trivial =
#divide_trivial_semiring_modulo_trivial : 'a semiring_modulo_trivial -> 'a divide_trivial; val semiring_modulo_semiring_modulo_trivial =
#semiring_modulo_semiring_modulo_trivial : 'a semiring_modulo_trivial -> 'a semiring_modulo;
type'a algebraic_semidom =
{semidom_divide_algebraic_semidom : 'a semidom_divide}; val semidom_divide_algebraic_semidom = #semidom_divide_algebraic_semidom : 'a algebraic_semidom -> 'a semidom_divide;
type'a semidom_modulo =
{algebraic_semidom_semidom_modulo : 'a algebraic_semidom,
semiring_modulo_trivial_semidom_modulo : 'a semiring_modulo_trivial}; val algebraic_semidom_semidom_modulo = #algebraic_semidom_semidom_modulo : 'a semidom_modulo -> 'a algebraic_semidom; val semiring_modulo_trivial_semidom_modulo =
#semiring_modulo_trivial_semidom_modulo : 'a semidom_modulo -> 'a semiring_modulo_trivial;
val equal_num = {equal = equal_numa} : numa equal;
type'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool}; val less_eq = #less_eq : 'a ord -> 'a -> 'a -> bool; val less = #less : 'a ord -> 'a -> 'a -> bool;
val ord_integer =
{less_eq = (fn a => fn b => a <= b), less = (fn a => fn b => a < b)} :
int ord;
datatype fm = T | F | Lt of numa | Le of numa | Gt of numa | Ge of numa |
Eq of numa | NEq of numa | Dvd of inta * numa | NDvd of inta * numa | Notof fm | Andof fm * fm | Orof fm * fm | Imp of fm * fm | Iff of fm * fm |
E of fm | A of fm | Closed of nat | NClosed of nat;
fun id x = (fn xa => xa) x;
fun eq A_ a b = equal A_ a b;
fun plus_nat m n = Nat (integer_of_nat m + integer_of_nat n);
fun djf f p q =
(if equal_fm q T then T else (if equal_fm q F then f p elselet val fp = f p; in
(case fp of T => T | F => q | Lt _ => Or (fp, q)
| Le _ => Or (fp, q) | Gt _ => Or (fp, q)
| Ge _ => Or (fp, q) | Eq _ => Or (fp, q)
| NEq _ => Or (fp, q) | Dvd (_, _) => Or (fp, q)
| NDvd (_, _) => Or (fp, q) | Not _ => Or (fp, q)
| And (_, _) => Or (fp, q) | Or (_, _) => Or (fp, q)
| Imp (_, _) => Or (fp, q) | Iff (_, _) => Or (fp, q)
| E _ => Or (fp, q) | A _ => Or (fp, q)
| Closed _ => Or (fp, q) | NClosed _ => Or (fp, q)) end));
fun evaldjf f ps = foldr (djf f) ps F;
fun dj f p = evaldjf f (disjuncts p);
fun max A_ a b = (if less_eq A_ a b then b else a);
fun minus_nat m n =
Nat (max ord_integer (0 : IntInf.int) (integer_of_nat m - integer_of_nat n));
funmap f [] = []
| map f (x21 :: x22) = f x21 :: map f x22;
fun numsubst0 t (C c) = C c
| numsubst0 t (Bound n) = (if equal_nat n zero_nat then t else Bound n)
| numsubst0 t (Neg a) = Neg (numsubst0 t a)
| numsubst0 t (Add (a, b)) = Add (numsubst0 t a, numsubst0 t b)
| numsubst0 t (Sub (a, b)) = Sub (numsubst0 t a, numsubst0 t b)
| numsubst0 t (Mul (i, a)) = Mul (i, numsubst0 t a)
| numsubst0 t (CN (v, i, a)) =
(if equal_nat v zero_nat then Add (Mul (i, t), numsubst0 t a) else CN (suc (minus_nat v one_nat), i, numsubst0 t a));
fun subst0 t T = T
| subst0 t F = F
| subst0 t (Lt a) = Lt (numsubst0 t a)
| subst0 t (Le a) = Le (numsubst0 t a)
| subst0 t (Gt a) = Gt (numsubst0 t a)
| subst0 t (Ge a) = Ge (numsubst0 t a)
| subst0 t (Eq a) = Eq (numsubst0 t a)
| subst0 t (NEq a) = NEq (numsubst0 t a)
| subst0 t (Dvd (i, a)) = Dvd (i, numsubst0 t a)
| subst0 t (NDvd (i, a)) = NDvd (i, numsubst0 t a)
| subst0 t (Not p) = Not (subst0 t p)
| subst0 t (And (p, q)) = And (subst0 t p, subst0 t q)
| subst0 t (Or (p, q)) = Or (subst0 t p, subst0 t q)
| subst0 t (Imp (p, q)) = Imp (subst0 t p, subst0 t q)
| subst0 t (Iff (p, q)) = Iff (subst0 t p, subst0 t q)
| subst0 t (Closed p) = Closed p
| subst0 t (NClosed p) = NClosed p;
fun less_eq_int k l = integer_of_int k <= integer_of_int l;
fun less_int k l = integer_of_int k < integer_of_int l;
fun uminus_int k = Int_of_integer (~ (integer_of_int k));
fun abs_int i = (if less_int i zero_inta then uminus_int i else i);
fun dvd (A1_, A2_) a b =
eq A1_
(modulo
((modulo_semiring_modulo o semiring_modulo_semiring_modulo_trivial o
semiring_modulo_trivial_semidom_modulo)
A2_)
b a)
(zero ((zero_mult_zero o mult_zero_semiring_0 o semiring_0_semiring_1 o
semiring_1_comm_semiring_1 o
comm_semiring_1_comm_semiring_1_cancel o
comm_semiring_1_cancel_semidom o semidom_semidom_divide o
semidom_divide_algebraic_semidom o
algebraic_semidom_semidom_modulo)
A2_));
fun nummul i (C j) = C (times_inta i j)
| nummul i (CN (n, c, t)) = CN (n, times_inta c i, nummul i t)
| nummul i (Bound v) = Mul (i, Bound v)
| nummul i (Neg v) = Mul (i, Neg v)
| nummul i (Add (v, va)) = Mul (i, Add (v, va))
| nummul i (Sub (v, va)) = Mul (i, Sub (v, va))
| nummul i (Mul (v, va)) = Mul (i, Mul (v, va));
fun numneg t = nummul (uminus_int one_inta) t;
fun less_eq_nat m n = integer_of_nat m <= integer_of_nat n;
fun numsub s t = (if equal_numa s t then C zero_inta else numadd s (numneg t));
fun simpnum (C j) = C j
| simpnum (Bound n) = CN (n, one_inta, C zero_inta)
| simpnum (Neg t) = numneg (simpnum t)
| simpnum (Add (t, s)) = numadd (simpnum t) (simpnum s)
| simpnum (Sub (t, s)) = numsub (simpnum t) (simpnum s)
| simpnum (Mul (i, t)) =
(if equal_inta i zero_inta then C zero_inta else nummul i (simpnum t))
| simpnum (CN (v, va, vb)) = CN (v, va, vb);
fun disj p q =
(if equal_fm p T orelse equal_fm q T then T else (if equal_fm p F then q else (if equal_fm q F then p elseOr (p, q))));
fun conj p q =
(if equal_fm p F orelse equal_fm q F then F else (if equal_fm p T then q else (if equal_fm q T then p elseAnd (p, q))));
fun nota (Not p) = p
| nota T = F
| nota F = T
| nota (Lt v) = Not (Lt v)
| nota (Le v) = Not (Le v)
| nota (Gt v) = Not (Gt v)
| nota (Ge v) = Not (Ge v)
| nota (Eq v) = Not (Eq v)
| nota (NEq v) = Not (NEq v)
| nota (Dvd (v, va)) = Not (Dvd (v, va))
| nota (NDvd (v, va)) = Not (NDvd (v, va))
| nota (And (v, va)) = Not (And (v, va))
| nota (Or (v, va)) = Not (Or (v, va))
| nota (Imp (v, va)) = Not (Imp (v, va))
| nota (Iff (v, va)) = Not (Iff (v, va))
| nota (E v) = Not (E v)
| nota (A v) = Not (A v)
| nota (Closed v) = Not (Closed v)
| nota (NClosed v) = Not (NClosed v);
fun imp p q =
(if equal_fm p F orelse equal_fm q T then T else (if equal_fm p T then q else (if equal_fm q F then nota p else Imp (p, q))));
fun iff p q =
(if equal_fm p q then T else (if equal_fm p (nota q) orelse equal_fm (nota p) q then F else (if equal_fm p F then nota q else (if equal_fm q F then nota p else (if equal_fm p T then q else (if equal_fm q T then p else Iff (p, q)))))));
fun simpfm (And (p, q)) = conj (simpfm p) (simpfm q)
| simpfm (Or (p, q)) = disj (simpfm p) (simpfm q)
| simpfm (Imp (p, q)) = imp (simpfm p) (simpfm q)
| simpfm (Iff (p, q)) = iff (simpfm p) (simpfm q)
| simpfm (Not p) = nota (simpfm p)
| simpfm (Lt a) = let val aa = simpnum a; in
(case aa of C v => (if less_int v zero_inta then T else F)
| Bound _ => Lt aa | CN (_, _, _) => Lt aa | Neg _ => Lt aa
| Add (_, _) => Lt aa | Sub (_, _) => Lt aa | Mul (_, _) => Lt aa) end
| simpfm (Le a) = let val aa = simpnum a; in
(case aa of C v => (if less_eq_int v zero_inta then T else F)
| Bound _ => Le aa | CN (_, _, _) => Le aa | Neg _ => Le aa
| Add (_, _) => Le aa | Sub (_, _) => Le aa | Mul (_, _) => Le aa) end
| simpfm (Gt a) = let val aa = simpnum a; in
(case aa of C v => (if less_int zero_inta v then T else F)
| Bound _ => Gt aa | CN (_, _, _) => Gt aa | Neg _ => Gt aa
| Add (_, _) => Gt aa | Sub (_, _) => Gt aa | Mul (_, _) => Gt aa) end
| simpfm (Ge a) = let val aa = simpnum a; in
(case aa of C v => (if less_eq_int zero_inta v then T else F)
| Bound _ => Ge aa | CN (_, _, _) => Ge aa | Neg _ => Ge aa
| Add (_, _) => Ge aa | Sub (_, _) => Ge aa | Mul (_, _) => Ge aa) end
| simpfm (Eq a) = let val aa = simpnum a; in
(case aa of C v => (if equal_inta v zero_inta then T else F)
| Bound _ => Eq aa | CN (_, _, _) => Eq aa | Neg _ => Eq aa
| Add (_, _) => Eq aa | Sub (_, _) => Eq aa | Mul (_, _) => Eq aa) end
| simpfm (NEq a) = let val aa = simpnum a; in
(case aa of C v => (ifnot (equal_inta v zero_inta) then T else F)
| Bound _ => NEq aa | CN (_, _, _) => NEq aa | Neg _ => NEq aa
| Add (_, _) => NEq aa | Sub (_, _) => NEq aa | Mul (_, _) => NEq aa) end
| simpfm (Dvd (i, a)) =
(if equal_inta i zero_inta then simpfm (Eq a) else (if equal_inta (abs_int i) one_inta then T elselet val aa = simpnum a; in
(case aa of C v =>
(if dvd (equal_int, semidom_modulo_int) i v then T else F)
| Bound _ => Dvd (i, aa) | CN (_, _, _) => Dvd (i, aa)
| Neg _ => Dvd (i, aa) | Add (_, _) => Dvd (i, aa)
| Sub (_, _) => Dvd (i, aa) | Mul (_, _) => Dvd (i, aa)) end))
| simpfm (NDvd (i, a)) =
(if equal_inta i zero_inta then simpfm (NEq a) else (if equal_inta (abs_int i) one_inta then F elselet val aa = simpnum a; in
(case aa of C v =>
(ifnot (dvd (equal_int, semidom_modulo_int) i v) then T else F)
| Bound _ => NDvd (i, aa) | CN (_, _, _) => NDvd (i, aa)
| Neg _ => NDvd (i, aa) | Add (_, _) => NDvd (i, aa)
| Sub (_, _) => NDvd (i, aa) | Mul (_, _) => NDvd (i, aa)) end))
| simpfm T = T
| simpfm F = F
| simpfm (E v) = E v
| simpfm (A v) = A v
| simpfm (Closed v) = Closed v
| simpfm (NClosed v) = NClosed v;
fun length_tailrec [] n = n
| length_tailrec (x :: xs) n = length_tailrec xs (suc n);
fun size_list xs = length_tailrec xs zero_nat;
fun a_beta (And (p, q)) k = And (a_beta p k, a_beta q k)
| a_beta (Or (p, q)) k = Or (a_beta p k, a_beta q k)
| a_beta T k = T
| a_beta F k = F
| a_beta (Lt (C va)) k = Lt (C va)
| a_beta (Lt (Bound va)) k = Lt (Bound va)
| a_beta (Lt (Neg va)) k = Lt (Neg va)
| a_beta (Lt (Add (va, vb))) k = Lt (Add (va, vb))
| a_beta (Lt (Sub (va, vb))) k = Lt (Sub (va, vb))
| a_beta (Lt (Mul (va, vb))) k = Lt (Mul (va, vb))
| a_beta (Le (C va)) k = Le (C va)
| a_beta (Le (Bound va)) k = Le (Bound va)
| a_beta (Le (Neg va)) k = Le (Neg va)
| a_beta (Le (Add (va, vb))) k = Le (Add (va, vb))
| a_beta (Le (Sub (va, vb))) k = Le (Sub (va, vb))
| a_beta (Le (Mul (va, vb))) k = Le (Mul (va, vb))
| a_beta (Gt (C va)) k = Gt (C va)
| a_beta (Gt (Bound va)) k = Gt (Bound va)
| a_beta (Gt (Neg va)) k = Gt (Neg va)
| a_beta (Gt (Add (va, vb))) k = Gt (Add (va, vb))
| a_beta (Gt (Sub (va, vb))) k = Gt (Sub (va, vb))
| a_beta (Gt (Mul (va, vb))) k = Gt (Mul (va, vb))
| a_beta (Ge (C va)) k = Ge (C va)
| a_beta (Ge (Bound va)) k = Ge (Bound va)
| a_beta (Ge (Neg va)) k = Ge (Neg va)
| a_beta (Ge (Add (va, vb))) k = Ge (Add (va, vb))
| a_beta (Ge (Sub (va, vb))) k = Ge (Sub (va, vb))
| a_beta (Ge (Mul (va, vb))) k = Ge (Mul (va, vb))
| a_beta (Eq (C va)) k = Eq (C va)
| a_beta (Eq (Bound va)) k = Eq (Bound va)
| a_beta (Eq (Neg va)) k = Eq (Neg va)
| a_beta (Eq (Add (va, vb))) k = Eq (Add (va, vb))
| a_beta (Eq (Sub (va, vb))) k = Eq (Sub (va, vb))
| a_beta (Eq (Mul (va, vb))) k = Eq (Mul (va, vb))
| a_beta (NEq (C va)) k = NEq (C va)
| a_beta (NEq (Bound va)) k = NEq (Bound va)
| a_beta (NEq (Neg va)) k = NEq (Neg va)
| a_beta (NEq (Add (va, vb))) k = NEq (Add (va, vb))
| a_beta (NEq (Sub (va, vb))) k = NEq (Sub (va, vb))
| a_beta (NEq (Mul (va, vb))) k = NEq (Mul (va, vb))
| a_beta (Dvd (v, C vb)) k = Dvd (v, C vb)
| a_beta (Dvd (v, Bound vb)) k = Dvd (v, Bound vb)
| a_beta (Dvd (v, Neg vb)) k = Dvd (v, Neg vb)
| a_beta (Dvd (v, Add (vb, vc))) k = Dvd (v, Add (vb, vc))
| a_beta (Dvd (v, Sub (vb, vc))) k = Dvd (v, Sub (vb, vc))
| a_beta (Dvd (v, Mul (vb, vc))) k = Dvd (v, Mul (vb, vc))
| a_beta (NDvd (v, C vb)) k = NDvd (v, C vb)
| a_beta (NDvd (v, Bound vb)) k = NDvd (v, Bound vb)
| a_beta (NDvd (v, Neg vb)) k = NDvd (v, Neg vb)
| a_beta (NDvd (v, Add (vb, vc))) k = NDvd (v, Add (vb, vc))
| a_beta (NDvd (v, Sub (vb, vc))) k = NDvd (v, Sub (vb, vc))
| a_beta (NDvd (v, Mul (vb, vc))) k = NDvd (v, Mul (vb, vc))
| a_beta (Not v) k = Not v
| a_beta (Imp (v, va)) k = Imp (v, va)
| a_beta (Iff (v, va)) k = Iff (v, va)
| a_beta (E v) k = E v
| a_beta (A v) k = A v
| a_beta (Closed v) k = Closed v
| a_beta (NClosed v) k = NClosed v
| a_beta (Lt (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then Lt (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Lt (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (Le (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then Le (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Le (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (Gt (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then Gt (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Gt (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (Ge (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then Ge (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Ge (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (Eq (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then Eq (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Eq (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (NEq (CN (vd, c, e))) k =
(if equal_nat vd zero_nat then NEq (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else NEq (CN (suc (minus_nat vd one_nat), c, e)))
| a_beta (Dvd (i, CN (ve, c, e))) k =
(if equal_nat ve zero_nat then Dvd (times_inta (divide_inta k c) i,
CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else Dvd (i, CN (suc (minus_nat ve one_nat), c, e)))
| a_beta (NDvd (i, CN (ve, c, e))) k =
(if equal_nat ve zero_nat then NDvd (times_inta (divide_inta k c) i,
CN (zero_nat, one_inta, Mul (divide_inta k c, e))) else NDvd (i, CN (suc (minus_nat ve one_nat), c, e)));
fun gcd_integer k l =
abs (if l = (0 : IntInf.int) then k else gcd_integer l (modulo_integer (abs k) (abs l)));
fun lcm_integer a b = divide_integer (abs a * abs b) (gcd_integer a b);
fun lcm_int (Int_of_integer x) (Int_of_integer y) =
Int_of_integer (lcm_integer x y);
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.34Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.