| author | paulson <lp15@cam.ac.uk> | 
| Mon, 27 Feb 2023 17:09:59 +0000 | |
| changeset 77406 | c2013f617a70 | 
| parent 75362 | 4b8da5eef9d0 | 
| child 82801 | c8d92d4ced73 | 
| permissions | -rw-r--r-- | 
| 36798 | 1 | structure Cooper_Procedure : sig | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2 | datatype inta = Int_of_integer of int | 
| 55685 | 3 | val integer_of_int : inta -> int | 
| 4 | type nat | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 5 | val integer_of_nat : nat -> int | 
| 61128 | 6 | datatype numa = C of inta | Bound of nat | CN of nat * inta * numa | | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 7 | Neg of numa | Add of numa * numa | Sub of numa * numa | Mul of inta * numa | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 8 | datatype fm = T | F | Lt of numa | Le of numa | Gt of numa | Ge of numa | | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 9 | Eq of numa | NEq of numa | Dvd of inta * numa | NDvd of inta * numa | | 
| 74531 | 10 | Not of fm | And of fm * fm | Or of fm * fm | Imp of fm * fm | Iff of fm * fm | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 11 | | E of fm | A of fm | Closed of nat | NClosed of nat | 
| 36528 | 12 | val pa : fm -> fm | 
| 55685 | 13 | val nat_of_integer : int -> nat | 
| 36528 | 14 | end = struct | 
| 23466 | 15 | |
| 55685 | 16 | datatype inta = Int_of_integer of int; | 
| 17 | ||
| 18 | fun integer_of_int (Int_of_integer k) = k; | |
| 19 | ||
| 20 | fun equal_inta k l = integer_of_int k = integer_of_int l; | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 21 | |
| 44930 | 22 | type 'a equal = {equal : 'a -> 'a -> bool};
 | 
| 23 | val equal = #equal : 'a equal -> 'a -> 'a -> bool; | |
| 29787 | 24 | |
| 55685 | 25 | val equal_int = {equal = equal_inta} : inta equal;
 | 
| 26 | ||
| 27 | fun times_inta k l = Int_of_integer (integer_of_int k * integer_of_int l); | |
| 28 | ||
| 29 | type 'a times = {times : 'a -> 'a -> 'a};
 | |
| 30 | val times = #times : 'a times -> 'a -> 'a -> 'a; | |
| 31 | ||
| 32 | type 'a dvd = {times_dvd : 'a times};
 | |
| 33 | val times_dvd = #times_dvd : 'a dvd -> 'a times; | |
| 34 | ||
| 35 | val times_int = {times = times_inta} : inta times;
 | |
| 36 | ||
| 37 | val dvd_int = {times_dvd = times_int} : inta dvd;
 | |
| 38 | ||
| 39 | datatype num = One | Bit0 of num | Bit1 of num; | |
| 40 | ||
| 41 | val one_inta : inta = Int_of_integer (1 : IntInf.int); | |
| 42 | ||
| 43 | type 'a one = {one : 'a};
 | |
| 44 | val one = #one : 'a one -> 'a; | |
| 45 | ||
| 46 | val one_int = {one = one_inta} : inta one;
 | |
| 47 | ||
| 48 | fun plus_inta k l = Int_of_integer (integer_of_int k + integer_of_int l); | |
| 49 | ||
| 50 | type 'a plus = {plus : 'a -> 'a -> 'a};
 | |
| 51 | val plus = #plus : 'a plus -> 'a -> 'a -> 'a; | |
| 52 | ||
| 53 | val plus_int = {plus = plus_inta} : inta plus;
 | |
| 54 | ||
| 61128 | 55 | val zero_inta : inta = Int_of_integer (0 : IntInf.int); | 
| 55685 | 56 | |
| 57 | type 'a zero = {zero : 'a};
 | |
| 58 | val zero = #zero : 'a zero -> 'a; | |
| 59 | ||
| 60 | val zero_int = {zero = zero_inta} : inta zero;
 | |
| 61 | ||
| 62 | type 'a semigroup_add = {plus_semigroup_add : 'a plus};
 | |
| 63 | val plus_semigroup_add = #plus_semigroup_add : 'a semigroup_add -> 'a plus; | |
| 64 | ||
| 65 | type 'a numeral = | |
| 66 |   {one_numeral : 'a one, semigroup_add_numeral : 'a semigroup_add};
 | |
| 67 | val one_numeral = #one_numeral : 'a numeral -> 'a one; | |
| 68 | val semigroup_add_numeral = #semigroup_add_numeral : | |
| 69 | 'a numeral -> 'a semigroup_add; | |
| 70 | ||
| 71 | val semigroup_add_int = {plus_semigroup_add = plus_int} : inta semigroup_add;
 | |
| 72 | ||
| 73 | val numeral_int = | |
| 74 |   {one_numeral = one_int, semigroup_add_numeral = semigroup_add_int} :
 | |
| 75 | inta numeral; | |
| 76 | ||
| 77 | type 'a power = {one_power : 'a one, times_power : 'a times};
 | |
| 78 | val one_power = #one_power : 'a power -> 'a one; | |
| 79 | val times_power = #times_power : 'a power -> 'a times; | |
| 80 | ||
| 81 | val power_int = {one_power = one_int, times_power = times_int} : inta power;
 | |
| 82 | ||
| 61128 | 83 | fun minus_inta k l = Int_of_integer (integer_of_int k - integer_of_int l); | 
| 84 | ||
| 85 | type 'a minus = {minus : 'a -> 'a -> 'a};
 | |
| 86 | val minus = #minus : 'a minus -> 'a -> 'a -> 'a; | |
| 87 | ||
| 88 | val minus_int = {minus = minus_inta} : inta minus;
 | |
| 89 | ||
| 65024 | 90 | fun apsnd f (x, y) = (x, f y); | 
| 91 | ||
| 92 | fun divmod_integer k l = | |
| 93 | (if k = (0 : IntInf.int) then ((0 : IntInf.int), (0 : IntInf.int)) | |
| 70093 | 94 | else (if (0 : IntInf.int) < l | 
| 95 | then (if (0 : IntInf.int) < k then Integer.div_mod (abs k) (abs l) | |
| 96 | else let | |
| 97 | val (r, s) = Integer.div_mod (abs k) (abs l); | |
| 98 | in | |
| 99 | (if s = (0 : IntInf.int) then (~ r, (0 : IntInf.int)) | |
| 100 | else (~ r - (1 : IntInf.int), l - s)) | |
| 101 | end) | |
| 102 | else (if l = (0 : IntInf.int) then ((0 : IntInf.int), k) | |
| 103 | else apsnd (fn a => ~ a) | |
| 104 | (if k < (0 : IntInf.int) | |
| 105 | then Integer.div_mod (abs k) (abs l) | |
| 106 | else let | |
| 107 | val (r, s) = Integer.div_mod (abs k) (abs l); | |
| 108 | in | |
| 109 | (if s = (0 : IntInf.int) | |
| 110 | then (~ r, (0 : IntInf.int)) | |
| 111 | else (~ r - (1 : IntInf.int), ~ l - s)) | |
| 112 | end)))); | |
| 65024 | 113 | |
| 114 | fun fst (x1, x2) = x1; | |
| 115 | ||
| 116 | fun divide_integer k l = fst (divmod_integer k l); | |
| 117 | ||
| 118 | fun divide_inta k l = | |
| 119 | Int_of_integer (divide_integer (integer_of_int k) (integer_of_int l)); | |
| 120 | ||
| 121 | type 'a divide = {divide : 'a -> 'a -> 'a};
 | |
| 122 | val divide = #divide : 'a divide -> 'a -> 'a -> 'a; | |
| 123 | ||
| 124 | val divide_int = {divide = divide_inta} : inta divide;
 | |
| 125 | ||
| 126 | fun snd (x1, x2) = x2; | |
| 127 | ||
| 128 | fun modulo_integer k l = snd (divmod_integer k l); | |
| 129 | ||
| 130 | fun modulo_inta k l = | |
| 131 | Int_of_integer (modulo_integer (integer_of_int k) (integer_of_int l)); | |
| 132 | ||
| 133 | type 'a modulo = | |
| 134 |   {divide_modulo : 'a divide, dvd_modulo : 'a dvd, modulo : 'a -> 'a -> 'a};
 | |
| 135 | val divide_modulo = #divide_modulo : 'a modulo -> 'a divide; | |
| 136 | val dvd_modulo = #dvd_modulo : 'a modulo -> 'a dvd; | |
| 137 | val modulo = #modulo : 'a modulo -> 'a -> 'a -> 'a; | |
| 138 | ||
| 139 | val modulo_int = | |
| 140 |   {divide_modulo = divide_int, dvd_modulo = dvd_int, modulo = modulo_inta} :
 | |
| 141 | inta modulo; | |
| 142 | ||
| 55685 | 143 | type 'a ab_semigroup_add = {semigroup_add_ab_semigroup_add : 'a semigroup_add};
 | 
| 144 | val semigroup_add_ab_semigroup_add = #semigroup_add_ab_semigroup_add : | |
| 145 | 'a ab_semigroup_add -> 'a semigroup_add; | |
| 146 | ||
| 147 | type 'a monoid_add = | |
| 148 |   {semigroup_add_monoid_add : 'a semigroup_add, zero_monoid_add : 'a zero};
 | |
| 149 | val semigroup_add_monoid_add = #semigroup_add_monoid_add : | |
| 150 | 'a monoid_add -> 'a semigroup_add; | |
| 151 | val zero_monoid_add = #zero_monoid_add : 'a monoid_add -> 'a zero; | |
| 152 | ||
| 153 | type 'a comm_monoid_add = | |
| 154 |   {ab_semigroup_add_comm_monoid_add : 'a ab_semigroup_add,
 | |
| 155 | monoid_add_comm_monoid_add : 'a monoid_add}; | |
| 156 | val ab_semigroup_add_comm_monoid_add = #ab_semigroup_add_comm_monoid_add : | |
| 157 | 'a comm_monoid_add -> 'a ab_semigroup_add; | |
| 158 | val monoid_add_comm_monoid_add = #monoid_add_comm_monoid_add : | |
| 159 | 'a comm_monoid_add -> 'a monoid_add; | |
| 160 | ||
| 61128 | 161 | type 'a mult_zero = {times_mult_zero : 'a times, zero_mult_zero : 'a zero};
 | 
| 162 | val times_mult_zero = #times_mult_zero : 'a mult_zero -> 'a times; | |
| 163 | val zero_mult_zero = #zero_mult_zero : 'a mult_zero -> 'a zero; | |
| 164 | ||
| 165 | type 'a semigroup_mult = {times_semigroup_mult : 'a times};
 | |
| 166 | val times_semigroup_mult = #times_semigroup_mult : | |
| 167 | 'a semigroup_mult -> 'a times; | |
| 168 | ||
| 169 | type 'a semiring = | |
| 170 |   {ab_semigroup_add_semiring : 'a ab_semigroup_add,
 | |
| 171 | semigroup_mult_semiring : 'a semigroup_mult}; | |
| 172 | val ab_semigroup_add_semiring = #ab_semigroup_add_semiring : | |
| 173 | 'a semiring -> 'a ab_semigroup_add; | |
| 174 | val semigroup_mult_semiring = #semigroup_mult_semiring : | |
| 175 | 'a semiring -> 'a semigroup_mult; | |
| 176 | ||
| 55685 | 177 | type 'a semiring_0 = | 
| 178 |   {comm_monoid_add_semiring_0 : 'a comm_monoid_add,
 | |
| 179 | mult_zero_semiring_0 : 'a mult_zero, semiring_semiring_0 : 'a semiring}; | |
| 180 | val comm_monoid_add_semiring_0 = #comm_monoid_add_semiring_0 : | |
| 181 | 'a semiring_0 -> 'a comm_monoid_add; | |
| 182 | val mult_zero_semiring_0 = #mult_zero_semiring_0 : | |
| 183 | 'a semiring_0 -> 'a mult_zero; | |
| 184 | val semiring_semiring_0 = #semiring_semiring_0 : 'a semiring_0 -> 'a semiring; | |
| 185 | ||
| 61128 | 186 | type 'a semiring_no_zero_divisors = | 
| 187 |   {semiring_0_semiring_no_zero_divisors : 'a semiring_0};
 | |
| 188 | val semiring_0_semiring_no_zero_divisors = #semiring_0_semiring_no_zero_divisors | |
| 189 | : 'a semiring_no_zero_divisors -> 'a semiring_0; | |
| 55685 | 190 | |
| 191 | type 'a monoid_mult = | |
| 192 |   {semigroup_mult_monoid_mult : 'a semigroup_mult,
 | |
| 193 | power_monoid_mult : 'a power}; | |
| 194 | val semigroup_mult_monoid_mult = #semigroup_mult_monoid_mult : | |
| 195 | 'a monoid_mult -> 'a semigroup_mult; | |
| 196 | val power_monoid_mult = #power_monoid_mult : 'a monoid_mult -> 'a power; | |
| 197 | ||
| 198 | type 'a semiring_numeral = | |
| 199 |   {monoid_mult_semiring_numeral : 'a monoid_mult,
 | |
| 200 | numeral_semiring_numeral : 'a numeral, | |
| 201 | semiring_semiring_numeral : 'a semiring}; | |
| 202 | val monoid_mult_semiring_numeral = #monoid_mult_semiring_numeral : | |
| 203 | 'a semiring_numeral -> 'a monoid_mult; | |
| 204 | val numeral_semiring_numeral = #numeral_semiring_numeral : | |
| 205 | 'a semiring_numeral -> 'a numeral; | |
| 206 | val semiring_semiring_numeral = #semiring_semiring_numeral : | |
| 207 | 'a semiring_numeral -> 'a semiring; | |
| 208 | ||
| 209 | type 'a zero_neq_one = {one_zero_neq_one : 'a one, zero_zero_neq_one : 'a zero};
 | |
| 210 | val one_zero_neq_one = #one_zero_neq_one : 'a zero_neq_one -> 'a one; | |
| 211 | val zero_zero_neq_one = #zero_zero_neq_one : 'a zero_neq_one -> 'a zero; | |
| 212 | ||
| 213 | type 'a semiring_1 = | |
| 214 |   {semiring_numeral_semiring_1 : 'a semiring_numeral,
 | |
| 215 | semiring_0_semiring_1 : 'a semiring_0, | |
| 216 | zero_neq_one_semiring_1 : 'a zero_neq_one}; | |
| 217 | val semiring_numeral_semiring_1 = #semiring_numeral_semiring_1 : | |
| 218 | 'a semiring_1 -> 'a semiring_numeral; | |
| 219 | val semiring_0_semiring_1 = #semiring_0_semiring_1 : | |
| 220 | 'a semiring_1 -> 'a semiring_0; | |
| 221 | val zero_neq_one_semiring_1 = #zero_neq_one_semiring_1 : | |
| 222 | 'a semiring_1 -> 'a zero_neq_one; | |
| 223 | ||
| 61128 | 224 | type 'a semiring_1_no_zero_divisors = | 
| 225 |   {semiring_1_semiring_1_no_zero_divisors : 'a semiring_1,
 | |
| 226 | semiring_no_zero_divisors_semiring_1_no_zero_divisors : | |
| 227 | 'a semiring_no_zero_divisors}; | |
| 228 | val semiring_1_semiring_1_no_zero_divisors = | |
| 229 | #semiring_1_semiring_1_no_zero_divisors : | |
| 230 | 'a semiring_1_no_zero_divisors -> 'a semiring_1; | |
| 231 | val semiring_no_zero_divisors_semiring_1_no_zero_divisors = | |
| 232 | #semiring_no_zero_divisors_semiring_1_no_zero_divisors : | |
| 233 | 'a semiring_1_no_zero_divisors -> 'a semiring_no_zero_divisors; | |
| 55685 | 234 | |
| 235 | type 'a cancel_semigroup_add = | |
| 236 |   {semigroup_add_cancel_semigroup_add : 'a semigroup_add};
 | |
| 237 | val semigroup_add_cancel_semigroup_add = #semigroup_add_cancel_semigroup_add : | |
| 238 | 'a cancel_semigroup_add -> 'a semigroup_add; | |
| 239 | ||
| 240 | type 'a cancel_ab_semigroup_add = | |
| 241 |   {ab_semigroup_add_cancel_ab_semigroup_add : 'a ab_semigroup_add,
 | |
| 61128 | 242 | cancel_semigroup_add_cancel_ab_semigroup_add : 'a cancel_semigroup_add, | 
| 243 | minus_cancel_ab_semigroup_add : 'a minus}; | |
| 55685 | 244 | val ab_semigroup_add_cancel_ab_semigroup_add = | 
| 245 | #ab_semigroup_add_cancel_ab_semigroup_add : | |
| 246 | 'a cancel_ab_semigroup_add -> 'a ab_semigroup_add; | |
| 247 | val cancel_semigroup_add_cancel_ab_semigroup_add = | |
| 248 | #cancel_semigroup_add_cancel_ab_semigroup_add : | |
| 249 | 'a cancel_ab_semigroup_add -> 'a cancel_semigroup_add; | |
| 61128 | 250 | val minus_cancel_ab_semigroup_add = #minus_cancel_ab_semigroup_add : | 
| 251 | 'a cancel_ab_semigroup_add -> 'a minus; | |
| 55685 | 252 | |
| 253 | type 'a cancel_comm_monoid_add = | |
| 254 |   {cancel_ab_semigroup_add_cancel_comm_monoid_add : 'a cancel_ab_semigroup_add,
 | |
| 255 | comm_monoid_add_cancel_comm_monoid_add : 'a comm_monoid_add}; | |
| 256 | val cancel_ab_semigroup_add_cancel_comm_monoid_add = | |
| 257 | #cancel_ab_semigroup_add_cancel_comm_monoid_add : | |
| 258 | 'a cancel_comm_monoid_add -> 'a cancel_ab_semigroup_add; | |
| 259 | val comm_monoid_add_cancel_comm_monoid_add = | |
| 260 | #comm_monoid_add_cancel_comm_monoid_add : | |
| 261 | 'a cancel_comm_monoid_add -> 'a comm_monoid_add; | |
| 262 | ||
| 263 | type 'a semiring_0_cancel = | |
| 264 |   {cancel_comm_monoid_add_semiring_0_cancel : 'a cancel_comm_monoid_add,
 | |
| 265 | semiring_0_semiring_0_cancel : 'a semiring_0}; | |
| 266 | val cancel_comm_monoid_add_semiring_0_cancel = | |
| 267 | #cancel_comm_monoid_add_semiring_0_cancel : | |
| 268 | 'a semiring_0_cancel -> 'a cancel_comm_monoid_add; | |
| 269 | val semiring_0_semiring_0_cancel = #semiring_0_semiring_0_cancel : | |
| 270 | 'a semiring_0_cancel -> 'a semiring_0; | |
| 271 | ||
| 61128 | 272 | type 'a ab_semigroup_mult = | 
| 273 |   {semigroup_mult_ab_semigroup_mult : 'a semigroup_mult};
 | |
| 274 | val semigroup_mult_ab_semigroup_mult = #semigroup_mult_ab_semigroup_mult : | |
| 275 | 'a ab_semigroup_mult -> 'a semigroup_mult; | |
| 276 | ||
| 277 | type 'a comm_semiring = | |
| 278 |   {ab_semigroup_mult_comm_semiring : 'a ab_semigroup_mult,
 | |
| 279 | semiring_comm_semiring : 'a semiring}; | |
| 280 | val ab_semigroup_mult_comm_semiring = #ab_semigroup_mult_comm_semiring : | |
| 281 | 'a comm_semiring -> 'a ab_semigroup_mult; | |
| 282 | val semiring_comm_semiring = #semiring_comm_semiring : | |
| 283 | 'a comm_semiring -> 'a semiring; | |
| 284 | ||
| 55685 | 285 | type 'a comm_semiring_0 = | 
| 286 |   {comm_semiring_comm_semiring_0 : 'a comm_semiring,
 | |
| 287 | semiring_0_comm_semiring_0 : 'a semiring_0}; | |
| 288 | val comm_semiring_comm_semiring_0 = #comm_semiring_comm_semiring_0 : | |
| 289 | 'a comm_semiring_0 -> 'a comm_semiring; | |
| 290 | val semiring_0_comm_semiring_0 = #semiring_0_comm_semiring_0 : | |
| 291 | 'a comm_semiring_0 -> 'a semiring_0; | |
| 292 | ||
| 293 | type 'a comm_semiring_0_cancel = | |
| 294 |   {comm_semiring_0_comm_semiring_0_cancel : 'a comm_semiring_0,
 | |
| 295 | semiring_0_cancel_comm_semiring_0_cancel : 'a semiring_0_cancel}; | |
| 296 | val comm_semiring_0_comm_semiring_0_cancel = | |
| 297 | #comm_semiring_0_comm_semiring_0_cancel : | |
| 298 | 'a comm_semiring_0_cancel -> 'a comm_semiring_0; | |
| 299 | val semiring_0_cancel_comm_semiring_0_cancel = | |
| 300 | #semiring_0_cancel_comm_semiring_0_cancel : | |
| 301 | 'a comm_semiring_0_cancel -> 'a semiring_0_cancel; | |
| 302 | ||
| 303 | type 'a semiring_1_cancel = | |
| 304 |   {semiring_0_cancel_semiring_1_cancel : 'a semiring_0_cancel,
 | |
| 305 | semiring_1_semiring_1_cancel : 'a semiring_1}; | |
| 306 | val semiring_0_cancel_semiring_1_cancel = #semiring_0_cancel_semiring_1_cancel : | |
| 307 | 'a semiring_1_cancel -> 'a semiring_0_cancel; | |
| 308 | val semiring_1_semiring_1_cancel = #semiring_1_semiring_1_cancel : | |
| 309 | 'a semiring_1_cancel -> 'a semiring_1; | |
| 310 | ||
| 311 | type 'a comm_monoid_mult = | |
| 312 |   {ab_semigroup_mult_comm_monoid_mult : 'a ab_semigroup_mult,
 | |
| 61128 | 313 | monoid_mult_comm_monoid_mult : 'a monoid_mult, | 
| 314 | dvd_comm_monoid_mult : 'a dvd}; | |
| 55685 | 315 | val ab_semigroup_mult_comm_monoid_mult = #ab_semigroup_mult_comm_monoid_mult : | 
| 316 | 'a comm_monoid_mult -> 'a ab_semigroup_mult; | |
| 317 | val monoid_mult_comm_monoid_mult = #monoid_mult_comm_monoid_mult : | |
| 318 | 'a comm_monoid_mult -> 'a monoid_mult; | |
| 61128 | 319 | val dvd_comm_monoid_mult = #dvd_comm_monoid_mult : | 
| 320 | 'a comm_monoid_mult -> 'a dvd; | |
| 55685 | 321 | |
| 322 | type 'a comm_semiring_1 = | |
| 323 |   {comm_monoid_mult_comm_semiring_1 : 'a comm_monoid_mult,
 | |
| 324 | comm_semiring_0_comm_semiring_1 : 'a comm_semiring_0, | |
| 61128 | 325 | semiring_1_comm_semiring_1 : 'a semiring_1}; | 
| 55685 | 326 | val comm_monoid_mult_comm_semiring_1 = #comm_monoid_mult_comm_semiring_1 : | 
| 327 | 'a comm_semiring_1 -> 'a comm_monoid_mult; | |
| 328 | val comm_semiring_0_comm_semiring_1 = #comm_semiring_0_comm_semiring_1 : | |
| 329 | 'a comm_semiring_1 -> 'a comm_semiring_0; | |
| 330 | val semiring_1_comm_semiring_1 = #semiring_1_comm_semiring_1 : | |
| 331 | 'a comm_semiring_1 -> 'a semiring_1; | |
| 332 | ||
| 333 | type 'a comm_semiring_1_cancel = | |
| 334 |   {comm_semiring_0_cancel_comm_semiring_1_cancel : 'a comm_semiring_0_cancel,
 | |
| 335 | comm_semiring_1_comm_semiring_1_cancel : 'a comm_semiring_1, | |
| 336 | semiring_1_cancel_comm_semiring_1_cancel : 'a semiring_1_cancel}; | |
| 337 | val comm_semiring_0_cancel_comm_semiring_1_cancel = | |
| 338 | #comm_semiring_0_cancel_comm_semiring_1_cancel : | |
| 339 | 'a comm_semiring_1_cancel -> 'a comm_semiring_0_cancel; | |
| 340 | val comm_semiring_1_comm_semiring_1_cancel = | |
| 341 | #comm_semiring_1_comm_semiring_1_cancel : | |
| 342 | 'a comm_semiring_1_cancel -> 'a comm_semiring_1; | |
| 343 | val semiring_1_cancel_comm_semiring_1_cancel = | |
| 344 | #semiring_1_cancel_comm_semiring_1_cancel : | |
| 345 | 'a comm_semiring_1_cancel -> 'a semiring_1_cancel; | |
| 346 | ||
| 61128 | 347 | type 'a semidom = | 
| 65024 | 348 |   {comm_semiring_1_cancel_semidom : 'a comm_semiring_1_cancel,
 | 
| 349 | semiring_1_no_zero_divisors_semidom : 'a semiring_1_no_zero_divisors}; | |
| 350 | val comm_semiring_1_cancel_semidom = #comm_semiring_1_cancel_semidom : | |
| 351 | 'a semidom -> 'a comm_semiring_1_cancel; | |
| 61128 | 352 | val semiring_1_no_zero_divisors_semidom = #semiring_1_no_zero_divisors_semidom : | 
| 353 | 'a semidom -> 'a semiring_1_no_zero_divisors; | |
| 354 | ||
| 355 | val ab_semigroup_add_int = {semigroup_add_ab_semigroup_add = semigroup_add_int}
 | |
| 356 | : inta ab_semigroup_add; | |
| 357 | ||
| 358 | val monoid_add_int = | |
| 359 |   {semigroup_add_monoid_add = semigroup_add_int, zero_monoid_add = zero_int} :
 | |
| 360 | inta monoid_add; | |
| 361 | ||
| 362 | val comm_monoid_add_int = | |
| 363 |   {ab_semigroup_add_comm_monoid_add = ab_semigroup_add_int,
 | |
| 364 | monoid_add_comm_monoid_add = monoid_add_int} | |
| 365 | : inta comm_monoid_add; | |
| 366 | ||
| 367 | val mult_zero_int = {times_mult_zero = times_int, zero_mult_zero = zero_int} :
 | |
| 368 | inta mult_zero; | |
| 369 | ||
| 370 | val semigroup_mult_int = {times_semigroup_mult = times_int} :
 | |
| 371 | inta semigroup_mult; | |
| 372 | ||
| 373 | val semiring_int = | |
| 374 |   {ab_semigroup_add_semiring = ab_semigroup_add_int,
 | |
| 375 | semigroup_mult_semiring = semigroup_mult_int} | |
| 376 | : inta semiring; | |
| 55685 | 377 | |
| 61128 | 378 | val semiring_0_int = | 
| 379 |   {comm_monoid_add_semiring_0 = comm_monoid_add_int,
 | |
| 380 | mult_zero_semiring_0 = mult_zero_int, semiring_semiring_0 = semiring_int} | |
| 381 | : inta semiring_0; | |
| 382 | ||
| 383 | val semiring_no_zero_divisors_int = | |
| 384 |   {semiring_0_semiring_no_zero_divisors = semiring_0_int} :
 | |
| 385 | inta semiring_no_zero_divisors; | |
| 386 | ||
| 387 | val monoid_mult_int = | |
| 388 |   {semigroup_mult_monoid_mult = semigroup_mult_int,
 | |
| 389 | power_monoid_mult = power_int} | |
| 390 | : inta monoid_mult; | |
| 391 | ||
| 392 | val semiring_numeral_int = | |
| 393 |   {monoid_mult_semiring_numeral = monoid_mult_int,
 | |
| 394 | numeral_semiring_numeral = numeral_int, | |
| 395 | semiring_semiring_numeral = semiring_int} | |
| 396 | : inta semiring_numeral; | |
| 397 | ||
| 398 | val zero_neq_one_int = | |
| 399 |   {one_zero_neq_one = one_int, zero_zero_neq_one = zero_int} :
 | |
| 400 | inta zero_neq_one; | |
| 401 | ||
| 402 | val semiring_1_int = | |
| 403 |   {semiring_numeral_semiring_1 = semiring_numeral_int,
 | |
| 404 | semiring_0_semiring_1 = semiring_0_int, | |
| 405 | zero_neq_one_semiring_1 = zero_neq_one_int} | |
| 406 | : inta semiring_1; | |
| 407 | ||
| 408 | val semiring_1_no_zero_divisors_int = | |
| 409 |   {semiring_1_semiring_1_no_zero_divisors = semiring_1_int,
 | |
| 410 | semiring_no_zero_divisors_semiring_1_no_zero_divisors = | |
| 411 | semiring_no_zero_divisors_int} | |
| 412 | : inta semiring_1_no_zero_divisors; | |
| 55685 | 413 | |
| 414 | val cancel_semigroup_add_int = | |
| 415 |   {semigroup_add_cancel_semigroup_add = semigroup_add_int} :
 | |
| 416 | inta cancel_semigroup_add; | |
| 417 | ||
| 418 | val cancel_ab_semigroup_add_int = | |
| 419 |   {ab_semigroup_add_cancel_ab_semigroup_add = ab_semigroup_add_int,
 | |
| 61128 | 420 | cancel_semigroup_add_cancel_ab_semigroup_add = cancel_semigroup_add_int, | 
| 421 | minus_cancel_ab_semigroup_add = minus_int} | |
| 55685 | 422 | : inta cancel_ab_semigroup_add; | 
| 423 | ||
| 424 | val cancel_comm_monoid_add_int = | |
| 425 |   {cancel_ab_semigroup_add_cancel_comm_monoid_add = cancel_ab_semigroup_add_int,
 | |
| 426 | comm_monoid_add_cancel_comm_monoid_add = comm_monoid_add_int} | |
| 427 | : inta cancel_comm_monoid_add; | |
| 428 | ||
| 429 | val semiring_0_cancel_int = | |
| 430 |   {cancel_comm_monoid_add_semiring_0_cancel = cancel_comm_monoid_add_int,
 | |
| 431 | semiring_0_semiring_0_cancel = semiring_0_int} | |
| 432 | : inta semiring_0_cancel; | |
| 433 | ||
| 61128 | 434 | val ab_semigroup_mult_int = | 
| 435 |   {semigroup_mult_ab_semigroup_mult = semigroup_mult_int} :
 | |
| 436 | inta ab_semigroup_mult; | |
| 437 | ||
| 438 | val comm_semiring_int = | |
| 439 |   {ab_semigroup_mult_comm_semiring = ab_semigroup_mult_int,
 | |
| 440 | semiring_comm_semiring = semiring_int} | |
| 441 | : inta comm_semiring; | |
| 442 | ||
| 55685 | 443 | val comm_semiring_0_int = | 
| 444 |   {comm_semiring_comm_semiring_0 = comm_semiring_int,
 | |
| 445 | semiring_0_comm_semiring_0 = semiring_0_int} | |
| 446 | : inta comm_semiring_0; | |
| 447 | ||
| 448 | val comm_semiring_0_cancel_int = | |
| 449 |   {comm_semiring_0_comm_semiring_0_cancel = comm_semiring_0_int,
 | |
| 450 | semiring_0_cancel_comm_semiring_0_cancel = semiring_0_cancel_int} | |
| 451 | : inta comm_semiring_0_cancel; | |
| 452 | ||
| 453 | val semiring_1_cancel_int = | |
| 454 |   {semiring_0_cancel_semiring_1_cancel = semiring_0_cancel_int,
 | |
| 455 | semiring_1_semiring_1_cancel = semiring_1_int} | |
| 456 | : inta semiring_1_cancel; | |
| 457 | ||
| 458 | val comm_monoid_mult_int = | |
| 459 |   {ab_semigroup_mult_comm_monoid_mult = ab_semigroup_mult_int,
 | |
| 61128 | 460 | monoid_mult_comm_monoid_mult = monoid_mult_int, | 
| 461 | dvd_comm_monoid_mult = dvd_int} | |
| 55685 | 462 | : inta comm_monoid_mult; | 
| 463 | ||
| 464 | val comm_semiring_1_int = | |
| 465 |   {comm_monoid_mult_comm_semiring_1 = comm_monoid_mult_int,
 | |
| 466 | comm_semiring_0_comm_semiring_1 = comm_semiring_0_int, | |
| 61128 | 467 | semiring_1_comm_semiring_1 = semiring_1_int} | 
| 55685 | 468 | : inta comm_semiring_1; | 
| 469 | ||
| 470 | val comm_semiring_1_cancel_int = | |
| 471 |   {comm_semiring_0_cancel_comm_semiring_1_cancel = comm_semiring_0_cancel_int,
 | |
| 472 | comm_semiring_1_comm_semiring_1_cancel = comm_semiring_1_int, | |
| 473 | semiring_1_cancel_comm_semiring_1_cancel = semiring_1_cancel_int} | |
| 474 | : inta comm_semiring_1_cancel; | |
| 475 | ||
| 61128 | 476 | val semidom_int = | 
| 65024 | 477 |   {comm_semiring_1_cancel_semidom = comm_semiring_1_cancel_int,
 | 
| 478 | semiring_1_no_zero_divisors_semidom = semiring_1_no_zero_divisors_int} | |
| 61128 | 479 | : inta semidom; | 
| 480 | ||
| 481 | type 'a semiring_no_zero_divisors_cancel = | |
| 482 |   {semiring_no_zero_divisors_semiring_no_zero_divisors_cancel :
 | |
| 483 | 'a semiring_no_zero_divisors}; | |
| 484 | val semiring_no_zero_divisors_semiring_no_zero_divisors_cancel = | |
| 485 | #semiring_no_zero_divisors_semiring_no_zero_divisors_cancel : | |
| 486 | 'a semiring_no_zero_divisors_cancel -> 'a semiring_no_zero_divisors; | |
| 487 | ||
| 488 | type 'a semidom_divide = | |
| 489 |   {divide_semidom_divide : 'a divide, semidom_semidom_divide : 'a semidom,
 | |
| 490 | semiring_no_zero_divisors_cancel_semidom_divide : | |
| 491 | 'a semiring_no_zero_divisors_cancel}; | |
| 492 | val divide_semidom_divide = #divide_semidom_divide : | |
| 493 | 'a semidom_divide -> 'a divide; | |
| 494 | val semidom_semidom_divide = #semidom_semidom_divide : | |
| 495 | 'a semidom_divide -> 'a semidom; | |
| 496 | val semiring_no_zero_divisors_cancel_semidom_divide = | |
| 497 | #semiring_no_zero_divisors_cancel_semidom_divide : | |
| 498 | 'a semidom_divide -> 'a semiring_no_zero_divisors_cancel; | |
| 499 | ||
| 500 | val semiring_no_zero_divisors_cancel_int = | |
| 501 |   {semiring_no_zero_divisors_semiring_no_zero_divisors_cancel =
 | |
| 502 | semiring_no_zero_divisors_int} | |
| 503 | : inta semiring_no_zero_divisors_cancel; | |
| 504 | ||
| 505 | val semidom_divide_int = | |
| 506 |   {divide_semidom_divide = divide_int, semidom_semidom_divide = semidom_int,
 | |
| 507 | semiring_no_zero_divisors_cancel_semidom_divide = | |
| 508 | semiring_no_zero_divisors_cancel_int} | |
| 509 | : inta semidom_divide; | |
| 510 | ||
| 70093 | 511 | type 'a algebraic_semidom = | 
| 512 |   {semidom_divide_algebraic_semidom : 'a semidom_divide};
 | |
| 513 | val semidom_divide_algebraic_semidom = #semidom_divide_algebraic_semidom : | |
| 514 | 'a algebraic_semidom -> 'a semidom_divide; | |
| 515 | ||
| 65024 | 516 | type 'a semiring_modulo = | 
| 517 |   {comm_semiring_1_cancel_semiring_modulo : 'a comm_semiring_1_cancel,
 | |
| 518 | modulo_semiring_modulo : 'a modulo}; | |
| 519 | val comm_semiring_1_cancel_semiring_modulo = | |
| 520 | #comm_semiring_1_cancel_semiring_modulo : | |
| 521 | 'a semiring_modulo -> 'a comm_semiring_1_cancel; | |
| 522 | val modulo_semiring_modulo = #modulo_semiring_modulo : | |
| 523 | 'a semiring_modulo -> 'a modulo; | |
| 524 | ||
| 525 | type 'a semidom_modulo = | |
| 526 |   {algebraic_semidom_semidom_modulo : 'a algebraic_semidom,
 | |
| 527 | semiring_modulo_semidom_modulo : 'a semiring_modulo}; | |
| 528 | val algebraic_semidom_semidom_modulo = #algebraic_semidom_semidom_modulo : | |
| 529 | 'a semidom_modulo -> 'a algebraic_semidom; | |
| 530 | val semiring_modulo_semidom_modulo = #semiring_modulo_semidom_modulo : | |
| 531 | 'a semidom_modulo -> 'a semiring_modulo; | |
| 532 | ||
| 70093 | 533 | val algebraic_semidom_int = | 
| 534 |   {semidom_divide_algebraic_semidom = semidom_divide_int} :
 | |
| 535 | inta algebraic_semidom; | |
| 536 | ||
| 537 | val semiring_modulo_int = | |
| 538 |   {comm_semiring_1_cancel_semiring_modulo = comm_semiring_1_cancel_int,
 | |
| 539 | modulo_semiring_modulo = modulo_int} | |
| 540 | : inta semiring_modulo; | |
| 541 | ||
| 65024 | 542 | val semidom_modulo_int = | 
| 543 |   {algebraic_semidom_semidom_modulo = algebraic_semidom_int,
 | |
| 544 | semiring_modulo_semidom_modulo = semiring_modulo_int} | |
| 545 | : inta semidom_modulo; | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 546 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 547 | datatype nat = Nat of int; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 548 | |
| 55685 | 549 | fun integer_of_nat (Nat x) = x; | 
| 550 | ||
| 551 | fun equal_nat m n = integer_of_nat m = integer_of_nat n; | |
| 552 | ||
| 61128 | 553 | datatype numa = C of inta | Bound of nat | CN of nat * inta * numa | Neg of numa | 
| 55685 | 554 | | Add of numa * numa | Sub of numa * numa | Mul of inta * numa; | 
| 555 | ||
| 61128 | 556 | fun equal_numa (Sub (x61, x62)) (Mul (x71, x72)) = false | 
| 557 | | equal_numa (Mul (x71, x72)) (Sub (x61, x62)) = false | |
| 558 | | equal_numa (Add (x51, x52)) (Mul (x71, x72)) = false | |
| 559 | | equal_numa (Mul (x71, x72)) (Add (x51, x52)) = false | |
| 560 | | equal_numa (Add (x51, x52)) (Sub (x61, x62)) = false | |
| 561 | | equal_numa (Sub (x61, x62)) (Add (x51, x52)) = false | |
| 562 | | equal_numa (Neg x4) (Mul (x71, x72)) = false | |
| 563 | | equal_numa (Mul (x71, x72)) (Neg x4) = false | |
| 564 | | equal_numa (Neg x4) (Sub (x61, x62)) = false | |
| 565 | | equal_numa (Sub (x61, x62)) (Neg x4) = false | |
| 566 | | equal_numa (Neg x4) (Add (x51, x52)) = false | |
| 567 | | equal_numa (Add (x51, x52)) (Neg x4) = false | |
| 568 | | equal_numa (CN (x31, x32, x33)) (Mul (x71, x72)) = false | |
| 569 | | equal_numa (Mul (x71, x72)) (CN (x31, x32, x33)) = false | |
| 570 | | equal_numa (CN (x31, x32, x33)) (Sub (x61, x62)) = false | |
| 571 | | equal_numa (Sub (x61, x62)) (CN (x31, x32, x33)) = false | |
| 572 | | equal_numa (CN (x31, x32, x33)) (Add (x51, x52)) = false | |
| 573 | | equal_numa (Add (x51, x52)) (CN (x31, x32, x33)) = false | |
| 574 | | equal_numa (CN (x31, x32, x33)) (Neg x4) = false | |
| 575 | | equal_numa (Neg x4) (CN (x31, x32, x33)) = false | |
| 576 | | equal_numa (Bound x2) (Mul (x71, x72)) = false | |
| 577 | | equal_numa (Mul (x71, x72)) (Bound x2) = false | |
| 578 | | equal_numa (Bound x2) (Sub (x61, x62)) = false | |
| 579 | | equal_numa (Sub (x61, x62)) (Bound x2) = false | |
| 580 | | equal_numa (Bound x2) (Add (x51, x52)) = false | |
| 581 | | equal_numa (Add (x51, x52)) (Bound x2) = false | |
| 582 | | equal_numa (Bound x2) (Neg x4) = false | |
| 583 | | equal_numa (Neg x4) (Bound x2) = false | |
| 584 | | equal_numa (Bound x2) (CN (x31, x32, x33)) = false | |
| 585 | | equal_numa (CN (x31, x32, x33)) (Bound x2) = false | |
| 586 | | equal_numa (C x1) (Mul (x71, x72)) = false | |
| 587 | | equal_numa (Mul (x71, x72)) (C x1) = false | |
| 588 | | equal_numa (C x1) (Sub (x61, x62)) = false | |
| 589 | | equal_numa (Sub (x61, x62)) (C x1) = false | |
| 590 | | equal_numa (C x1) (Add (x51, x52)) = false | |
| 591 | | equal_numa (Add (x51, x52)) (C x1) = false | |
| 592 | | equal_numa (C x1) (Neg x4) = false | |
| 593 | | equal_numa (Neg x4) (C x1) = false | |
| 594 | | equal_numa (C x1) (CN (x31, x32, x33)) = false | |
| 595 | | equal_numa (CN (x31, x32, x33)) (C x1) = false | |
| 596 | | equal_numa (C x1) (Bound x2) = false | |
| 597 | | equal_numa (Bound x2) (C x1) = false | |
| 598 | | equal_numa (Mul (x71, x72)) (Mul (y71, y72)) = | |
| 599 | equal_inta x71 y71 andalso equal_numa x72 y72 | |
| 600 | | equal_numa (Sub (x61, x62)) (Sub (y61, y62)) = | |
| 601 | equal_numa x61 y61 andalso equal_numa x62 y62 | |
| 602 | | equal_numa (Add (x51, x52)) (Add (y51, y52)) = | |
| 603 | equal_numa x51 y51 andalso equal_numa x52 y52 | |
| 604 | | equal_numa (Neg x4) (Neg y4) = equal_numa x4 y4 | |
| 605 | | equal_numa (CN (x31, x32, x33)) (CN (y31, y32, y33)) = | |
| 606 | equal_nat x31 y31 andalso (equal_inta x32 y32 andalso equal_numa x33 y33) | |
| 607 | | equal_numa (Bound x2) (Bound y2) = equal_nat x2 y2 | |
| 608 | | equal_numa (C x1) (C y1) = equal_inta x1 y1; | |
| 55685 | 609 | |
| 610 | val equal_num = {equal = equal_numa} : numa equal;
 | |
| 29787 | 611 | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 612 | type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};
 | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 613 | val less_eq = #less_eq : 'a ord -> 'a -> 'a -> bool; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 614 | val less = #less : 'a ord -> 'a -> 'a -> bool; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 615 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 616 | val ord_integer = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 617 |   {less_eq = (fn a => fn b => a <= b), less = (fn a => fn b => a < b)} :
 | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 618 | int ord; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 619 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 620 | datatype fm = T | F | Lt of numa | Le of numa | Gt of numa | Ge of numa | | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 621 | Eq of numa | NEq of numa | Dvd of inta * numa | NDvd of inta * numa | | 
| 74531 | 622 | Not of fm | And of fm * fm | Or of fm * fm | Imp of fm * fm | Iff of fm * fm | | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 623 | E of fm | A of fm | Closed of nat | NClosed of nat; | 
| 29787 | 624 | |
| 55685 | 625 | fun id x = (fn xa => xa) x; | 
| 626 | ||
| 627 | fun eq A_ a b = equal A_ a b; | |
| 628 | ||
| 629 | fun plus_nat m n = Nat (integer_of_nat m + integer_of_nat n); | |
| 630 | ||
| 631 | val one_nat : nat = Nat (1 : IntInf.int); | |
| 632 | ||
| 633 | fun suc n = plus_nat n one_nat; | |
| 29787 | 634 | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 635 | fun disjuncts (Or (p, q)) = disjuncts p @ disjuncts q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 636 | | disjuncts F = [] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 637 | | disjuncts T = [T] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 638 | | disjuncts (Lt v) = [Lt v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 639 | | disjuncts (Le v) = [Le v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 640 | | disjuncts (Gt v) = [Gt v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 641 | | disjuncts (Ge v) = [Ge v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 642 | | disjuncts (Eq v) = [Eq v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 643 | | disjuncts (NEq v) = [NEq v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 644 | | disjuncts (Dvd (v, va)) = [Dvd (v, va)] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 645 | | disjuncts (NDvd (v, va)) = [NDvd (v, va)] | 
| 74531 | 646 | | disjuncts (Not v) = [Not v] | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 647 | | disjuncts (And (v, va)) = [And (v, va)] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 648 | | disjuncts (Imp (v, va)) = [Imp (v, va)] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 649 | | disjuncts (Iff (v, va)) = [Iff (v, va)] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 650 | | disjuncts (E v) = [E v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 651 | | disjuncts (A v) = [A v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 652 | | disjuncts (Closed v) = [Closed v] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 653 | | disjuncts (NClosed v) = [NClosed v]; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 654 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 655 | fun foldr f [] = id | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 656 | | foldr f (x :: xs) = f x o foldr f xs; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 657 | |
| 61128 | 658 | fun equal_fm (Closed x18) (NClosed x19) = false | 
| 659 | | equal_fm (NClosed x19) (Closed x18) = false | |
| 660 | | equal_fm (A x17) (NClosed x19) = false | |
| 661 | | equal_fm (NClosed x19) (A x17) = false | |
| 662 | | equal_fm (A x17) (Closed x18) = false | |
| 663 | | equal_fm (Closed x18) (A x17) = false | |
| 664 | | equal_fm (E x16) (NClosed x19) = false | |
| 665 | | equal_fm (NClosed x19) (E x16) = false | |
| 666 | | equal_fm (E x16) (Closed x18) = false | |
| 667 | | equal_fm (Closed x18) (E x16) = false | |
| 668 | | equal_fm (E x16) (A x17) = false | |
| 669 | | equal_fm (A x17) (E x16) = false | |
| 670 | | equal_fm (Iff (x151, x152)) (NClosed x19) = false | |
| 671 | | equal_fm (NClosed x19) (Iff (x151, x152)) = false | |
| 672 | | equal_fm (Iff (x151, x152)) (Closed x18) = false | |
| 673 | | equal_fm (Closed x18) (Iff (x151, x152)) = false | |
| 674 | | equal_fm (Iff (x151, x152)) (A x17) = false | |
| 675 | | equal_fm (A x17) (Iff (x151, x152)) = false | |
| 676 | | equal_fm (Iff (x151, x152)) (E x16) = false | |
| 677 | | equal_fm (E x16) (Iff (x151, x152)) = false | |
| 678 | | equal_fm (Imp (x141, x142)) (NClosed x19) = false | |
| 679 | | equal_fm (NClosed x19) (Imp (x141, x142)) = false | |
| 680 | | equal_fm (Imp (x141, x142)) (Closed x18) = false | |
| 681 | | equal_fm (Closed x18) (Imp (x141, x142)) = false | |
| 682 | | equal_fm (Imp (x141, x142)) (A x17) = false | |
| 683 | | equal_fm (A x17) (Imp (x141, x142)) = false | |
| 684 | | equal_fm (Imp (x141, x142)) (E x16) = false | |
| 685 | | equal_fm (E x16) (Imp (x141, x142)) = false | |
| 686 | | equal_fm (Imp (x141, x142)) (Iff (x151, x152)) = false | |
| 687 | | equal_fm (Iff (x151, x152)) (Imp (x141, x142)) = false | |
| 688 | | equal_fm (Or (x131, x132)) (NClosed x19) = false | |
| 689 | | equal_fm (NClosed x19) (Or (x131, x132)) = false | |
| 690 | | equal_fm (Or (x131, x132)) (Closed x18) = false | |
| 691 | | equal_fm (Closed x18) (Or (x131, x132)) = false | |
| 692 | | equal_fm (Or (x131, x132)) (A x17) = false | |
| 693 | | equal_fm (A x17) (Or (x131, x132)) = false | |
| 694 | | equal_fm (Or (x131, x132)) (E x16) = false | |
| 695 | | equal_fm (E x16) (Or (x131, x132)) = false | |
| 696 | | equal_fm (Or (x131, x132)) (Iff (x151, x152)) = false | |
| 697 | | equal_fm (Iff (x151, x152)) (Or (x131, x132)) = false | |
| 698 | | equal_fm (Or (x131, x132)) (Imp (x141, x142)) = false | |
| 699 | | equal_fm (Imp (x141, x142)) (Or (x131, x132)) = false | |
| 700 | | equal_fm (And (x121, x122)) (NClosed x19) = false | |
| 701 | | equal_fm (NClosed x19) (And (x121, x122)) = false | |
| 702 | | equal_fm (And (x121, x122)) (Closed x18) = false | |
| 703 | | equal_fm (Closed x18) (And (x121, x122)) = false | |
| 704 | | equal_fm (And (x121, x122)) (A x17) = false | |
| 705 | | equal_fm (A x17) (And (x121, x122)) = false | |
| 706 | | equal_fm (And (x121, x122)) (E x16) = false | |
| 707 | | equal_fm (E x16) (And (x121, x122)) = false | |
| 708 | | equal_fm (And (x121, x122)) (Iff (x151, x152)) = false | |
| 709 | | equal_fm (Iff (x151, x152)) (And (x121, x122)) = false | |
| 710 | | equal_fm (And (x121, x122)) (Imp (x141, x142)) = false | |
| 711 | | equal_fm (Imp (x141, x142)) (And (x121, x122)) = false | |
| 712 | | equal_fm (And (x121, x122)) (Or (x131, x132)) = false | |
| 713 | | equal_fm (Or (x131, x132)) (And (x121, x122)) = false | |
| 74531 | 714 | | equal_fm (Not x11) (NClosed x19) = false | 
| 715 | | equal_fm (NClosed x19) (Not x11) = false | |
| 716 | | equal_fm (Not x11) (Closed x18) = false | |
| 717 | | equal_fm (Closed x18) (Not x11) = false | |
| 718 | | equal_fm (Not x11) (A x17) = false | |
| 719 | | equal_fm (A x17) (Not x11) = false | |
| 720 | | equal_fm (Not x11) (E x16) = false | |
| 721 | | equal_fm (E x16) (Not x11) = false | |
| 722 | | equal_fm (Not x11) (Iff (x151, x152)) = false | |
| 723 | | equal_fm (Iff (x151, x152)) (Not x11) = false | |
| 724 | | equal_fm (Not x11) (Imp (x141, x142)) = false | |
| 725 | | equal_fm (Imp (x141, x142)) (Not x11) = false | |
| 726 | | equal_fm (Not x11) (Or (x131, x132)) = false | |
| 727 | | equal_fm (Or (x131, x132)) (Not x11) = false | |
| 728 | | equal_fm (Not x11) (And (x121, x122)) = false | |
| 729 | | equal_fm (And (x121, x122)) (Not x11) = false | |
| 61128 | 730 | | equal_fm (NDvd (x101, x102)) (NClosed x19) = false | 
| 731 | | equal_fm (NClosed x19) (NDvd (x101, x102)) = false | |
| 732 | | equal_fm (NDvd (x101, x102)) (Closed x18) = false | |
| 733 | | equal_fm (Closed x18) (NDvd (x101, x102)) = false | |
| 734 | | equal_fm (NDvd (x101, x102)) (A x17) = false | |
| 735 | | equal_fm (A x17) (NDvd (x101, x102)) = false | |
| 736 | | equal_fm (NDvd (x101, x102)) (E x16) = false | |
| 737 | | equal_fm (E x16) (NDvd (x101, x102)) = false | |
| 738 | | equal_fm (NDvd (x101, x102)) (Iff (x151, x152)) = false | |
| 739 | | equal_fm (Iff (x151, x152)) (NDvd (x101, x102)) = false | |
| 740 | | equal_fm (NDvd (x101, x102)) (Imp (x141, x142)) = false | |
| 741 | | equal_fm (Imp (x141, x142)) (NDvd (x101, x102)) = false | |
| 742 | | equal_fm (NDvd (x101, x102)) (Or (x131, x132)) = false | |
| 743 | | equal_fm (Or (x131, x132)) (NDvd (x101, x102)) = false | |
| 744 | | equal_fm (NDvd (x101, x102)) (And (x121, x122)) = false | |
| 745 | | equal_fm (And (x121, x122)) (NDvd (x101, x102)) = false | |
| 74531 | 746 | | equal_fm (NDvd (x101, x102)) (Not x11) = false | 
| 747 | | equal_fm (Not x11) (NDvd (x101, x102)) = false | |
| 61128 | 748 | | equal_fm (Dvd (x91, x92)) (NClosed x19) = false | 
| 749 | | equal_fm (NClosed x19) (Dvd (x91, x92)) = false | |
| 750 | | equal_fm (Dvd (x91, x92)) (Closed x18) = false | |
| 751 | | equal_fm (Closed x18) (Dvd (x91, x92)) = false | |
| 752 | | equal_fm (Dvd (x91, x92)) (A x17) = false | |
| 753 | | equal_fm (A x17) (Dvd (x91, x92)) = false | |
| 754 | | equal_fm (Dvd (x91, x92)) (E x16) = false | |
| 755 | | equal_fm (E x16) (Dvd (x91, x92)) = false | |
| 756 | | equal_fm (Dvd (x91, x92)) (Iff (x151, x152)) = false | |
| 757 | | equal_fm (Iff (x151, x152)) (Dvd (x91, x92)) = false | |
| 758 | | equal_fm (Dvd (x91, x92)) (Imp (x141, x142)) = false | |
| 759 | | equal_fm (Imp (x141, x142)) (Dvd (x91, x92)) = false | |
| 760 | | equal_fm (Dvd (x91, x92)) (Or (x131, x132)) = false | |
| 761 | | equal_fm (Or (x131, x132)) (Dvd (x91, x92)) = false | |
| 762 | | equal_fm (Dvd (x91, x92)) (And (x121, x122)) = false | |
| 763 | | equal_fm (And (x121, x122)) (Dvd (x91, x92)) = false | |
| 74531 | 764 | | equal_fm (Dvd (x91, x92)) (Not x11) = false | 
| 765 | | equal_fm (Not x11) (Dvd (x91, x92)) = false | |
| 61128 | 766 | | equal_fm (Dvd (x91, x92)) (NDvd (x101, x102)) = false | 
| 767 | | equal_fm (NDvd (x101, x102)) (Dvd (x91, x92)) = false | |
| 768 | | equal_fm (NEq x8) (NClosed x19) = false | |
| 769 | | equal_fm (NClosed x19) (NEq x8) = false | |
| 770 | | equal_fm (NEq x8) (Closed x18) = false | |
| 771 | | equal_fm (Closed x18) (NEq x8) = false | |
| 772 | | equal_fm (NEq x8) (A x17) = false | |
| 773 | | equal_fm (A x17) (NEq x8) = false | |
| 774 | | equal_fm (NEq x8) (E x16) = false | |
| 775 | | equal_fm (E x16) (NEq x8) = false | |
| 776 | | equal_fm (NEq x8) (Iff (x151, x152)) = false | |
| 777 | | equal_fm (Iff (x151, x152)) (NEq x8) = false | |
| 778 | | equal_fm (NEq x8) (Imp (x141, x142)) = false | |
| 779 | | equal_fm (Imp (x141, x142)) (NEq x8) = false | |
| 780 | | equal_fm (NEq x8) (Or (x131, x132)) = false | |
| 781 | | equal_fm (Or (x131, x132)) (NEq x8) = false | |
| 782 | | equal_fm (NEq x8) (And (x121, x122)) = false | |
| 783 | | equal_fm (And (x121, x122)) (NEq x8) = false | |
| 74531 | 784 | | equal_fm (NEq x8) (Not x11) = false | 
| 785 | | equal_fm (Not x11) (NEq x8) = false | |
| 61128 | 786 | | equal_fm (NEq x8) (NDvd (x101, x102)) = false | 
| 787 | | equal_fm (NDvd (x101, x102)) (NEq x8) = false | |
| 788 | | equal_fm (NEq x8) (Dvd (x91, x92)) = false | |
| 789 | | equal_fm (Dvd (x91, x92)) (NEq x8) = false | |
| 790 | | equal_fm (Eq x7) (NClosed x19) = false | |
| 791 | | equal_fm (NClosed x19) (Eq x7) = false | |
| 792 | | equal_fm (Eq x7) (Closed x18) = false | |
| 793 | | equal_fm (Closed x18) (Eq x7) = false | |
| 794 | | equal_fm (Eq x7) (A x17) = false | |
| 795 | | equal_fm (A x17) (Eq x7) = false | |
| 796 | | equal_fm (Eq x7) (E x16) = false | |
| 797 | | equal_fm (E x16) (Eq x7) = false | |
| 798 | | equal_fm (Eq x7) (Iff (x151, x152)) = false | |
| 799 | | equal_fm (Iff (x151, x152)) (Eq x7) = false | |
| 800 | | equal_fm (Eq x7) (Imp (x141, x142)) = false | |
| 801 | | equal_fm (Imp (x141, x142)) (Eq x7) = false | |
| 802 | | equal_fm (Eq x7) (Or (x131, x132)) = false | |
| 803 | | equal_fm (Or (x131, x132)) (Eq x7) = false | |
| 804 | | equal_fm (Eq x7) (And (x121, x122)) = false | |
| 805 | | equal_fm (And (x121, x122)) (Eq x7) = false | |
| 74531 | 806 | | equal_fm (Eq x7) (Not x11) = false | 
| 807 | | equal_fm (Not x11) (Eq x7) = false | |
| 61128 | 808 | | equal_fm (Eq x7) (NDvd (x101, x102)) = false | 
| 809 | | equal_fm (NDvd (x101, x102)) (Eq x7) = false | |
| 810 | | equal_fm (Eq x7) (Dvd (x91, x92)) = false | |
| 811 | | equal_fm (Dvd (x91, x92)) (Eq x7) = false | |
| 812 | | equal_fm (Eq x7) (NEq x8) = false | |
| 813 | | equal_fm (NEq x8) (Eq x7) = false | |
| 814 | | equal_fm (Ge x6) (NClosed x19) = false | |
| 815 | | equal_fm (NClosed x19) (Ge x6) = false | |
| 816 | | equal_fm (Ge x6) (Closed x18) = false | |
| 817 | | equal_fm (Closed x18) (Ge x6) = false | |
| 818 | | equal_fm (Ge x6) (A x17) = false | |
| 819 | | equal_fm (A x17) (Ge x6) = false | |
| 820 | | equal_fm (Ge x6) (E x16) = false | |
| 821 | | equal_fm (E x16) (Ge x6) = false | |
| 822 | | equal_fm (Ge x6) (Iff (x151, x152)) = false | |
| 823 | | equal_fm (Iff (x151, x152)) (Ge x6) = false | |
| 824 | | equal_fm (Ge x6) (Imp (x141, x142)) = false | |
| 825 | | equal_fm (Imp (x141, x142)) (Ge x6) = false | |
| 826 | | equal_fm (Ge x6) (Or (x131, x132)) = false | |
| 827 | | equal_fm (Or (x131, x132)) (Ge x6) = false | |
| 828 | | equal_fm (Ge x6) (And (x121, x122)) = false | |
| 829 | | equal_fm (And (x121, x122)) (Ge x6) = false | |
| 74531 | 830 | | equal_fm (Ge x6) (Not x11) = false | 
| 831 | | equal_fm (Not x11) (Ge x6) = false | |
| 61128 | 832 | | equal_fm (Ge x6) (NDvd (x101, x102)) = false | 
| 833 | | equal_fm (NDvd (x101, x102)) (Ge x6) = false | |
| 834 | | equal_fm (Ge x6) (Dvd (x91, x92)) = false | |
| 835 | | equal_fm (Dvd (x91, x92)) (Ge x6) = false | |
| 836 | | equal_fm (Ge x6) (NEq x8) = false | |
| 837 | | equal_fm (NEq x8) (Ge x6) = false | |
| 838 | | equal_fm (Ge x6) (Eq x7) = false | |
| 839 | | equal_fm (Eq x7) (Ge x6) = false | |
| 840 | | equal_fm (Gt x5) (NClosed x19) = false | |
| 841 | | equal_fm (NClosed x19) (Gt x5) = false | |
| 842 | | equal_fm (Gt x5) (Closed x18) = false | |
| 843 | | equal_fm (Closed x18) (Gt x5) = false | |
| 844 | | equal_fm (Gt x5) (A x17) = false | |
| 845 | | equal_fm (A x17) (Gt x5) = false | |
| 846 | | equal_fm (Gt x5) (E x16) = false | |
| 847 | | equal_fm (E x16) (Gt x5) = false | |
| 848 | | equal_fm (Gt x5) (Iff (x151, x152)) = false | |
| 849 | | equal_fm (Iff (x151, x152)) (Gt x5) = false | |
| 850 | | equal_fm (Gt x5) (Imp (x141, x142)) = false | |
| 851 | | equal_fm (Imp (x141, x142)) (Gt x5) = false | |
| 852 | | equal_fm (Gt x5) (Or (x131, x132)) = false | |
| 853 | | equal_fm (Or (x131, x132)) (Gt x5) = false | |
| 854 | | equal_fm (Gt x5) (And (x121, x122)) = false | |
| 855 | | equal_fm (And (x121, x122)) (Gt x5) = false | |
| 74531 | 856 | | equal_fm (Gt x5) (Not x11) = false | 
| 857 | | equal_fm (Not x11) (Gt x5) = false | |
| 61128 | 858 | | equal_fm (Gt x5) (NDvd (x101, x102)) = false | 
| 859 | | equal_fm (NDvd (x101, x102)) (Gt x5) = false | |
| 860 | | equal_fm (Gt x5) (Dvd (x91, x92)) = false | |
| 861 | | equal_fm (Dvd (x91, x92)) (Gt x5) = false | |
| 862 | | equal_fm (Gt x5) (NEq x8) = false | |
| 863 | | equal_fm (NEq x8) (Gt x5) = false | |
| 864 | | equal_fm (Gt x5) (Eq x7) = false | |
| 865 | | equal_fm (Eq x7) (Gt x5) = false | |
| 866 | | equal_fm (Gt x5) (Ge x6) = false | |
| 867 | | equal_fm (Ge x6) (Gt x5) = false | |
| 868 | | equal_fm (Le x4) (NClosed x19) = false | |
| 869 | | equal_fm (NClosed x19) (Le x4) = false | |
| 870 | | equal_fm (Le x4) (Closed x18) = false | |
| 871 | | equal_fm (Closed x18) (Le x4) = false | |
| 872 | | equal_fm (Le x4) (A x17) = false | |
| 873 | | equal_fm (A x17) (Le x4) = false | |
| 874 | | equal_fm (Le x4) (E x16) = false | |
| 875 | | equal_fm (E x16) (Le x4) = false | |
| 876 | | equal_fm (Le x4) (Iff (x151, x152)) = false | |
| 877 | | equal_fm (Iff (x151, x152)) (Le x4) = false | |
| 878 | | equal_fm (Le x4) (Imp (x141, x142)) = false | |
| 879 | | equal_fm (Imp (x141, x142)) (Le x4) = false | |
| 880 | | equal_fm (Le x4) (Or (x131, x132)) = false | |
| 881 | | equal_fm (Or (x131, x132)) (Le x4) = false | |
| 882 | | equal_fm (Le x4) (And (x121, x122)) = false | |
| 883 | | equal_fm (And (x121, x122)) (Le x4) = false | |
| 74531 | 884 | | equal_fm (Le x4) (Not x11) = false | 
| 885 | | equal_fm (Not x11) (Le x4) = false | |
| 61128 | 886 | | equal_fm (Le x4) (NDvd (x101, x102)) = false | 
| 887 | | equal_fm (NDvd (x101, x102)) (Le x4) = false | |
| 888 | | equal_fm (Le x4) (Dvd (x91, x92)) = false | |
| 889 | | equal_fm (Dvd (x91, x92)) (Le x4) = false | |
| 890 | | equal_fm (Le x4) (NEq x8) = false | |
| 891 | | equal_fm (NEq x8) (Le x4) = false | |
| 892 | | equal_fm (Le x4) (Eq x7) = false | |
| 893 | | equal_fm (Eq x7) (Le x4) = false | |
| 894 | | equal_fm (Le x4) (Ge x6) = false | |
| 895 | | equal_fm (Ge x6) (Le x4) = false | |
| 896 | | equal_fm (Le x4) (Gt x5) = false | |
| 897 | | equal_fm (Gt x5) (Le x4) = false | |
| 898 | | equal_fm (Lt x3) (NClosed x19) = false | |
| 899 | | equal_fm (NClosed x19) (Lt x3) = false | |
| 900 | | equal_fm (Lt x3) (Closed x18) = false | |
| 901 | | equal_fm (Closed x18) (Lt x3) = false | |
| 902 | | equal_fm (Lt x3) (A x17) = false | |
| 903 | | equal_fm (A x17) (Lt x3) = false | |
| 904 | | equal_fm (Lt x3) (E x16) = false | |
| 905 | | equal_fm (E x16) (Lt x3) = false | |
| 906 | | equal_fm (Lt x3) (Iff (x151, x152)) = false | |
| 907 | | equal_fm (Iff (x151, x152)) (Lt x3) = false | |
| 908 | | equal_fm (Lt x3) (Imp (x141, x142)) = false | |
| 909 | | equal_fm (Imp (x141, x142)) (Lt x3) = false | |
| 910 | | equal_fm (Lt x3) (Or (x131, x132)) = false | |
| 911 | | equal_fm (Or (x131, x132)) (Lt x3) = false | |
| 912 | | equal_fm (Lt x3) (And (x121, x122)) = false | |
| 913 | | equal_fm (And (x121, x122)) (Lt x3) = false | |
| 74531 | 914 | | equal_fm (Lt x3) (Not x11) = false | 
| 915 | | equal_fm (Not x11) (Lt x3) = false | |
| 61128 | 916 | | equal_fm (Lt x3) (NDvd (x101, x102)) = false | 
| 917 | | equal_fm (NDvd (x101, x102)) (Lt x3) = false | |
| 918 | | equal_fm (Lt x3) (Dvd (x91, x92)) = false | |
| 919 | | equal_fm (Dvd (x91, x92)) (Lt x3) = false | |
| 920 | | equal_fm (Lt x3) (NEq x8) = false | |
| 921 | | equal_fm (NEq x8) (Lt x3) = false | |
| 922 | | equal_fm (Lt x3) (Eq x7) = false | |
| 923 | | equal_fm (Eq x7) (Lt x3) = false | |
| 924 | | equal_fm (Lt x3) (Ge x6) = false | |
| 925 | | equal_fm (Ge x6) (Lt x3) = false | |
| 926 | | equal_fm (Lt x3) (Gt x5) = false | |
| 927 | | equal_fm (Gt x5) (Lt x3) = false | |
| 928 | | equal_fm (Lt x3) (Le x4) = false | |
| 929 | | equal_fm (Le x4) (Lt x3) = false | |
| 930 | | equal_fm F (NClosed x19) = false | |
| 931 | | equal_fm (NClosed x19) F = false | |
| 932 | | equal_fm F (Closed x18) = false | |
| 933 | | equal_fm (Closed x18) F = false | |
| 934 | | equal_fm F (A x17) = false | |
| 935 | | equal_fm (A x17) F = false | |
| 936 | | equal_fm F (E x16) = false | |
| 937 | | equal_fm (E x16) F = false | |
| 938 | | equal_fm F (Iff (x151, x152)) = false | |
| 939 | | equal_fm (Iff (x151, x152)) F = false | |
| 940 | | equal_fm F (Imp (x141, x142)) = false | |
| 941 | | equal_fm (Imp (x141, x142)) F = false | |
| 942 | | equal_fm F (Or (x131, x132)) = false | |
| 943 | | equal_fm (Or (x131, x132)) F = false | |
| 944 | | equal_fm F (And (x121, x122)) = false | |
| 945 | | equal_fm (And (x121, x122)) F = false | |
| 74531 | 946 | | equal_fm F (Not x11) = false | 
| 947 | | equal_fm (Not x11) F = false | |
| 61128 | 948 | | equal_fm F (NDvd (x101, x102)) = false | 
| 949 | | equal_fm (NDvd (x101, x102)) F = false | |
| 950 | | equal_fm F (Dvd (x91, x92)) = false | |
| 951 | | equal_fm (Dvd (x91, x92)) F = false | |
| 952 | | equal_fm F (NEq x8) = false | |
| 953 | | equal_fm (NEq x8) F = false | |
| 954 | | equal_fm F (Eq x7) = false | |
| 955 | | equal_fm (Eq x7) F = false | |
| 956 | | equal_fm F (Ge x6) = false | |
| 957 | | equal_fm (Ge x6) F = false | |
| 958 | | equal_fm F (Gt x5) = false | |
| 959 | | equal_fm (Gt x5) F = false | |
| 960 | | equal_fm F (Le x4) = false | |
| 961 | | equal_fm (Le x4) F = false | |
| 962 | | equal_fm F (Lt x3) = false | |
| 963 | | equal_fm (Lt x3) F = false | |
| 964 | | equal_fm T (NClosed x19) = false | |
| 965 | | equal_fm (NClosed x19) T = false | |
| 966 | | equal_fm T (Closed x18) = false | |
| 967 | | equal_fm (Closed x18) T = false | |
| 968 | | equal_fm T (A x17) = false | |
| 969 | | equal_fm (A x17) T = false | |
| 970 | | equal_fm T (E x16) = false | |
| 971 | | equal_fm (E x16) T = false | |
| 972 | | equal_fm T (Iff (x151, x152)) = false | |
| 973 | | equal_fm (Iff (x151, x152)) T = false | |
| 974 | | equal_fm T (Imp (x141, x142)) = false | |
| 975 | | equal_fm (Imp (x141, x142)) T = false | |
| 976 | | equal_fm T (Or (x131, x132)) = false | |
| 977 | | equal_fm (Or (x131, x132)) T = false | |
| 978 | | equal_fm T (And (x121, x122)) = false | |
| 979 | | equal_fm (And (x121, x122)) T = false | |
| 74531 | 980 | | equal_fm T (Not x11) = false | 
| 981 | | equal_fm (Not x11) T = false | |
| 61128 | 982 | | equal_fm T (NDvd (x101, x102)) = false | 
| 983 | | equal_fm (NDvd (x101, x102)) T = false | |
| 984 | | equal_fm T (Dvd (x91, x92)) = false | |
| 985 | | equal_fm (Dvd (x91, x92)) T = false | |
| 986 | | equal_fm T (NEq x8) = false | |
| 987 | | equal_fm (NEq x8) T = false | |
| 988 | | equal_fm T (Eq x7) = false | |
| 989 | | equal_fm (Eq x7) T = false | |
| 990 | | equal_fm T (Ge x6) = false | |
| 991 | | equal_fm (Ge x6) T = false | |
| 992 | | equal_fm T (Gt x5) = false | |
| 993 | | equal_fm (Gt x5) T = false | |
| 994 | | equal_fm T (Le x4) = false | |
| 995 | | equal_fm (Le x4) T = false | |
| 996 | | equal_fm T (Lt x3) = false | |
| 997 | | equal_fm (Lt x3) T = false | |
| 55685 | 998 | | equal_fm T F = false | 
| 44930 | 999 | | equal_fm F T = false | 
| 61128 | 1000 | | equal_fm (NClosed x19) (NClosed y19) = equal_nat x19 y19 | 
| 1001 | | equal_fm (Closed x18) (Closed y18) = equal_nat x18 y18 | |
| 1002 | | equal_fm (A x17) (A y17) = equal_fm x17 y17 | |
| 1003 | | equal_fm (E x16) (E y16) = equal_fm x16 y16 | |
| 1004 | | equal_fm (Iff (x151, x152)) (Iff (y151, y152)) = | |
| 1005 | equal_fm x151 y151 andalso equal_fm x152 y152 | |
| 1006 | | equal_fm (Imp (x141, x142)) (Imp (y141, y142)) = | |
| 1007 | equal_fm x141 y141 andalso equal_fm x142 y142 | |
| 1008 | | equal_fm (Or (x131, x132)) (Or (y131, y132)) = | |
| 1009 | equal_fm x131 y131 andalso equal_fm x132 y132 | |
| 1010 | | equal_fm (And (x121, x122)) (And (y121, y122)) = | |
| 1011 | equal_fm x121 y121 andalso equal_fm x122 y122 | |
| 74531 | 1012 | | equal_fm (Not x11) (Not y11) = equal_fm x11 y11 | 
| 61128 | 1013 | | equal_fm (NDvd (x101, x102)) (NDvd (y101, y102)) = | 
| 1014 | equal_inta x101 y101 andalso equal_numa x102 y102 | |
| 1015 | | equal_fm (Dvd (x91, x92)) (Dvd (y91, y92)) = | |
| 1016 | equal_inta x91 y91 andalso equal_numa x92 y92 | |
| 1017 | | equal_fm (NEq x8) (NEq y8) = equal_numa x8 y8 | |
| 1018 | | equal_fm (Eq x7) (Eq y7) = equal_numa x7 y7 | |
| 1019 | | equal_fm (Ge x6) (Ge y6) = equal_numa x6 y6 | |
| 1020 | | equal_fm (Gt x5) (Gt y5) = equal_numa x5 y5 | |
| 1021 | | equal_fm (Le x4) (Le y4) = equal_numa x4 y4 | |
| 1022 | | equal_fm (Lt x3) (Lt y3) = equal_numa x3 y3 | |
| 44930 | 1023 | | equal_fm F F = true | 
| 1024 | | equal_fm T T = true; | |
| 29787 | 1025 | |
| 1026 | fun djf f p q = | |
| 44930 | 1027 | (if equal_fm q T then T | 
| 1028 | else (if equal_fm q F then f p | |
| 75300 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1029 | else let | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1030 | val fp = f p; | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1031 | in | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1032 | (case fp of T => T | F => q | Lt _ => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1033 | | Le _ => Or (fp, q) | Gt _ => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1034 | | Ge _ => Or (fp, q) | Eq _ => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1035 | | NEq _ => Or (fp, q) | Dvd (_, _) => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1036 | | NDvd (_, _) => Or (fp, q) | Not _ => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1037 | | And (_, _) => Or (fp, q) | Or (_, _) => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1038 | | Imp (_, _) => Or (fp, q) | Iff (_, _) => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1039 | | E _ => Or (fp, q) | A _ => Or (fp, q) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1040 | | Closed _ => Or (fp, q) | NClosed _ => Or (fp, q)) | 
| 
8adbfeaecbfe
avoided recomputation in Cooper.djf and ran `isabelle regenerate_cooper`
 desharna parents: 
74531diff
changeset | 1041 | end)); | 
| 29787 | 1042 | |
| 1043 | fun evaldjf f ps = foldr (djf f) ps F; | |
| 1044 | ||
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1045 | fun dj f p = evaldjf f (disjuncts p); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1046 | |
| 55685 | 1047 | fun max A_ a b = (if less_eq A_ a b then b else a); | 
| 1048 | ||
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1049 | fun minus_nat m n = | 
| 61128 | 1050 | Nat (max ord_integer (0 : IntInf.int) (integer_of_nat m - integer_of_nat n)); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1051 | |
| 61128 | 1052 | val zero_nat : nat = Nat (0 : IntInf.int); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1053 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1054 | fun minusinf (And (p, q)) = And (minusinf p, minusinf q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1055 | | minusinf (Or (p, q)) = Or (minusinf p, minusinf q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1056 | | minusinf T = T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1057 | | minusinf F = F | 
| 65024 | 1058 | | minusinf (Lt (C va)) = Lt (C va) | 
| 1059 | | minusinf (Lt (Bound va)) = Lt (Bound va) | |
| 1060 | | minusinf (Lt (Neg va)) = Lt (Neg va) | |
| 1061 | | minusinf (Lt (Add (va, vb))) = Lt (Add (va, vb)) | |
| 1062 | | minusinf (Lt (Sub (va, vb))) = Lt (Sub (va, vb)) | |
| 1063 | | minusinf (Lt (Mul (va, vb))) = Lt (Mul (va, vb)) | |
| 1064 | | minusinf (Le (C va)) = Le (C va) | |
| 1065 | | minusinf (Le (Bound va)) = Le (Bound va) | |
| 1066 | | minusinf (Le (Neg va)) = Le (Neg va) | |
| 1067 | | minusinf (Le (Add (va, vb))) = Le (Add (va, vb)) | |
| 1068 | | minusinf (Le (Sub (va, vb))) = Le (Sub (va, vb)) | |
| 1069 | | minusinf (Le (Mul (va, vb))) = Le (Mul (va, vb)) | |
| 1070 | | minusinf (Gt (C va)) = Gt (C va) | |
| 1071 | | minusinf (Gt (Bound va)) = Gt (Bound va) | |
| 1072 | | minusinf (Gt (Neg va)) = Gt (Neg va) | |
| 1073 | | minusinf (Gt (Add (va, vb))) = Gt (Add (va, vb)) | |
| 1074 | | minusinf (Gt (Sub (va, vb))) = Gt (Sub (va, vb)) | |
| 1075 | | minusinf (Gt (Mul (va, vb))) = Gt (Mul (va, vb)) | |
| 1076 | | minusinf (Ge (C va)) = Ge (C va) | |
| 1077 | | minusinf (Ge (Bound va)) = Ge (Bound va) | |
| 1078 | | minusinf (Ge (Neg va)) = Ge (Neg va) | |
| 1079 | | minusinf (Ge (Add (va, vb))) = Ge (Add (va, vb)) | |
| 1080 | | minusinf (Ge (Sub (va, vb))) = Ge (Sub (va, vb)) | |
| 1081 | | minusinf (Ge (Mul (va, vb))) = Ge (Mul (va, vb)) | |
| 1082 | | minusinf (Eq (C va)) = Eq (C va) | |
| 1083 | | minusinf (Eq (Bound va)) = Eq (Bound va) | |
| 1084 | | minusinf (Eq (Neg va)) = Eq (Neg va) | |
| 1085 | | minusinf (Eq (Add (va, vb))) = Eq (Add (va, vb)) | |
| 1086 | | minusinf (Eq (Sub (va, vb))) = Eq (Sub (va, vb)) | |
| 1087 | | minusinf (Eq (Mul (va, vb))) = Eq (Mul (va, vb)) | |
| 1088 | | minusinf (NEq (C va)) = NEq (C va) | |
| 1089 | | minusinf (NEq (Bound va)) = NEq (Bound va) | |
| 1090 | | minusinf (NEq (Neg va)) = NEq (Neg va) | |
| 1091 | | minusinf (NEq (Add (va, vb))) = NEq (Add (va, vb)) | |
| 1092 | | minusinf (NEq (Sub (va, vb))) = NEq (Sub (va, vb)) | |
| 1093 | | minusinf (NEq (Mul (va, vb))) = NEq (Mul (va, vb)) | |
| 1094 | | minusinf (Dvd (v, va)) = Dvd (v, va) | |
| 1095 | | minusinf (NDvd (v, va)) = NDvd (v, va) | |
| 74531 | 1096 | | minusinf (Not v) = Not v | 
| 65024 | 1097 | | minusinf (Imp (v, va)) = Imp (v, va) | 
| 1098 | | minusinf (Iff (v, va)) = Iff (v, va) | |
| 1099 | | minusinf (E v) = E v | |
| 1100 | | minusinf (A v) = A v | |
| 1101 | | minusinf (Closed v) = Closed v | |
| 1102 | | minusinf (NClosed v) = NClosed v | |
| 1103 | | minusinf (Lt (CN (vd, c, e))) = | |
| 1104 | (if equal_nat vd zero_nat then T | |
| 1105 | else Lt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1106 | | minusinf (Le (CN (vd, c, e))) = | |
| 1107 | (if equal_nat vd zero_nat then T | |
| 1108 | else Le (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1109 | | minusinf (Gt (CN (vd, c, e))) = | |
| 1110 | (if equal_nat vd zero_nat then F | |
| 1111 | else Gt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1112 | | minusinf (Ge (CN (vd, c, e))) = | |
| 1113 | (if equal_nat vd zero_nat then F | |
| 1114 | else Ge (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1115 | | minusinf (Eq (CN (vd, c, e))) = | |
| 1116 | (if equal_nat vd zero_nat then F | |
| 1117 | else Eq (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1118 | | minusinf (NEq (CN (vd, c, e))) = | |
| 1119 | (if equal_nat vd zero_nat then T | |
| 1120 | else NEq (CN (suc (minus_nat vd one_nat), c, e))); | |
| 55685 | 1121 | |
| 61128 | 1122 | fun map f [] = [] | 
| 1123 | | map f (x21 :: x22) = f x21 :: map f x22; | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1124 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1125 | fun numsubst0 t (C c) = C c | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1126 | | numsubst0 t (Bound n) = (if equal_nat n zero_nat then t else Bound n) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1127 | | numsubst0 t (Neg a) = Neg (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1128 | | numsubst0 t (Add (a, b)) = Add (numsubst0 t a, numsubst0 t b) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1129 | | numsubst0 t (Sub (a, b)) = Sub (numsubst0 t a, numsubst0 t b) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1130 | | numsubst0 t (Mul (i, a)) = Mul (i, numsubst0 t a) | 
| 61128 | 1131 | | numsubst0 t (CN (v, i, a)) = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1132 | (if equal_nat v zero_nat then Add (Mul (i, t), numsubst0 t a) | 
| 61128 | 1133 | else CN (suc (minus_nat v one_nat), i, numsubst0 t a)); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1134 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1135 | fun subst0 t T = T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1136 | | subst0 t F = F | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1137 | | subst0 t (Lt a) = Lt (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1138 | | subst0 t (Le a) = Le (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1139 | | subst0 t (Gt a) = Gt (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1140 | | subst0 t (Ge a) = Ge (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1141 | | subst0 t (Eq a) = Eq (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1142 | | subst0 t (NEq a) = NEq (numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1143 | | subst0 t (Dvd (i, a)) = Dvd (i, numsubst0 t a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1144 | | subst0 t (NDvd (i, a)) = NDvd (i, numsubst0 t a) | 
| 74531 | 1145 | | subst0 t (Not p) = Not (subst0 t p) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1146 | | subst0 t (And (p, q)) = And (subst0 t p, subst0 t q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1147 | | subst0 t (Or (p, q)) = Or (subst0 t p, subst0 t q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1148 | | subst0 t (Imp (p, q)) = Imp (subst0 t p, subst0 t q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1149 | | subst0 t (Iff (p, q)) = Iff (subst0 t p, subst0 t q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1150 | | subst0 t (Closed p) = Closed p | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1151 | | subst0 t (NClosed p) = NClosed p; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1152 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1153 | fun less_eq_int k l = integer_of_int k <= integer_of_int l; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1154 | |
| 55685 | 1155 | fun less_int k l = integer_of_int k < integer_of_int l; | 
| 1156 | ||
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1157 | fun uminus_int k = Int_of_integer (~ (integer_of_int k)); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1158 | |
| 55685 | 1159 | fun abs_int i = (if less_int i zero_inta then uminus_int i else i); | 
| 1160 | ||
| 1161 | fun dvd (A1_, A2_) a b = | |
| 70093 | 1162 | eq A1_ | 
| 1163 | (modulo ((modulo_semiring_modulo o semiring_modulo_semidom_modulo) A2_) b a) | |
| 55685 | 1164 | (zero ((zero_mult_zero o mult_zero_semiring_0 o semiring_0_semiring_1 o | 
| 1165 | semiring_1_comm_semiring_1 o | |
| 1166 | comm_semiring_1_comm_semiring_1_cancel o | |
| 61128 | 1167 | comm_semiring_1_cancel_semidom o semidom_semidom_divide o | 
| 65024 | 1168 | semidom_divide_algebraic_semidom o | 
| 1169 | algebraic_semidom_semidom_modulo) | |
| 70093 | 1170 | A2_)); | 
| 55685 | 1171 | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1172 | fun nummul i (C j) = C (times_inta i j) | 
| 61128 | 1173 | | nummul i (CN (n, c, t)) = CN (n, times_inta c i, nummul i t) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1174 | | nummul i (Bound v) = Mul (i, Bound v) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1175 | | nummul i (Neg v) = Mul (i, Neg v) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1176 | | nummul i (Add (v, va)) = Mul (i, Add (v, va)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1177 | | nummul i (Sub (v, va)) = Mul (i, Sub (v, va)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1178 | | nummul i (Mul (v, va)) = Mul (i, Mul (v, va)); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1179 | |
| 65024 | 1180 | fun numneg t = nummul (uminus_int one_inta) t; | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1181 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1182 | fun less_eq_nat m n = integer_of_nat m <= integer_of_nat n; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1183 | |
| 70093 | 1184 | fun numadd (CN (n1, c1, r1)) (CN (n2, c2, r2)) = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1185 | (if equal_nat n1 n2 | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1186 | then let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1187 | val c = plus_inta c1 c2; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1188 | in | 
| 70093 | 1189 | (if equal_inta c zero_inta then numadd r1 r2 | 
| 1190 | else CN (n1, c, numadd r1 r2)) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1191 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1192 | else (if less_eq_nat n1 n2 | 
| 70093 | 1193 | then CN (n1, c1, numadd r1 (Add (Mul (c2, Bound n2), r2))) | 
| 1194 | else CN (n2, c2, numadd (Add (Mul (c1, Bound n1), r1)) r2))) | |
| 1195 | | numadd (CN (n1, c1, r1)) (C v) = CN (n1, c1, numadd r1 (C v)) | |
| 1196 | | numadd (CN (n1, c1, r1)) (Bound v) = CN (n1, c1, numadd r1 (Bound v)) | |
| 1197 | | numadd (CN (n1, c1, r1)) (Neg v) = CN (n1, c1, numadd r1 (Neg v)) | |
| 1198 | | numadd (CN (n1, c1, r1)) (Add (v, va)) = | |
| 1199 | CN (n1, c1, numadd r1 (Add (v, va))) | |
| 1200 | | numadd (CN (n1, c1, r1)) (Sub (v, va)) = | |
| 1201 | CN (n1, c1, numadd r1 (Sub (v, va))) | |
| 1202 | | numadd (CN (n1, c1, r1)) (Mul (v, va)) = | |
| 1203 | CN (n1, c1, numadd r1 (Mul (v, va))) | |
| 1204 | | numadd (C v) (CN (n2, c2, r2)) = CN (n2, c2, numadd (C v) r2) | |
| 1205 | | numadd (Bound v) (CN (n2, c2, r2)) = CN (n2, c2, numadd (Bound v) r2) | |
| 1206 | | numadd (Neg v) (CN (n2, c2, r2)) = CN (n2, c2, numadd (Neg v) r2) | |
| 1207 | | numadd (Add (v, va)) (CN (n2, c2, r2)) = | |
| 1208 | CN (n2, c2, numadd (Add (v, va)) r2) | |
| 1209 | | numadd (Sub (v, va)) (CN (n2, c2, r2)) = | |
| 1210 | CN (n2, c2, numadd (Sub (v, va)) r2) | |
| 1211 | | numadd (Mul (v, va)) (CN (n2, c2, r2)) = | |
| 1212 | CN (n2, c2, numadd (Mul (v, va)) r2) | |
| 1213 | | numadd (C b1) (C b2) = C (plus_inta b1 b2) | |
| 1214 | | numadd (C v) (Bound va) = Add (C v, Bound va) | |
| 1215 | | numadd (C v) (Neg va) = Add (C v, Neg va) | |
| 1216 | | numadd (C v) (Add (va, vb)) = Add (C v, Add (va, vb)) | |
| 1217 | | numadd (C v) (Sub (va, vb)) = Add (C v, Sub (va, vb)) | |
| 1218 | | numadd (C v) (Mul (va, vb)) = Add (C v, Mul (va, vb)) | |
| 1219 | | numadd (Bound v) (C va) = Add (Bound v, C va) | |
| 1220 | | numadd (Bound v) (Bound va) = Add (Bound v, Bound va) | |
| 1221 | | numadd (Bound v) (Neg va) = Add (Bound v, Neg va) | |
| 1222 | | numadd (Bound v) (Add (va, vb)) = Add (Bound v, Add (va, vb)) | |
| 1223 | | numadd (Bound v) (Sub (va, vb)) = Add (Bound v, Sub (va, vb)) | |
| 1224 | | numadd (Bound v) (Mul (va, vb)) = Add (Bound v, Mul (va, vb)) | |
| 1225 | | numadd (Neg v) (C va) = Add (Neg v, C va) | |
| 1226 | | numadd (Neg v) (Bound va) = Add (Neg v, Bound va) | |
| 1227 | | numadd (Neg v) (Neg va) = Add (Neg v, Neg va) | |
| 1228 | | numadd (Neg v) (Add (va, vb)) = Add (Neg v, Add (va, vb)) | |
| 1229 | | numadd (Neg v) (Sub (va, vb)) = Add (Neg v, Sub (va, vb)) | |
| 1230 | | numadd (Neg v) (Mul (va, vb)) = Add (Neg v, Mul (va, vb)) | |
| 1231 | | numadd (Add (v, va)) (C vb) = Add (Add (v, va), C vb) | |
| 1232 | | numadd (Add (v, va)) (Bound vb) = Add (Add (v, va), Bound vb) | |
| 1233 | | numadd (Add (v, va)) (Neg vb) = Add (Add (v, va), Neg vb) | |
| 1234 | | numadd (Add (v, va)) (Add (vb, vc)) = Add (Add (v, va), Add (vb, vc)) | |
| 1235 | | numadd (Add (v, va)) (Sub (vb, vc)) = Add (Add (v, va), Sub (vb, vc)) | |
| 1236 | | numadd (Add (v, va)) (Mul (vb, vc)) = Add (Add (v, va), Mul (vb, vc)) | |
| 1237 | | numadd (Sub (v, va)) (C vb) = Add (Sub (v, va), C vb) | |
| 1238 | | numadd (Sub (v, va)) (Bound vb) = Add (Sub (v, va), Bound vb) | |
| 1239 | | numadd (Sub (v, va)) (Neg vb) = Add (Sub (v, va), Neg vb) | |
| 1240 | | numadd (Sub (v, va)) (Add (vb, vc)) = Add (Sub (v, va), Add (vb, vc)) | |
| 1241 | | numadd (Sub (v, va)) (Sub (vb, vc)) = Add (Sub (v, va), Sub (vb, vc)) | |
| 1242 | | numadd (Sub (v, va)) (Mul (vb, vc)) = Add (Sub (v, va), Mul (vb, vc)) | |
| 1243 | | numadd (Mul (v, va)) (C vb) = Add (Mul (v, va), C vb) | |
| 1244 | | numadd (Mul (v, va)) (Bound vb) = Add (Mul (v, va), Bound vb) | |
| 1245 | | numadd (Mul (v, va)) (Neg vb) = Add (Mul (v, va), Neg vb) | |
| 1246 | | numadd (Mul (v, va)) (Add (vb, vc)) = Add (Mul (v, va), Add (vb, vc)) | |
| 1247 | | numadd (Mul (v, va)) (Sub (vb, vc)) = Add (Mul (v, va), Sub (vb, vc)) | |
| 1248 | | numadd (Mul (v, va)) (Mul (vb, vc)) = Add (Mul (v, va), Mul (vb, vc)); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1249 | |
| 70093 | 1250 | fun numsub s t = (if equal_numa s t then C zero_inta else numadd s (numneg t)); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1251 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1252 | fun simpnum (C j) = C j | 
| 65024 | 1253 | | simpnum (Bound n) = CN (n, one_inta, C zero_inta) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1254 | | simpnum (Neg t) = numneg (simpnum t) | 
| 70093 | 1255 | | simpnum (Add (t, s)) = numadd (simpnum t) (simpnum s) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1256 | | simpnum (Sub (t, s)) = numsub (simpnum t) (simpnum s) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1257 | | simpnum (Mul (i, t)) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1258 | (if equal_inta i zero_inta then C zero_inta else nummul i (simpnum t)) | 
| 61128 | 1259 | | simpnum (CN (v, va, vb)) = CN (v, va, vb); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1260 | |
| 55685 | 1261 | fun disj p q = | 
| 1262 | (if equal_fm p T orelse equal_fm q T then T | |
| 1263 | else (if equal_fm p F then q else (if equal_fm q F then p else Or (p, q)))); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1264 | |
| 55685 | 1265 | fun conj p q = | 
| 1266 | (if equal_fm p F orelse equal_fm q F then F | |
| 1267 | else (if equal_fm p T then q | |
| 1268 | else (if equal_fm q T then p else And (p, q)))); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1269 | |
| 74531 | 1270 | fun nota (Not p) = p | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1271 | | nota T = F | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1272 | | nota F = T | 
| 74531 | 1273 | | nota (Lt v) = Not (Lt v) | 
| 1274 | | nota (Le v) = Not (Le v) | |
| 1275 | | nota (Gt v) = Not (Gt v) | |
| 1276 | | nota (Ge v) = Not (Ge v) | |
| 1277 | | nota (Eq v) = Not (Eq v) | |
| 1278 | | nota (NEq v) = Not (NEq v) | |
| 1279 | | nota (Dvd (v, va)) = Not (Dvd (v, va)) | |
| 1280 | | nota (NDvd (v, va)) = Not (NDvd (v, va)) | |
| 1281 | | nota (And (v, va)) = Not (And (v, va)) | |
| 1282 | | nota (Or (v, va)) = Not (Or (v, va)) | |
| 1283 | | nota (Imp (v, va)) = Not (Imp (v, va)) | |
| 1284 | | nota (Iff (v, va)) = Not (Iff (v, va)) | |
| 1285 | | nota (E v) = Not (E v) | |
| 1286 | | nota (A v) = Not (A v) | |
| 1287 | | nota (Closed v) = Not (Closed v) | |
| 1288 | | nota (NClosed v) = Not (NClosed v); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1289 | |
| 55685 | 1290 | fun imp p q = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1291 | (if equal_fm p F orelse equal_fm q T then T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1292 | else (if equal_fm p T then q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1293 | else (if equal_fm q F then nota p else Imp (p, q)))); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1294 | |
| 55685 | 1295 | fun iff p q = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1296 | (if equal_fm p q then T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1297 | else (if equal_fm p (nota q) orelse equal_fm (nota p) q then F | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1298 | else (if equal_fm p F then nota q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1299 | else (if equal_fm q F then nota p | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1300 | else (if equal_fm p T then q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1301 | else (if equal_fm q T then p | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1302 | else Iff (p, q))))))); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1303 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1304 | fun simpfm (And (p, q)) = conj (simpfm p) (simpfm q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1305 | | simpfm (Or (p, q)) = disj (simpfm p) (simpfm q) | 
| 55685 | 1306 | | simpfm (Imp (p, q)) = imp (simpfm p) (simpfm q) | 
| 1307 | | simpfm (Iff (p, q)) = iff (simpfm p) (simpfm q) | |
| 74531 | 1308 | | simpfm (Not p) = nota (simpfm p) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1309 | | simpfm (Lt a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1310 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1311 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1312 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1313 | (case aa of C v => (if less_int v zero_inta then T else F) | 
| 61128 | 1314 | | Bound _ => Lt aa | CN (_, _, _) => Lt aa | Neg _ => Lt aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1315 | | Add (_, _) => Lt aa | Sub (_, _) => Lt aa | Mul (_, _) => Lt aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1316 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1317 | | simpfm (Le a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1318 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1319 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1320 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1321 | (case aa of C v => (if less_eq_int v zero_inta then T else F) | 
| 61128 | 1322 | | Bound _ => Le aa | CN (_, _, _) => Le aa | Neg _ => Le aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1323 | | Add (_, _) => Le aa | Sub (_, _) => Le aa | Mul (_, _) => Le aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1324 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1325 | | simpfm (Gt a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1326 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1327 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1328 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1329 | (case aa of C v => (if less_int zero_inta v then T else F) | 
| 61128 | 1330 | | Bound _ => Gt aa | CN (_, _, _) => Gt aa | Neg _ => Gt aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1331 | | Add (_, _) => Gt aa | Sub (_, _) => Gt aa | Mul (_, _) => Gt aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1332 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1333 | | simpfm (Ge a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1334 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1335 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1336 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1337 | (case aa of C v => (if less_eq_int zero_inta v then T else F) | 
| 61128 | 1338 | | Bound _ => Ge aa | CN (_, _, _) => Ge aa | Neg _ => Ge aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1339 | | Add (_, _) => Ge aa | Sub (_, _) => Ge aa | Mul (_, _) => Ge aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1340 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1341 | | simpfm (Eq a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1342 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1343 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1344 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1345 | (case aa of C v => (if equal_inta v zero_inta then T else F) | 
| 61128 | 1346 | | Bound _ => Eq aa | CN (_, _, _) => Eq aa | Neg _ => Eq aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1347 | | Add (_, _) => Eq aa | Sub (_, _) => Eq aa | Mul (_, _) => Eq aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1348 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1349 | | simpfm (NEq a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1350 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1351 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1352 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1353 | (case aa of C v => (if not (equal_inta v zero_inta) then T else F) | 
| 61128 | 1354 | | Bound _ => NEq aa | CN (_, _, _) => NEq aa | Neg _ => NEq aa | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1355 | | Add (_, _) => NEq aa | Sub (_, _) => NEq aa | Mul (_, _) => NEq aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1356 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1357 | | simpfm (Dvd (i, a)) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1358 | (if equal_inta i zero_inta then simpfm (Eq a) | 
| 65024 | 1359 | else (if equal_inta (abs_int i) one_inta then T | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1360 | else let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1361 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1362 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1363 | (case aa | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1364 | of C v => | 
| 70093 | 1365 | (if dvd (equal_int, semidom_modulo_int) i v then T | 
| 65024 | 1366 | else F) | 
| 61128 | 1367 | | Bound _ => Dvd (i, aa) | CN (_, _, _) => Dvd (i, aa) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1368 | | Neg _ => Dvd (i, aa) | Add (_, _) => Dvd (i, aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1369 | | Sub (_, _) => Dvd (i, aa) | Mul (_, _) => Dvd (i, aa)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1370 | end)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1371 | | simpfm (NDvd (i, a)) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1372 | (if equal_inta i zero_inta then simpfm (NEq a) | 
| 65024 | 1373 | else (if equal_inta (abs_int i) one_inta then F | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1374 | else let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1375 | val aa = simpnum a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1376 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1377 | (case aa | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1378 | of C v => | 
| 70093 | 1379 | (if not (dvd (equal_int, semidom_modulo_int) i v) then T | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1380 | else F) | 
| 61128 | 1381 | | Bound _ => NDvd (i, aa) | CN (_, _, _) => NDvd (i, aa) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1382 | | Neg _ => NDvd (i, aa) | Add (_, _) => NDvd (i, aa) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1383 | | Sub (_, _) => NDvd (i, aa) | Mul (_, _) => NDvd (i, aa)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1384 | end)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1385 | | simpfm T = T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1386 | | simpfm F = F | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1387 | | simpfm (E v) = E v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1388 | | simpfm (A v) = A v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1389 | | simpfm (Closed v) = Closed v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1390 | | simpfm (NClosed v) = NClosed v; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1391 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1392 | fun gen_length n (x :: xs) = gen_length (suc n) xs | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1393 | | gen_length n [] = n; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1394 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1395 | fun size_list x = gen_length zero_nat x; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1396 | |
| 65024 | 1397 | fun a_beta (And (p, q)) k = And (a_beta p k, a_beta q k) | 
| 1398 | | a_beta (Or (p, q)) k = Or (a_beta p k, a_beta q k) | |
| 1399 | | a_beta T k = T | |
| 1400 | | a_beta F k = F | |
| 1401 | | a_beta (Lt (C va)) k = Lt (C va) | |
| 1402 | | a_beta (Lt (Bound va)) k = Lt (Bound va) | |
| 1403 | | a_beta (Lt (Neg va)) k = Lt (Neg va) | |
| 1404 | | a_beta (Lt (Add (va, vb))) k = Lt (Add (va, vb)) | |
| 1405 | | a_beta (Lt (Sub (va, vb))) k = Lt (Sub (va, vb)) | |
| 1406 | | a_beta (Lt (Mul (va, vb))) k = Lt (Mul (va, vb)) | |
| 1407 | | a_beta (Le (C va)) k = Le (C va) | |
| 1408 | | a_beta (Le (Bound va)) k = Le (Bound va) | |
| 1409 | | a_beta (Le (Neg va)) k = Le (Neg va) | |
| 1410 | | a_beta (Le (Add (va, vb))) k = Le (Add (va, vb)) | |
| 1411 | | a_beta (Le (Sub (va, vb))) k = Le (Sub (va, vb)) | |
| 1412 | | a_beta (Le (Mul (va, vb))) k = Le (Mul (va, vb)) | |
| 1413 | | a_beta (Gt (C va)) k = Gt (C va) | |
| 1414 | | a_beta (Gt (Bound va)) k = Gt (Bound va) | |
| 1415 | | a_beta (Gt (Neg va)) k = Gt (Neg va) | |
| 1416 | | a_beta (Gt (Add (va, vb))) k = Gt (Add (va, vb)) | |
| 1417 | | a_beta (Gt (Sub (va, vb))) k = Gt (Sub (va, vb)) | |
| 1418 | | a_beta (Gt (Mul (va, vb))) k = Gt (Mul (va, vb)) | |
| 1419 | | a_beta (Ge (C va)) k = Ge (C va) | |
| 1420 | | a_beta (Ge (Bound va)) k = Ge (Bound va) | |
| 1421 | | a_beta (Ge (Neg va)) k = Ge (Neg va) | |
| 1422 | | a_beta (Ge (Add (va, vb))) k = Ge (Add (va, vb)) | |
| 1423 | | a_beta (Ge (Sub (va, vb))) k = Ge (Sub (va, vb)) | |
| 1424 | | a_beta (Ge (Mul (va, vb))) k = Ge (Mul (va, vb)) | |
| 1425 | | a_beta (Eq (C va)) k = Eq (C va) | |
| 1426 | | a_beta (Eq (Bound va)) k = Eq (Bound va) | |
| 1427 | | a_beta (Eq (Neg va)) k = Eq (Neg va) | |
| 1428 | | a_beta (Eq (Add (va, vb))) k = Eq (Add (va, vb)) | |
| 1429 | | a_beta (Eq (Sub (va, vb))) k = Eq (Sub (va, vb)) | |
| 1430 | | a_beta (Eq (Mul (va, vb))) k = Eq (Mul (va, vb)) | |
| 1431 | | a_beta (NEq (C va)) k = NEq (C va) | |
| 1432 | | a_beta (NEq (Bound va)) k = NEq (Bound va) | |
| 1433 | | a_beta (NEq (Neg va)) k = NEq (Neg va) | |
| 1434 | | a_beta (NEq (Add (va, vb))) k = NEq (Add (va, vb)) | |
| 1435 | | a_beta (NEq (Sub (va, vb))) k = NEq (Sub (va, vb)) | |
| 1436 | | a_beta (NEq (Mul (va, vb))) k = NEq (Mul (va, vb)) | |
| 1437 | | a_beta (Dvd (v, C vb)) k = Dvd (v, C vb) | |
| 1438 | | a_beta (Dvd (v, Bound vb)) k = Dvd (v, Bound vb) | |
| 1439 | | a_beta (Dvd (v, Neg vb)) k = Dvd (v, Neg vb) | |
| 1440 | | a_beta (Dvd (v, Add (vb, vc))) k = Dvd (v, Add (vb, vc)) | |
| 1441 | | a_beta (Dvd (v, Sub (vb, vc))) k = Dvd (v, Sub (vb, vc)) | |
| 1442 | | a_beta (Dvd (v, Mul (vb, vc))) k = Dvd (v, Mul (vb, vc)) | |
| 1443 | | a_beta (NDvd (v, C vb)) k = NDvd (v, C vb) | |
| 1444 | | a_beta (NDvd (v, Bound vb)) k = NDvd (v, Bound vb) | |
| 1445 | | a_beta (NDvd (v, Neg vb)) k = NDvd (v, Neg vb) | |
| 1446 | | a_beta (NDvd (v, Add (vb, vc))) k = NDvd (v, Add (vb, vc)) | |
| 1447 | | a_beta (NDvd (v, Sub (vb, vc))) k = NDvd (v, Sub (vb, vc)) | |
| 1448 | | a_beta (NDvd (v, Mul (vb, vc))) k = NDvd (v, Mul (vb, vc)) | |
| 74531 | 1449 | | a_beta (Not v) k = Not v | 
| 65024 | 1450 | | a_beta (Imp (v, va)) k = Imp (v, va) | 
| 1451 | | a_beta (Iff (v, va)) k = Iff (v, va) | |
| 1452 | | a_beta (E v) k = E v | |
| 1453 | | a_beta (A v) k = A v | |
| 1454 | | a_beta (Closed v) k = Closed v | |
| 1455 | | a_beta (NClosed v) k = NClosed v | |
| 1456 | | a_beta (Lt (CN (vd, c, e))) k = | |
| 1457 | (if equal_nat vd zero_nat | |
| 1458 | then Lt (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1459 | else Lt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1460 | | a_beta (Le (CN (vd, c, e))) k = | |
| 1461 | (if equal_nat vd zero_nat | |
| 1462 | then Le (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1463 | else Le (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1464 | | a_beta (Gt (CN (vd, c, e))) k = | |
| 1465 | (if equal_nat vd zero_nat | |
| 1466 | then Gt (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1467 | else Gt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1468 | | a_beta (Ge (CN (vd, c, e))) k = | |
| 1469 | (if equal_nat vd zero_nat | |
| 1470 | then Ge (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1471 | else Ge (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1472 | | a_beta (Eq (CN (vd, c, e))) k = | |
| 1473 | (if equal_nat vd zero_nat | |
| 1474 | then Eq (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1475 | else Eq (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1476 | | a_beta (NEq (CN (vd, c, e))) k = | |
| 1477 | (if equal_nat vd zero_nat | |
| 1478 | then NEq (CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1479 | else NEq (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1480 | | a_beta (Dvd (i, CN (ve, c, e))) k = | |
| 1481 | (if equal_nat ve zero_nat | |
| 1482 | then Dvd (times_inta (divide_inta k c) i, | |
| 1483 | CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1484 | else Dvd (i, CN (suc (minus_nat ve one_nat), c, e))) | |
| 1485 | | a_beta (NDvd (i, CN (ve, c, e))) k = | |
| 1486 | (if equal_nat ve zero_nat | |
| 1487 | then NDvd (times_inta (divide_inta k c) i, | |
| 1488 | CN (zero_nat, one_inta, Mul (divide_inta k c, e))) | |
| 1489 | else NDvd (i, CN (suc (minus_nat ve one_nat), c, e))); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1490 | |
| 65024 | 1491 | fun gcd_integer k l = | 
| 1492 | abs (if l = (0 : IntInf.int) then k | |
| 1493 | else gcd_integer l (modulo_integer (abs k) (abs l))); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1494 | |
| 65024 | 1495 | fun lcm_integer a b = divide_integer (abs a * abs b) (gcd_integer a b); | 
| 1496 | ||
| 1497 | fun lcm_int (Int_of_integer x) (Int_of_integer y) = | |
| 1498 | Int_of_integer (lcm_integer x y); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1499 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1500 | fun delta (And (p, q)) = lcm_int (delta p) (delta q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1501 | | delta (Or (p, q)) = lcm_int (delta p) (delta q) | 
| 65024 | 1502 | | delta T = one_inta | 
| 1503 | | delta F = one_inta | |
| 1504 | | delta (Lt v) = one_inta | |
| 1505 | | delta (Le v) = one_inta | |
| 1506 | | delta (Gt v) = one_inta | |
| 1507 | | delta (Ge v) = one_inta | |
| 1508 | | delta (Eq v) = one_inta | |
| 1509 | | delta (NEq v) = one_inta | |
| 1510 | | delta (Dvd (v, C vb)) = one_inta | |
| 1511 | | delta (Dvd (v, Bound vb)) = one_inta | |
| 1512 | | delta (Dvd (v, Neg vb)) = one_inta | |
| 1513 | | delta (Dvd (v, Add (vb, vc))) = one_inta | |
| 1514 | | delta (Dvd (v, Sub (vb, vc))) = one_inta | |
| 1515 | | delta (Dvd (v, Mul (vb, vc))) = one_inta | |
| 1516 | | delta (NDvd (v, C vb)) = one_inta | |
| 1517 | | delta (NDvd (v, Bound vb)) = one_inta | |
| 1518 | | delta (NDvd (v, Neg vb)) = one_inta | |
| 1519 | | delta (NDvd (v, Add (vb, vc))) = one_inta | |
| 1520 | | delta (NDvd (v, Sub (vb, vc))) = one_inta | |
| 1521 | | delta (NDvd (v, Mul (vb, vc))) = one_inta | |
| 74531 | 1522 | | delta (Not v) = one_inta | 
| 65024 | 1523 | | delta (Imp (v, va)) = one_inta | 
| 1524 | | delta (Iff (v, va)) = one_inta | |
| 1525 | | delta (E v) = one_inta | |
| 1526 | | delta (A v) = one_inta | |
| 1527 | | delta (Closed v) = one_inta | |
| 1528 | | delta (NClosed v) = one_inta | |
| 1529 | | delta (Dvd (i, CN (ve, c, e))) = | |
| 1530 | (if equal_nat ve zero_nat then i else one_inta) | |
| 1531 | | delta (NDvd (i, CN (ve, c, e))) = | |
| 1532 | (if equal_nat ve zero_nat then i else one_inta); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1533 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1534 | fun alpha (And (p, q)) = alpha p @ alpha q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1535 | | alpha (Or (p, q)) = alpha p @ alpha q | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1536 | | alpha T = [] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1537 | | alpha F = [] | 
| 65024 | 1538 | | alpha (Lt (C va)) = [] | 
| 1539 | | alpha (Lt (Bound va)) = [] | |
| 1540 | | alpha (Lt (Neg va)) = [] | |
| 1541 | | alpha (Lt (Add (va, vb))) = [] | |
| 1542 | | alpha (Lt (Sub (va, vb))) = [] | |
| 1543 | | alpha (Lt (Mul (va, vb))) = [] | |
| 1544 | | alpha (Le (C va)) = [] | |
| 1545 | | alpha (Le (Bound va)) = [] | |
| 1546 | | alpha (Le (Neg va)) = [] | |
| 1547 | | alpha (Le (Add (va, vb))) = [] | |
| 1548 | | alpha (Le (Sub (va, vb))) = [] | |
| 1549 | | alpha (Le (Mul (va, vb))) = [] | |
| 1550 | | alpha (Gt (C va)) = [] | |
| 1551 | | alpha (Gt (Bound va)) = [] | |
| 1552 | | alpha (Gt (Neg va)) = [] | |
| 1553 | | alpha (Gt (Add (va, vb))) = [] | |
| 1554 | | alpha (Gt (Sub (va, vb))) = [] | |
| 1555 | | alpha (Gt (Mul (va, vb))) = [] | |
| 1556 | | alpha (Ge (C va)) = [] | |
| 1557 | | alpha (Ge (Bound va)) = [] | |
| 1558 | | alpha (Ge (Neg va)) = [] | |
| 1559 | | alpha (Ge (Add (va, vb))) = [] | |
| 1560 | | alpha (Ge (Sub (va, vb))) = [] | |
| 1561 | | alpha (Ge (Mul (va, vb))) = [] | |
| 1562 | | alpha (Eq (C va)) = [] | |
| 1563 | | alpha (Eq (Bound va)) = [] | |
| 1564 | | alpha (Eq (Neg va)) = [] | |
| 1565 | | alpha (Eq (Add (va, vb))) = [] | |
| 1566 | | alpha (Eq (Sub (va, vb))) = [] | |
| 1567 | | alpha (Eq (Mul (va, vb))) = [] | |
| 1568 | | alpha (NEq (C va)) = [] | |
| 1569 | | alpha (NEq (Bound va)) = [] | |
| 1570 | | alpha (NEq (Neg va)) = [] | |
| 1571 | | alpha (NEq (Add (va, vb))) = [] | |
| 1572 | | alpha (NEq (Sub (va, vb))) = [] | |
| 1573 | | alpha (NEq (Mul (va, vb))) = [] | |
| 1574 | | alpha (Dvd (v, va)) = [] | |
| 1575 | | alpha (NDvd (v, va)) = [] | |
| 74531 | 1576 | | alpha (Not v) = [] | 
| 65024 | 1577 | | alpha (Imp (v, va)) = [] | 
| 1578 | | alpha (Iff (v, va)) = [] | |
| 1579 | | alpha (E v) = [] | |
| 1580 | | alpha (A v) = [] | |
| 1581 | | alpha (Closed v) = [] | |
| 1582 | | alpha (NClosed v) = [] | |
| 1583 | | alpha (Lt (CN (vd, c, e))) = (if equal_nat vd zero_nat then [e] else []) | |
| 1584 | | alpha (Le (CN (vd, c, e))) = | |
| 1585 | (if equal_nat vd zero_nat then [Add (C (uminus_int one_inta), e)] else []) | |
| 1586 | | alpha (Gt (CN (vd, c, e))) = (if equal_nat vd zero_nat then [] else []) | |
| 1587 | | alpha (Ge (CN (vd, c, e))) = (if equal_nat vd zero_nat then [] else []) | |
| 1588 | | alpha (Eq (CN (vd, c, e))) = | |
| 1589 | (if equal_nat vd zero_nat then [Add (C (uminus_int one_inta), e)] else []) | |
| 1590 | | alpha (NEq (CN (vd, c, e))) = (if equal_nat vd zero_nat then [e] else []); | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1591 | |
| 55685 | 1592 | fun zeta (And (p, q)) = lcm_int (zeta p) (zeta q) | 
| 1593 | | zeta (Or (p, q)) = lcm_int (zeta p) (zeta q) | |
| 65024 | 1594 | | zeta T = one_inta | 
| 1595 | | zeta F = one_inta | |
| 1596 | | zeta (Lt (C va)) = one_inta | |
| 1597 | | zeta (Lt (Bound va)) = one_inta | |
| 1598 | | zeta (Lt (Neg va)) = one_inta | |
| 1599 | | zeta (Lt (Add (va, vb))) = one_inta | |
| 1600 | | zeta (Lt (Sub (va, vb))) = one_inta | |
| 1601 | | zeta (Lt (Mul (va, vb))) = one_inta | |
| 1602 | | zeta (Le (C va)) = one_inta | |
| 1603 | | zeta (Le (Bound va)) = one_inta | |
| 1604 | | zeta (Le (Neg va)) = one_inta | |
| 1605 | | zeta (Le (Add (va, vb))) = one_inta | |
| 1606 | | zeta (Le (Sub (va, vb))) = one_inta | |
| 1607 | | zeta (Le (Mul (va, vb))) = one_inta | |
| 1608 | | zeta (Gt (C va)) = one_inta | |
| 1609 | | zeta (Gt (Bound va)) = one_inta | |
| 1610 | | zeta (Gt (Neg va)) = one_inta | |
| 1611 | | zeta (Gt (Add (va, vb))) = one_inta | |
| 1612 | | zeta (Gt (Sub (va, vb))) = one_inta | |
| 1613 | | zeta (Gt (Mul (va, vb))) = one_inta | |
| 1614 | | zeta (Ge (C va)) = one_inta | |
| 1615 | | zeta (Ge (Bound va)) = one_inta | |
| 1616 | | zeta (Ge (Neg va)) = one_inta | |
| 1617 | | zeta (Ge (Add (va, vb))) = one_inta | |
| 1618 | | zeta (Ge (Sub (va, vb))) = one_inta | |
| 1619 | | zeta (Ge (Mul (va, vb))) = one_inta | |
| 1620 | | zeta (Eq (C va)) = one_inta | |
| 1621 | | zeta (Eq (Bound va)) = one_inta | |
| 1622 | | zeta (Eq (Neg va)) = one_inta | |
| 1623 | | zeta (Eq (Add (va, vb))) = one_inta | |
| 1624 | | zeta (Eq (Sub (va, vb))) = one_inta | |
| 1625 | | zeta (Eq (Mul (va, vb))) = one_inta | |
| 1626 | | zeta (NEq (C va)) = one_inta | |
| 1627 | | zeta (NEq (Bound va)) = one_inta | |
| 1628 | | zeta (NEq (Neg va)) = one_inta | |
| 1629 | | zeta (NEq (Add (va, vb))) = one_inta | |
| 1630 | | zeta (NEq (Sub (va, vb))) = one_inta | |
| 1631 | | zeta (NEq (Mul (va, vb))) = one_inta | |
| 1632 | | zeta (Dvd (v, C vb)) = one_inta | |
| 1633 | | zeta (Dvd (v, Bound vb)) = one_inta | |
| 1634 | | zeta (Dvd (v, Neg vb)) = one_inta | |
| 1635 | | zeta (Dvd (v, Add (vb, vc))) = one_inta | |
| 1636 | | zeta (Dvd (v, Sub (vb, vc))) = one_inta | |
| 1637 | | zeta (Dvd (v, Mul (vb, vc))) = one_inta | |
| 1638 | | zeta (NDvd (v, C vb)) = one_inta | |
| 1639 | | zeta (NDvd (v, Bound vb)) = one_inta | |
| 1640 | | zeta (NDvd (v, Neg vb)) = one_inta | |
| 1641 | | zeta (NDvd (v, Add (vb, vc))) = one_inta | |
| 1642 | | zeta (NDvd (v, Sub (vb, vc))) = one_inta | |
| 1643 | | zeta (NDvd (v, Mul (vb, vc))) = one_inta | |
| 74531 | 1644 | | zeta (Not v) = one_inta | 
| 65024 | 1645 | | zeta (Imp (v, va)) = one_inta | 
| 1646 | | zeta (Iff (v, va)) = one_inta | |
| 1647 | | zeta (E v) = one_inta | |
| 1648 | | zeta (A v) = one_inta | |
| 1649 | | zeta (Closed v) = one_inta | |
| 1650 | | zeta (NClosed v) = one_inta | |
| 1651 | | zeta (Lt (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1652 | | zeta (Le (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1653 | | zeta (Gt (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1654 | | zeta (Ge (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1655 | | zeta (Eq (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1656 | | zeta (NEq (CN (vd, c, e))) = (if equal_nat vd zero_nat then c else one_inta) | |
| 1657 | | zeta (Dvd (i, CN (ve, c, e))) = | |
| 1658 | (if equal_nat ve zero_nat then c else one_inta) | |
| 1659 | | zeta (NDvd (i, CN (ve, c, e))) = | |
| 1660 | (if equal_nat ve zero_nat then c else one_inta); | |
| 55685 | 1661 | |
| 1662 | fun beta (And (p, q)) = beta p @ beta q | |
| 1663 | | beta (Or (p, q)) = beta p @ beta q | |
| 1664 | | beta T = [] | |
| 1665 | | beta F = [] | |
| 65024 | 1666 | | beta (Lt (C va)) = [] | 
| 1667 | | beta (Lt (Bound va)) = [] | |
| 1668 | | beta (Lt (Neg va)) = [] | |
| 1669 | | beta (Lt (Add (va, vb))) = [] | |
| 1670 | | beta (Lt (Sub (va, vb))) = [] | |
| 1671 | | beta (Lt (Mul (va, vb))) = [] | |
| 1672 | | beta (Le (C va)) = [] | |
| 1673 | | beta (Le (Bound va)) = [] | |
| 1674 | | beta (Le (Neg va)) = [] | |
| 1675 | | beta (Le (Add (va, vb))) = [] | |
| 1676 | | beta (Le (Sub (va, vb))) = [] | |
| 1677 | | beta (Le (Mul (va, vb))) = [] | |
| 1678 | | beta (Gt (C va)) = [] | |
| 1679 | | beta (Gt (Bound va)) = [] | |
| 1680 | | beta (Gt (Neg va)) = [] | |
| 1681 | | beta (Gt (Add (va, vb))) = [] | |
| 1682 | | beta (Gt (Sub (va, vb))) = [] | |
| 1683 | | beta (Gt (Mul (va, vb))) = [] | |
| 1684 | | beta (Ge (C va)) = [] | |
| 1685 | | beta (Ge (Bound va)) = [] | |
| 1686 | | beta (Ge (Neg va)) = [] | |
| 1687 | | beta (Ge (Add (va, vb))) = [] | |
| 1688 | | beta (Ge (Sub (va, vb))) = [] | |
| 1689 | | beta (Ge (Mul (va, vb))) = [] | |
| 1690 | | beta (Eq (C va)) = [] | |
| 1691 | | beta (Eq (Bound va)) = [] | |
| 1692 | | beta (Eq (Neg va)) = [] | |
| 1693 | | beta (Eq (Add (va, vb))) = [] | |
| 1694 | | beta (Eq (Sub (va, vb))) = [] | |
| 1695 | | beta (Eq (Mul (va, vb))) = [] | |
| 1696 | | beta (NEq (C va)) = [] | |
| 1697 | | beta (NEq (Bound va)) = [] | |
| 1698 | | beta (NEq (Neg va)) = [] | |
| 1699 | | beta (NEq (Add (va, vb))) = [] | |
| 1700 | | beta (NEq (Sub (va, vb))) = [] | |
| 1701 | | beta (NEq (Mul (va, vb))) = [] | |
| 1702 | | beta (Dvd (v, va)) = [] | |
| 1703 | | beta (NDvd (v, va)) = [] | |
| 74531 | 1704 | | beta (Not v) = [] | 
| 65024 | 1705 | | beta (Imp (v, va)) = [] | 
| 1706 | | beta (Iff (v, va)) = [] | |
| 1707 | | beta (E v) = [] | |
| 1708 | | beta (A v) = [] | |
| 1709 | | beta (Closed v) = [] | |
| 1710 | | beta (NClosed v) = [] | |
| 1711 | | beta (Lt (CN (vd, c, e))) = (if equal_nat vd zero_nat then [] else []) | |
| 1712 | | beta (Le (CN (vd, c, e))) = (if equal_nat vd zero_nat then [] else []) | |
| 1713 | | beta (Gt (CN (vd, c, e))) = (if equal_nat vd zero_nat then [Neg e] else []) | |
| 1714 | | beta (Ge (CN (vd, c, e))) = | |
| 1715 | (if equal_nat vd zero_nat then [Sub (C (uminus_int one_inta), e)] else []) | |
| 1716 | | beta (Eq (CN (vd, c, e))) = | |
| 1717 | (if equal_nat vd zero_nat then [Sub (C (uminus_int one_inta), e)] else []) | |
| 1718 | | beta (NEq (CN (vd, c, e))) = | |
| 1719 | (if equal_nat vd zero_nat then [Neg e] else []); | |
| 55685 | 1720 | |
| 1721 | fun mirror (And (p, q)) = And (mirror p, mirror q) | |
| 1722 | | mirror (Or (p, q)) = Or (mirror p, mirror q) | |
| 1723 | | mirror T = T | |
| 1724 | | mirror F = F | |
| 65024 | 1725 | | mirror (Lt (C va)) = Lt (C va) | 
| 1726 | | mirror (Lt (Bound va)) = Lt (Bound va) | |
| 1727 | | mirror (Lt (Neg va)) = Lt (Neg va) | |
| 1728 | | mirror (Lt (Add (va, vb))) = Lt (Add (va, vb)) | |
| 1729 | | mirror (Lt (Sub (va, vb))) = Lt (Sub (va, vb)) | |
| 1730 | | mirror (Lt (Mul (va, vb))) = Lt (Mul (va, vb)) | |
| 1731 | | mirror (Le (C va)) = Le (C va) | |
| 1732 | | mirror (Le (Bound va)) = Le (Bound va) | |
| 1733 | | mirror (Le (Neg va)) = Le (Neg va) | |
| 1734 | | mirror (Le (Add (va, vb))) = Le (Add (va, vb)) | |
| 1735 | | mirror (Le (Sub (va, vb))) = Le (Sub (va, vb)) | |
| 1736 | | mirror (Le (Mul (va, vb))) = Le (Mul (va, vb)) | |
| 1737 | | mirror (Gt (C va)) = Gt (C va) | |
| 1738 | | mirror (Gt (Bound va)) = Gt (Bound va) | |
| 1739 | | mirror (Gt (Neg va)) = Gt (Neg va) | |
| 1740 | | mirror (Gt (Add (va, vb))) = Gt (Add (va, vb)) | |
| 1741 | | mirror (Gt (Sub (va, vb))) = Gt (Sub (va, vb)) | |
| 1742 | | mirror (Gt (Mul (va, vb))) = Gt (Mul (va, vb)) | |
| 1743 | | mirror (Ge (C va)) = Ge (C va) | |
| 1744 | | mirror (Ge (Bound va)) = Ge (Bound va) | |
| 1745 | | mirror (Ge (Neg va)) = Ge (Neg va) | |
| 1746 | | mirror (Ge (Add (va, vb))) = Ge (Add (va, vb)) | |
| 1747 | | mirror (Ge (Sub (va, vb))) = Ge (Sub (va, vb)) | |
| 1748 | | mirror (Ge (Mul (va, vb))) = Ge (Mul (va, vb)) | |
| 1749 | | mirror (Eq (C va)) = Eq (C va) | |
| 1750 | | mirror (Eq (Bound va)) = Eq (Bound va) | |
| 1751 | | mirror (Eq (Neg va)) = Eq (Neg va) | |
| 1752 | | mirror (Eq (Add (va, vb))) = Eq (Add (va, vb)) | |
| 1753 | | mirror (Eq (Sub (va, vb))) = Eq (Sub (va, vb)) | |
| 1754 | | mirror (Eq (Mul (va, vb))) = Eq (Mul (va, vb)) | |
| 1755 | | mirror (NEq (C va)) = NEq (C va) | |
| 1756 | | mirror (NEq (Bound va)) = NEq (Bound va) | |
| 1757 | | mirror (NEq (Neg va)) = NEq (Neg va) | |
| 1758 | | mirror (NEq (Add (va, vb))) = NEq (Add (va, vb)) | |
| 1759 | | mirror (NEq (Sub (va, vb))) = NEq (Sub (va, vb)) | |
| 1760 | | mirror (NEq (Mul (va, vb))) = NEq (Mul (va, vb)) | |
| 1761 | | mirror (Dvd (v, C vb)) = Dvd (v, C vb) | |
| 1762 | | mirror (Dvd (v, Bound vb)) = Dvd (v, Bound vb) | |
| 1763 | | mirror (Dvd (v, Neg vb)) = Dvd (v, Neg vb) | |
| 1764 | | mirror (Dvd (v, Add (vb, vc))) = Dvd (v, Add (vb, vc)) | |
| 1765 | | mirror (Dvd (v, Sub (vb, vc))) = Dvd (v, Sub (vb, vc)) | |
| 1766 | | mirror (Dvd (v, Mul (vb, vc))) = Dvd (v, Mul (vb, vc)) | |
| 1767 | | mirror (NDvd (v, C vb)) = NDvd (v, C vb) | |
| 1768 | | mirror (NDvd (v, Bound vb)) = NDvd (v, Bound vb) | |
| 1769 | | mirror (NDvd (v, Neg vb)) = NDvd (v, Neg vb) | |
| 1770 | | mirror (NDvd (v, Add (vb, vc))) = NDvd (v, Add (vb, vc)) | |
| 1771 | | mirror (NDvd (v, Sub (vb, vc))) = NDvd (v, Sub (vb, vc)) | |
| 1772 | | mirror (NDvd (v, Mul (vb, vc))) = NDvd (v, Mul (vb, vc)) | |
| 74531 | 1773 | | mirror (Not v) = Not v | 
| 65024 | 1774 | | mirror (Imp (v, va)) = Imp (v, va) | 
| 1775 | | mirror (Iff (v, va)) = Iff (v, va) | |
| 1776 | | mirror (E v) = E v | |
| 1777 | | mirror (A v) = A v | |
| 1778 | | mirror (Closed v) = Closed v | |
| 1779 | | mirror (NClosed v) = NClosed v | |
| 1780 | | mirror (Lt (CN (vd, c, e))) = | |
| 1781 | (if equal_nat vd zero_nat then Gt (CN (zero_nat, c, Neg e)) | |
| 1782 | else Lt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1783 | | mirror (Le (CN (vd, c, e))) = | |
| 1784 | (if equal_nat vd zero_nat then Ge (CN (zero_nat, c, Neg e)) | |
| 1785 | else Le (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1786 | | mirror (Gt (CN (vd, c, e))) = | |
| 1787 | (if equal_nat vd zero_nat then Lt (CN (zero_nat, c, Neg e)) | |
| 1788 | else Gt (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1789 | | mirror (Ge (CN (vd, c, e))) = | |
| 1790 | (if equal_nat vd zero_nat then Le (CN (zero_nat, c, Neg e)) | |
| 1791 | else Ge (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1792 | | mirror (Eq (CN (vd, c, e))) = | |
| 1793 | (if equal_nat vd zero_nat then Eq (CN (zero_nat, c, Neg e)) | |
| 1794 | else Eq (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1795 | | mirror (NEq (CN (vd, c, e))) = | |
| 1796 | (if equal_nat vd zero_nat then NEq (CN (zero_nat, c, Neg e)) | |
| 1797 | else NEq (CN (suc (minus_nat vd one_nat), c, e))) | |
| 1798 | | mirror (Dvd (i, CN (ve, c, e))) = | |
| 1799 | (if equal_nat ve zero_nat then Dvd (i, CN (zero_nat, c, Neg e)) | |
| 1800 | else Dvd (i, CN (suc (minus_nat ve one_nat), c, e))) | |
| 1801 | | mirror (NDvd (i, CN (ve, c, e))) = | |
| 1802 | (if equal_nat ve zero_nat then NDvd (i, CN (zero_nat, c, Neg e)) | |
| 1803 | else NDvd (i, CN (suc (minus_nat ve one_nat), c, e))); | |
| 55685 | 1804 | |
| 1805 | fun member A_ [] y = false | |
| 1806 | | member A_ (x :: xs) y = eq A_ x y orelse member A_ xs y; | |
| 1807 | ||
| 1808 | fun remdups A_ [] = [] | |
| 1809 | | remdups A_ (x :: xs) = | |
| 1810 | (if member A_ xs x then remdups A_ xs else x :: remdups A_ xs); | |
| 1811 | ||
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1812 | fun zsplit0 (C c) = (zero_inta, C c) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1813 | | zsplit0 (Bound n) = | 
| 65024 | 1814 | (if equal_nat n zero_nat then (one_inta, C zero_inta) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1815 | else (zero_inta, Bound n)) | 
| 61128 | 1816 | | zsplit0 (CN (n, i, a)) = | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1817 | let | 
| 75362 | 1818 | val (ia, aa) = zsplit0 a; | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1819 | in | 
| 75362 | 1820 | (if equal_nat n zero_nat then (plus_inta i ia, aa) | 
| 1821 | else (ia, CN (n, i, aa))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1822 | end | 
| 65024 | 1823 | | zsplit0 (Neg a) = let | 
| 75362 | 1824 | val (i, aa) = zsplit0 a; | 
| 65024 | 1825 | in | 
| 75362 | 1826 | (uminus_int i, Neg aa) | 
| 65024 | 1827 | end | 
| 1828 | | zsplit0 (Add (a, b)) = let | |
| 75362 | 1829 | val (ia, aa) = zsplit0 a; | 
| 1830 | val (ib, ba) = zsplit0 b; | |
| 65024 | 1831 | in | 
| 75362 | 1832 | (plus_inta ia ib, Add (aa, ba)) | 
| 65024 | 1833 | end | 
| 1834 | | zsplit0 (Sub (a, b)) = let | |
| 75362 | 1835 | val (ia, aa) = zsplit0 a; | 
| 1836 | val (ib, ba) = zsplit0 b; | |
| 65024 | 1837 | in | 
| 75362 | 1838 | (minus_inta ia ib, Sub (aa, ba)) | 
| 65024 | 1839 | end | 
| 1840 | | zsplit0 (Mul (i, a)) = let | |
| 75362 | 1841 | val (ia, aa) = zsplit0 a; | 
| 65024 | 1842 | in | 
| 75362 | 1843 | (times_inta i ia, Mul (i, aa)) | 
| 65024 | 1844 | end; | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1845 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1846 | fun zlfm (And (p, q)) = And (zlfm p, zlfm q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1847 | | zlfm (Or (p, q)) = Or (zlfm p, zlfm q) | 
| 74531 | 1848 | | zlfm (Imp (p, q)) = Or (zlfm (Not p), zlfm q) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1849 | | zlfm (Iff (p, q)) = | 
| 74531 | 1850 | Or (And (zlfm p, zlfm q), And (zlfm (Not p), zlfm (Not q))) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1851 | | zlfm (Lt a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1852 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1853 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1854 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1855 | (if equal_inta c zero_inta then Lt r | 
| 61128 | 1856 | else (if less_int zero_inta c then Lt (CN (zero_nat, c, r)) | 
| 1857 | else Gt (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1858 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1859 | | zlfm (Le a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1860 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1861 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1862 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1863 | (if equal_inta c zero_inta then Le r | 
| 61128 | 1864 | else (if less_int zero_inta c then Le (CN (zero_nat, c, r)) | 
| 1865 | else Ge (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1866 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1867 | | zlfm (Gt a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1868 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1869 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1870 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1871 | (if equal_inta c zero_inta then Gt r | 
| 61128 | 1872 | else (if less_int zero_inta c then Gt (CN (zero_nat, c, r)) | 
| 1873 | else Lt (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1874 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1875 | | zlfm (Ge a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1876 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1877 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1878 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1879 | (if equal_inta c zero_inta then Ge r | 
| 61128 | 1880 | else (if less_int zero_inta c then Ge (CN (zero_nat, c, r)) | 
| 1881 | else Le (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1882 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1883 | | zlfm (Eq a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1884 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1885 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1886 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1887 | (if equal_inta c zero_inta then Eq r | 
| 61128 | 1888 | else (if less_int zero_inta c then Eq (CN (zero_nat, c, r)) | 
| 1889 | else Eq (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1890 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1891 | | zlfm (NEq a) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1892 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1893 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1894 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1895 | (if equal_inta c zero_inta then NEq r | 
| 61128 | 1896 | else (if less_int zero_inta c then NEq (CN (zero_nat, c, r)) | 
| 1897 | else NEq (CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1898 | end | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1899 | | zlfm (Dvd (i, a)) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1900 | (if equal_inta i zero_inta then zlfm (Eq a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1901 | else let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1902 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1903 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1904 | (if equal_inta c zero_inta then Dvd (abs_int i, r) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1905 | else (if less_int zero_inta c | 
| 61128 | 1906 | then Dvd (abs_int i, CN (zero_nat, c, r)) | 
| 1907 | else Dvd (abs_int i, CN (zero_nat, uminus_int c, Neg r)))) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1908 | end) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1909 | | zlfm (NDvd (i, a)) = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1910 | (if equal_inta i zero_inta then zlfm (NEq a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1911 | else let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1912 | val (c, r) = zsplit0 a; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1913 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1914 | (if equal_inta c zero_inta then NDvd (abs_int i, r) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1915 | else (if less_int zero_inta c | 
| 61128 | 1916 | then NDvd (abs_int i, CN (zero_nat, c, r)) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1917 | else NDvd (abs_int i, | 
| 61128 | 1918 | CN (zero_nat, uminus_int c, Neg r)))) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1919 | end) | 
| 74531 | 1920 | | zlfm (Not (And (p, q))) = Or (zlfm (Not p), zlfm (Not q)) | 
| 1921 | | zlfm (Not (Or (p, q))) = And (zlfm (Not p), zlfm (Not q)) | |
| 1922 | | zlfm (Not (Imp (p, q))) = And (zlfm p, zlfm (Not q)) | |
| 1923 | | zlfm (Not (Iff (p, q))) = | |
| 1924 | Or (And (zlfm p, zlfm (Not q)), And (zlfm (Not p), zlfm q)) | |
| 1925 | | zlfm (Not (Not p)) = zlfm p | |
| 1926 | | zlfm (Not T) = F | |
| 1927 | | zlfm (Not F) = T | |
| 1928 | | zlfm (Not (Lt a)) = zlfm (Ge a) | |
| 1929 | | zlfm (Not (Le a)) = zlfm (Gt a) | |
| 1930 | | zlfm (Not (Gt a)) = zlfm (Le a) | |
| 1931 | | zlfm (Not (Ge a)) = zlfm (Lt a) | |
| 1932 | | zlfm (Not (Eq a)) = zlfm (NEq a) | |
| 1933 | | zlfm (Not (NEq a)) = zlfm (Eq a) | |
| 1934 | | zlfm (Not (Dvd (i, a))) = zlfm (NDvd (i, a)) | |
| 1935 | | zlfm (Not (NDvd (i, a))) = zlfm (Dvd (i, a)) | |
| 1936 | | zlfm (Not (Closed p)) = NClosed p | |
| 1937 | | zlfm (Not (NClosed p)) = Closed p | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1938 | | zlfm T = T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1939 | | zlfm F = F | 
| 74531 | 1940 | | zlfm (Not (E va)) = Not (E va) | 
| 1941 | | zlfm (Not (A va)) = Not (A va) | |
| 65024 | 1942 | | zlfm (E v) = E v | 
| 1943 | | zlfm (A v) = A v | |
| 1944 | | zlfm (Closed v) = Closed v | |
| 1945 | | zlfm (NClosed v) = NClosed v; | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1946 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1947 | fun unita p = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1948 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1949 | val pa = zlfm p; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1950 | val l = zeta pa; | 
| 65024 | 1951 | val q = And (Dvd (l, CN (zero_nat, one_inta, C zero_inta)), a_beta pa l); | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1952 | val d = delta q; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1953 | val b = remdups equal_num (map simpnum (beta q)); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1954 | val a = remdups equal_num (map simpnum (alpha q)); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1955 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1956 | (if less_eq_nat (size_list b) (size_list a) then (q, (b, d)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1957 | else (mirror q, (a, d))) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1958 | end; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1959 | |
| 55685 | 1960 | fun decrnum (Bound n) = Bound (minus_nat n one_nat) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1961 | | decrnum (Neg a) = Neg (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1962 | | decrnum (Add (a, b)) = Add (decrnum a, decrnum b) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1963 | | decrnum (Sub (a, b)) = Sub (decrnum a, decrnum b) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1964 | | decrnum (Mul (c, a)) = Mul (c, decrnum a) | 
| 61128 | 1965 | | decrnum (CN (n, i, a)) = CN (minus_nat n one_nat, i, decrnum a) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1966 | | decrnum (C v) = C v; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1967 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1968 | fun decr (Lt a) = Lt (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1969 | | decr (Le a) = Le (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1970 | | decr (Gt a) = Gt (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1971 | | decr (Ge a) = Ge (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1972 | | decr (Eq a) = Eq (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1973 | | decr (NEq a) = NEq (decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1974 | | decr (Dvd (i, a)) = Dvd (i, decrnum a) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1975 | | decr (NDvd (i, a)) = NDvd (i, decrnum a) | 
| 74531 | 1976 | | decr (Not p) = Not (decr p) | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1977 | | decr (And (p, q)) = And (decr p, decr q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1978 | | decr (Or (p, q)) = Or (decr p, decr q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1979 | | decr (Imp (p, q)) = Imp (decr p, decr q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1980 | | decr (Iff (p, q)) = Iff (decr p, decr q) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1981 | | decr T = T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1982 | | decr F = F | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1983 | | decr (E v) = E v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1984 | | decr (A v) = A v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1985 | | decr (Closed v) = Closed v | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1986 | | decr (NClosed v) = NClosed v; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1987 | |
| 55685 | 1988 | fun upto_aux i j js = | 
| 65024 | 1989 | (if less_int j i then js else upto_aux i (minus_inta j one_inta) (j :: js)); | 
| 55685 | 1990 | |
| 1991 | fun uptoa i j = upto_aux i j []; | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1992 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1993 | fun maps f [] = [] | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1994 | | maps f (x :: xs) = f x @ maps f xs; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1995 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1996 | fun cooper p = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1997 | let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 1998 | val (q, (b, d)) = unita p; | 
| 65024 | 1999 | val js = uptoa one_inta d; | 
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2000 | val mq = simpfm (minusinf q); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2001 | val md = evaldjf (fn j => simpfm (subst0 (C j) mq)) js; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2002 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2003 | (if equal_fm md T then T | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2004 | else let | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2005 | val qd = | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2006 | evaldjf (fn (ba, j) => simpfm (subst0 (Add (ba, C j)) q)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2007 | (maps (fn ba => map (fn a => (ba, a)) js) b); | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2008 | in | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2009 | decr (disj md qd) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2010 | end) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2011 | end; | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2012 | |
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2013 | fun qelim (E p) = (fn qe => dj qe (qelim p qe)) | 
| 74531 | 2014 | | qelim (A p) = (fn qe => nota (qe (qelim (Not p) qe))) | 
| 2015 | | qelim (Not p) = (fn qe => nota (qelim p qe)) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2016 | | qelim (And (p, q)) = (fn qe => conj (qelim p qe) (qelim q qe)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2017 | | qelim (Or (p, q)) = (fn qe => disj (qelim p qe) (qelim q qe)) | 
| 55685 | 2018 | | qelim (Imp (p, q)) = (fn qe => imp (qelim p qe) (qelim q qe)) | 
| 2019 | | qelim (Iff (p, q)) = (fn qe => iff (qelim p qe) (qelim q qe)) | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2020 | | qelim T = (fn _ => simpfm T) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2021 | | qelim F = (fn _ => simpfm F) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2022 | | qelim (Lt v) = (fn _ => simpfm (Lt v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2023 | | qelim (Le v) = (fn _ => simpfm (Le v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2024 | | qelim (Gt v) = (fn _ => simpfm (Gt v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2025 | | qelim (Ge v) = (fn _ => simpfm (Ge v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2026 | | qelim (Eq v) = (fn _ => simpfm (Eq v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2027 | | qelim (NEq v) = (fn _ => simpfm (NEq v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2028 | | qelim (Dvd (v, va)) = (fn _ => simpfm (Dvd (v, va))) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2029 | | qelim (NDvd (v, va)) = (fn _ => simpfm (NDvd (v, va))) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2030 | | qelim (Closed v) = (fn _ => simpfm (Closed v)) | 
| 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
44930diff
changeset | 2031 | | qelim (NClosed v) = (fn _ => simpfm (NClosed v)); | 
| 23466 | 2032 | |
| 29787 | 2033 | fun prep (E T) = T | 
| 2034 | | prep (E F) = F | |
| 2035 | | prep (E (Or (p, q))) = Or (prep (E p), prep (E q)) | |
| 74531 | 2036 | | prep (E (Imp (p, q))) = Or (prep (E (Not p)), prep (E q)) | 
| 29787 | 2037 | | prep (E (Iff (p, q))) = | 
| 74531 | 2038 | Or (prep (E (And (p, q))), prep (E (And (Not p, Not q)))) | 
| 2039 | | prep (E (Not (And (p, q)))) = Or (prep (E (Not p)), prep (E (Not q))) | |
| 2040 | | prep (E (Not (Imp (p, q)))) = prep (E (And (p, Not q))) | |
| 2041 | | prep (E (Not (Iff (p, q)))) = | |
| 2042 | Or (prep (E (And (p, Not q))), prep (E (And (Not p, q)))) | |
| 65024 | 2043 | | prep (E (Lt v)) = E (prep (Lt v)) | 
| 2044 | | prep (E (Le v)) = E (prep (Le v)) | |
| 2045 | | prep (E (Gt v)) = E (prep (Gt v)) | |
| 2046 | | prep (E (Ge v)) = E (prep (Ge v)) | |
| 2047 | | prep (E (Eq v)) = E (prep (Eq v)) | |
| 2048 | | prep (E (NEq v)) = E (prep (NEq v)) | |
| 2049 | | prep (E (Dvd (v, va))) = E (prep (Dvd (v, va))) | |
| 2050 | | prep (E (NDvd (v, va))) = E (prep (NDvd (v, va))) | |
| 74531 | 2051 | | prep (E (Not T)) = E (prep (Not T)) | 
| 2052 | | prep (E (Not F)) = E (prep (Not F)) | |
| 2053 | | prep (E (Not (Lt va))) = E (prep (Not (Lt va))) | |
| 2054 | | prep (E (Not (Le va))) = E (prep (Not (Le va))) | |
| 2055 | | prep (E (Not (Gt va))) = E (prep (Not (Gt va))) | |
| 2056 | | prep (E (Not (Ge va))) = E (prep (Not (Ge va))) | |
| 2057 | | prep (E (Not (Eq va))) = E (prep (Not (Eq va))) | |
| 2058 | | prep (E (Not (NEq va))) = E (prep (Not (NEq va))) | |
| 2059 | | prep (E (Not (Dvd (va, vb)))) = E (prep (Not (Dvd (va, vb)))) | |
| 2060 | | prep (E (Not (NDvd (va, vb)))) = E (prep (Not (NDvd (va, vb)))) | |
| 2061 | | prep (E (Not (Not va))) = E (prep (Not (Not va))) | |
| 2062 | | prep (E (Not (Or (va, vb)))) = E (prep (Not (Or (va, vb)))) | |
| 2063 | | prep (E (Not (E va))) = E (prep (Not (E va))) | |
| 2064 | | prep (E (Not (A va))) = E (prep (Not (A va))) | |
| 2065 | | prep (E (Not (Closed va))) = E (prep (Not (Closed va))) | |
| 2066 | | prep (E (Not (NClosed va))) = E (prep (Not (NClosed va))) | |
| 65024 | 2067 | | prep (E (And (v, va))) = E (prep (And (v, va))) | 
| 2068 | | prep (E (E v)) = E (prep (E v)) | |
| 2069 | | prep (E (A v)) = E (prep (A v)) | |
| 2070 | | prep (E (Closed v)) = E (prep (Closed v)) | |
| 2071 | | prep (E (NClosed v)) = E (prep (NClosed v)) | |
| 29787 | 2072 | | prep (A (And (p, q))) = And (prep (A p), prep (A q)) | 
| 74531 | 2073 | | prep (A T) = prep (Not (E (Not T))) | 
| 2074 | | prep (A F) = prep (Not (E (Not F))) | |
| 2075 | | prep (A (Lt v)) = prep (Not (E (Not (Lt v)))) | |
| 2076 | | prep (A (Le v)) = prep (Not (E (Not (Le v)))) | |
| 2077 | | prep (A (Gt v)) = prep (Not (E (Not (Gt v)))) | |
| 2078 | | prep (A (Ge v)) = prep (Not (E (Not (Ge v)))) | |
| 2079 | | prep (A (Eq v)) = prep (Not (E (Not (Eq v)))) | |
| 2080 | | prep (A (NEq v)) = prep (Not (E (Not (NEq v)))) | |
| 2081 | | prep (A (Dvd (v, va))) = prep (Not (E (Not (Dvd (v, va))))) | |
| 2082 | | prep (A (NDvd (v, va))) = prep (Not (E (Not (NDvd (v, va))))) | |
| 2083 | | prep (A (Not v)) = prep (Not (E (Not (Not v)))) | |
| 2084 | | prep (A (Or (v, va))) = prep (Not (E (Not (Or (v, va))))) | |
| 2085 | | prep (A (Imp (v, va))) = prep (Not (E (Not (Imp (v, va))))) | |
| 2086 | | prep (A (Iff (v, va))) = prep (Not (E (Not (Iff (v, va))))) | |
| 2087 | | prep (A (E v)) = prep (Not (E (Not (E v)))) | |
| 2088 | | prep (A (A v)) = prep (Not (E (Not (A v)))) | |
| 2089 | | prep (A (Closed v)) = prep (Not (E (Not (Closed v)))) | |
| 2090 | | prep (A (NClosed v)) = prep (Not (E (Not (NClosed v)))) | |
| 2091 | | prep (Not (Not p)) = prep p | |
| 2092 | | prep (Not (And (p, q))) = Or (prep (Not p), prep (Not q)) | |
| 2093 | | prep (Not (A p)) = prep (E (Not p)) | |
| 2094 | | prep (Not (Or (p, q))) = And (prep (Not p), prep (Not q)) | |
| 2095 | | prep (Not (Imp (p, q))) = And (prep p, prep (Not q)) | |
| 2096 | | prep (Not (Iff (p, q))) = Or (prep (And (p, Not q)), prep (And (Not p, q))) | |
| 2097 | | prep (Not T) = Not (prep T) | |
| 2098 | | prep (Not F) = Not (prep F) | |
| 2099 | | prep (Not (Lt v)) = Not (prep (Lt v)) | |
| 2100 | | prep (Not (Le v)) = Not (prep (Le v)) | |
| 2101 | | prep (Not (Gt v)) = Not (prep (Gt v)) | |
| 2102 | | prep (Not (Ge v)) = Not (prep (Ge v)) | |
| 2103 | | prep (Not (Eq v)) = Not (prep (Eq v)) | |
| 2104 | | prep (Not (NEq v)) = Not (prep (NEq v)) | |
| 2105 | | prep (Not (Dvd (v, va))) = Not (prep (Dvd (v, va))) | |
| 2106 | | prep (Not (NDvd (v, va))) = Not (prep (NDvd (v, va))) | |
| 2107 | | prep (Not (E v)) = Not (prep (E v)) | |
| 2108 | | prep (Not (Closed v)) = Not (prep (Closed v)) | |
| 2109 | | prep (Not (NClosed v)) = Not (prep (NClosed v)) | |
| 29787 | 2110 | | prep (Or (p, q)) = Or (prep p, prep q) | 
| 2111 | | prep (And (p, q)) = And (prep p, prep q) | |
| 74531 | 2112 | | prep (Imp (p, q)) = prep (Or (Not p, q)) | 
| 2113 | | prep (Iff (p, q)) = Or (prep (And (p, q)), prep (And (Not p, Not q))) | |
| 29787 | 2114 | | prep T = T | 
| 2115 | | prep F = F | |
| 65024 | 2116 | | prep (Lt v) = Lt v | 
| 29787 | 2117 | | prep (Le v) = Le v | 
| 65024 | 2118 | | prep (Gt v) = Gt v | 
| 2119 | | prep (Ge v) = Ge v | |
| 2120 | | prep (Eq v) = Eq v | |
| 2121 | | prep (NEq v) = NEq v | |
| 2122 | | prep (Dvd (v, va)) = Dvd (v, va) | |
| 2123 | | prep (NDvd (v, va)) = NDvd (v, va) | |
| 2124 | | prep (Closed v) = Closed v | |
| 2125 | | prep (NClosed v) = NClosed v; | |
| 23466 | 2126 | |
| 29787 | 2127 | fun pa p = qelim (prep p) cooper; | 
| 2128 | ||
| 61128 | 2129 | fun nat_of_integer k = Nat (max ord_integer (0 : IntInf.int) k); | 
| 55685 | 2130 | |
| 36798 | 2131 | end; (*struct Cooper_Procedure*) |