src/HOL/Real/simproc.ML
author paulson
Mon, 05 Oct 1998 10:19:21 +0200
changeset 5610 377acd99d74c
parent 5588 a3ab526bb891
child 7585 dca904d4ce4c
permissions -rw-r--r--
simpler interface for Abel_Cancel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     1
(*  Title:      HOL/Real/simproc.ML
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     2
    ID:         $Id$
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     4
    Copyright   1998  University of Cambridge
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     5
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     6
Apply Abel_Cancel to the reals
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     7
*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     8
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     9
(*** Two lemmas needed for the simprocs ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    10
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    11
(*Deletion of other terms in the formula, seeking the -x at the front of z*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    12
val real_add_cancel_21 = prove_goal RealDef.thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    13
    "((x::real) + (y + z) = y + u) = ((x + z) = u)"
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    14
  (fn _ => [stac real_add_left_commute 1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    15
	    rtac real_add_left_cancel 1]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    16
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    17
(*A further rule to deal with the case that
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    18
  everything gets cancelled on the right.*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    19
val real_add_cancel_end = prove_goal RealDef.thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    20
    "((x::real) + (y + z) = y) = (x = -z)"
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    21
  (fn _ => [stac real_add_left_commute 1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    22
	    res_inst_tac [("t", "y")] (real_add_zero_right RS subst) 1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    23
	    stac real_add_left_cancel 1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    24
	    simp_tac (simpset() addsimps [real_eq_diff_eq RS sym]) 1]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    25
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    26
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    27
structure Real_Cancel_Data =
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    28
struct
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    29
  val ss		= HOL_ss
5610
377acd99d74c simpler interface for Abel_Cancel
paulson
parents: 5588
diff changeset
    30
  val eq_reflection	= eq_reflection
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    31
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    32
  val thy		= RealDef.thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    33
  val T			= Type ("RealDef.real", [])
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    34
  val zero		= Const ("RealDef.0r", T)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    35
  val add_cancel_21	= real_add_cancel_21
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    36
  val add_cancel_end	= real_add_cancel_end
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    37
  val add_left_cancel	= real_add_left_cancel
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    38
  val add_assoc		= real_add_assoc
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    39
  val add_commute	= real_add_commute
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    40
  val add_left_commute	= real_add_left_commute
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    41
  val add_0		= real_add_zero_left
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    42
  val add_0_right	= real_add_zero_right
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    43
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    44
  val eq_diff_eq	= real_eq_diff_eq
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    45
  val eqI_rules		= [real_less_eqI, real_eq_eqI, real_le_eqI]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    46
  fun dest_eqI th = 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    47
      #1 (HOLogic.dest_bin "op =" HOLogic.boolT 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    48
	      (HOLogic.dest_Trueprop (concl_of th)))
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    49
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    50
  val diff_def		= real_diff_def
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    51
  val minus_add_distrib	= real_minus_add_distrib
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    52
  val minus_minus	= real_minus_minus
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    53
  val minus_0		= real_minus_zero
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    54
  val add_inverses	= [real_add_minus, real_add_minus_left];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    55
  val cancel_simps	= [real_add_minus_cancel, real_minus_add_cancel]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    56
end;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    57
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    58
structure Real_Cancel = Abel_Cancel (Real_Cancel_Data);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    59
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    60
Addsimprocs [Real_Cancel.sum_conv, Real_Cancel.rel_conv];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    61