Hint Resolve Dec_auto Dec_auto_not.
Hint Extern 4 =>  (* Improves type class inference *)
match goal with
| [  |- dec ((fun _ => _) _) ] => cbn
end : typeclass_instances.
Tactic Notation "decide" constr(p) :=
destruct (Dec p).
Tactic Notation "decide" constr(p) "as" simple_intropattern(i) :=
destruct (Dec p) as i.
Tactic Notation "decide" "_" :=
destruct (Dec _).
Tactic Notation "have" constr(E) := let X := fresh "E" in decide E as [X|X]; subst; try congruence; try omega; clear X.

(* Specifications: *)
Lemma Dec_true P {H : dec P} : dec2bool (Dec P) = true -> P.
Lemma Dec_false P {H : dec P} : dec2bool (Dec P) = false -> ~P.
Hint Extern 4 =>
match goal with
[ H : dec2bool (Dec ?P) = true  |- _ ] => apply Dec_true in  H
| [ H : dec2bool (Dec ?P) = false |- _ ] => apply Dec_false in H
end.
Lemma Dec_true P {H : dec P} : dec2bool (Dec P) = true -> P.
Lemma Dec_false P {H : dec P} : dec2bool (Dec P) = false -> ~P.
Hint Extern 4 =>
match goal with
[ H : dec2bool (Dec ?P) = true  |- _ ] => apply Dec_true in  H
| [ H : dec2bool (Dec ?P) = false |- _ ] => apply Dec_false in H
end.