8.1 Refine
This tactic applies to any goal. It behaves like Exact with a
big difference : the user can leave some holes (denoted by ? or
(?::type)) in the term.
Refine will generate as many
subgoals as they are holes in the term. The type of holes must be
either synthesized by the system or declared by an
explicit cast like (?::nat->Prop)
. This low-level
tactic can be useful to advanced users.
Example:
Coq < Inductive Option: Set := Fail : Option | Ok : bool->Option.
Coq < Definition get: (x:Option)~x=Fail->bool.
1 subgoal
============================
(x:Option)~x=Fail->bool
Coq < Refine
Coq < [x:Option]<[x:Option]~x=Fail->bool>Cases x of
Coq < Fail => ?
Coq < | (Ok b) => [_:?]b end.
1 subgoal
x : Option
============================
~Fail=Fail->bool
Coq < Intros;Absurd Fail=Fail;Trivial.
Subtree proved!
Coq < Defined.