diff options
Diffstat (limited to 'hol-light/TacticRecording/promote.ml')
-rw-r--r-- | hol-light/TacticRecording/promote.ml | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/hol-light/TacticRecording/promote.ml b/hol-light/TacticRecording/promote.ml new file mode 100644 index 00000000..0b40b5f9 --- /dev/null +++ b/hol-light/TacticRecording/promote.ml @@ -0,0 +1,297 @@ +(* ========================================================================== *) +(* PROMOTTION (HOL LIGHT) *) +(* - Overwrites original HOL Light tactics/etc with xgoal/xthm versions *) +(* *) +(* By Mark Adams *) +(* Copyright (c) Univeristy of Edinburgh, 2012 *) +(* ========================================================================== *) + + + +(* ** TACTICS.ML ** *) + + +(* Tactics *) + +(* Atomic tactics can be automatically promoted to deal with xgoals and *) +(* recording. *) + +let NO_TAC = tactic_wrap "NO_TAC" NO_TAC;; +let ALL_TAC = tactic_wrap "ALL_TAC" ALL_TAC;; + +let LABEL_TAC = stringthm_tactic_wrap "LABEL_TAC" LABEL_TAC;; +let ASSUME_TAC = thm_tactic_wrap "ASSUME_TAC" ASSUME_TAC;; + +let ACCEPT_TAC = thm_tactic_wrap "ACCEPT_TAC" ACCEPT_TAC;; + +let REFL_TAC = tactic_wrap "REFL_TAC" REFL_TAC;; +let ABS_TAC = tactic_wrap "ABS_TAC" ABS_TAC;; +let MK_COMB_TAC = tactic_wrap "MK_COMB_TAC" MK_COMB_TAC;; +let AP_TERM_TAC = tactic_wrap "AP_TERM_TAC" AP_TERM_TAC;; +let AP_THM_TAC = tactic_wrap "AP_THM_TAC" AP_THM_TAC;; +let BINOP_TAC = tactic_wrap "BINOP_TAC" BINOP_TAC;; +let SUBST1_TAC = thm_tactic_wrap "SUBST1_TAC" SUBST1_TAC;; +let SUBST_ALL_TAC = thm_tactic_wrap "SUBST_ALL_TAC" SUBST_ALL_TAC;; +let BETA_TAC = tactic_wrap "BETA_TAC" BETA_TAC;; + +let SUBST_VAR_TAC = thm_tactic_wrap "SUBST_VAR_TAC" SUBST_VAR_TAC;; + +let DISCH_TAC = tactic_wrap "DISCH_TAC" DISCH_TAC;; +let MP_TAC = thm_tactic_wrap "MP_TAC" MP_TAC;; +let EQ_TAC = tactic_wrap "EQ_TAC" EQ_TAC;; +let UNDISCH_TAC = term_tactic_wrap "UNDISCH_TAC" UNDISCH_TAC;; +let SPEC_TAC = termpair_tactic_wrap "SPEC_TAC" SPEC_TAC;; +let X_GEN_TAC = term_tactic_wrap "X_GEN_TAC" X_GEN_TAC;; +let GEN_TAC = tactic_wrap "GEN_TAC" GEN_TAC;; +let EXISTS_TAC = term_tactic_wrap "EXISTS_TAC" EXISTS_TAC;; +let CHOOSE_TAC = thm_tactic_wrap "CHOOSE_TAC" CHOOSE_TAC;; +let CONJ_TAC = tactic_wrap "CONJ_TAC" CONJ_TAC;; +let DISJ1_TAC = tactic_wrap "DISJ1_TAC" DISJ1_TAC;; +let DISJ2_TAC = tactic_wrap "DISJ2_TAC" DISJ2_TAC;; +let DISJ_CASES_TAC = thm_tactic_wrap "DISJ_CASES_TAC" DISJ_CASES_TAC;; +let CONTR_TAC = thm_tactic_wrap "CONTR_TAC" CONTR_TAC;; +let MATCH_ACCEPT_TAC = thm_tactic_wrap "MATCH_ACCEPT_TAC" MATCH_ACCEPT_TAC;; +let MATCH_MP_TAC = thm_tactic_wrap "MATCH_MP_TAC" MATCH_MP_TAC;; + +let STRIP_ASSUME_TAC = thm_tactic_wrap "STRIP_ASSUME_TAC" STRIP_ASSUME_TAC;; +let STRUCT_CASES_TAC = thm_tactic_wrap "STRUCT_CASES_TAC" STRUCT_CASES_TAC;; +let STRIP_TAC = tactic_wrap "STRIP_TAC" STRIP_TAC;; + +let X_META_EXISTS_TAC = term_tactic_wrap "X_META_EXISTS_TAC" X_META_EXISTS_TAC;; +let META_EXISTS_TAC = tactic_wrap "META_EXISTS_TAC" META_EXISTS_TAC;; + +let ANTS_TAC = tactic_wrap "ANTS_TAC" ANTS_TAC;; + + +(* Special cases, already fully hand-promoted *) + +let CONV_TAC = xCONV_TAC;; +let SUBGOAL_THEN = xSUBGOAL_THEN;; + + +(* Tacticals *) + +(* Tacticals need to be hand-promoted to deal with xgoals, but this is *) +(* trivial and is done in 'xtactics.ml'. They are further promoted here to *) +(* get recorded as boxes, using the tactical-wrap functions. *) + +let (THEN) = btactical_wrap "THEN" (xTHEN);; +let (THENL) = btactical_wrap "THENL" (xTHENL);; +let (ORELSE) = btactical_wrap "ORELSE" (xORELSE);; +let TRY = tactical_wrap "TRY" xTRY;; +let REPEAT = tactical_wrap "REPEAT" xREPEAT;; +let EVERY = tactical_wrap "EVERY" xEVERY;; +let FIRST = tactical_wrap "FIRST" xFIRST;; +let MAP_EVERY = list_tactical_wrap "MAP_EVERY" xMAP_EVERY;; +let MAP_FIRST = list_tactical_wrap "MAP_FIRST" xMAP_FIRST;; +let CHANGED_TAC = tactical_wrap "CHANGED_TAC" xCHANGED_TAC;; +let REPLICATE_TAC = int_tactical_wrap "REPLICATE_TAC" xREPLICATE_TAC;; + + +(* Subgoal commands *) + +let e = xe;; +let r = xr;; +let set_goal = xset_goal;; +let g = xg;; +let b = xb;; +let p = xp;; +let top_goal = xtop_goal;; +let top_thm = xtop_thm;; + +let prove = xprove;; + + + +(* ** COMMON HOL API ** *) + + +(* Rules *) + +let ADD_ASSUM = term_rule_wrap "ADD_ASSUM" ADD_ASSUM;; +let ASSUME = conv_wrap "ASSUME" ASSUME;; +let BETA_CONV = conv_wrap "BETA_CONV" BETA_CONV;; +let CCONTR = term_rule_wrap "CCONTR" CCONTR;; +let CHOOSE = termthmpair_rule_wrap "CHOOSE" CHOOSE;; +let CONJ = drule_wrap "CONJ" CONJ;; +let CONJUNCT1 = rule_wrap "CONJUNCT1" CONJUNCT1;; +let CONJUNCT2 = rule_wrap "CONJUNCT2" CONJUNCT2;; +let CONTR = term_rule_wrap "CONTR" CONTR;; +let DEDUCT_ANTISYM_RULE = drule_wrap "DEDUCT_ANTISYM_RULE" DEDUCT_ANTISYM_RULE;; +let DISCH = term_rule_wrap "DISCH" DISCH;; +let DISJ1 = thm_conv_wrap "DISJ1" DISJ1;; +let DISJ2 = term_rule_wrap "DISJ2" DISJ2;; +let DISJ_CASES = trule_wrap "DISJ_CASES" DISJ_CASES;; +let EQ_MP = drule_wrap "EQ_MP" EQ_MP;; +let EQF_INTRO = rule_wrap "EQF_INTRO" EQF_INTRO;; +let EQF_ELIM = rule_wrap "EQF_ELIM" EQF_ELIM;; +let EQT_INTRO = rule_wrap "EQT_INTRO" EQT_INTRO;; +let EQT_ELIM = rule_wrap "EQT_ELIM" EQT_ELIM;; +let ETA_CONV = conv_wrap "ETA_CONV" ETA_CONV;; +let EXISTS = termpair_rule_wrap "EXISTS" EXISTS;; +let GEN = term_rule_wrap "GEN" GEN;; +let GENL = termlist_rule_wrap "GENL" GENL;; +let IMP_ANTISYM_RULE = drule_wrap "IMP_ANTISYM_RULE" IMP_ANTISYM_RULE;; +let IMP_TRANS = drule_wrap "IMP_TRANS" IMP_TRANS;; +let INST = terminst_rule_wrap "INST" INST;; +let INST_TYPE = typeinst_rule_wrap "INST_TYPE" INST_TYPE;; +let MP = drule_wrap "MP" MP;; +let NOT_ELIM = rule_wrap "NOT_ELIM" NOT_ELIM;; +let NOT_INTRO = rule_wrap "NOT_INTRO" NOT_INTRO;; +let PROVE_HYP = drule_wrap "PROVE_HYP" PROVE_HYP;; +let REFL = conv_wrap "REFL" REFL;; +let SELECT_RULE = rule_wrap "SELECT_RULE" SELECT_RULE;; +let SPEC = term_rule_wrap "SPEC" SPEC;; +let SPECL = termlist_rule_wrap "SPECL" SPECL;; +let SUBS = thmlist_rule_wrap "SUBS" SUBS;; +let SUBS_CONV = thmlist_conv_wrap "SUBS_CONV" SUBS_CONV;; +let SYM = rule_wrap "SYM" SYM;; +let SYM_CONV = conv_wrap "SYM_CONV" SYM_CONV;; +let TRANS = drule_wrap "TRANS" TRANS;; +let UNDISCH = rule_wrap "UNDISCH" UNDISCH;; + +let ABS = term_rule_wrap "ABS" ABS;; +let MK_COMB = prule_wrap "MK_COMB" MK_COMB;; +let AP_THM = thm_conv_wrap "AP_THM" AP_THM;; +let AP_TERM = term_rule_wrap "AP_TERM" AP_TERM;; + +let NUM_SUC_CONV = conv_wrap "NUM_SUC_CONV" NUM_SUC_CONV;; +let NUM_PRE_CONV = conv_wrap "NUM_PRE_CONV" NUM_PRE_CONV;; +let NUM_ADD_CONV = conv_wrap "NUM_ADD_CONV" NUM_ADD_CONV;; +let NUM_SUB_CONV = conv_wrap "NUM_SUB_CONV" NUM_SUB_CONV;; +let NUM_MULT_CONV = conv_wrap "NUM_MULT_CONV" NUM_MULT_CONV;; +let NUM_EXP_CONV = conv_wrap "NUM_EXP_CONV" NUM_EXP_CONV;; +let NUM_EQ_CONV = conv_wrap "NUM_EQ_CONV" NUM_EQ_CONV;; +let NUM_LT_CONV = conv_wrap "NUM_LT_CONV" NUM_LT_CONV;; +let NUM_LE_CONV = conv_wrap "NUM_LE_CONV" NUM_LE_CONV;; +let NUM_GT_CONV = conv_wrap "NUM_GT_CONV" NUM_GT_CONV;; +let NUM_EVEN_CONV = conv_wrap "NUM_EVEN_CONV" NUM_EVEN_CONV;; +let NUM_ODD_CONV = conv_wrap "NUM_ODD_CONV" NUM_ODD_CONV;; + + +(* Theorems *) + +let ETA_AX = theorem_wrap "ETA_AX" ETA_AX;; +let INFINITY_AX = theorem_wrap "INFINITY_AX" INFINITY_AX;; +let BOOL_CASES_AX = theorem_wrap "BOOL_CASES_AX" BOOL_CASES_AX;; +let SELECT_AX = theorem_wrap "SELECT_AX" SELECT_AX;; +let TRUTH = theorem_wrap "TRUTH" TRUTH;; +let EXCLUDED_MIDDLE = theorem_wrap "EXCLUDED_MIDDLE" EXCLUDED_MIDDLE;; + +let PAIR_EQ = theorem_wrap "PAIR_EQ" PAIR_EQ;; +let PAIR_SURJECTIVE = theorem_wrap "PAIR_SURJECTIVE" PAIR_SURJECTIVE;; +let FST = theorem_wrap "FST" FST;; +let SND = theorem_wrap "SND" SND;; + +let IND_SUC_0 = theorem_wrap "IND_SUC_0" IND_SUC_0;; +let IND_SUC_INJ = theorem_wrap "IND_SUC_INJ" IND_SUC_INJ;; + +let NOT_SUC = theorem_wrap "NOT_SUC" NOT_SUC;; +let SUC_INJ = theorem_wrap "SUC_INJ" SUC_INJ;; +let num_INDUCTION = theorem_wrap "num_INDUCTION" num_INDUCTION;; +let num_CASES = theorem_wrap "num_CASES" num_CASES;; +let num_RECURSION = theorem_wrap "num_RECURSION" num_RECURSION;; +let PRE = theorem_wrap "PRE" PRE;; +let ADD = theorem_wrap "ADD" ADD;; +let SUB = theorem_wrap "SUB" SUB;; +let MULT = theorem_wrap "MULT" MULT;; +let EXP = theorem_wrap "EXP" EXP;; +let LT = theorem_wrap "LT" LT;; +let LE = theorem_wrap "LE" LE;; +let GT = theorem_wrap "GT" GT;; +let GE = theorem_wrap "GE" GE;; +let EVEN = theorem_wrap "EVEN" EVEN;; +let ODD = theorem_wrap "ODD" ODD;; + + + +(* ** OTHER HOL LIGHT ** *) + + +(* More tactics *) + +let REWRITE_TAC = thmlist_tactic_wrap "REWRITE_TAC" REWRITE_TAC;; +let PURE_REWRITE_TAC = thmlist_tactic_wrap "PURE_REWRITE_TAC" PURE_REWRITE_TAC;; +let ONCE_REWRITE_TAC = thmlist_tactic_wrap "ONCE_REWRITE_TAC" ONCE_REWRITE_TAC;; +let ASM_REWRITE_TAC = thmlist_tactic_wrap "ASM_REWRITE_TAC" ASM_REWRITE_TAC;; +let PURE_ASM_REWRITE_TAC = + thmlist_tactic_wrap "PURE_ASM_REWRITE_TAC" PURE_ASM_REWRITE_TAC;; +let ONCE_ASM_REWRITE_TAC = + thmlist_tactic_wrap "ONCE_ASM_REWRITE_TAC" ONCE_ASM_REWRITE_TAC;; +let SIMP_TAC = thmlist_tactic_wrap "SIMP_TAC" SIMP_TAC;; +let PURE_SIMP_TAC = thmlist_tactic_wrap "PURE_SIMP_TAC" PURE_SIMP_TAC;; +let ONCE_SIMP_TAC = thmlist_tactic_wrap "ONCE_SIMP_TAC" ONCE_SIMP_TAC;; +let ASM_SIMP_TAC = thmlist_tactic_wrap "ASM_SIMP_TAC" ASM_SIMP_TAC;; +let PURE_ASM_SIMP_TAC = + thmlist_tactic_wrap "PURE_ASM_SIMP_TAC" PURE_ASM_SIMP_TAC;; +let ONCE_ASM_SIMP_TAC = + thmlist_tactic_wrap "ONCE_ASM_SIMP_TAC" ONCE_ASM_SIMP_TAC;; +let ABBREV_TAC = term_tactic_wrap "ABBREV_TAC" ABBREV_TAC;; +let EXPAND_TAC = string_tactic_wrap "EXPAND_TAC" EXPAND_TAC;; + +let ASM_CASES_TAC = term_tactic_wrap "ASM_CASES_TAC" ASM_CASES_TAC;; +let COND_CASES_TAC = tactic_wrap "COND_CASES_TAC" COND_CASES_TAC;; + +let ARITH_TAC = tactic_wrap "ARITH_TAC" ARITH_TAC;; +let INDUCT_TAC = tactic_wrap "INDUCT_TAC" INDUCT_TAC;; + +let REAL_ARITH_TAC = tactic_wrap "REAL_ARITH_TAC" REAL_ARITH_TAC;; +let ASM_REAL_ARITH_TAC = tactic_wrap "ASM_REAL_ARITH_TAC" ASM_REAL_ARITH_TAC;; + + +(* More rules *) + +let GSYM = rule_wrap "GSYM" GSYM;; +let ISPECL = termlist_rule_wrap "ISPECL" ISPECL;; +let ALL_CONV = conv_wrap "ALL_CONV" ALL_CONV;; +let (REPEATC) = conv_conv_wrap "REPEATC" REPEATC;; +let ONCE_DEPTH_CONV = conv_conv_wrap "ONCE_DEPTH_CONV" ONCE_DEPTH_CONV;; + +let ARITH_RULE = conv_wrap "ARITH_RULE" ARITH_RULE;; + +let REAL_ARITH = conv_wrap "REAL_ARITH" REAL_ARITH;; +let REAL_FIELD = conv_wrap "REAL_FIELD" REAL_FIELD;; + + +(* More theorems *) + +let CONJ_ASSOC = theorem_wrap "CONJ_ASSOC" CONJ_ASSOC;; +let IMP_IMP = theorem_wrap "IMP_IMP" IMP_IMP;; +let EQ_IMP = theorem_wrap "EQ_IMP" EQ_IMP;; + +let ARITH = theorem_wrap "ARITH" ARITH;; +let ARITH_EQ = theorem_wrap "ARITH_EQ" ARITH_EQ;; +let ADD_CLAUSES = theorem_wrap "ADD_CLAUSES" ADD_CLAUSES;; +let SUB_REFL = theorem_wrap "SUB_REFL" SUB_REFL;; +let ADD1 = theorem_wrap "ADD1" ADD1;; +let LE_1 = theorem_wrap "LE_1" LE_1;; + +let REAL_ADD_LDISTRIB = theorem_wrap "REAL_ADD_LDISTRIB" REAL_ADD_LDISTRIB;; +let REAL_OF_NUM_ADD = theorem_wrap "REAL_OF_NUM_ADD" REAL_OF_NUM_ADD;; +let REAL_OF_NUM_EQ = theorem_wrap "REAL_OF_NUM_EQ" REAL_OF_NUM_EQ;; +let REAL_OF_NUM_SUC = theorem_wrap "REAL_OF_NUM_SUC" REAL_OF_NUM_SUC;; +let REAL_MUL_ASSOC = theorem_wrap "REAL_MUL_ASSOC" REAL_MUL_ASSOC;; +let REAL_MUL_SYM = theorem_wrap "REAL_MUL_SYM" REAL_MUL_SYM;; +let REAL_MUL_RID = theorem_wrap "REAL_MUL_RID" REAL_MUL_RID;; +let REAL_MUL_RZERO = theorem_wrap "REAL_MUL_RZERO" REAL_MUL_RZERO;; +let REAL_DIV_LMUL = theorem_wrap "REAL_DIV_LMUL" REAL_DIV_LMUL;; +let REAL_POS = theorem_wrap "REAL_POS" REAL_POS;; +let REAL_LE_TRANS = theorem_wrap "REAL_LE_TRANS" REAL_LE_TRANS;; +let REAL_LE_MUL = theorem_wrap "REAL_LE_MUL" REAL_LE_MUL;; +let REAL_LE_RMUL = theorem_wrap "REAL_LE_RMUL" REAL_LE_RMUL;; +let REAL_LE_DIV = theorem_wrap "REAL_LE_DIV" REAL_LE_DIV;; +let REAL_LE_SQUARE = theorem_wrap "REAL_LE_SQUARE" REAL_LE_SQUARE;; +let REAL_LE_RDIV_EQ = theorem_wrap "REAL_LE_RDIV_EQ" REAL_LE_RDIV_EQ;; +let real_pow = theorem_wrap "real_pow" real_pow;; +let REAL_POW_2 = theorem_wrap "REAL_POW_2" REAL_POW_2;; +let REAL_POW_ZERO = theorem_wrap "REAL_POW_ZERO" REAL_POW_ZERO;; +let REAL_POW_ADD = theorem_wrap "REAL_POW_ADD" REAL_POW_ADD;; +let REAL_POW_DIV = theorem_wrap "REAL_POW_DIV" REAL_POW_DIV;; +let REAL_POW_LE = theorem_wrap "REAL_POW_LE" REAL_POW_LE;; +let REAL_POW_LT = theorem_wrap "REAL_POW_LT" REAL_POW_LT;; +let SUM_RMUL = theorem_wrap "SUM_RMUL" SUM_RMUL;; +let SUM_ADD_SPLIT = theorem_wrap "SUM_ADD_SPLIT" SUM_ADD_SPLIT;; +let SUM_POS_LE_NUMSEG = theorem_wrap "SUM_POS_LE_NUMSEG" SUM_POS_LE_NUMSEG;; +let SUM_CLAUSES_NUMSEG = theorem_wrap "SUM_CLAUSES_NUMSEG" SUM_CLAUSES_NUMSEG;; +let SUM_SING_NUMSEG = theorem_wrap "SUM_SING_NUMSEG" SUM_SING_NUMSEG;; +let PRODUCT_CLAUSES_NUMSEG = theorem_wrap "PRODUCT_CLAUSES_NUMSEG" PRODUCT_CLAUSES_NUMSEG;;
\ No newline at end of file |