src/Provers/Arith/extract_common_term.ML
author paulson
Mon, 18 Dec 2000 15:00:15 +0100
changeset 10694 9a5d5df29e5c
child 13484 d8f5d3391766
permissions -rw-r--r--
new simproc for cancelling common factors, etc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10694
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     1
(*  Title:      Provers/Arith/extract_common_term.ML
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     2
    ID:         $Id$
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     4
    Copyright   2000  University of Cambridge
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     5
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     6
Extract common terms in balanced expressions:
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     7
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     8
     i + u + j ~~ i' + u + j'  ==  u + (i + j) ~~ u + (i' + j')
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
     9
     i + u     ~~ u            ==  u + i       ~~ u + 0
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    10
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    11
where ~~ is an appropriate balancing operation (e.g. =, <=, <, -) and 0 is a 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    12
suitable identity for +.
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    13
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    14
This massaged formula is then simplified in a user-specified way.
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    15
*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    16
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    17
signature EXTRACT_COMMON_TERM_DATA =
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    18
sig
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    19
  (*abstract syntax*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    20
  val mk_sum: term list -> term
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    21
  val dest_sum: term -> term list
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    22
  val mk_bal: term * term -> term
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    23
  val dest_bal: term -> term * term
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    24
  val find_first: term -> term list -> term list
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    25
  (*proof tools*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    26
  val prove_conv: tactic list -> Sign.sg -> 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    27
                  thm list -> term * term -> thm option
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    28
  val norm_tac: tactic                (*proves the result*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    29
  val simplify_meta_eq: thm -> thm    (*simplifies the result*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    30
end;
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    31
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    32
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    33
functor ExtractCommonTermFun(Data: EXTRACT_COMMON_TERM_DATA):
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    34
  sig
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    35
  val proc: Sign.sg -> thm list -> term -> thm option
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    36
  end 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    37
=
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    38
struct
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    39
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    40
(*Store the term t in the table*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    41
fun update_by_coeff (tab, t) = Termtab.update ((t, ()), tab);
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    42
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    43
(*a left-to-right scan of terms1, seeking a term u that is also in terms2*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    44
fun find_common (terms1,terms2) =
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    45
  let val tab2 = foldl update_by_coeff (Termtab.empty, terms2)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    46
      fun seek [] = raise TERM("find_common", []) 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    47
	| seek (u::terms) =
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    48
	      if is_some (Termtab.lookup (tab2, u)) then u
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    49
	      else seek terms
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    50
  in  seek terms1 end;
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    51
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    52
(*the simplification procedure*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    53
fun proc sg hyps t =
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    54
  let (*first freeze any Vars in the term to prevent flex-flex problems*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    55
      val rand_s = gensym"_"
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    56
      fun mk_inst (var as Var((a,i),T))  = 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    57
	    (var,  Free((a ^ rand_s ^ string_of_int i), T))
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    58
      val t' = subst_atomic (map mk_inst (term_vars t)) t
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    59
      val (t1,t2) = Data.dest_bal t' 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    60
      val terms1 = Data.dest_sum t1
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    61
      and terms2 = Data.dest_sum t2
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    62
      val u = find_common (terms1,terms2)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    63
      val terms1' = Data.find_first u terms1
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    64
      and terms2' = Data.find_first u terms2
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    65
      val reshape = 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    66
	    Data.prove_conv [Data.norm_tac] sg hyps
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    67
	        (t', 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    68
		 Data.mk_bal (Data.mk_sum (u::terms1'), 
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    69
		              Data.mk_sum (u::terms2')))
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    70
  in
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    71
      apsome Data.simplify_meta_eq reshape
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    72
  end
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    73
  handle TERM _ => None
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    74
       | TYPE _ => None;   (*Typically (if thy doesn't include Numeral)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    75
			     Undeclared type constructor "Numeral.bin"*)
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    76
9a5d5df29e5c new simproc for cancelling common factors, etc.
paulson
parents:
diff changeset
    77
end;