The Coq libraries¶
The prelude contains definitions and theorems for the most commonly used elementary logical notions and data types. Coq loads many of these files automatically when it starts. The content of the prelude can be browsed at https://coq.inria.fr/prelude/.
Other libraries like the standard library are general-purpose
libraries with definitions and theorems for sets, lists, sorting,
arithmetic, etc. To use these files, users must load them explicitly
with the Require
command (see Compiled files)
The content of the standard library can be browsed at https://coq.inria.fr/stdlib/.
There are also many libraries provided by Coq users' community. These libraries and developments are available for download at https://coq.inria.fr/ (see Users’ contributions).
This chapter briefly reviews the Coq prelude
The prelude¶
This section lists the basic notions and results which are directly
available in the standard Coq system. Most of these constructions
are defined in the Prelude
module in directory theories/Init
in the Coq root directory; this includes the modules
Notations
,
Logic
,
Datatypes
,
Specif
,
Peano
,
Wf
and
Tactics
.
Notations¶
This module defines the parsing and pretty-printing of many symbols (infixes, prefixes, etc.). However, it does not assign a meaning to these notations. The purpose of this is to define and fix once for all the precedence and associativity of very common notations. The main notations fixed in the initial state are :
Notation |
Precedence |
Associativity |
---|---|---|
|
99 |
right |
|
95 |
no |
|
85 |
right |
|
80 |
right |
|
75 |
right |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
70 |
no |
|
50 |
left |
|
50 |
left |
|
50 |
left |
|
40 |
left |
|
40 |
left |
|
40 |
left |
|
35 |
right |
|
35 |
right |
|
30 |
right |
Logic¶
Logic.v
in the basic library of Coq has the definitions of standard
(intuitionistic) logical connectives defined as inductive
constructions. They are equipped with an appealing syntax enriching the
subclass form
of the syntactic class term
. The constructs
for form
are:
True |
True |
False |
False |
|
not |
and |
|
or |
|
primitive implication |
|
iff |
|
primitive for all |
|
ex |
|
ex2 |
|
eq |
|
eq |
Note
Implication is not defined but primitive (it is a non-dependent product of a proposition over another proposition). There is also a primitive universal quantification (it is a dependent product over a proposition). The primitive universal quantification allows both first-order and higher-order quantification.
Propositional Connectives¶
First, we find propositional calculus connectives. At times, it's helpful to know exactly what these notations represent.
We also have the Type
level negation:
- Definition notT (A:Type) := A -> False.
- notT is defined
Quantifiers¶
Then we find first-order quantifiers:
- Definition all (A:Set) (P:A -> Prop) := forall x:A, P x.
- all is defined
- Inductive ex (A: Set) (P:A -> Prop) : Prop := ex_intro (x:A) (_:P x).
- ex is defined ex_ind is defined ex_sind is defined
- Inductive ex2 (A:Set) (P Q:A -> Prop) : Prop := ex_intro2 (x:A) (_:P x) (_:Q x).
- ex2 is defined ex2_ind is defined ex2_sind is defined
The following abbreviations are allowed:
|
|
|
|
|
|
|
|
The type annotation :A
can be omitted when A
can be
synthesized by the system.
Equality¶
Then, we find equality, defined as an inductive relation. That is,
given a type A
and an x
of type A
, the
predicate (eq A x)
is the smallest one which contains x
.
This definition, due to Christine Paulin-Mohring, is equivalent to
define eq
as the smallest reflexive relation, and it is also
equivalent to Leibniz' equality.
- Inductive eq (A:Type) (x:A) : A -> Prop := eq_refl : eq A x x.
- eq is defined eq_rect is defined eq_ind is defined eq_rec is defined eq_sind is defined
Lemmas¶
Finally, a few easy lemmas are provided.
The theorem f_equal
is extended to functions with two to five
arguments. The theorem are names f_equal2
, f_equal3
,
f_equal4
and f_equal5
.
For instance f_equal3
is defined the following way.
- Theorem f_equal3 : forall (A1 A2 A3 B:Type) (f:A1 -> A2 -> A3 -> B) (x1 y1:A1) (x2 y2:A2) (x3 y3:A3), x1 = y1 -> x2 = y2 -> x3 = y3 -> f x1 x2 x3 = f y1 y2 y3.
- 1 goal ============================ forall (A1 A2 A3 B : Type) (f : A1 -> A2 -> A3 -> B) (x1 y1 : A1) (x2 y2 : A2) (x3 y3 : A3), x1 = y1 -> x2 = y2 -> x3 = y3 -> f x1 x2 x3 = f y1 y2 y3
Datatypes¶
In the basic library, we find in Datatypes.v
the definition
of the basic data-types of programming,
defined as inductive constructions over the sort Set
. Some of
them come with a special syntax shown below (this syntax table is common with
the next section Specification). The constructs for specif
are:
prod |
|
sum |
|
sumor |
|
sumbool |
|
sig |
|
sig2 |
|
sigT |
|
sigT2 |
The notation for pairs (elements of type prod) is: (term, term)
Programming¶
- Inductive unit : Set := tt.
- unit is defined unit_rect is defined unit_ind is defined unit_rec is defined unit_sind is defined
- Inductive bool : Set := true | false.
- bool is defined bool_rect is defined bool_ind is defined bool_rec is defined bool_sind is defined
- Inductive nat : Set := O | S (n:nat).
- nat is defined nat_rect is defined nat_ind is defined nat_rec is defined nat_sind is defined
- Inductive option (A:Set) : Set := Some (_:A) | None.
- option is defined option_rect is defined option_ind is defined option_rec is defined option_sind is defined
Note that zero is the letter O
, and not the numeral 0
.
We then define the disjoint sum of A+B
of two sets A
and
B
, and their product A*B
.
- Inductive sum (A B:Set) : Set := inl (_:A) | inr (_:B).
- sum is defined sum_rect is defined sum_ind is defined sum_rec is defined sum_sind is defined
- Inductive prod (A B:Set) : Set := pair (_:A) (_:B).
- prod is defined prod_rect is defined prod_ind is defined prod_rec is defined prod_sind is defined
- Section projections.
- Variables A B : Set.
- A is declared B is declared
- Definition fst (H: prod A B) := match H with | pair _ _ x y => x end.
- fst is defined
- Definition snd (H: prod A B) := match H with | pair _ _ x y => y end.
- snd is defined
- End projections.
Some operations on bool
are also provided: andb
(with
infix notation &&
), orb
(with
infix notation ||
), xorb
, implb
and negb
.
Specification¶
The following notions defined in module Specif.v
allow to build new data-types and specifications.
They are available with the syntax shown in the previous section Datatypes.
For instance, given A:Type
and P:A->Prop
, the construct
{x:A | P x}
(in abstract syntax (sig A P)
) is a
Type
. We may build elements of this set as (exist x p)
whenever we have a witness x:A
with its justification
p:P x
.
From such a (exist x p)
we may in turn extract its witness
x:A
(using an elimination construct such as match
) but
not its justification, which stays hidden, like in an abstract
data-type. In technical terms, one says that sig
is a weak
(dependent) sum. A variant sig2
with two predicates is also
provided.
- Inductive sig (A:Set) (P:A -> Prop) : Set := exist (x:A) (_:P x).
- sig is defined sig_rect is defined sig_ind is defined sig_rec is defined sig_sind is defined
- Inductive sig2 (A:Set) (P Q:A -> Prop) : Set := exist2 (x:A) (_:P x) (_:Q x).
- sig2 is defined sig2_rect is defined sig2_ind is defined sig2_rec is defined sig2_sind is defined
A strong (dependent) sum {x:A & P x}
may be also defined,
when the predicate P
is now defined as a
constructor of types in Type
.
- Inductive sigT (A:Type) (P:A -> Type) : Type := existT (x:A) (_:P x).
- sigT is defined sigT_rect is defined sigT_ind is defined sigT_rec is defined sigT_sind is defined
- Section Projections2.
- Variable A : Type.
- A is declared
- Variable P : A -> Type.
- P is declared
- Definition projT1 (H:sigT A P) := let (x, h) := H in x.
- projT1 is defined
- Definition projT2 (H:sigT A P) := match H return P (projT1 H) with existT _ _ x h => h end.
- projT2 is defined
- End Projections2.
- Inductive sigT2 (A: Type) (P Q:A -> Type) : Type := existT2 (x:A) (_:P x) (_:Q x).
- sigT2 is defined sigT2_rect is defined sigT2_ind is defined sigT2_rec is defined sigT2_sind is defined
A related non-dependent construct is the constructive sum
{A}+{B}
of two propositions A
and B
.
- Inductive sumbool (A B:Prop) : Set := left (_:A) | right (_:B).
- sumbool is defined sumbool_rect is defined sumbool_ind is defined sumbool_rec is defined sumbool_sind is defined
This sumbool
construct may be used as a kind of indexed boolean
data-type. An intermediate between sumbool
and sum
is
the mixed sumor
which combines A:Set
and B:Prop
in the construction A+{B}
in Set
.
- Inductive sumor (A:Set) (B:Prop) : Set := | inleft (_:A) | inright (_:B).
- sumor is defined sumor_rect is defined sumor_ind is defined sumor_rec is defined sumor_sind is defined
We may define variants of the axiom of choice, like in Martin-Löf's Intuitionistic Type Theory.
The next construct builds a sum between a data-type A:Type
and
an exceptional value encoding errors:
- Definition Exc := option.
- Exc is defined
- Definition value := Some.
- value is defined
- Definition error := None.
- error is defined
This module ends with theorems, relating the sorts Set
or
Type
and Prop
in a way which is consistent with the
realizability interpretation.
Basic Arithmetic¶
The basic library includes a few elementary properties of natural
numbers, together with the definitions of predecessor, addition and
multiplication, in module Peano.v
. It also
provides a scope nat_scope
gathering standard notations for
common operations (+
, *
) and a decimal notation for
numbers, allowing, for instance, writing 3
for S (S (S O))
.
This also works on
the left hand side of a match
expression (see for example
section refine
). This scope is opened by default.
Example
The following example is not part of the standard library, but it shows the usage of the notations:
- Fixpoint even (n:nat) : bool := match n with | 0 => true | 1 => false | S (S n) => even n end.
- even is defined even is recursively defined (guarded on 1st argument)
Now comes the content of module Peano
:
Finally, it gives the definition of the usual orderings le
,
lt
, ge
and gt
.
- Inductive le (n:nat) : nat -> Prop := | le_n : le n n | le_S : forall m:nat, n <= m -> n <= (S m) where "n <= m" := (le n m) : nat_scope.
- Toplevel input, characters 0-137: > Inductive le (n:nat) : nat -> Prop := | le_n : le n n | le_S : forall m:nat, n <= m -> n <= (S m) where "n <= m" := (le n m) : nat_scope. > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Notation "_ <= _" was already used in scope nat_scope. [notation-overridden,parsing,default] le is defined le_ind is defined le_sind is defined Toplevel input, characters 0-137: > Inductive le (n:nat) : nat -> Prop := | le_n : le n n | le_S : forall m:nat, n <= m -> n <= (S m) where "n <= m" := (le n m) : nat_scope. > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Notation "_ <= _" was already used in scope nat_scope. [notation-overridden,parsing,default]
- Definition lt (n m:nat) := S n <= m.
- lt is defined
- Definition ge (n m:nat) := m <= n.
- ge is defined
- Definition gt (n m:nat) := m < n.
- gt is defined
Properties of these relations are not initially known, but may be
required by the user from modules Le
and Lt
. Finally,
Peano
gives some lemmas allowing pattern matching, and a double
induction principle.
Well-founded recursion¶
The basic library contains the basics of well-founded recursion and
well-founded induction, in module Wf.v
.
The automatically generated scheme Acc_rect
can be used to define functions by fixpoints using
well-founded relations to justify termination. Assuming
extensionality of the functional used for the recursive call, the
fixpoint equation can be proved.
Tactics¶
A few tactics defined at the user level are provided in the initial
state, in module Tactics.v
. They are listed at
https://coq.inria.fr/prelude/, in paragraph Init
, link Tactics
.
Users’ contributions¶
Numerous users' contributions have been collected and are available at URL https://coq.inria.fr/opam/www/. On this web page, you have a list of all contributions with informations (author, institution, quick description, etc.) and the possibility to download them one by one. You will also find informations on how to submit a new contribution.