(* ========================================================================== *) (* FLYSPECK - BOOK FORMALIZATION *) (* *) (* Tactic: AFF_SGN_TAC *) (* Chapter: LEG *) (* Author: John Harrison, with minor edits by T. Hales *) (* Date: 2010-02-07 *) (* ========================================================================== *) module type Aff_sgn_tac_type = sig val AFF_SGN_TAC : tactic end;; (* This is Harrison's 2009 workshop AFF_GE_TAC tactic, slightly adapted to handle signs other than GE. The tactic is documented at http://weyl.math.pitt.edu/hanoi2009/uploads/HOLLight/affsign_small.ml Examples appear at the indicated URL. It proves conv0, aff_gt, aff_ge, and aff_lt formulas in special cases. *) module Aff_sgn_tac : Aff_sgn_tac_type = struct let AFF_SGN_TAC = REWRITE_TAC[DISJOINT_INSERT; DISJOINT_EMPTY] THEN REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN REPEAT STRIP_TAC THEN REWRITE_TAC[aff_ge_def; sgn_ge; aff_gt_def;sgn_gt;conv0;aff_lt_def;sgn_lt;AFFSIGN_ALT] THEN REWRITE_TAC[SET_RULE `(x INSERT s) UNION t = x INSERT (s UNION t)`] THEN REWRITE_TAC[UNION_EMPTY] THEN SIMP_TAC[FINITE_INSERT; FINITE_UNION; AFFINE_HULL_FINITE_STEP_GEN; FINITE_EMPTY; RIGHT_EXISTS_AND_THM; REAL_LE_ADD; REAL_LT_ADD; REAL_ARITH `a < &0 /\ b < &0 ==> a+ b< &0`; REAL_ARITH `&0 < a/ &2 <=> &0 < a`; REAL_ARITH `&0 <= a / &2 <=> &0 <= a`; REAL_ARITH `a/ &2 < &0 <=> a < &0`] THEN ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; real_ge;real_gt] THEN REWRITE_TAC[REAL_ARITH `x - y:real = z <=> x = y + z`; VECTOR_ARITH `x - y:real^N = z <=> x = y + z`] THEN REWRITE_TAC[RIGHT_AND_EXISTS_THM; REAL_ADD_RID; VECTOR_ADD_RID] THEN ONCE_REWRITE_TAC[REAL_ARITH `&1 = x <=> x = &1`] THEN REWRITE_TAC[] THEN SET_TAC[];; end;;