(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
Set Implicit Arguments.
Require Export Notations.
Notation "A -> B" := (forall (_ : A), B) : type_scope.
(** * Propositional connectives *)
(** [True] is the always true proposition *)
Inductive True : Prop :=
I : True.
Register True as core.True.type.
Register I as core.True.I.
(** [False] is the always false proposition *)
Inductive False : Prop :=.
Register False as core.False.type.
(** [not A], written [~A], is the negation of [A] *)
Definition not (A:Prop) := A -> False.
Notation "~ x" := (not x) : type_scope.
Register not as core.not.type.
(** Negation of a type in [Type] *)
Definition notT (A:Type) := A -> False.
(** Create the "core" hint database, and set its transparent state for variables and constants explicitly. *)
Create HintDb core.
#[global]
Hint Variables Opaque : core.
#[global]
Hint Constants Opaque : core.
#[global]
Hint Unfold not: core.
(** [and A B], written [A /\ B], is the conjunction of [A] and [B]  [conj 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 -> A /\ B
where "A /\ B" := (and A B) : type_scope.
Register and as core.and.type.
Register conj as core.and.conj.
Section Conjunction.
Variables A B : Prop.

Theorem proj1 : A /\ B -> A.