(* Higher Order *)

Fact not_implies_our_not : forall (P:Prop),
  ~ P -> (forall (Q:Prop), P -> Q).

(* Specifications: *)
Theorem contradiction_implies_anything : forall P Q : Prop, (P /\ ~P) -> Q.
Theorem contrapositive : forall (P Q : Prop), (P -> Q) -> (~Q -> ~P).
Theorem not_both_true_and_false : forall P : Prop, ~ (P /\ ~P).
Theorem not_true_is_false : forall b : bool, b <> true -> b = false.
Theorem not_true_is_false' : forall b : bool, b <> true -> b = false.
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.
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 (app l l') <-> In a l \/ In a l'.
Lemma plus_comm3 : forall n m p, n + (m + p) = (p + m) + n.
Lemma plus_comm3_take2 : forall n m p, n + (m + p) = (p + m) + n.
Lemma plus_comm3_take3 : forall n m p, n + (m + p) = (p + m) + n.
Lemma tr_rev_correct : forall X, @tr_rev X = @rev X.
Theorem evenb_double : forall k, evenb (double k) = true.
Theorem evenb_double_conv : forall n, exists k, n = if evenb n then double k else S (double k).
Theorem even_bool_prop : forall n, evenb n = true <-> exists k, n = double k.
Lemma andb_true_iff : forall b1 b2:bool, b1 && b2 = true <-> b1 = true /\ b2 = true.
Lemma orb_true_iff : forall b1 b2, b1 || b2 = true <-> b1 = true \/ b2 = true.
Theorem beq_nat_false_iff : forall x y : nat, beq_nat x y = false <-> x <> y.