src/Provers/Arith/cancel_factor.ML
author wenzelm
Tue, 18 Sep 2007 16:08:00 +0200
changeset 24630 351a308ab58d
parent 23261 85f27f79232f
child 29269 5c25a2012975
permissions -rw-r--r--
simplified type int (eliminated IntInf.int, integer);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     1
(*  Title:      Provers/Arith/cancel_factor.ML
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel and Stefan Berghofer, TU Muenchen
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     4
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     5
Cancel common constant factor from balanced exression (e.g. =, <=, < of sums).
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     6
*)
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     7
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     8
signature CANCEL_FACTOR_DATA =
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
     9
sig
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    10
  (*abstract syntax*)
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    11
  val mk_sum: term list -> term
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    12
  val dest_sum: term -> term list
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    13
  val mk_bal: term * term -> term
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    14
  val dest_bal: term -> term * term
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    15
  (*rules*)
20044
92cc2f4c7335 simprocs: no theory argument -- use simpset context instead;
wenzelm
parents: 19250
diff changeset
    16
  val prove_conv: tactic -> tactic -> Proof.context -> term * term -> thm
23261
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    17
  val norm_tac: tactic (*AC0 etc.*)
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    18
  val multiply_tac: integer -> tactic
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    19
    (*apply a ~~ b  ==  k * a ~~ k * b  (for k > 0)*)
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    20
end;
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    21
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    22
signature CANCEL_FACTOR =
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    23
sig
20044
92cc2f4c7335 simprocs: no theory argument -- use simpset context instead;
wenzelm
parents: 19250
diff changeset
    24
  val proc: simpset -> term -> thm option
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    25
end;
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    26
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    27
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    28
functor CancelFactorFun(Data: CANCEL_FACTOR_DATA): CANCEL_FACTOR =
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    29
struct
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    30
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    31
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    32
(* count terms *)
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    33
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    34
fun ins_term (t, []) = [(t, 1)]
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    35
  | ins_term (t, (u, k) :: uks) =
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    36
      if t aconv u then (u, k + 1) :: uks
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    37
      else (t, 1) :: (u, k) :: uks;
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    38
4452
b2ee34200dab adapted to new sort function;
wenzelm
parents: 4292
diff changeset
    39
fun count_terms ts = foldr ins_term (sort Term.term_ord ts, []);
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    40
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    41
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    42
(* divide sum *)
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    43
23261
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    44
fun div_sum d =
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    45
  Data.mk_sum o maps (fn (t, k) => replicate (k div d) t);
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    46
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    47
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    48
(* the simplification procedure *)
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    49
20044
92cc2f4c7335 simprocs: no theory argument -- use simpset context instead;
wenzelm
parents: 19250
diff changeset
    50
fun proc ss t =
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    51
  (case try Data.dest_bal t of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    52
    NONE => NONE
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    53
  | SOME bal =>
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    54
      (case pairself Data.dest_sum bal of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    55
        ([_], _) => NONE
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    56
      | (_, [_]) => NONE
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    57
      | ts_us =>
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    58
          let
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    59
            val (tks, uks) = pairself count_terms ts_us;
23261
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    60
            val d = 0
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    61
              |> fold (Integer.gcd o snd) tks
85f27f79232f tuned integers
haftmann
parents: 20044
diff changeset
    62
              |> fold (Integer.gcd o snd) uks;
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    63
          in
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    64
            if d = 0 orelse d = 1 then NONE
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 4452
diff changeset
    65
            else SOME
20044
92cc2f4c7335 simprocs: no theory argument -- use simpset context instead;
wenzelm
parents: 19250
diff changeset
    66
              (Data.prove_conv (Data.multiply_tac d) Data.norm_tac (Simplifier.the_context ss)
24630
351a308ab58d simplified type int (eliminated IntInf.int, integer);
wenzelm
parents: 23261
diff changeset
    67
                (t, Data.mk_bal (div_sum d tks, div_sum d uks)))
4292
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    68
          end));
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    69
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    70
014771692751 Cancel common constant factor from balanced exression.
wenzelm
parents:
diff changeset
    71
end;