Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Local Set Universe Minimization ToSet.(** * If and only if *)(** ** Definition *)(** [iff A B], written [A <-> B], expresses the logical equivalence of [A] and [B] *)Definitioniff (AB : Type) := prod (A -> B) (B -> A).Notation"A <-> B" := (iff A B) : type_scope.(** ** Basic Properties *)(** Everything is logically equivalent to itself. *)Definitioniff_refl {A} : A <-> A
:= (idmap , idmap).(** [iff] is a reflexive relation. *)Instanceiff_reflexive : Reflexive iff | 1
:= @iff_refl.(** Logical equivalences can be inverted. *)Definitioniff_inverse {AB} : (A <-> B) -> (B <-> A)
:= funf => (snd f , fst f).(** [iff] is a symmetric relation. *)Instancesymmetric_iff : Symmetric iff | 1
:= @iff_inverse.(** Logical equivalences can be composed. *)Definitioniff_compose {ABC} (f : A <-> B) (g : B <-> C) : A <-> C
:= (fst g o fst f , snd f o snd g).(** [iff] is a transitive relation. *)Instancetransitive_iff : Transitive iff | 1
:= @iff_compose.(** Any equivalence can be considered a logical equivalence by discarding everything but the maps. We make this a coercion so that equivalences can be used in place of logical equivalences. *)Coercioniff_equiv {A B : Type} (f : A <~> B)
: A <-> B := (equiv_fun f, f^-1).(** ** Logical Laws *)(** One of De Morgan's Laws. The dual statement about negating a product appears in Decidable.v due to decidability requirements. *)