drule_allTactic.drule_all : thm -> tactic
Attempts to discharge all of a theorem’s antecedents from assumptions
If th is a theorem with a conclusion that is a (possibly
universally quantified) implication (or negation), the theorem-tactic
drule_all (implicitly) normalises it have form
!v1 .. vn. P1 ==> (P2 ==> (P3 ==> ... Q)...)
where each Pi is not a conjunction. (In other words,
P /\ Q ==> R is normalised to
P ==> (Q ==> R).) An application of
drule_all th to a goal then attempts to find a consistent
instantiation so that all of the Pi antecedents can be
discharged by appeal to the goal’s assumptions. If this repeated
instantiation and use of MP is possible, then the
(instantiated) conclusion Q is added to the goal with the
MP_TAC thm_tactic.
When finding assumptions, those that have been most recently added to the assumption list will be preferred.
An invocation of drule_all th can only fail when applied
to a goal. It can then fail if th is not an implication, or
if all of th’s implications cannot be eliminated by
matching against the goal’s assumptions.
The LESS_LESS_EQ_TRANS theorem states:
!m n p. m < n /\ n <= p ==> m < p
Then:
> drule_all arithmeticTheory.LESS_LESS_EQ_TRANS
([“x < w”, “1 < x”, “z <= y”, “x <= z”, “y < z”], “P:bool”);
val it =
([([“x < w”, “1 < x”, “z <= y”, “x <= z”, “y < z”],
“1 < z ==> P”)], fn): goal list * validation
Note how the other possible instance of the theorem (chaining
y < z and z <= y) is not found.
The variant dxrule_all removes used assumptions from the
assumption list as they resolve against the theorem. The variant
drule_all_then allows a continuation other than
MP_TAC to be used. The variant dxrule_all_then
combines both.
A negated conclusion (~Q) is not treated as an
implication (Q ==> F) so the tactic will not attempt to
find an instantiation of Q among the assumptions.