diff --git a/prelude/option.v b/prelude/option.v index f6066107a320c5fbef0f27bac5d0bf76e4caedc7..ff082187d3a4a317ae1bd02b839e8c8d848fd306 100644 --- a/prelude/option.v +++ b/prelude/option.v @@ -80,9 +80,9 @@ Lemma not_eq_None_Some {A} (mx : option A) : mx ≠None ↔ is_Some mx. Proof. rewrite eq_None_not_Some; apply dec_stable; tauto. Qed. (** Lifting a relation point-wise to option *) -Inductive option_Forall2 {A B} (P: A → B → Prop) : option A → option B → Prop := - | Some_Forall2 x y : P x y → option_Forall2 P (Some x) (Some y) - | None_Forall2 : option_Forall2 P None None. +Inductive option_Forall2 {A B} (R: A → B → Prop) : option A → option B → Prop := + | Some_Forall2 x y : R x y → option_Forall2 R (Some x) (Some y) + | None_Forall2 : option_Forall2 R None None. Definition option_relation {A B} (R: A → B → Prop) (P: A → Prop) (Q: B → Prop) (mx : option A) (my : option B) : Prop := match mx, my with @@ -92,22 +92,30 @@ Definition option_relation {A B} (R: A → B → Prop) (P: A → Prop) (Q: B → | None, None => True end. +Section Forall2. + Context {A} (R : relation A). + + Global Instance option_Forall2_refl : Reflexive R → Reflexive (option_Forall2 R). + Proof. intros ? [?|]; by constructor. Qed. + Global Instance option_Forall2_sym : Symmetric R → Symmetric (option_Forall2 R). + Proof. destruct 2; by constructor. Qed. + Global Instance option_Forall2_trans : Transitive R → Transitive (option_Forall2 R). + Proof. destruct 2; inversion_clear 1; constructor; etrans; eauto. Qed. + Global Instance option_Forall2_equiv : Equivalence R → Equivalence (option_Forall2 R). + Proof. destruct 1; split; apply _. Qed. +End Forall2. + (** Setoids *) +Instance option_equiv `{Equiv A} : Equiv (option A) := option_Forall2 (≡). + Section setoids. Context `{Equiv A} `{!Equivalence ((≡) : relation A)}. - Global Instance option_equiv : Equiv (option A) := option_Forall2 (≡). - Lemma equiv_option_Forall2 mx my : mx ≡ my ↔ option_Forall2 (≡) mx my. - Proof. split; destruct 1; constructor; auto. Qed. + Proof. done. Qed. Global Instance option_equivalence : Equivalence ((≡) : relation (option A)). - Proof. - split. - - by intros []; constructor. - - by destruct 1; constructor. - - destruct 1; inversion 1; constructor; etrans; eauto. - Qed. + Proof. apply _. Qed. Global Instance Some_proper : Proper ((≡) ==> (≡)) (@Some A). Proof. by constructor. Qed. Global Instance option_leibniz `{!LeibnizEquiv A} : LeibnizEquiv (option A). @@ -129,6 +137,8 @@ Section setoids. Proof. by destruct 2. Qed. End setoids. +Typeclasses Opaque option_equiv. + (** Equality on [option] is decidable. *) Instance option_eq_None_dec {A} (mx : option A) : Decision (mx = None) := match mx with Some _ => right (Some_ne_None _) | None => left eq_refl end.