In the Coq tactics language, what is the difference between intro and intros
Question
In the Coq tactics language, what is the difference between intro and intros?
Answer
intro and intros behave differently if no argument is supplied
According to the reference manual:
If the goal is neither a product nor starting with a let definition, the tactic intro applies the tactic hnf until the tactic intro can be applied or the goal is not head-reducible.
On the other hand, intros, as a variant of intro tactic,
repeats intro until it meets the head-constant. It never reduces head-constants and it never fails.
Example:
(* does nothing *)~ False(* unfolds `not`, revealing `False -> False`; moves the premise to the context *)~ FalseAbort.H: FalseFalse
Note: both intro and intros do the same thing if an argument is supplied (intro contra / intros contra).
intros is polyvariadic, intro can only take 0 or 1 arguments
(* Fail `intro t1 t2.` *)True -> True -> TrueAbort.t1, t2: TrueTrue
intro does not support intro-patterns
(* Fail `intro [].` *) intros []. Qed.False -> False
Some information about intro-patterns can be found in the manual or in the Software Foundations book. See also this example of not-so-trivial combination of several intro-patterns.
intros does not support after / before / at top / at bottom switches
Let's say we have a proof state like this
then e.g. intro H4 after H3 will modify the proof state like so:
and intro H4 after H1 will produce