UniAna.util.ConvBoolTac
Require Export Coq.Bool.Bool.
Require Export Coq.Classes.EquivDec.
Lemma beq_true {A : Type} `{EqDec A} (a c : A) :
(a ==b c) = true <-> (a === c).
Proof.
unfold equiv_decb; destruct (a == c); firstorder auto with *.
Qed.
Lemma beq_false {A : Type} `{EqDec A} (a b : A) :
(a ==b b) = false <-> (a =/= b).
Proof.
unfold equiv_decb; destruct (a == b); firstorder auto with *.
Qed.
Lemma bne_true {A : Type} `{EqDec A} (a c : A) :
(a <>b c) = true <-> (a =/= c).
Proof.
unfold nequiv_decb, equiv_decb. rewrite negb_true_iff. destruct (a == c); firstorder auto with *.
Qed.
Lemma bne_false {A : Type} `{EqDec A} (a b : A) :
(a <>b b) = false <-> (a === b).
Proof.
unfold nequiv_decb, equiv_decb. rewrite negb_false_iff. destruct (a == b); firstorder auto with *.
Qed.
Definition to_bool {P Q : Prop} (x : {P} + {Q}) := if x then true else false.
Lemma to_bool_true (P : Prop) (x : {P} + {~ P}) : to_bool x = true <-> P.
Proof.
destruct x; cbn; firstorder auto with *.
Qed.
Lemma to_bool_false (P : Prop) (x : {P} + {~P}) : to_bool x = false <-> ~ P.
Proof.
destruct x; cbn; firstorder auto with *.
Qed.
Ltac conv_bool := repeat match goal with
| [ H: context[_ ==b _ = true] |- _ ] => rewrite beq_true in H
| [ H: context[_ ==b _ = false] |- _ ] => rewrite beq_false in H
| [ H: context[_ <>b _ = true] |- _ ] => rewrite bne_true in H
| [ H: context[_ <>b _ = false] |- _ ] => rewrite bne_false in H
| [ H: context[_ || _ = true] |- _ ] => rewrite orb_true_iff in H
| [ H: context[_ || _ = false] |- _ ] => rewrite orb_false_iff in H
| [ H: context[_ && _ = true] |- _ ] => rewrite andb_true_iff in H
| [ H: context[_ && _ = false] |- _ ] => rewrite andb_false_iff in H
| [ H: context[to_bool _ = true] |- _ ] => rewrite to_bool_true in H
| [ H: context[to_bool _ = false] |- _ ] => rewrite to_bool_false in H
| [ H: context[negb (_ && _)] |- _ ] => rewrite negb_andb in H
| [ H: context[negb (_ || _ )] |- _ ] => rewrite negb_orb in H
| [ |- context[_ ==b _ = true]] => rewrite beq_true
| [ |- context[_ ==b _ = false]] => rewrite beq_false
| [ |- context[_ <>b _ = true]] => rewrite bne_true
| [ |- context[_ <>b _ = false]] => rewrite bne_false
| [ |- context[_ || _ = true]] => rewrite orb_true_iff
| [ |- context[_ || _ = false]] => rewrite orb_false_iff
| [ |- context[_ && _ = true]] => rewrite andb_true_iff
| [ |- context[_ && _ = false]] => rewrite andb_false_iff
| [ |- context[to_bool _ = true]] => rewrite to_bool_true
| [ |- context[to_bool _ = false]] => rewrite to_bool_false
| [ |- context[negb (_ && _)]] => rewrite negb_andb
| [ |- context[negb (_ || _ )]] => rewrite negb_orb
end.