Library Coqprime.Tactic.Tactic
Ltac finish := intros; auto; trivial; discriminate.
Ltac contradict name :=
let term := type of name in (
match term with
(~_) =>
match goal with
|- ~ _ => let x := fresh in
(intros x; case name;
generalize x; clear x name;
intro name)
| |- _ => case name; clear name
end
| _ =>
match goal with
|- ~ _ => let x := fresh in
(intros x; absurd term;
[idtac | exact name]; generalize x; clear x name;
intros name)
| |- _ => generalize name; absurd term;
[idtac | exact name]; clear name
end
end).
Ltac case_eq name :=
generalize (refl_equal name); pattern name at -1 in |- *; case name.
Ltac eq_tac :=
match goal with
|- (?g _ = ?g _) => apply f_equal with (f := g)
| |- (?g ?X _ = ?g ?X _) => apply f_equal with (f := g X)
| |- (?g _ _ = ?g _ _) => apply f_equal2 with (f := g)
| |- (?g ?X ?Y _ = ?g ?X ?Y _) => apply f_equal with (f := g X Y)
| |- (?g ?X _ _ = ?g ?X _ _) => apply f_equal2 with (f := g X)
| |- (?g _ _ _ = ?g _ _ _) => apply f_equal3 with (f := g)
| |- (?g ?X ?Y ?Z _ = ?g ?X ?Y ?Z _) => apply f_equal with (f := g X Y Z)
| |- (?g ?X ?Y _ _ = ?g ?X ?Y _ _) => apply f_equal2 with (f := g X Y)
| |- (?g ?X _ _ _ = ?g ?X _ _ _) => apply f_equal3 with (f := g X)
| |- (?g _ _ _ _ _ = ?g _ _ _ _) => apply f_equal4 with (f := g)
end.
Ltac sauto := (intros; apply sym_equal; auto; fail) || auto.