Module Coq.Init.Logic

Require Datatypes.

True is the always true proposition

Inductive True : Prop := I : True.

False is the always false proposition

Inductive False : Prop := .

not A, written ~A, is the negation of A

Definition not := [A:Prop]A->False.

Hints Unfold not : core.

Section Conjunction.

and A B, written A /\ B, is the conjunction of A and B

conj A B p q, written <p,q> is a proof of A /\ B as soon as p is a proof of A and q a proof of B

proj1 and proj2 are first and second projections of a conjunction

  Inductive and [A,B:Prop] : Prop := conj : A -> B -> (and A B).

  Variables A,B : Prop.

  Theorem proj1 : (and A B) -> A.
  Proof.
  Induction 1; Trivial.
  Qed.

  Theorem proj2 : (and A B) -> B.
  Proof.
  Induction 1; Trivial.
  Qed.

End Conjunction.

Section Disjunction.

or A B, written A \/ B, is the disjunction of A and B

  Inductive or [A,B:Prop] : Prop :=
       or_introl : A -> (or A B)
     | or_intror : B -> (or A B).

End Disjunction.

Section Equivalence.

iff A B, written A <-> B, expresses the equivalence of A and B

  Definition iff := [P,Q:Prop] (and (P->Q) (Q->P)).

Theorem iff_refl : (a:Prop) (iff a a).
  Proof.
    Split; Auto.
  Qed.

Theorem iff_trans : (a,b,c:Prop) (iff a b) -> (iff b c) -> (iff a c).
  Proof.
    Intros a b c (H1,H2) (H3,H4); Split; Auto.
  Qed.

Theorem iff_sym : (a,b:Prop) (iff a b) -> (iff b a).
  Proof.
    Intros a b (H1,H2); Split; Auto.
  Qed.

End Equivalence.

(IF P Q R), or more suggestively (either P and_then Q or_else R), denotes either P and Q, or ~P and Q

Definition IF := [P,Q,R:Prop] (or (and P Q) (and (not P) R)).

Section First_order_quantifiers.

(ex A P), or simply (EX x | P(x)), expresses the existence of an x of type A which satisfies the predicate P (A is of type Set). This is existential quantification.

(ex2 A P Q), or simply (EX x | P(x) & Q(x)), expresses the existence of an x of type A which satisfies both the predicates P and Q

Universal quantification (especially first-order one) is normally written (x:A)(P x). For duality with existential quantification, the construction (all A P), or simply (All P), is provided as an abbreviation of (x:A)(P x)

  Inductive ex [A:Set;P:A->Prop] : Prop
      := ex_intro : (x:A)(P x)->(ex A P).

  Inductive ex2 [A:Set;P,Q:A->Prop] : Prop
      := ex_intro2 : (x:A)(P x)->(Q x)->(ex2 A P Q).

  Definition all := [A:Set][P:A->Prop](x:A)(P x).

End First_order_quantifiers.

Section Equality.

(eq A x y), or simply x=y, expresses the (Leibniz') equality of x and y. Both x and y must belong to the same type A. The definition is inductive and states the reflexivity of the equality. The others properties (symmetry, transitivity, replacement of equals) are proved below

  Inductive eq [A:Set;x:A] : A->Prop
         := refl_equal : (eq A x x).

End Equality.

Hints Resolve I conj or_introl or_intror refl_equal : core v62.
Hints Resolve ex_intro ex_intro2 : core v62.

Section Logic_lemmas.

  Theorem absurd : (A:Prop)(C:Prop) A -> (not A) -> C.
  Proof.
    Unfold not; Intros A C h1 h2.
    Elim (h2 h1).
  Qed.

  Section equality.
    Variable A,B : Set.
    Variable f : A->B.
    Variable x,y,z : A.

    Theorem sym_eq : (eq ? x y) -> (eq ? y x).
      Proof.
     Induction 1; Trivial.
    Defined.
    Opaque sym_eq.

    Theorem trans_eq : (eq ? x y) -> (eq ? y z) -> (eq ? x z).
    Proof.
     Induction 2; Trivial.
    Defined.
    Opaque trans_eq.

    Theorem f_equal : (eq ? x y) -> (eq ? (f x) (f y)).
    Proof.
     Induction 1; Trivial.
    Defined.
    Opaque f_equal.

    Theorem sym_not_eq : (not (eq ? x y)) -> (not (eq ? y x)).
    Proof.
     Red; Intros h1 h2; Apply h1; Elim h2; Trivial.
    Qed.

    Definition sym_equal := sym_eq.
    Definition sym_not_equal := sym_not_eq.
    Definition trans_equal := trans_eq.

  End equality.

  Definition eq_ind_r : (A:Set)(x:A)(P:A->Prop)(P x)->(y:A)(eq ? y x)->(P y).
   Intros A x P H y H0; Case sym_eq with 1:= H0; Trivial.
  Defined.

  Definition eq_rec_r : (A:Set)(x:A)(P:A->Set)(P x)->(y:A)(eq ? y x)->(P y).
    Intros A x P H y H0; Case sym_eq with 1:= H0; Trivial.
  Defined.

  Definition eq_rect_r : (A:Set)(x:A)(P:A->Type)(P x)->(y:A)(eq ? y x)->(P y).
    Intros A x P H y H0; Elim sym_eq with 1:= H0; Trivial.
  Defined.
End Logic_lemmas.

Theorem f_equal2 : (A1,A2,B:Set)(f:A1->A2->B)(x1,y1:A1)(x2,y2:A2)
  (eq ? x1 y1) -> (eq ? x2 y2) -> (eq ? (f x1 x2) (f y1 y2)).
Proof.
  Induction 1; Induction 1; Trivial.
Qed.

Theorem f_equal3 : (A1,A2,A3,B:Set)(f:A1->A2->A3->B)(x1,y1:A1)(x2,y2:A2)
  (x3,y3:A3)(eq ? x1 y1) -> (eq ? x2 y2) -> (eq ? x3 y3)
   -> (eq ? (f x1 x2 x3) (f y1 y2 y3)).
Proof.
  Induction 1; Induction 1; Induction 1; Trivial.
Qed.

Theorem f_equal4 : (A1,A2,A3,A4,B:Set)(f:A1->A2->A3->A4->B)
  (x1,y1:A1)(x2,y2:A2)(x3,y3:A3)(x4,y4:A4)
  (eq ? x1 y1) -> (eq ? x2 y2) -> (eq ? x3 y3) -> (eq ? x4 y4)
   -> (eq ? (f x1 x2 x3 x4) (f y1 y2 y3 y4)).
Proof.
  Induction 1; Induction 1; Induction 1; Induction 1; Trivial.
Qed.

Theorem f_equal5 : (A1,A2,A3,A4,A5,B:Set)(f:A1->A2->A3->A4->A5->B)
  (x1,y1:A1)(x2,y2:A2)(x3,y3:A3)(x4,y4:A4)(x5,y5:A5)
  (eq ? x1 y1) -> (eq ? x2 y2) -> (eq ? x3 y3) -> (eq ? x4 y4) -> (eq ? x5 y5)
    -> (eq ? (f x1 x2 x3 x4 x5) (f y1 y2 y3 y4 y5)).
Proof.
  Induction 1; Induction 1; Induction 1; Induction 1; Induction 1; Trivial.
Qed.

Hints Immediate sym_eq sym_not_eq : core v62.

Syntactic Definition Ex := ex | 1.
Syntactic Definition Ex2 := ex2 | 1.
Syntactic Definition All := all | 1.


Index