INTRO_TAC : string -> tactic
- SYNOPSIS
-
Breaks down outer quantifiers in goal, introducing variables and named
hypotheses.
- DESCRIPTION
-
Given a string s, INTRO_TAC s breaks down outer universal quantifiers and
implications in the goal, fixing variables and introducing assumptions with
names. It combines several forms of introduction of logical connectives. The
introduction pattern uses the following syntax:
- ! fix_pattern introduces universally quantified variables as with
FIX_TAC
- a destruct pattern introduces and destructs an implication as with
DESTRUCT_TAC
- #n selects disjunct n in the goal
Several fix patterns and destruct patterns can be combined sequentially,
separed by semicolons `;'.
- FAILURE CONDITIONS
-
Fails if the pattern is ill-formed or does not match the form of the goal.
- EXAMPLE
-
Here we introduce the universally quantified outer variables, assume the
antecedent, splitting apart conjunctions and disjunctions:
# g `!p q r. p \/ (q /\ r) ==> p /\ q \/ p /\ r`;;
# e (INTRO_TAC "!p q r; p | q r");;
val it : goalstack = 2 subgoals (2 total)
0 [`q`] (q)
1 [`r`] (r)
`p /\ q \/ p /\ r`
0 [`p`] (p)
`p /\ q \/ p /\ r`
Now a further step will select the first disjunct to prove in the top goal:
# e (INTRO_TAC "#1");;
val it : goalstack = 1 subgoal (2 total)
0 [`p`] (p)
`p /\ q`
In the next example we introduce an alternation of universally quantified
variables and antecedents. Along the way we split a disjunction and rename
variables x1, x2 into n, n'. All is done in a single tactic invocation.
# g `!a. ~(a = 0) ==> ONE_ONE (\n. a * n)`;;
# e (REWRITE_TAC[ONE_ONE; EQ_MULT_LCANCEL]);;
val it : goalstack = 1 subgoal (1 total)
`!a. ~(a = 0) ==> (!x1 x2. a = 0 \/ x1 = x2 ==> x1 = x2)`
# e (INTRO_TAC "!a; anz; ![n] [n']; az | eq");;
val it : goalstack = 2 subgoals (2 total)
0 [`~(a = 0)`] (anz)
1 [`n = n'`] (eq)
`n = n'`
0 [`~(a = 0)`] (anz)
1 [`a = 0`] (az)
`n = n'`
- SEE ALSO
-
DESTRUCT_TAC, DISCH_TAC, FIX_TAC, GEN_TAC, LABEL_TAC, REMOVE_THEN,
STRIP_TAC, USE_THEN.