228 {splits = splits, inj_consts = inj_consts, discrete = d :: discrete, presburger= presburger}); |
228 {splits = splits, inj_consts = inj_consts, discrete = d :: discrete, presburger= presburger}); |
229 |
229 |
230 fun arith_inj_const c = ArithTheoryData.map (fn {splits,inj_consts,discrete,presburger} => |
230 fun arith_inj_const c = ArithTheoryData.map (fn {splits,inj_consts,discrete,presburger} => |
231 {splits = splits, inj_consts = c :: inj_consts, discrete = discrete, presburger = presburger}); |
231 {splits = splits, inj_consts = c :: inj_consts, discrete = discrete, presburger = presburger}); |
232 |
232 |
|
233 |
|
234 (* A FIXME to avoid excessive case splits when ~= is split into < and >: |
|
235 ignore ~= altogether. |
|
236 *) |
|
237 |
|
238 val ignore_neq = ref false; |
233 |
239 |
234 structure LA_Data_Ref: LIN_ARITH_DATA = |
240 structure LA_Data_Ref: LIN_ARITH_DATA = |
235 struct |
241 struct |
236 |
242 |
237 (* Decomposition of terms *) |
243 (* Decomposition of terms *) |
331 | "op <=" => Some(p,i,"<=",q,j) |
337 | "op <=" => Some(p,i,"<=",q,j) |
332 | "op =" => Some(p,i,"=",q,j) |
338 | "op =" => Some(p,i,"=",q,j) |
333 | _ => None |
339 | _ => None |
334 end handle Zero => None; |
340 end handle Zero => None; |
335 |
341 |
336 fun negate(Some(x,i,rel,y,j,d)) = Some(x,i,"~"^rel,y,j,d) |
342 fun negate(Some(x,i,rel,y,j,d)) = |
|
343 if rel = "=" andalso !ignore_neq then None else Some(x,i,"~"^rel,y,j,d) |
337 | negate None = None; |
344 | negate None = None; |
338 |
345 |
339 fun decomp1 (discrete,inj_consts) (T,xxx) = |
346 fun decomp1 (discrete,inj_consts) (T,xxx) = |
340 (case T of |
347 (case T of |
341 Type("fun",[Type(D,[]),_]) => |
348 Type("fun",[Type(D,[]),_]) => |