Definition iff (P Q : Prop) := (P -> Q) /\ (Q -> P).

(* Specifications: *)
Theorem iff_sym : forall P Q : Prop, (P <-> Q) -> (Q <-> P).
Lemma not_true_iff_false : forall b, b <> true <-> b = false.
Theorem iff_refl : forall P : Prop, P <-> P.
Theorem iff_trans : forall P Q R : Prop, (P <-> Q) -> (Q <-> R) -> (P <-> R).
Theorem or_distributes_over_and : forall P Q R : Prop, P \/ (Q /\ R) <-> (P \/ Q) /\ (P \/ R).
Lemma mult_0 : forall n m, n * m = 0 <-> n = 0 \/ m = 0.
Lemma or_assoc : forall P Q R : Prop, P \/ (Q \/ R) <-> (P \/ Q) \/ R.
Lemma mult_0_3 : forall n m p, n * m * p = 0 <-> n = 0 \/ m = 0 \/ p = 0.
Lemma apply_iff_example : forall n m : nat, n * m = 0 -> n = 0 \/ m = 0.
Lemma four_is_even : exists n : nat, 4 = n + n.
Theorem exists_example_2 : forall n, (exists m, n = 4 + m) -> (exists o, n = 2 + o).
Theorem dist_not_exists : forall (X:Type) (P : X -> Prop), (forall x, P x) -> ~ (exists x, ~ P x).
Theorem dist_exists_or : forall (X:Type) (P Q : X -> Prop), (exists x, P x \/ Q x) <-> (exists x, P x) \/ (exists x, Q x).
Lemma In_map : forall (A B : Type) (f : A -> B) (l : list A) (x : A), In x l -> In (f x) (map f l).
Lemma In_map_iff : forall (A B : Type) (f : A -> B) (l : list A) (y : B), In y (map f l) <-> exists x, f x = y /\ In x l.
Lemma in_app_iff : forall A l l' (a:A), In a (l++l') <-> In a l \/ In a l'.