Require Export Coq.Bool.Bool.
(** * Relations for [sumbool] *)
(** ** Symmetric relation *)
(** NB: With proof irrelevance this is the same as [eq]. *)
Inductive sumbool_rel {P1 P2 Q1 Q2}: rel (sumbool P1 Q1) (sumbool P2 Q2):=
| left_rel_def H1 H2: sumbool_rel (left H1) (left H2)
| right_rel_def H1 H2: sumbool_rel (right H1) (right H2).
Global Instance left_rel:
Monotonic (@left) (forallr _ _ : ⊤, forallr _ _ : ⊤, ⊤ ++> sumbool_rel).
Global Instance right_rel:
Monotonic (@right) (forallr _ _ : ⊤, forallr _ _ : ⊤, ⊤ ++> sumbool_rel).
(** ** Directed relation *)
Inductive sumbool_le {P1 P2 Q1 Q2}: rel (sumbool P1 Q1) (sumbool P2 Q2):=
| left_le b1 H2: Related b1 (left H2) sumbool_le
| right_le H1 b2: Related (right H1) b2 sumbool_le.
Global Existing Instance left_le.
Global Existing Instance right_le.
(** * Definitions for [leb] *)
(** ** Properties *)
Global Instance leb_preo:
PreOrder leb.
Hint Extern 0 (RDestruct leb _) =>
eapply leb_rdestruct : typeclass_instances.
Global Instance leb_transport_eq_true x y:
Transport Bool.leb x y (x = true) (y = true).
(** ** Monotonicity of various definitions *)
Hint Extern 0 (Related _ true _) =>
eapply true_leb : typeclass_instances.

Lemma false_leb b:
Related false b leb.