drule : thm -> tactic
Performs one step of resolution (or modus ponens) against implication theorem.
If theorem th is of the form A |- t, where t is of the form !x1..xn. P .. /\ ... ==> Q or !x1..xn. P .. ==> Q, then a call to drule th (asl,g) looks for an assumption in asl that matches the pattern P .. in t. It then performs instantiation of th’s universally quantified and free variables, transforms any conjunctions on the left into a minimal number of chained implications, and calls MP once to generate a consequent theorem A |- t'. This theorem is then passed to MP_TAC, turning the goal into (asl, t' ==> g). (We assume that A is a subset of asl; otherwise the tactic is invalid.)
A call to drule th (asl,g) will fail if th is not a (possibly universally quantified) implication (or negation), or if there are no assumptions in asl matching the “first” hypothesis of th.
The DIV_LESS theorem states:
   !n d. 0 < n /\ 1 < d ==> (n DIV d < n)
   > drule arithmeticTheory.DIV_LESS ([“1 < x”, “0 < y”], “P:bool”);
   val it =
      ([([“1 < x”, “0 < y”], “(!d. 1 < d ==> y DIV d < y) ==> P”)], fn):
      goal list * validation
The drule tactic is similar to, but a great deal more controlled than, the IMP_RES_TAC tactic, which will look for a great many more possible instantiations and resolutions to perform. IMP_RES_TAC also puts all of its derived consequences into the assumption list; drule can be sure that there will be just one such consequence, and puts this into the goal directly.

The related dxrule tactic removes the matching assumption from the assumption list. In this example above, the resulting assumption list would just contain 1 < x, having lost the 0 < y which was resolved against the DIV_LESS theorem.

The drule tactic uses the MP_TAC thm_tactic as its fixed continuation; the drule_then variation takes a thm_tactic continuation as its first parameter and applies this to the result of the instantiation and MP call. There is also a dxrule_then, that combines both variations described here.

Finally, note that the implicational theorem may itself have come from the goal’s assumptions, extracted with tools such as FIRST_ASSUM and PAT_ASSUM.

HOL  Kananaskis-14