(** * Auto: More Automation *)
Set Warnings "-notation-overridden,-parsing".
(** Up to now, we've used the more manual part of Coq's tactic facilities.  In this chapter, we'll learn more about some of Coq's powerful automation features: proof search via the [auto] tactic, automated forward reasoning via the [Ltac] hypothesis matching machinery, and deferred instantiation of existential variables using [eapply] and [eauto].  Using these features together with Ltac's scripting facilities will enable us to make our proofs startlingly short!  Used properly, they can also make proofs more maintainable and robust to changes in underlying definitions.  A deeper treatment of [auto] and [eauto] can be found in the [UseAuto] chapter.  There's another major category of automation we haven't discussed much yet, namely built-in decision procedures for specific kinds of problems: [omega] is one example, but there are others.  This topic will be deferred for a while longer.  Our motivating example will be this proof, repeated with just a few small changes from the [Imp] chapter.  We will simplify this proof in several stages. *)
Ltac inv H := inversion H; subst; clear H.

(* Specifications: *)
Theorem ceval_deterministic: forall c st st1 st2,
c / st \\ st1  ->
c / st \\ st2 ->
st1 = st2.