HO_MATCH_MP_TAC

Tactic.HO_MATCH_MP_TAC : thm_tactic

Reduces the goal using a supplied implication, with higher-order matching.

When applied to a theorem of the form

   A' |- !x1...xn. s ==> t

HO_MATCH_MP_TAC produces a tactic that reduces a goal whose conclusion t' is a substitution and/or type instance of t to the corresponding instance of s. Any variables free in s but not in t will be existentially quantified in the resulting subgoal:

     A ?- t'
  ======================  HO_MATCH_MP_TAC (A' |- !x1...xn. s ==> t)
     A ?- ?z1...zp. s'

where z1, …, zp are (type instances of) those variables among x1, …, xn that do not occur free in t. Note that this is not a valid tactic unless A' is a subset of A.

Example

The following goal might be solved by case analysis:

  > g `!n:num. n <= n * n`;

We can “manually” perform induction by using the following theorem:

  > numTheory.INDUCTION;
  - val it : thm = |- !P. P 0 /\ (!n. P n ==> P (SUC n)) ==> (!n. P n)

which is useful with HO_MATCH_MP_TAC because of higher-order matching:

  > e(HO_MATCH_MP_TAC numTheory.INDUCTION);
  - val it : goalstack = 1 subgoal (1 total)

  `0 <= 0 * 0 /\ (!n. n <= n * n ==> SUC n <= SUC n * SUC n)`

The goal can be finished with SIMP_TAC arith_ss [].

Failure

Fails unless the theorem is an (optionally universally quantified) implication whose consequent can be instantiated to match the goal.

See also

Tactic.MATCH_MP_TAC, bossLib.Induct_on, Thm.EQ_MP, Drule.MATCH_MP, Thm.MP, Tactic.MP_TAC, ConseqConv.CONSEQ_CONV_TAC