Ltac bool :=
repeat match goal with
| [ H : ?P && ?Q = true |- _ ] =>
apply andb_true_iff in H; destruct H
| |- ?P && ?Q = true =>
apply <- andb_true_iff; split
end.
Arguments decide P /H.
#[export]
Hint Extern 5 => progress bool : core.
Ltac define t x H :=
set (x := t) in *; assert (H : t = x) by reflexivity; clearbody x.

(* Specifications: *)
Lemma Decidable_sound : forall P (H : Decidable P),
decide P = true -> P.
Lemma Decidable_complete : forall P (H : Decidable P),
P -> decide P = true.
Lemma Decidable_sound_alt : forall P (H : Decidable P),
~ P -> decide P = false.
Lemma Decidable_complete_alt : forall P (H : Decidable P),
decide P = false -> ~ P.