1 (* Title: Provers/Arith/cancel_sums.ML
2 Author: Markus Wenzel and Stefan Berghofer, TU Muenchen
4 Cancel common summands of balanced expressions:
6 A + x + B ~~ A' + x + B' == A + B ~~ A' + B'
8 where + is AC0 and ~~ an appropriate balancing operation (e.g. =, <=, <, -).
11 signature CANCEL_SUMS_DATA =
14 val mk_sum: term list -> term
15 val dest_sum: term -> term list
16 val mk_bal: term * term -> term
17 val dest_bal: term -> term * term
19 val prove_conv: tactic -> (simpset -> tactic) -> simpset -> term * term -> thm
20 val norm_tac: simpset -> tactic (*AC0 etc.*)
21 val uncancel_tac: cterm -> tactic (*apply A ~~ B == x + A ~~ x + B*)
24 signature CANCEL_SUMS =
26 val proc: simpset -> term -> thm option
30 functor CancelSumsFun(Data: CANCEL_SUMS_DATA): CANCEL_SUMS =
36 fun cons1 x (xs, y, z) = (x :: xs, y, z);
37 fun cons2 y (x, ys, z) = (x, y :: ys, z);
39 (*symmetric difference of multisets -- assumed to be sorted wrt. Term_Ord.term_ord*)
40 fun cancel ts [] vs = (ts, [], vs)
41 | cancel [] us vs = ([], us, vs)
42 | cancel (t :: ts) (u :: us) vs =
43 (case Term_Ord.term_ord (t, u) of
44 EQUAL => cancel ts us (t :: vs)
45 | LESS => cons1 t (cancel ts (u :: us) vs)
46 | GREATER => cons2 u (cancel (t :: ts) us vs));
51 fun uncancel_sums_tac _ [] = all_tac
52 | uncancel_sums_tac thy (t :: ts) =
53 Data.uncancel_tac (Thm.cterm_of thy t) THEN
54 uncancel_sums_tac thy ts;
57 (* the simplification procedure *)
60 (case try Data.dest_bal t of
64 val thy = ProofContext.theory_of (Simplifier.the_context ss);
65 val (ts, us) = pairself (sort Term_Ord.term_ord o Data.dest_sum) bal;
66 val (ts', us', vs) = cancel ts us [];
70 (Data.prove_conv (uncancel_sums_tac thy vs) Data.norm_tac ss
71 (t, Data.mk_bal (Data.mk_sum ts', Data.mk_sum us')))