Coq.Bool.BoolEq

# Module Coq.Bool.BoolEq

``

Properties of a boolean equality

`

`Require` `Export` Bool.

`Section` Bool_eq_dec.

`Variable` A : Set.

`Variable` beq : A -> A -> bool.

`Variable` beq_refl : (x:A)true=(beq x x).

`Variable` beq_eq : (x,y:A)true=(beq x y)->x=y.

`Definition` beq_eq_true : (x,y:A)x=y->true=(beq x y).
`Proof`.
Intros x y H.
Case H.
Apply beq_refl.
`Defined`.

`Definition` beq_eq_not_false : (x,y:A)x=y->~false=(beq x y).
`Proof`.
Intros x y e.
Rewrite <- beq_eq_true; Trivial; Discriminate.
`Defined`.

`Definition` beq_false_not_eq : (x,y:A)false=(beq x y)->~x=y.
`Proof`.
Exact [x,y:A; H:(false=(beq x y)); e:(x=y)](beq_eq_not_false x y e H).
`Defined`.

`Definition` exists_beq_eq : (x,y:A){b:bool | b=(beq x y)}.
`Proof`.
Intros.
Exists (beq x y).
Constructor.
`Defined`.

`Definition` not_eq_false_beq : (x,y:A)~x=y->false=(beq x y).
`Proof`.
Intros x y H.
Symmetry.
Apply not_true_is_false.
Intro.
Apply H.
Apply beq_eq.
Symmetry.
Assumption.
`Defined`.

`Definition` eq_dec : (x,y:A){x=y}+{~x=y}.
`Proof`.
Intros x y; Case (exists_beq_eq x y).
Intros b; Case b; Intro H.
Left; Apply beq_eq; Assumption.
Right; Apply beq_false_not_eq; Assumption.
`Defined`.

`End` Bool_eq_dec.

`

Index