aboutsummaryrefslogtreecommitdiff
path: root/doc/sphinx
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sphinx')
-rw-r--r--doc/sphinx/README.rst15
-rw-r--r--doc/sphinx/README.template.rst4
-rw-r--r--doc/sphinx/addendum/extended-pattern-matching.rst30
-rw-r--r--doc/sphinx/addendum/generalized-rewriting.rst23
-rw-r--r--doc/sphinx/addendum/implicit-coercions.rst6
-rw-r--r--doc/sphinx/addendum/micromega.rst17
-rw-r--r--doc/sphinx/addendum/parallel-proof-processing.rst54
-rw-r--r--doc/sphinx/addendum/ring.rst21
-rw-r--r--doc/sphinx/addendum/type-classes.rst33
-rw-r--r--doc/sphinx/addendum/universe-polymorphism.rst6
-rwxr-xr-xdoc/sphinx/conf.py3
-rw-r--r--doc/sphinx/dune7
-rw-r--r--doc/sphinx/language/cic.rst72
-rw-r--r--doc/sphinx/language/coq-library.rst24
-rw-r--r--doc/sphinx/language/gallina-extensions.rst27
-rw-r--r--doc/sphinx/language/gallina-specification-language.rst26
-rw-r--r--doc/sphinx/practical-tools/coq-commands.rst21
-rw-r--r--doc/sphinx/practical-tools/coqide.rst10
-rw-r--r--doc/sphinx/proof-engine/detailed-tactic-examples.rst32
-rw-r--r--doc/sphinx/proof-engine/ltac.rst26
-rw-r--r--doc/sphinx/proof-engine/proof-handling.rst53
-rw-r--r--doc/sphinx/proof-engine/ssreflect-proof-language.rst496
-rw-r--r--doc/sphinx/proof-engine/tactics.rst244
-rw-r--r--doc/sphinx/user-extensions/syntax-extensions.rst18
24 files changed, 641 insertions, 627 deletions
diff --git a/doc/sphinx/README.rst b/doc/sphinx/README.rst
index e4f078c1d6..fac0035de1 100644
--- a/doc/sphinx/README.rst
+++ b/doc/sphinx/README.rst
@@ -214,17 +214,17 @@ In addition to the objects above, the ``coqrst`` Sphinx plugin defines the follo
Example::
- .. coqtop:: in reset undo
+ .. coqtop:: in reset
Print nat.
Definition a := 1.
The blank line after the directive is required. If you begin a proof,
- include an ``Abort`` afterwards to reset coqtop for the next example.
+ use the ``abort`` option to reset coqtop for the next example.
Here is a list of permissible options:
- - Display options
+ - Display options (choose exactly one)
- ``all``: Display input and output
- ``in``: Display only input
@@ -234,8 +234,9 @@ In addition to the objects above, the ``coqrst`` Sphinx plugin defines the follo
- Behavior options
- ``reset``: Send a ``Reset Initial`` command before running this block
- - ``undo``: Send an ``Undo n`` (``n`` = number of sentences) command after
- running all the commands in this block
+ - ``fail``: Don't die if a command fails
+ - ``restart``: Send a ``Restart`` command before running this block (only works in proof mode)
+ - ``abort``: Send an ``Abort All`` command after running this block (leaves all pending proofs if any)
``coqtop``\ 's state is preserved across consecutive ``.. coqtop::`` blocks
of the same document (``coqrst`` creates a single ``coqtop`` process per
@@ -509,7 +510,7 @@ Tips and tricks
Nested lemmas
-------------
-The ``.. coqtop::`` directive does *not* reset Coq after running its contents. That is, the following will create two nested lemmas::
+The ``.. coqtop::`` directive does *not* reset Coq after running its contents. That is, the following will create two nested lemmas (which by default results in a failure)::
.. coqtop:: all
@@ -519,7 +520,7 @@ The ``.. coqtop::`` directive does *not* reset Coq after running its contents.
Lemma l2: 2 + 2 <> 1.
-Add either ``undo`` to the first block or ``reset`` to the second block to avoid nesting lemmas.
+Add either ``abort`` to the first block or ``reset`` to the second block to avoid nesting lemmas.
Abbreviations and macros
------------------------
diff --git a/doc/sphinx/README.template.rst b/doc/sphinx/README.template.rst
index 81f25bf274..78803a927f 100644
--- a/doc/sphinx/README.template.rst
+++ b/doc/sphinx/README.template.rst
@@ -265,7 +265,7 @@ Tips and tricks
Nested lemmas
-------------
-The ``.. coqtop::`` directive does *not* reset Coq after running its contents. That is, the following will create two nested lemmas::
+The ``.. coqtop::`` directive does *not* reset Coq after running its contents. That is, the following will create two nested lemmas (which by default results in a failure)::
.. coqtop:: all
@@ -275,7 +275,7 @@ The ``.. coqtop::`` directive does *not* reset Coq after running its contents.
Lemma l2: 2 + 2 <> 1.
-Add either ``undo`` to the first block or ``reset`` to the second block to avoid nesting lemmas.
+Add either ``abort`` to the first block or ``reset`` to the second block to avoid nesting lemmas.
Abbreviations and macros
------------------------
diff --git a/doc/sphinx/addendum/extended-pattern-matching.rst b/doc/sphinx/addendum/extended-pattern-matching.rst
index 7b8a86d1ab..3ec6c118af 100644
--- a/doc/sphinx/addendum/extended-pattern-matching.rst
+++ b/doc/sphinx/addendum/extended-pattern-matching.rst
@@ -59,7 +59,7 @@ pattern matching. Consider for example the function that computes the
maximum of two natural numbers. We can write it in primitive syntax
by:
-.. coqtop:: in undo
+.. coqtop:: in
Fixpoint max (n m:nat) {struct m} : nat :=
match n with
@@ -75,7 +75,7 @@ Multiple patterns
Using multiple patterns in the definition of ``max`` lets us write:
-.. coqtop:: in undo
+.. coqtop:: in reset
Fixpoint max (n m:nat) {struct m} : nat :=
match n, m with
@@ -103,7 +103,7 @@ Aliasing subpatterns
We can also use :n:`as @ident` to associate a name to a sub-pattern:
-.. coqtop:: in undo
+.. coqtop:: in reset
Fixpoint max (n m:nat) {struct n} : nat :=
match n, m with
@@ -128,18 +128,22 @@ Here is now an example of nested patterns:
This is compiled into:
-.. coqtop:: all undo
+.. coqtop:: all
Unset Printing Matching.
Print even.
+.. coqtop:: none
+
+ Set Printing Matching.
+
In the previous examples patterns do not conflict with, but sometimes
it is comfortable to write patterns that admit a non trivial
superposition. Consider the boolean function :g:`lef` that given two
natural numbers yields :g:`true` if the first one is less or equal than the
second one and :g:`false` otherwise. We can write it as follows:
-.. coqtop:: in undo
+.. coqtop:: in
Fixpoint lef (n m:nat) {struct m} : bool :=
match n, m with
@@ -158,7 +162,7 @@ is matched by the first pattern, and so :g:`(lef O O)` yields true.
Another way to write this function is:
-.. coqtop:: in
+.. coqtop:: in reset
Fixpoint lef (n m:nat) {struct m} : bool :=
match n, m with
@@ -191,7 +195,7 @@ Multiple patterns that share the same right-hand-side can be
factorized using the notation :n:`{+| @mult_pattern}`. For
instance, :g:`max` can be rewritten as follows:
-.. coqtop:: in undo
+.. coqtop:: in reset
Fixpoint max (n m:nat) {struct m} : nat :=
match n, m with
@@ -269,7 +273,7 @@ When we use parameters in patterns there is an error message:
Set Asymmetric Patterns.
Check (fun l:List nat =>
match l with
- | nil => nil
+ | nil => nil _
| cons _ l' => l'
end).
Unset Asymmetric Patterns.
@@ -291,7 +295,7 @@ By default, implicit arguments are omitted in patterns. So we write:
end).
But the possibility to use all the arguments is given by “``@``” implicit
-explicitations (as for terms 2.7.11).
+explicitations (as for terms, see :ref:`explicit-applications`).
.. coqtop:: all
@@ -325,7 +329,7 @@ Understanding dependencies in patterns
We can define the function length over :g:`listn` by:
-.. coqtop:: in
+.. coqdoc::
Definition length (n:nat) (l:listn n) := n.
@@ -367,6 +371,10 @@ different types and we need to provide the elimination predicate:
| consn n' a y => consn (n' + m) a (concat n' y m l')
end.
+.. coqtop:: none
+
+ Reset concat.
+
The elimination predicate is :g:`fun (n:nat) (l:listn n) => listn (n+m)`.
In general if :g:`m` has type :g:`(I q1 … qr t1 … ts)` where :g:`q1, …, qr`
are parameters, the elimination predicate should be of the form :g:`fun y1 … ys x : (I q1 … qr y1 … ys ) => Q`.
@@ -503,7 +511,7 @@ can also be caught in the matching.
.. example::
- .. coqtop:: in
+ .. coqtop:: in reset
Inductive list : nat -> Set :=
| nil : list 0
diff --git a/doc/sphinx/addendum/generalized-rewriting.rst b/doc/sphinx/addendum/generalized-rewriting.rst
index b606fb4dd2..b474c51f17 100644
--- a/doc/sphinx/addendum/generalized-rewriting.rst
+++ b/doc/sphinx/addendum/generalized-rewriting.rst
@@ -121,7 +121,7 @@ parameters is any term :math:`f \, t_1 \ldots t_n`.
morphism parametric over ``A`` that respects the relation instance
``(set_eq A)``. The latter condition is proved by showing:
- .. coqtop:: in
+ .. coqdoc::
forall (A: Type) (S1 S1' S2 S2': list A),
set_eq A S1 S1' ->
@@ -205,7 +205,7 @@ Adding new relations and morphisms
For Leibniz equality, we may declare:
- .. coqtop:: in
+ .. coqdoc::
Add Parametric Relation (A : Type) : A (@eq A)
[reflexivity proved by @refl_equal A]
@@ -274,7 +274,7 @@ following command.
(maximally inserted) implicit arguments. If ``A`` is always set as
maximally implicit in the previous example, one can write:
- .. coqtop:: in
+ .. coqdoc::
Add Parametric Relation A : (set A) eq_set
reflexivity proved by eq_set_refl
@@ -282,13 +282,8 @@ following command.
transitivity proved by eq_set_trans
as eq_set_rel.
- .. coqtop:: in
-
Add Parametric Morphism A : (@union A) with
signature eq_set ==> eq_set ==> eq_set as union_mor.
-
- .. coqtop:: in
-
Proof. exact (@union_compat A). Qed.
We proceed now by proving a simple lemma performing a rewrite step and
@@ -300,7 +295,7 @@ following command.
.. coqtop:: in
Goal forall (S : set nat),
- eq_set (union (union S empty) S) (union S S).
+ eq_set (union (union S (empty nat)) S) (union S S).
.. coqtop:: in
@@ -486,7 +481,7 @@ registered as parametric relations and morphisms.
.. example:: First class setoids
- .. coqtop:: in
+ .. coqtop:: in reset
Require Import Relation_Definitions Setoid.
@@ -623,12 +618,16 @@ declared as morphisms in the ``Classes.Morphisms_Prop`` module. For
example, to declare that universal quantification is a morphism for
logical equivalence:
+.. coqtop:: none
+
+ Require Import Morphisms.
+
.. coqtop:: in
Instance all_iff_morphism (A : Type) :
Proper (pointwise_relation A iff ==> iff) (@all A).
-.. coqtop:: all
+.. coqtop:: all abort
Proof. simpl_relation.
@@ -650,7 +649,7 @@ functional arguments (or whatever subrelation of the pointwise
extension). For example, one could declare the ``map`` combinator on lists
as a morphism:
-.. coqtop:: in
+.. coqdoc::
Instance map_morphism `{Equivalence A eqA, Equivalence B eqB} :
Proper ((eqA ==> eqB) ==> list_equiv eqA ==> list_equiv eqB) (@map A B).
diff --git a/doc/sphinx/addendum/implicit-coercions.rst b/doc/sphinx/addendum/implicit-coercions.rst
index e5b41be691..d15aacad44 100644
--- a/doc/sphinx/addendum/implicit-coercions.rst
+++ b/doc/sphinx/addendum/implicit-coercions.rst
@@ -37,7 +37,7 @@ In addition to these user-defined classes, we have two built-in classes:
* ``Funclass``, the class of functions; its objects are all the terms with a functional
type, i.e. of form :g:`forall x:A,B`.
-Formally, the syntax of a classes is defined as:
+Formally, the syntax of classes is defined as:
.. productionlist::
class: `qualid`
@@ -289,7 +289,7 @@ by extending the existing :cmd:`Record` macro. Its new syntax is:
The first identifier :token:`ident` is the name of the defined record and
:token:`sort` is its type. The optional identifier after ``:=`` is the name
- of the constuctor (it will be :n:`Build_@ident` if not given).
+ of the constructor (it will be :n:`Build_@ident` if not given).
The other identifiers are the names of the fields, and :token:`term`
are their respective types. If ``:>`` is used instead of ``:`` in
the declaration of a field, then the name of this field is automatically
@@ -365,7 +365,7 @@ We first give an example of coercion between atomic inductive types
.. warning::
- Note that ``Check true=O`` would fail. This is "normal" behavior of
+ Note that ``Check (true = O)`` would fail. This is "normal" behavior of
coercions. To validate ``true=O``, the coercion is searched from
``nat`` to ``bool``. There is none.
diff --git a/doc/sphinx/addendum/micromega.rst b/doc/sphinx/addendum/micromega.rst
index e799677c59..e56b36caad 100644
--- a/doc/sphinx/addendum/micromega.rst
+++ b/doc/sphinx/addendum/micromega.rst
@@ -124,7 +124,7 @@ and checked to be :math:`-1`.
that :tacn:`omega` does not solve, such as the following so-called *omega
nightmare* :cite:`TheOmegaPaper`.
-.. coqtop:: in
+.. coqdoc::
Goal forall x y,
27 <= 11 * x + 13 * y <= 45 ->
@@ -145,7 +145,7 @@ weakness, the :tacn:`lia` tactic is using recursively a combination of:
+ linear *positivstellensatz* refutations;
+ cutting plane proofs;
+ case split.
-
+
Cutting plane proofs
~~~~~~~~~~~~~~~~~~~~~~
@@ -234,7 +234,8 @@ proof by abstracting monomials by variables.
To illustrate the working of the tactic, consider we wish to prove the
following Coq goal:
-.. coqtop:: all
+.. needs csdp
+.. coqdoc::
Require Import ZArith Psatz.
Open Scope Z_scope.
@@ -250,6 +251,16 @@ obtain :math:`-1`. By Theorem :ref:`Psatz <psatz_thm>`, the goal is valid.
.. [#] Support for :g:`nat` and :g:`N` is obtained by pre-processing the goal with
the ``zify`` tactic.
+.. [#] Support for :g:`Z.div` and :g:`Z.modulo` may be obtained by
+ pre-processing the goal with the ``Z.div_mod_to_equations`` tactic (you may
+ need to manually run ``zify`` first).
+.. [#] Support for :g:`Z.quot` and :g:`Z.rem` may be obtained by pre-processing
+ the goal with the ``Z.quot_rem_to_equations`` tactic (you may need to manually
+ run ``zify`` first).
+.. [#] Note that support for :g:`Z.div`, :g:`Z.modulo`, :g:`Z.quot`, and
+ :g:`Z.rem` may be simultaneously obtained by pre-processing the goal with the
+ ``Z.to_euclidean_division_equations`` tactic (you may need to manually run
+ ``zify`` first).
.. [#] Sources and binaries can be found at https://projects.coin-or.org/Csdp
.. [#] Variants deal with equalities and strict inequalities.
.. [#] In practice, the oracle might fail to produce such a refutation.
diff --git a/doc/sphinx/addendum/parallel-proof-processing.rst b/doc/sphinx/addendum/parallel-proof-processing.rst
index 8b7214e2ab..903ee115c9 100644
--- a/doc/sphinx/addendum/parallel-proof-processing.rst
+++ b/doc/sphinx/addendum/parallel-proof-processing.rst
@@ -52,7 +52,7 @@ in interactive mode.
It is not strictly mandatory in batch mode if it is not the first time
the file is compiled and if the file itself did not change. When the
proof does not begin with Proof using, the system records in an
-auxiliary file, produced along with the `.vo` file, the list of section
+auxiliary file, produced along with the ``.vo`` file, the list of section
variables used.
Automatic suggestion of proof annotations
@@ -154,22 +154,22 @@ to a worker process. The threshold can be configured with
Batch mode
---------------
-When |Coq| is used as a batch compiler by running `coqc` or `coqtop`
--compile, it produces a `.vo` file for each `.v` file. A `.vo` file contains,
-among other things, theorem statements and proofs. Hence to produce a
-.vo |Coq| need to process all the proofs of the `.v` file.
+When |Coq| is used as a batch compiler by running ``coqc``, it produces
+a ``.vo`` file for each ``.v`` file. A ``.vo`` file contains, among other
+things, theorem statements and proofs. Hence to produce a .vo |Coq|
+need to process all the proofs of the ``.v`` file.
The asynchronous processing of proofs can decouple the generation of a
-compiled file (like the `.vo` one) that can be loaded by ``Require`` from the
+compiled file (like the ``.vo`` one) that can be loaded by ``Require`` from the
generation and checking of the proof objects. The ``-quick`` flag can be
-passed to `coqc` or `coqtop` to produce, quickly, `.vio` files.
-Alternatively, when using a Makefile produced by `coq_makefile`,
+passed to ``coqc`` or ``coqtop`` to produce, quickly, ``.vio`` files.
+Alternatively, when using a Makefile produced by ``coq_makefile``,
the ``quick`` target can be used to compile all files using the ``-quick`` flag.
-A `.vio` file can be loaded using ``Require`` exactly as a `.vo` file but
+A ``.vio`` file can be loaded using ``Require`` exactly as a ``.vo`` file but
proofs will not be available (the Print command produces an error).
Moreover, some universe constraints might be missing, so universes
-inconsistencies might go unnoticed. A `.vio` file does not contain proof
+inconsistencies might go unnoticed. A ``.vio`` file does not contain proof
objects, but proof tasks, i.e. what a worker process can transform
into a proof object.
@@ -177,52 +177,52 @@ Compiling a set of files with the ``-quick`` flag allows one to work,
interactively, on any file without waiting for all the proofs to be
checked.
-When working interactively, one can fully check all the `.v` files by
-running `coqc` as usual.
+When working interactively, one can fully check all the ``.v`` files by
+running ``coqc`` as usual.
-Alternatively one can turn each `.vio` into the corresponding `.vo`. All
+Alternatively one can turn each ``.vio`` into the corresponding ``.vo``. All
.vio files can be processed in parallel, hence this alternative might
be faster. The command ``coqtop -schedule-vio2vo 2 a b c`` can be used to
-obtain a good scheduling for two workers to produce `a.vo`, `b.vo`, and
-`c.vo`. When using a Makefile produced by `coq_makefile`, the ``vio2vo`` target
-can be used for that purpose. Variable `J` should be set to the number
+obtain a good scheduling for two workers to produce ``a.vo``, ``b.vo``, and
+``c.vo``. When using a Makefile produced by ``coq_makefile``, the ``vio2vo`` target
+can be used for that purpose. Variable ``J`` should be set to the number
of workers, e.g. ``make vio2vo J=2``. The only caveat is that, while the
-.vo files obtained from `.vio` files are complete (they contain all proof
+.vo files obtained from ``.vio`` files are complete (they contain all proof
terms and universe constraints), the satisfiability of all universe
constraints has not been checked globally (they are checked to be
consistent for every single proof). Constraints will be checked when
-these `.vo` files are (recursively) loaded with ``Require``.
+these ``.vo`` files are (recursively) loaded with ``Require``.
There is an extra, possibly even faster, alternative: just check the
-proof tasks stored in `.vio` files without producing the `.vo` files. This
+proof tasks stored in ``.vio`` files without producing the ``.vo`` files. This
is possibly faster because all the proof tasks are independent, hence
one can further partition the job to be done between workers. The
``coqtop -schedule-vio-checking 6 a b c`` command can be used to obtain a
-good scheduling for 6 workers to check all the proof tasks of `a.vio`,
-`b.vio`, and `c.vio`. Auxiliary files are used to predict how long a proof
+good scheduling for 6 workers to check all the proof tasks of ``a.vio``,
+``b.vio``, and ``c.vio``. Auxiliary files are used to predict how long a proof
task will take, assuming it will take the same amount of time it took
last time. When using a Makefile produced by coq_makefile, the
-``checkproofs`` target can be used to check all `.vio` files. Variable `J`
+``checkproofs`` target can be used to check all ``.vio`` files. Variable ``J``
should be set to the number of workers, e.g. ``make checkproofs J=6``. As
-when converting `.vio` files to `.vo` files, universe constraints are not
+when converting ``.vio`` files to ``.vo`` files, universe constraints are not
checked to be globally consistent. Hence this compilation mode is only
useful for quick regression testing and on developments not making
-heavy use of the `Type` hierarchy.
+heavy use of the ``Type`` hierarchy.
Limiting the number of parallel workers
--------------------------------------------
Many |Coq| processes may run on the same computer, and each of them may
-start many additional worker processes. The `coqworkmgr` utility lets
+start many additional worker processes. The ``coqworkmgr`` utility lets
one limit the number of workers, globally.
The utility accepts the ``-j`` argument to specify the maximum number of
-workers (defaults to 2). `coqworkmgr` automatically starts in the
+workers (defaults to 2). ``coqworkmgr`` automatically starts in the
background and prints an environment variable assignment
like ``COQWORKMGR_SOCKET=localhost:45634``. The user must set this variable
in all the shells from which |Coq| processes will be started. If one
uses just one terminal running the bash shell, then
``export ‘coqworkmgr -j 4‘`` will do the job.
-After that, all |Coq| processes, e.g. `coqide` and `coqc`, will respect the
+After that, all |Coq| processes, e.g. ``coqide`` and ``coqc``, will respect the
limit, globally.
diff --git a/doc/sphinx/addendum/ring.rst b/doc/sphinx/addendum/ring.rst
index 8204d93fa7..20e4c6a3d6 100644
--- a/doc/sphinx/addendum/ring.rst
+++ b/doc/sphinx/addendum/ring.rst
@@ -197,7 +197,7 @@ be either Leibniz equality, or any relation declared as a setoid (see
:ref:`tactics-enabled-on-user-provided-relations`).
The definitions of ring and semiring (see module ``Ring_theory``) are:
-.. coqtop:: in
+.. coqdoc::
Record ring_theory : Prop := mk_rt {
Radd_0_l : forall x, 0 + x == x;
@@ -235,7 +235,7 @@ coefficients could be the rational numbers, upon which the ring
operations can be implemented. The fact that there exists a morphism
is defined by the following properties:
-.. coqtop:: in
+.. coqdoc::
Record ring_morph : Prop := mkmorph {
morph0 : [cO] == 0;
@@ -285,13 +285,14 @@ following property:
.. coqtop:: in
+ Require Import Reals.
Section POWER.
Variable Cpow : Set.
Variable Cp_phi : N -> Cpow.
Variable rpow : R -> Cpow -> R.
Record power_theory : Prop := mkpow_th {
- rpow_pow_N : forall r n, req (rpow r (Cp_phi n)) (pow_N rI rmul r n)
+ rpow_pow_N : forall r n, rpow r (Cp_phi n) = pow_N 1%R Rmult r n
}.
End POWER.
@@ -422,7 +423,7 @@ The interested reader is strongly advised to have a look at the
file ``Ring_polynom.v``. Here a type for polynomials is defined:
-.. coqtop:: in
+.. coqdoc::
Inductive PExpr : Type :=
| PEc : C -> PExpr
@@ -437,7 +438,7 @@ file ``Ring_polynom.v``. Here a type for polynomials is defined:
Polynomials in normal form are defined as:
-.. coqtop:: in
+.. coqdoc::
Inductive Pol : Type :=
| Pc : C -> Pol
@@ -454,7 +455,7 @@ polynomial to an element of the concrete ring, and the second one that
does the same for normal forms:
-.. coqtop:: in
+.. coqdoc::
Definition PEeval : list R -> PExpr -> R := [...].
@@ -465,7 +466,7 @@ A function to normalize polynomials is defined, and the big theorem is
its correctness w.r.t interpretation, that is:
-.. coqtop:: in
+.. coqdoc::
Definition norm : PExpr -> Pol := [...].
Lemma Pphi_dev_ok :
@@ -616,7 +617,7 @@ also supported. The equality can be either Leibniz equality, or any
relation declared as a setoid (see :ref:`tactics-enabled-on-user-provided-relations`). The definition of
fields and semifields is:
-.. coqtop:: in
+.. coqdoc::
Record field_theory : Prop := mk_field {
F_R : ring_theory rO rI radd rmul rsub ropp req;
@@ -636,7 +637,7 @@ fields and semifields is:
The result of the normalization process is a fraction represented by
the following type:
-.. coqtop:: in
+.. coqdoc::
Record linear : Type := mk_linear {
num : PExpr C;
@@ -690,7 +691,7 @@ for |Coq|’s type checker. Let us see why:
x + 3 + y + y * z = x + 3 + y + z * y.
intros; rewrite (Zmult_comm y z); reflexivity.
Save foo.
- Print foo.
+ Print foo.
At each step of rewriting, the whole context is duplicated in the
proof term. Then, a tactic that does hundreds of rewriting generates
diff --git a/doc/sphinx/addendum/type-classes.rst b/doc/sphinx/addendum/type-classes.rst
index 43d302114e..c7ea7e326f 100644
--- a/doc/sphinx/addendum/type-classes.rst
+++ b/doc/sphinx/addendum/type-classes.rst
@@ -44,25 +44,20 @@ Leibniz equality on some type. An example implementation is:
eqb_leibniz x y H :=
match x, y return x = y with tt, tt => eq_refl tt end }.
-If one does not give all the members in the Instance declaration, Coq
-enters the proof-mode and the user is asked to build inhabitants of
-the remaining fields, e.g.:
+Using :cmd:`Program Instance`, if one does not give all the members in
+the Instance declaration, Coq generates obligations for the remaining
+fields, e.g.:
.. coqtop:: in
- Instance eq_bool : EqDec bool :=
+ Require Import Program.Tactics.
+ Program Instance eq_bool : EqDec bool :=
{ eqb x y := if x then y else negb y }.
.. coqtop:: all
- Proof. intros x y H.
-
-.. coqtop:: all
-
- destruct x ; destruct y ; (discriminate || reflexivity).
-
-.. coqtop:: all
-
+ Next Obligation.
+ destruct x ; destruct y ; (discriminate || reflexivity).
Defined.
One has to take care that the transparency of every field is
@@ -131,14 +126,14 @@ the constraints as a binding context before the instance, e.g.:
.. coqtop:: in
- Instance prod_eqb `(EA : EqDec A, EB : EqDec B) : EqDec (A * B) :=
+ Program Instance prod_eqb `(EA : EqDec A, EB : EqDec B) : EqDec (A * B) :=
{ eqb x y := match x, y with
| (la, ra), (lb, rb) => andb (eqb la lb) (eqb ra rb)
end }.
.. coqtop:: none
- Abort.
+ Admit Obligations.
These instances are used just as well as lemmas in the instance hint
database.
@@ -157,13 +152,13 @@ vernacular, except it accepts any binding context as argument. For example:
Context `{EA : EqDec A}.
- Global Instance option_eqb : EqDec (option A) :=
+ Global Program Instance option_eqb : EqDec (option A) :=
{ eqb x y := match x, y with
| Some x, Some y => eqb x y
| None, None => true
| _, _ => false
end }.
- Admitted.
+ Admit Obligations.
End EqDec_defs.
@@ -564,12 +559,12 @@ Settings
This flag allows to switch the behavior of instance declarations made through
the Instance command.
- + When it is on (the default), instances that have unsolved holes in
+ + When it is off (the default), they fail with an error instead.
+
+ + When it is on, instances that have unsolved holes in
their proof-term silently open the proof mode with the remaining
obligations to prove.
- + When it is off, they fail with an error instead.
-
Typeclasses eauto `:=`
~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/sphinx/addendum/universe-polymorphism.rst b/doc/sphinx/addendum/universe-polymorphism.rst
index 04aedd0cf6..6b10b7c0b3 100644
--- a/doc/sphinx/addendum/universe-polymorphism.rst
+++ b/doc/sphinx/addendum/universe-polymorphism.rst
@@ -223,7 +223,7 @@ The following is an example of a record with non-trivial subtyping relation:
E[Γ] ⊢ \mathsf{packType}@\{i\} =_{βδιζη}
\mathsf{packType}@\{j\}~\mbox{ whenever }~i ≤ j
-Cumulative inductive types, coninductive types, variants and records
+Cumulative inductive types, coinductive types, variants and records
only make sense when they are universe polymorphic. Therefore, an
error is issued whenever the user uses the :g:`Cumulative` or
:g:`NonCumulative` prefix in a monomorphic context.
@@ -236,11 +236,11 @@ Consider the following examples.
.. coqtop:: all reset
- Monomorphic Cumulative Inductive Unit := unit.
+ Fail Monomorphic Cumulative Inductive Unit := unit.
.. coqtop:: all reset
- Monomorphic NonCumulative Inductive Unit := unit.
+ Fail Monomorphic NonCumulative Inductive Unit := unit.
.. coqtop:: all reset
diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py
index 39047f4f23..48ad60c6dd 100755
--- a/doc/sphinx/conf.py
+++ b/doc/sphinx/conf.py
@@ -28,7 +28,7 @@ from shutil import copyfile
import sphinx
# Increase recursion limit for sphinx
-sys.setrecursionlimit(1500)
+sys.setrecursionlimit(3000)
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -142,6 +142,7 @@ exclude_patterns = [
'introduction.rst',
'refman-preamble.rst',
'README.rst',
+ 'README.gen.rst',
'README.template.rst'
] + ["*.{}.rst".format(fmt) for fmt in SUPPORTED_FORMATS]
diff --git a/doc/sphinx/dune b/doc/sphinx/dune
index fff025c919..353d58c676 100644
--- a/doc/sphinx/dune
+++ b/doc/sphinx/dune
@@ -1 +1,8 @@
(dirs :standard _static)
+
+(rule (targets README.gen.rst)
+ (deps (source_tree ../tools/coqrst) README.template.rst)
+ (action (run ../tools/coqrst/regen_readme.py %{targets})))
+
+(alias (name refman-html)
+ (action (diff README.rst README.gen.rst)))
diff --git a/doc/sphinx/language/cic.rst b/doc/sphinx/language/cic.rst
index 775fc76cfe..e05df65c63 100644
--- a/doc/sphinx/language/cic.rst
+++ b/doc/sphinx/language/cic.rst
@@ -20,9 +20,9 @@ There are types for functions (or programs), there are atomic types
(especially datatypes)... but also types for proofs and types for the
types themselves. Especially, any object handled in the formalism must
belong to a type. For instance, universal quantification is relative
-to a type and takes the form "*for all x of type T, P* ". The expression
-“x of type T” is written :g:`x:T`. Informally, :g:`x:T` can be thought as
-“x belongs to T”.
+to a type and takes the form “*for all x of type* :math:`T`, :math:`P`”. The expression
+“:math:`x` *of type* :math:`T`” is written “:math:`x:T`”. Informally, “:math:`x:T`” can be thought as
+“:math:`x` *belongs to* :math:`T`”.
The types of types are *sorts*. Types and sorts are themselves terms
so that terms, types and sorts are all components of a common
@@ -51,7 +51,7 @@ function types over these data types.
Consequently they also have a type. Because assuming simply that :math:`\Set`
has type :math:`\Set` leads to an inconsistent theory :cite:`Coq86`, the language of
|Cic| has infinitely many sorts. There are, in addition to :math:`\Set` and :math:`\Prop`
-a hierarchy of universes :math:`\Type(i)` for any integer :math:`i`.
+a hierarchy of universes :math:`\Type(i)` for any integer :math:`i ≥ 1`.
Like :math:`\Set`, all of the sorts :math:`\Type(i)` contain small sets such as
booleans, natural numbers, as well as products, subsets and function
@@ -132,7 +132,7 @@ the following rules.
which maps elements of :math:`T` to the expression :math:`u`.
#. if :math:`t` and :math:`u` are terms then :math:`(t~u)` is a term
(:g:`t u` in |Coq| concrete
- syntax). The term :math:`(t~u)` reads as “t applied to u”.
+ syntax). The term :math:`(t~u)` reads as “:math:`t` applied to :math:`u`”.
#. if :math:`x` is a variable, and :math:`t`, :math:`T` and :math:`u` are
terms then :math:`\letin{x}{t:T}{u}` is
a term which denotes the term :math:`u` where the variable :math:`x` is locally bound
@@ -216,7 +216,7 @@ For the rest of the chapter, :math:`Γ::(y:T)` denotes the local context :math:`
enriched with the local assumption :math:`y:T`. Similarly, :math:`Γ::(y:=t:T)` denotes
the local context :math:`Γ` enriched with the local definition :math:`(y:=t:T)`. The
notation :math:`[]` denotes the empty local context. By :math:`Γ_1 ; Γ_2` we mean
-concatenation of the local context :math:`Γ_1` and the local context :math:`Γ_2` .
+concatenation of the local context :math:`Γ_1` and the local context :math:`Γ_2`.
.. _Global-environment:
@@ -542,10 +542,10 @@ exist terms :math:`u_1` and :math:`u_2` such that :math:`E[Γ] ⊢ t_1 \triangle
… \triangleright u_1` and :math:`E[Γ] ⊢ t_2 \triangleright … \triangleright u_2` and either :math:`u_1` and
:math:`u_2` are identical, or they are convertible up to η-expansion,
i.e. :math:`u_1` is :math:`λ x:T.~u_1'` and :math:`u_2 x` is
-recursively convertible to :math:`u_1'` , or, symmetrically,
+recursively convertible to :math:`u_1'`, or, symmetrically,
:math:`u_2` is :math:`λx:T.~u_2'`
and :math:`u_1 x` is recursively convertible to :math:`u_2'`. We then write
-:math:`E[Γ] ⊢ t_1 =_{βδιζη} t_2` .
+:math:`E[Γ] ⊢ t_1 =_{βδιζη} t_2`.
Apart from this we consider two instances of polymorphic and
cumulative (see Chapter :ref:`polymorphicuniverses`) inductive types
@@ -782,7 +782,7 @@ the sort of the inductive type :math:`t` (not to be confused with :math:`\Sort`
Inductive even : nat -> Prop :=
| even_O : even 0
| even_S : forall n, odd n -> even (S n)
- with odd : nat -> prop :=
+ with odd : nat -> Prop :=
| odd_S : forall n, even n -> odd (S n).
@@ -793,7 +793,7 @@ Types of inductive objects
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We have to give the type of constants in a global environment :math:`E` which
-contains an inductive declaration.
+contains an inductive definition.
.. inference:: Ind
@@ -833,7 +833,7 @@ contains an inductive declaration.
Well-formed inductive definitions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-We cannot accept any inductive declaration because some of them lead
+We cannot accept any inductive definition because some of them lead
to inconsistent systems. We restrict ourselves to definitions which
satisfy a syntactic criterion of positivity. Before giving the formal
rules, we need a few definitions:
@@ -898,7 +898,7 @@ cases:
+ :math:`T` converts to :math:`∀ x:U,~V` and :math:`X` does not occur in type :math:`U` but occurs
strictly positively in type :math:`V`
+ :math:`T` converts to :math:`(I~a_1 … a_m~t_1 … t_p )` where :math:`I` is the name of an
- inductive declaration of the form
+ inductive definition of the form
.. math::
\ind{m}{I:A}{c_1 :∀ p_1 :P_1 ,… ∀p_m :P_m ,~C_1 ;~…;~c_n :∀ p_1 :P_1 ,… ∀p_m :P_m ,~C_n}
@@ -914,7 +914,7 @@ Nested Positivity
The type of constructor :math:`T` of :math:`I` *satisfies the nested positivity
condition* for a constant :math:`X` in the following cases:
-+ :math:`T=(I~b_1 … b_m~u_1 … u_p)`, :math:`I` is an inductive definition with :math:`m`
++ :math:`T=(I~b_1 … b_m~u_1 … u_p)`, :math:`I` is an inductive type with :math:`m`
parameters and :math:`X` does not occur in any :math:`u_i`
+ :math:`T=∀ x:U,~V` and :math:`X` occurs only strictly positively in :math:`U` and the type :math:`V`
satisfies the nested positivity condition for :math:`X`
@@ -929,7 +929,7 @@ condition* for a constant :math:`X` in the following cases:
Inductive nattree (A:Type) : Type :=
| leaf : nattree A
- | node : A -> (nat -> nattree A) -> nattree A.
+ | natnode : A -> (nat -> nattree A) -> nattree A.
Then every instantiated constructor of ``nattree A`` satisfies the nested positivity
condition for ``nattree``:
@@ -939,7 +939,7 @@ condition* for a constant :math:`X` in the following cases:
type of that constructor (primarily because ``nattree`` does not have any (real)
arguments) ... (bullet 1)
- + Type ``A → (nat → nattree A) → nattree A`` of constructor ``node`` satisfies the
+ + Type ``A → (nat → nattree A) → nattree A`` of constructor ``natnode`` satisfies the
positivity condition for ``nattree`` because:
- ``nattree`` occurs only strictly positively in ``A`` ... (bullet 1)
@@ -980,8 +980,8 @@ provided that the following side conditions hold:
One can remark that there is a constraint between the sort of the
arity of the inductive type and the sort of the type of its
constructors which will always be satisfied for the impredicative
-sort :math:`\Prop` but may fail to define inductive definition on sort :math:`\Set` and
-generate constraints between universes for inductive definitions in
+sort :math:`\Prop` but may fail to define inductive type on sort :math:`\Set` and
+generate constraints between universes for inductive types in
the Type hierarchy.
@@ -1061,9 +1061,9 @@ longest prefix of parameters such that the :math:`m` first arguments of all
occurrences of all :math:`I_j` in all :math:`C_k` (even the occurrences in the
hypotheses of :math:`C_k`) are exactly applied to :math:`p_1 … p_m` (:math:`m` is the number
of *recursively uniform parameters* and the :math:`p−m` remaining parameters
-are the *recursively non-uniform parameters*). Let :math:`q_1 , …, q_r` , with
+are the *recursively non-uniform parameters*). Let :math:`q_1 , …, q_r`, with
:math:`0≤ r≤ m`, be a (possibly) partial instantiation of the recursively
-uniform parameters of :math:`Γ_P` . We have:
+uniform parameters of :math:`Γ_P`. We have:
.. inference:: Ind-Family
@@ -1082,7 +1082,7 @@ provided that the following side conditions hold:
+ :math:`Γ_{P′}` is the context obtained from :math:`Γ_P` by replacing each :math:`P_l` that is
an arity with :math:`P_l'` for :math:`1≤ l ≤ r` (notice that :math:`P_l` arity implies :math:`P_l'`
arity since :math:`E[] ⊢ P_l' ≤_{βδιζη} \subst{P_l}{p_u}{q_u}_{u=1\ldots l-1}`);
- + there are sorts :math:`s_i` , for :math:`1 ≤ i ≤ k` such that, for
+ + there are sorts :math:`s_i`, for :math:`1 ≤ i ≤ k` such that, for
:math:`Γ_{I'} = [I_1 :∀ Γ_{P'} ,(A_1)_{/s_1} ;~…;~I_k :∀ Γ_{P'} ,(A_k)_{/s_k}]`
we have :math:`(E[Γ_{I′} ;Γ_{P′}] ⊢ C_i : s_{q_i})_{i=1… n}` ;
+ the sorts :math:`s_i` are such that all eliminations, to
@@ -1213,7 +1213,7 @@ recognized implicitly and taken into account in the conversion rule.
From the logical point of view, we have built a type family by giving
a set of constructors. We want to capture the fact that we do not have
any other way to build an object in this type. So when trying to prove
-a property about an object :math:`m` in an inductive definition it is enough
+a property about an object :math:`m` in an inductive type it is enough
to enumerate all the cases where :math:`m` starts with a different
constructor.
@@ -1319,7 +1319,7 @@ and :math:`I:A` and :math:`λ a x . P : B` then by :math:`[I:A|B]` we mean that
**Notations.** The :math:`[I:A|B]` is defined as the smallest relation satisfying the
following rules: We write :math:`[I|B]` for :math:`[I:A|B]` where :math:`A` is the type of :math:`I`.
-The case of inductive definitions in sorts :math:`\Set` or :math:`\Type` is simple.
+The case of inductive types in sorts :math:`\Set` or :math:`\Type` is simple.
There is no restriction on the sort of the predicate to be eliminated.
.. inference:: Prod
@@ -1395,7 +1395,7 @@ proof-irrelevance property which is sometimes a useful axiom:
Axiom proof_irrelevance : forall (P : Prop) (x y : P), x=y.
-The elimination of an inductive definition of type :math:`\Prop` on a predicate
+The elimination of an inductive type of sort :math:`\Prop` on a predicate
:math:`P` of type :math:`I→ \Type` leads to a paradox when applied to impredicative
inductive definition like the second-order existential quantifier
:g:`exProp` defined above, because it gives access to the two projections on
@@ -1440,7 +1440,7 @@ elimination on any sort is allowed.
**Type of branches.**
Let :math:`c` be a term of type :math:`C`, we assume :math:`C` is a type of constructor for an
inductive type :math:`I`. Let :math:`P` be a term that represents the property to be
-proved. We assume :math:`r` is the number of parameters and :math:`p` is the number of
+proved. We assume :math:`r` is the number of parameters and :math:`s` is the number of
arguments.
We define a new type :math:`\{c:C\}^P` which represents the type of the branch
@@ -1448,7 +1448,7 @@ corresponding to the :math:`c:C` constructor.
.. math::
\begin{array}{ll}
- \{c:(I~p_1\ldots p_r\ t_1 \ldots t_p)\}^P &\equiv (P~t_1\ldots ~t_p~c) \\
+ \{c:(I~q_1\ldots q_r\ t_1 \ldots t_s)\}^P &\equiv (P~t_1\ldots ~t_s~c) \\
\{c:∀ x:T,~C\}^P &\equiv ∀ x:T,~\{(c~x):C\}^P
\end{array}
@@ -1495,7 +1495,7 @@ We write :math:`\{c\}^P` for :math:`\{c:C\}^P` with :math:`C` the type of :math:
& ≡∀ n:\nat,~∀ l:\List~\nat,~(P~(\cons~\nat~n~l)).
\end{array}
- Given some :math:`P` then :math:`\{(\Nil~\nat)\}^P` represents the expected type of :math:`f_1` ,
+ Given some :math:`P` then :math:`\{(\Nil~\nat)\}^P` represents the expected type of :math:`f_1`,
and :math:`\{(\cons~\nat)\}^P` represents the expected type of :math:`f_2`.
@@ -1627,15 +1627,15 @@ Before accepting a fixpoint definition as being correctly typed, we
check that the definition is “guarded”. A precise analysis of this
notion can be found in :cite:`Gim94`. The first stage is to precise on which
argument the fixpoint will be decreasing. The type of this argument
-should be an inductive definition. For doing this, the syntax of
+should be an inductive type. For doing this, the syntax of
fixpoints is extended and becomes
.. math::
- \Fix~f_i\{f_1/k_1 :A_1':=t_1' … f_n/k_n :A_n':=t_n'\}
+ \Fix~f_i\{f_1/k_1 :A_1:=t_1 … f_n/k_n :A_n:=t_n\}
where :math:`k_i` are positive integers. Each :math:`k_i` represents the index of
-parameter of :math:`f_i` , on which :math:`f_i` is decreasing. Each :math:`A_i` should be a
+parameter of :math:`f_i`, on which :math:`f_i` is decreasing. Each :math:`A_i` should be a
type (reducible to a term) starting with at least :math:`k_i` products
:math:`∀ y_1 :B_1 ,~… ∀ y_{k_i} :B_{k_i} ,~A_i'` and :math:`B_{k_i}` an inductive type.
@@ -1647,7 +1647,7 @@ The definition of being structurally smaller is a bit technical. One
needs first to define the notion of *recursive arguments of a
constructor*. For an inductive definition :math:`\ind{r}{Γ_I}{Γ_C}`, if the
type of a constructor :math:`c` has the form
-:math:`∀ p_1 :P_1 ,~… ∀ p_r :P_r,~∀ x_1:T_1,~… ∀ x_r :T_r,~(I_j~p_1 … p_r~t_1 … t_s )`,
+:math:`∀ p_1 :P_1 ,~… ∀ p_r :P_r,~∀ x_1:T_1,~… ∀ x_m :T_m,~(I_j~p_1 … p_r~t_1 … t_s )`,
then the recursive
arguments will correspond to :math:`T_i` in which one of the :math:`I_l` occurs.
@@ -1660,13 +1660,13 @@ Given a variable :math:`y` of an inductively defined type in a declaration
+ :math:`(t~u)` and :math:`λ x:U .~t` when :math:`t` is structurally smaller than :math:`y`.
+ :math:`\case(c,P,f_1 … f_n)` when each :math:`f_i` is structurally smaller than :math:`y`.
If :math:`c` is :math:`y` or is structurally smaller than :math:`y`, its type is an inductive
- definition :math:`I_p` part of the inductive declaration corresponding to :math:`y`.
+ type :math:`I_p` part of the inductive definition corresponding to :math:`y`.
Each :math:`f_i` corresponds to a type of constructor
- :math:`C_q ≡ ∀ p_1 :P_1 ,~…,∀ p_r :P_r ,~∀ y_1 :B_1 ,~… ∀ y_k :B_k ,~(I~a_1 … a_k )`
- and can consequently be written :math:`λ y_1 :B_1' .~… λ y_k :B_k'.~g_i`. (:math:`B_i'` is
+ :math:`C_q ≡ ∀ p_1 :P_1 ,~…,∀ p_r :P_r ,~∀ y_1 :B_1 ,~… ∀ y_m :B_m ,~(I_p~p_1 … p_r~t_1 … t_s )`
+ and can consequently be written :math:`λ y_1 :B_1' .~… λ y_m :B_m'.~g_i`. (:math:`B_i'` is
obtained from :math:`B_i` by substituting parameters for variables) the variables
:math:`y_j` occurring in :math:`g_i` corresponding to recursive arguments :math:`B_i` (the
- ones in which one of the :math:`I_l` occurs) are structurally smaller than y.
+ ones in which one of the :math:`I_l` occurs) are structurally smaller than :math:`y`.
The following definitions are correct, we enter them using the :cmd:`Fixpoint`
@@ -1749,7 +1749,7 @@ One can modify a global declaration by generalizing it over a
previously assumed constant :math:`c`. For doing that, we need to modify the
reference to the global declaration in the subsequent global
environment and local context by explicitly applying this constant to
-the constant :math:`c'`.
+the constant :math:`c`.
Below, if :math:`Γ` is a context of the form :math:`[y_1 :A_1 ;~…;~y_n :A_n]`, we write
:math:`∀x:U,~\subst{Γ}{c}{x}` to mean
@@ -1779,7 +1779,7 @@ and :math:`\subst{E}{|Γ|}{|Γ|c}` to mean the parallel substitution
{\subst{Γ}{|Γ_I ;Γ_C|}{|Γ_I ;Γ_C | c}}}
One can similarly modify a global declaration by generalizing it over
-a previously defined constant :math:`c′`. Below, if :math:`Γ` is a context of the form
+a previously defined constant :math:`c`. Below, if :math:`Γ` is a context of the form
:math:`[y_1 :A_1 ;~…;~y_n :A_n]`, we write :math:`\subst{Γ}{c}{u}` to mean
:math:`[y_1 :\subst{A_1} {c}{u};~…;~y_n:\subst{A_n} {c}{u}]`.
diff --git a/doc/sphinx/language/coq-library.rst b/doc/sphinx/language/coq-library.rst
index b82b3b0e80..c1eab8a970 100644
--- a/doc/sphinx/language/coq-library.rst
+++ b/doc/sphinx/language/coq-library.rst
@@ -146,7 +146,7 @@ Propositional Connectives
First, we find propositional calculus connectives:
-.. coqtop:: in
+.. coqdoc::
Inductive True : Prop := I.
Inductive False : Prop := .
@@ -236,7 +236,7 @@ Finally, a few easy lemmas are provided.
single: eq_rect (term)
single: eq_rect_r (term)
-.. coqtop:: in
+.. coqdoc::
Theorem absurd : forall A C:Prop, A -> ~ A -> C.
Section equality.
@@ -264,7 +264,7 @@ arguments. The theorem are names ``f_equal2``, ``f_equal3``,
``f_equal4`` and ``f_equal5``.
For instance ``f_equal3`` is defined the following way.
-.. coqtop:: in
+.. coqtop:: in abort
Theorem f_equal3 :
forall (A1 A2 A3 B:Type) (f:A1 -> A2 -> A3 -> B)
@@ -465,7 +465,7 @@ Intuitionistic Type Theory.
single: Choice2 (term)
single: bool_choice (term)
-.. coqtop:: in
+.. coqdoc::
Lemma Choice :
forall (S S':Set) (R:S -> S' -> Prop),
@@ -506,7 +506,7 @@ realizability interpretation.
single: absurd_set (term)
single: and_rect (term)
-.. coqtop:: in
+.. coqdoc::
Definition except := False_rec.
Theorem absurd_set : forall (A:Prop) (C:Set), A -> ~ A -> C.
@@ -531,7 +531,7 @@ section :tacn:`refine`). This scope is opened by default.
The following example is not part of the standard library, but it
shows the usage of the notations:
- .. coqtop:: in
+ .. coqtop:: in reset
Fixpoint even (n:nat) : bool :=
match n with
@@ -558,7 +558,7 @@ section :tacn:`refine`). This scope is opened by default.
Now comes the content of module ``Peano``:
-.. coqtop:: in
+.. coqdoc::
Theorem eq_S : forall x y:nat, x = y -> S x = S y.
Definition pred (n:nat) : nat :=
@@ -610,7 +610,7 @@ Finally, it gives the definition of the usual orderings ``le``,
Inductive le (n:nat) : nat -> Prop :=
| le_n : le n n
- | le_S : forall m:nat, n <= m -> n <= (S m).
+ | le_S : forall m:nat, n <= m -> n <= (S m)
where "n <= m" := (le n m) : nat_scope.
Definition lt (n m:nat) := S n <= m.
Definition ge (n m:nat) := m <= n.
@@ -625,7 +625,7 @@ induction principle.
single: nat_case (term)
single: nat_double_ind (term)
-.. coqtop:: in
+.. coqdoc::
Theorem nat_case :
forall (n:nat) (P:nat -> Prop),
@@ -652,7 +652,7 @@ well-founded induction, in module ``Wf.v``.
single: Acc_rect (term)
single: well_founded (term)
-.. coqtop:: in
+.. coqdoc::
Section Well_founded.
Variable A : Type.
@@ -681,7 +681,7 @@ fixpoint equation can be proved.
single: Fix_F_inv (term)
single: Fix_F_eq (term)
-.. coqtop:: in
+.. coqdoc::
Section FixPoint.
Variable P : A -> Type.
@@ -715,7 +715,7 @@ of equality:
.. coqtop:: in
Inductive identity (A:Type) (a:A) : A -> Type :=
- identity_refl : identity a a.
+ identity_refl : identity A a a.
Some properties of ``identity`` are proved in the module ``Logic_Type``, which also
provides the definition of ``Type`` level negation:
diff --git a/doc/sphinx/language/gallina-extensions.rst b/doc/sphinx/language/gallina-extensions.rst
index 50a56f1d51..25f983ac1e 100644
--- a/doc/sphinx/language/gallina-extensions.rst
+++ b/doc/sphinx/language/gallina-extensions.rst
@@ -247,11 +247,6 @@ Primitive Projections
printing time (even though they are absent in the actual AST manipulated
by the kernel).
-.. flag:: Printing Primitive Projection Compatibility
-
- This compatibility option (on by default) governs the
- printing of pattern matching over primitive records.
-
Primitive Record Types
++++++++++++++++++++++
@@ -297,8 +292,8 @@ the folded version delta-reduces to the unfolded version. This allows to
precisely mimic the usual unfolding rules of constants. Projections
obey the usual ``simpl`` flags of the ``Arguments`` command in particular.
There is currently no way to input unfolded primitive projections at the
-user-level, and one must use the :flag:`Printing Primitive Projection Compatibility`
-to display unfolded primitive projections as matches and distinguish them from folded ones.
+user-level, and there is no way to display unfolded projections differently
+from folded ones.
Compatibility Projections and :g:`match`
@@ -1924,9 +1919,10 @@ applied to an unknown structure instance (an implicit argument) and a
value. The complete documentation of canonical structures can be found
in :ref:`canonicalstructures`; here only a simple example is given.
-.. cmd:: Canonical Structure @qualid
+.. cmd:: Canonical {? Structure } @qualid
- This command declares :token:`qualid` as a canonical structure.
+ This command declares :token:`qualid` as a canonical instance of a
+ structure (a record).
Assume that :token:`qualid` denotes an object ``(Build_struct`` |c_1| … |c_n| ``)`` in the
structure :g:`struct` of which the fields are |x_1|, …, |x_n|.
@@ -1961,12 +1957,12 @@ in :ref:`canonicalstructures`; here only a simple example is given.
Definition nat_setoid : Setoid := Build_Setoid eq_nat_equiv.
- Canonical Structure nat_setoid.
+ Canonical nat_setoid.
Thanks to :g:`nat_setoid` declared as canonical, the implicit arguments :g:`A`
and :g:`B` can be synthesized in the next statement.
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma is_law_S : is_law S.
@@ -1974,11 +1970,10 @@ in :ref:`canonicalstructures`; here only a simple example is given.
If a same field occurs in several canonical structures, then
only the structure declared first as canonical is considered.
- .. cmdv:: Canonical Structure @ident {? : @type } := @term
+ .. cmdv:: Canonical {? Structure } @ident {? : @type } := @term
This is equivalent to a regular definition of :token:`ident` followed by the
- declaration :n:`Canonical Structure @ident`.
-
+ declaration :n:`Canonical @ident`.
.. cmd:: Print Canonical Projections
@@ -2019,10 +2014,10 @@ or :g:`m` to the type :g:`nat` of natural numbers).
Implicit Types m n : nat.
Lemma cons_inj_nat : forall m n l, n :: l = m :: l -> n = m.
-
- intros m n.
+ Proof. intros m n. Abort.
Lemma cons_inj_bool : forall (m n:bool) l, n :: l = m :: l -> n = m.
+ Abort.
.. cmdv:: Implicit Type @ident : @type
diff --git a/doc/sphinx/language/gallina-specification-language.rst b/doc/sphinx/language/gallina-specification-language.rst
index 5ecf007eff..9ab3f905e6 100644
--- a/doc/sphinx/language/gallina-specification-language.rst
+++ b/doc/sphinx/language/gallina-specification-language.rst
@@ -434,6 +434,10 @@ the identifier :g:`b` being used to represent the dependency.
the return type. For instance, the following alternative definition is
accepted and has the same meaning as the previous one.
+ .. coqtop:: none
+
+ Reset bool_case.
+
.. coqtop:: in
Definition bool_case (b:bool) : or (eq bool b true) (eq bool b false) :=
@@ -471,7 +475,7 @@ For instance, in the following example:
Definition eq_sym (A:Type) (x y:A) (H:eq A x y) : eq A y x :=
match H in eq _ _ z return eq A z x with
- | eq_refl _ => eq_refl A x
+ | eq_refl _ _ => eq_refl A x
end.
the type of the branch is :g:`eq A x x` because the third argument of
@@ -826,6 +830,10 @@ Simple inductive types
.. example::
+ .. coqtop:: none
+
+ Reset nat.
+
.. coqtop:: in
Inductive nat : Set := O | S (_:nat).
@@ -904,6 +912,10 @@ Parametrized inductive types
Once again, it is possible to specify only the type of the arguments
of the constructors, and to omit the type of the conclusion:
+ .. coqtop:: none
+
+ Reset list.
+
.. coqtop:: in
Inductive list (A:Set) : Set := nil | cons (_:A) (_:list A).
@@ -949,7 +961,7 @@ Parametrized inductive types
inductive definitions are abstracted over their parameters
before type checking constructors, allowing to write:
- .. coqtop:: all undo
+ .. coqtop:: all
Set Uniform Inductive Parameters.
Inductive list3 (A:Set) : Set :=
@@ -960,7 +972,7 @@ Parametrized inductive types
and using :cmd:`Context` to give the uniform parameters, like so
(cf. :ref:`section-mechanism`):
- .. coqtop:: all undo
+ .. coqtop:: all reset
Section list3.
Context (A:Set).
@@ -1038,7 +1050,7 @@ Mutually defined inductive types
two type variables :g:`A` and :g:`B`, the declaration should be
done the following way:
- .. coqtop:: in
+ .. coqdoc::
Inductive tree (A B:Set) : Set := node : A -> forest A B -> tree A B
@@ -1130,6 +1142,10 @@ found in e.g. Agda, and preserves subject reduction.
The above example can be rewritten in the following way.
+.. coqtop:: none
+
+ Reset Stream.
+
.. coqtop:: all
Set Primitive Projections.
@@ -1147,7 +1163,7 @@ axiom.
.. coqtop:: all
- Axiom Stream_eta : forall s: Stream, s = cons (hs s) (tl s).
+ Axiom Stream_eta : forall s: Stream, s = Seq (hd s) (tl s).
More generally, as in the case of positive coinductive types, it is consistent
to further identify extensional equality of coinductive types with propositional
diff --git a/doc/sphinx/practical-tools/coq-commands.rst b/doc/sphinx/practical-tools/coq-commands.rst
index 9bc67147f7..eebf1f11e1 100644
--- a/doc/sphinx/practical-tools/coq-commands.rst
+++ b/doc/sphinx/practical-tools/coq-commands.rst
@@ -34,6 +34,11 @@ allow dynamic linking of tactics). You can switch to the OCaml toplevel
with the command ``Drop.``, and come back to the |Coq|
toplevel with the command ``Coqloop.loop();;``.
+.. flag:: Coqtop Exit On Error
+
+ This option, off by default, causes coqtop to exit with status code
+ ``1`` if a command produces an error instead of recovering from it.
+
Batch compilation (coqc)
------------------------
@@ -163,14 +168,14 @@ and ``coqtop``, unless stated otherwise:
is equivalent to runningRequire dirpath.
:-require dirpath: Load |Coq| compiled library dirpath and import it.
This is equivalent to running Require Import dirpath.
-:-batch: Exit just after argument parsing. Available for `coqtop` only.
-:-compile *file.v*: Compile file *file.v* into *file.vo*. This option
+:-batch: Exit just after argument parsing. Available for ``coqtop`` only.
+:-compile *file.v*: Deprecated; use ``coqc`` instead. Compile file *file.v* into *file.vo*. This option
implies -batch (exit just after argument parsing). It is available only
- for `coqtop`, as this behavior is the purpose of `coqc`.
-:-compile-verbose *file.v*: Same as -compile but also output the
+ for `coqtop`, as this behavior is the purpose of ``coqc``.
+:-compile-verbose *file.v*: Deprecated. Use ``coqc -verbose``. Same as -compile but also output the
content of *file.v* as it is compiled.
:-verbose: Output the content of the input file as it is compiled.
- This option is available for `coqc` only; it is the counterpart of
+ This option is available for ``coqc`` only; it is the counterpart of
-compile-verbose.
:-w (all|none|w₁,…,wₙ): Configure the display of warnings. This
option expects all, none or a comma-separated list of warning names or
@@ -211,11 +216,11 @@ and ``coqtop``, unless stated otherwise:
(to be used by coqdoc, see :ref:`coqdoc`). By default, if *file.v* is being
compiled, *file.glob* is used.
:-no-glob: Disable the dumping of references for global names.
-:-image *file*: Set the binary image to be used by `coqc` to be *file*
+:-image *file*: Set the binary image to be used by ``coqc`` to be *file*
instead of the standard one. Not of general use.
:-bindir *directory*: Set the directory containing |Coq| binaries to be
- used by `coqc`. It is equivalent to doing export COQBIN= *directory*
- before launching `coqc`.
+ used by ``coqc``. It is equivalent to doing export COQBIN= *directory*
+ before launching ``coqc``.
:-where: Print the location of |Coq|’s standard library and exit.
:-config: Print the locations of |Coq|’s binaries, dependencies, and
libraries, then exit.
diff --git a/doc/sphinx/practical-tools/coqide.rst b/doc/sphinx/practical-tools/coqide.rst
index 9455228e7d..8b7fe20191 100644
--- a/doc/sphinx/practical-tools/coqide.rst
+++ b/doc/sphinx/practical-tools/coqide.rst
@@ -230,10 +230,12 @@ mathematical symbols ∀ and ∃, you may define:
.. coqtop:: in
- Notation "∀ x : T, P" :=
- (forall x : T, P) (at level 200, x ident).
- Notation "∃ x : T, P" :=
- (exists x : T, P) (at level 200, x ident).
+ Notation "∀ x .. y , P" := (forall x, .. (forall y, P) ..)
+ (at level 200, x binder, y binder, right associativity)
+ : type_scope.
+ Notation "∃ x .. y , P" := (exists x, .. (exists y, P) ..)
+ (at level 200, x binder, y binder, right associativity)
+ : type_scope.
There exists a small set of such notations already defined, in the
file `utf8.v` of Coq library, so you may enable them just by
diff --git a/doc/sphinx/proof-engine/detailed-tactic-examples.rst b/doc/sphinx/proof-engine/detailed-tactic-examples.rst
index bd16b70d02..63d6a229ed 100644
--- a/doc/sphinx/proof-engine/detailed-tactic-examples.rst
+++ b/doc/sphinx/proof-engine/detailed-tactic-examples.rst
@@ -53,7 +53,7 @@ rule of thumb, all the variables that appear inside constructors in
the indices of the hypothesis should be generalized. This is exactly
what the ``generalize_eqs_vars`` variant does:
-.. coqtop:: all
+.. coqtop:: all abort
generalize_eqs_vars H.
induction H.
@@ -65,7 +65,7 @@ as well in this case, e.g.:
.. coqtop:: none
- Abort.
+ Require Import Coq.Program.Equality.
.. coqtop:: in
@@ -88,11 +88,7 @@ automatically do such simplifications (which may involve the axiom K).
This is what the ``simplify_dep_elim`` tactic from ``Coq.Program.Equality``
does. For example, we might simplify the previous goals considerably:
-.. coqtop:: all
-
- Require Import Coq.Program.Equality.
-
-.. coqtop:: all
+.. coqtop:: all abort
induction p ; simplify_dep_elim.
@@ -105,10 +101,6 @@ are ``dependent induction`` and ``dependent destruction`` that do induction or
simply case analysis on the generalized hypothesis. For example we can
redo what we’ve done manually with dependent destruction:
-.. coqtop:: none
-
- Abort.
-
.. coqtop:: in
Lemma ex : forall n m:nat, Le (S n) m -> P n m.
@@ -117,7 +109,7 @@ redo what we’ve done manually with dependent destruction:
intros n m H.
-.. coqtop:: all
+.. coqtop:: all abort
dependent destruction H.
@@ -126,10 +118,6 @@ destructed hypothesis actually appeared in the goal, the tactic would
still be able to invert it, contrary to dependent inversion. Consider
the following example on vectors:
-.. coqtop:: none
-
- Abort.
-
.. coqtop:: in
Set Implicit Arguments.
@@ -230,29 +218,21 @@ name. A term is either an application of:
Once we have this datatype we want to do proofs on it, like weakening:
-.. coqtop:: in
+.. coqtop:: in abort
Lemma weakening : forall G D tau, term (G ; D) tau ->
forall tau', term (G , tau' ; D) tau.
-.. coqtop:: none
-
- Abort.
-
The problem here is that we can’t just use induction on the typing
derivation because it will forget about the ``G ; D`` constraint appearing
in the instance. A solution would be to rewrite the goal as:
-.. coqtop:: in
+.. coqtop:: in abort
Lemma weakening' : forall G' tau, term G' tau ->
forall G D, (G ; D) = G' ->
forall tau', term (G, tau' ; D) tau.
-.. coqtop:: none
-
- Abort.
-
With this proper separation of the index from the instance and the
right induction loading (putting ``G`` and ``D`` after the inducted-on
hypothesis), the proof will go through, but it is a very tedious
diff --git a/doc/sphinx/proof-engine/ltac.rst b/doc/sphinx/proof-engine/ltac.rst
index 442077616f..3e87e8acd8 100644
--- a/doc/sphinx/proof-engine/ltac.rst
+++ b/doc/sphinx/proof-engine/ltac.rst
@@ -602,7 +602,7 @@ Failing
.. example::
- .. coqtop:: all
+ .. coqtop:: all fail
Goal True.
Proof. fail. Abort.
@@ -701,7 +701,7 @@ tactic
.. example::
- .. coqtop:: all
+ .. coqtop:: all abort
Ltac time_constr1 tac :=
let eval_early := match goal with _ => restart_timer "(depth 1)" end in
@@ -716,7 +716,6 @@ tactic
let y := time_constr1 ltac:(fun _ => eval compute in x) in
y) in
pose v.
- Abort.
Local definitions
~~~~~~~~~~~~~~~~~
@@ -847,7 +846,7 @@ We can carry out pattern matching on terms with:
.. example::
- .. coqtop:: all
+ .. coqtop:: all abort
Ltac f x :=
match x with
@@ -1022,7 +1021,7 @@ Counting the goals
Goal True /\ True /\ True.
split;[|split].
- .. coqtop:: all
+ .. coqtop:: all abort
all:pr_numgoals.
@@ -1154,6 +1153,15 @@ Printing |Ltac| tactics
Debugging |Ltac| tactics
------------------------
+Backtraces
+~~~~~~~~~~
+
+.. flag:: Ltac Backtrace
+
+ Setting this flag displays a backtrace on Ltac failures that can be useful
+ to find out what went wrong. It is disabled by default for performance
+ reasons.
+
Info trace
~~~~~~~~~~
@@ -1301,10 +1309,10 @@ performance issue.
.. coqtop:: all
- Set Ltac Profiling.
- tac.
- Show Ltac Profile.
- Show Ltac Profile "omega".
+ Set Ltac Profiling.
+ tac.
+ Show Ltac Profile.
+ Show Ltac Profile "omega".
.. coqtop:: in
diff --git a/doc/sphinx/proof-engine/proof-handling.rst b/doc/sphinx/proof-engine/proof-handling.rst
index 590d71b5f3..2300a317f1 100644
--- a/doc/sphinx/proof-engine/proof-handling.rst
+++ b/doc/sphinx/proof-engine/proof-handling.rst
@@ -346,11 +346,46 @@ Navigation in the proof tree
Goals are just existential variables and existential variables do not
get a name by default. You can give a name to a goal by using :n:`refine ?[@ident]`.
+ You may also wrap this in an Ltac-definition like:
+
+ .. coqtop:: in
+
+ Ltac name_goal name := refine ?[name].
.. seealso:: :ref:`existential-variables`
.. example::
+ This first example uses the Ltac definition above, and the named goals
+ only serve for documentation.
+
+ .. coqtop:: all
+
+ Goal forall n, n + 0 = n.
+ Proof.
+ induction n; [ name_goal base | name_goal step ].
+ [base]: {
+
+ .. coqtop:: all
+
+ reflexivity.
+
+ .. coqtop:: in
+
+ }
+
+ .. coqtop:: all
+
+ [step]: {
+
+ .. coqtop:: all
+
+ simpl.
+ f_equal.
+ assumption.
+ }
+ Qed.
+
This can also be a way of focusing on a shelved goal, for instance:
.. coqtop:: all
@@ -494,16 +529,12 @@ Requesting information
.. example::
- .. coqtop:: all
+ .. coqtop:: all abort
Goal exists n, n = 0.
eexists ?[n].
Show n.
- .. coqtop:: none
-
- Abort.
-
.. cmdv:: Show Script
:name: Show Script
@@ -704,14 +735,10 @@ Notes:
split.
- .. coqtop:: all
+ .. coqtop:: all abort
2: split.
- .. coqtop:: none
-
- Abort.
-
..
.. coqtop:: none
@@ -724,14 +751,10 @@ Notes:
intros n.
- .. coqtop:: all
+ .. coqtop:: all abort
intros m.
- .. coqtop:: none
-
- Abort.
-
This screen shot shows the result of applying a :tacn:`split` tactic that replaces one goal
with 2 goals. Notice that the goal ``P 1`` is not highlighted at all after
the split because it has not changed.
diff --git a/doc/sphinx/proof-engine/ssreflect-proof-language.rst b/doc/sphinx/proof-engine/ssreflect-proof-language.rst
index 483dbd311d..237b534d67 100644
--- a/doc/sphinx/proof-engine/ssreflect-proof-language.rst
+++ b/doc/sphinx/proof-engine/ssreflect-proof-language.rst
@@ -215,7 +215,7 @@ construct differs from the latter in that
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -233,7 +233,7 @@ construct differs from the latter in that
.. coqtop:: reset all
- Definition f u := let (m, n) := u in m + n.
+ Fail Definition f u := let (m, n) := u in m + n.
The ``let:`` construct is just (more legible) notation for the primitive
@@ -275,7 +275,7 @@ example, the null and all list function(al)s can be defined as follows:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -376,7 +376,7 @@ expressions such as
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -401,7 +401,7 @@ each point of use, e.g., the above definition can be written:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -413,7 +413,7 @@ each point of use, e.g., the above definition can be written:
Variable all : (T -> bool) -> list T -> bool.
- .. coqtop:: all undo
+ .. coqtop:: all
Prenex Implicits null.
Definition all_null (s : list T) := all null s.
@@ -436,7 +436,7 @@ The syntax of the new declaration is
a ``Set Printing All`` command). All |SSR| library files thus start
with the incantation
- .. coqtop:: all undo
+ .. coqdoc::
Set Implicit Arguments.
Unset Strict Implicit.
@@ -464,7 +464,7 @@ defined by the following declaration:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -505,7 +505,7 @@ Definitions
|SSR| pose tactic supports *open syntax*: the body of the
definition does not need surrounding parentheses. For instance:
-.. coqtop:: in
+.. coqdoc::
pose t := x + y.
@@ -518,7 +518,7 @@ For example, the tactic :tacn:`pose <pose (ssreflect)>` supoprts parameters:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -534,7 +534,7 @@ The |SSR| pose tactic also supports (co)fixpoints, by providing
the local counterpart of the ``Fixpoint f := …`` and ``CoFixpoint f := …``
constructs. For instance, the following tactic:
-.. coqtop:: in
+.. coqdoc::
pose fix f (x y : nat) {struct x} : nat :=
if x is S p then S (f p y) else 0.
@@ -544,7 +544,7 @@ on natural numbers.
Similarly, local cofixpoints can be defined by a tactic of the form:
-.. coqtop:: in
+.. coqdoc::
pose cofix f (arg : T) := … .
@@ -553,26 +553,26 @@ offers a smooth way of defining local abstractions. The type of
“holes” is guessed by type inference, and the holes are abstracted.
For instance the tactic:
-.. coqtop:: in
+.. coqdoc::
pose f := _ + 1.
is shorthand for:
-.. coqtop:: in
+.. coqdoc::
pose f n := n + 1.
When the local definition of a function involves both arguments and
holes, hole abstractions appear first. For instance, the tactic:
-.. coqtop:: in
+.. coqdoc::
pose f x := x + _.
is shorthand for:
-.. coqtop:: in
+.. coqdoc::
pose f n x := x + n.
@@ -580,13 +580,13 @@ The interaction of the pose tactic with the interpretation of implicit
arguments results in a powerful and concise syntax for local
definitions involving dependent types. For instance, the tactic:
-.. coqtop:: in
+.. coqdoc::
pose f x y := (x, y).
adds to the context the local definition:
-.. coqtop:: in
+.. coqdoc::
pose f (Tx Ty : Type) (x : Tx) (y : Ty) := (x, y).
@@ -639,7 +639,7 @@ The tactic:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -652,11 +652,7 @@ The tactic:
Lemma test x : f x + f x = f x.
set t := f _.
- .. coqtop:: none
-
- Undo.
-
- .. coqtop:: all
+ .. coqtop:: all restart
set t := {2}(f _).
@@ -694,7 +690,7 @@ conditions:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -715,7 +711,7 @@ conditions:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -736,7 +732,7 @@ Moreover:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -756,7 +752,7 @@ Moreover:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -766,7 +762,7 @@ Moreover:
.. coqtop:: all
Lemma test : forall x : nat, x + 1 = 0.
- set t := _ + 1.
+ Fail set t := _ + 1.
+ Typeclass inference should fill in any residual hole, but matching
should never assign a value to a global existential variable.
@@ -789,7 +785,7 @@ An *occurrence switch* can be:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -810,7 +806,7 @@ An *occurrence switch* can be:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -831,7 +827,7 @@ An *occurrence switch* can be:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -862,7 +858,7 @@ selection.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -879,7 +875,7 @@ only one occurrence of the selected term.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -889,7 +885,7 @@ only one occurrence of the selected term.
.. coqtop:: all
Lemma test x y z : (x + y) + (z + z) = z + z.
- set a := {2}(_ + _).
+ Fail set a := {2}(_ + _).
.. _basic_localization_ssr:
@@ -910,7 +906,7 @@ context of a goal thanks to the ``in`` tactical.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
@@ -926,7 +922,7 @@ context of a goal thanks to the ``in`` tactical.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
@@ -1042,7 +1038,7 @@ constants to the goal.
For example, the proof of [#3]_
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1079,7 +1075,7 @@ constants to the goal.
Because they are tacticals, ``:`` and ``=>`` can be combined, as in
-.. coqtop:: in
+.. coqdoc::
move: m le_n_m => p le_n_p.
@@ -1104,7 +1100,7 @@ The ``:`` tactical is used to operate on an element in the context.
to encapsulate the inductive step in a single
command:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1139,7 +1135,7 @@ Basic tactics like apply and elim can also be used without the ’:’
tactical: for example we can directly start a proof of ``subnK`` by
induction on the top variable ``m`` with
-.. coqtop:: in
+.. coqdoc::
elim=> [|m IHm] n le_n.
@@ -1150,7 +1146,7 @@ explained in terms of the goal stack::
is basically equivalent to
-.. coqtop:: in
+.. coqdoc::
move: a H1 H2; tactic => a H1 H2.
@@ -1163,13 +1159,13 @@ temporary abbreviation to hide the statement of the goal from
The general form of the in tactical can be used directly with the
``move``, ``case`` and ``elim`` tactics, so that one can write
-.. coqtop:: in
+.. coqdoc::
elim: n => [|n IHn] in m le_n_m *.
instead of
-.. coqtop:: in
+.. coqdoc::
elim: n m le_n_m => [|n IHn] m le_n_m.
@@ -1257,7 +1253,7 @@ The elim tactic
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1297,7 +1293,7 @@ existential metavariables of sort :g:`Prop`.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1398,7 +1394,7 @@ Switches affect the discharging of a :token:`d_item` as follows:
For example, the tactic:
-.. coqtop:: in
+.. coqdoc::
move: n {2}n (refl_equal n).
@@ -1409,7 +1405,7 @@ For example, the tactic:
Therefore this tactic changes any goal ``G`` into
-.. coqtop::
+.. coqdoc::
forall n n0 : nat, n = n0 -> G.
@@ -1477,7 +1473,7 @@ context to interpret wildcards; in particular it can accommodate the
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1752,7 +1748,7 @@ Clears are deferred until the end of the intro pattern.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -1813,7 +1809,7 @@ Block introduction
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1843,7 +1839,7 @@ Generation of equations
The generation of named equations option stores the definition of a
new constant as an equation. The tactic:
-.. coqtop:: in
+.. coqdoc::
move En: (size l) => n.
@@ -1851,7 +1847,7 @@ where ``l`` is a list, replaces ``size l`` by ``n`` in the goal and
adds the fact ``En : size l = n`` to the context.
This is quite different from:
-.. coqtop:: in
+.. coqdoc::
pose n := (size l).
@@ -1866,7 +1862,7 @@ deal with the possible parameters of the constants introduced.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1885,7 +1881,7 @@ under fresh |SSR| names.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1936,7 +1932,7 @@ be substituted.
inferred looking at the type of the top assumption. This allows for the
compact syntax:
- .. coqtop:: in
+ .. coqdoc::
case: {2}_ / eqP.
@@ -1952,7 +1948,7 @@ be substituted.
Here is a small example on lists. We define first a function which
adds an element at the end of a given list.
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -1989,19 +1985,17 @@ be substituted.
Lemma test l : (length l) * 2 = length (l ++ l).
case: (lastP l).
- Applied to the same goal, the command:
- ``case: l / (lastP l).``
- generates the same subgoals but ``l`` has been cleared from both contexts.
+ Applied to the same goal, the tactc ``case: l / (lastP l)``
+ generates the same subgoals but ``l`` has been cleared from both contexts:
- Again applied to the same goal, the command.
+ .. coqtop:: all restart
- .. coqtop:: none
+ case: l / (lastP l).
- Abort.
+ Again applied to the same goal:
- .. coqtop:: all
+ .. coqtop:: all restart abort
- Lemma test l : (length l) * 2 = length (l ++ l).
case: {1 3}l / (lastP l).
Note that selected occurrences on the left of the ``/``
@@ -2015,10 +2009,6 @@ be substituted.
.. example::
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Lemma test l : (length l) * 2 = length (l ++ l).
@@ -2112,7 +2102,7 @@ In the script provided as example in section :ref:`indentation_ssr`, the
paragraph corresponding to each sub-case ends with a tactic line prefixed
with a ``by``, like in:
-.. coqtop:: in
+.. coqdoc::
by apply/eqP; rewrite -dvdn1.
@@ -2147,13 +2137,13 @@ A natural and common way of closing a goal is to apply a lemma which
is the exact one needed for the goal to be solved. The defective form
of the tactic:
-.. coqtop:: in
+.. coqdoc::
exact.
is equivalent to:
-.. coqtop:: in
+.. coqdoc::
do [done | by move=> top; apply top].
@@ -2161,13 +2151,13 @@ where ``top`` is a fresh name assigned to the top assumption of the goal.
This applied form is supported by the ``:`` discharge tactical, and the
tactic:
-.. coqtop:: in
+.. coqdoc::
exact: MyLemma.
is equivalent to:
-.. coqtop:: in
+.. coqdoc::
by apply: MyLemma.
@@ -2179,19 +2169,19 @@ is equivalent to:
follows the ``by`` keyword is considered to be a parenthesized block applied to
the current goal. Hence for example if the tactic:
- .. coqtop:: in
+ .. coqdoc::
by rewrite my_lemma1.
succeeds, then the tactic:
- .. coqtop:: in
+ .. coqdoc::
by rewrite my_lemma1; apply my_lemma2.
usually fails since it is equivalent to:
- .. coqtop:: in
+ .. coqdoc::
by (rewrite my_lemma1; apply my_lemma2).
@@ -2247,7 +2237,7 @@ Finally, the tactics ``last`` and ``first`` combine with the branching syntax
of Ltac: if the tactic generates n subgoals on a given goal,
then the tactic
-.. coqtop:: in
+.. coqdoc::
tactic ; last k [ tactic1 |…| tacticm ] || tacticn.
@@ -2260,9 +2250,8 @@ to the others.
Here is a small example on lists. We define first a function which
adds an element at the end of a given list.
- .. coqtop:: reset
+ .. coqtop:: reset none
- Abort.
From Coq Require Import ssreflect.
Set Implicit Arguments.
Unset Strict Implicit.
@@ -2296,13 +2285,13 @@ Iteration
A tactic of the form:
-.. coqtop:: in
+.. coqdoc::
do [ tactic 1 | … | tactic n ].
is equivalent to the standard Ltac expression:
-.. coqtop:: in
+.. coqdoc::
first [ tactic 1 | … | tactic n ].
@@ -2327,14 +2316,14 @@ Their meaning is:
For instance, the tactic:
-.. coqtop:: in
+.. coqdoc::
tactic; do 1? rewrite mult_comm.
rewrites at most one time the lemma ``mult_comm`` in all the subgoals
generated by tactic , whereas the tactic:
-.. coqtop:: in
+.. coqdoc::
tactic; do 2! rewrite mult_comm.
@@ -2380,7 +2369,7 @@ between standard Ltac in and the |SSR| tactical in.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2455,7 +2444,7 @@ the holes are abstracted in term.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2469,7 +2458,7 @@ the holes are abstracted in term.
The invokation of ``have`` is equivalent to:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2487,7 +2476,7 @@ tactic:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2518,7 +2507,7 @@ tactics of the form:
which behave like:
-.. coqtop:: in
+.. coqdoc::
have: term ; first by tactic.
move=> clear_switch i_item.
@@ -2531,7 +2520,7 @@ to introduce the new assumption itself.
The ``by`` feature is especially convenient when the proof script of the
statement is very short, basically when it fits in one line like in:
-.. coqtop:: in
+.. coqdoc::
have H23 : 3 + 2 = 2 + 3 by rewrite addnC.
@@ -2540,7 +2529,7 @@ the further use of the intermediate step. For instance,
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2559,7 +2548,7 @@ the further use of the intermediate step. For instance,
Thanks to the deferred execution of clears, the following idiom is
also supported (assuming x occurs in the goal only):
-.. coqtop:: in
+.. coqdoc::
have {x} -> : x = y.
@@ -2568,7 +2557,7 @@ destruction of existential assumptions like in the tactic:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2595,7 +2584,7 @@ term for the intermediate lemma, using tactics of the form:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2616,7 +2605,7 @@ After the :token:`i_pattern`, a list of binders is allowed.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
From Coq Require Import Omega.
@@ -2635,7 +2624,7 @@ Since the :token:`i_pattern` can be omitted, to avoid ambiguity,
bound variables can be surrounded
with parentheses even if no type is specified:
-.. coqtop:: in
+.. coqtop:: all restart
have (x) : 2 * x = x + x by omega.
@@ -2649,13 +2638,8 @@ copying the goal itself.
.. example::
- .. coqtop:: none
-
- Abort All.
-
- .. coqtop:: all
+ .. coqtop:: all restart abort
- Lemma test : True.
have suff H : 2 + 2 = 3; last first.
Note that H is introduced in the second goal.
@@ -2676,10 +2660,9 @@ context entry name.
.. coqtop:: none
- Abort All.
Set Printing Depth 15.
- .. coqtop:: all
+ .. coqtop:: all abort
Inductive Ord n := Sub x of x < n.
Notation "'I_ n" := (Ord n) (at level 8, n at level 2, format "''I_' n").
@@ -2695,11 +2678,7 @@ For this purpose the ``[: name ]`` intro pattern and the tactic
.. example::
- .. coqtop:: none
-
- Abort All.
-
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma test n m (H : m + 1 < n) : True.
have [:pm] @i : 'I_n by apply: (Sub m); abstract: pm; omega.
@@ -2712,11 +2691,7 @@ with have and an explicit term, they must be used as follows:
.. example::
- .. coqtop:: none
-
- Abort All.
-
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma test n m (H : m + 1 < n) : True.
have [:pm] @i : 'I_n := Sub m pm.
@@ -2735,11 +2710,7 @@ makes use of it).
.. example::
- .. coqtop:: none
-
- Abort All.
-
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma test n m (H : m + 1 < n) : True.
have [:pm] @i k : 'I_(n+k) by apply: (Sub m); abstract: pm k; omega.
@@ -2756,21 +2727,21 @@ typeclass inference.
.. coqtop:: none
- Abort All.
-
Axiom ty : Type.
Axiom t : ty.
Goal True.
-+ .. coqtop:: in undo
+ .. coqtop:: all
have foo : ty.
Full inference for ``ty``. The first subgoal demands a
proof of such instantiated statement.
-+ .. coqdoc::
+ .. A strange bug prevents using the coqtop directive here
+
+ .. coqdoc::
have foo : ty := .
@@ -2779,13 +2750,13 @@ typeclass inference.
statement. Note that no proof term follows ``:=``, hence two subgoals are
generated.
-+ .. coqtop:: in undo
+ .. coqtop:: all restart
have foo : ty := t.
No inference for ``ty`` and ``t``.
-+ .. coqtop:: in undo
+ .. coqtop:: all restart abort
have foo := t.
@@ -2816,7 +2787,7 @@ The
+ but the optional clear item is still performed in the *second*
branch. This means that the tactic:
- .. coqtop:: in
+ .. coqdoc::
suff {H} H : forall x : nat, x >= 0.
@@ -2834,10 +2805,9 @@ The ``have`` modifier can follow the ``suff`` tactic.
.. coqtop:: none
- Abort All.
Axioms G P : Prop.
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma test : G.
suff have H : P.
@@ -2888,7 +2858,7 @@ name of the local definition with the ``@`` character.
In the second subgoal, the tactic:
-.. coqtop:: in
+.. coqdoc::
move=> clear_switch i_item.
@@ -2902,10 +2872,6 @@ are unique.
.. example::
- .. coqtop:: none
-
- Abort All.
-
.. coqtop:: all
Lemma quo_rem_unicity d q1 q2 r1 r2 :
@@ -2927,7 +2893,7 @@ pattern will be used to process its instance.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrfun ssrbool.
Set Implicit Arguments.
@@ -2976,7 +2942,7 @@ illustrated in the following example.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -2995,10 +2961,13 @@ illustrated in the following example.
the pattern ``id (addx x)``, that would produce the following first
subgoal
- .. coqtop:: none
+ .. coqtop:: reset none
+
+ From Coq Require Import ssreflect Omega.
+ Set Implicit Arguments.
+ Unset Strict Implicit.
+ Unset Printing Implicit Defensive.
- Abort All.
- From Coq Require Import Omega.
Section Test.
Variable x : nat.
Definition addx z := z + x.
@@ -3126,14 +3095,14 @@ An :token:`r_item` can be:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
- .. coqtop:: all
+ .. coqtop:: all abort
Definition double x := x + x.
Definition ddouble x := double (double x).
@@ -3145,21 +3114,16 @@ An :token:`r_item` can be:
The |SSR| terms containing holes are *not* typed as
abstractions in this context. Hence the following script fails.
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Definition f := fun x y => x + y.
Lemma test x y : x + y = f y x.
- rewrite -[f y]/(y + _).
- but the following script succeeds
+ .. coqtop:: all fail
- .. coqtop:: none
+ rewrite -[f y]/(y + _).
- Restart.
+ but the following script succeeds
.. coqtop:: all
@@ -3192,7 +3156,7 @@ tactics.
In a rewrite tactic of the form:
-.. coqtop:: in
+.. coqdoc::
rewrite occ_switch [term1]term2.
@@ -3235,7 +3199,7 @@ Performing rewrite and simplification operations in a single tactic
enhances significantly the concision of scripts. For instance the
tactic:
-.. coqtop:: in
+.. coqdoc::
rewrite /my_def {2}[f _]/= my_eq //=.
@@ -3250,7 +3214,7 @@ proof of basic results on natural numbers arithmetic.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3286,7 +3250,7 @@ side of the equality the user wants to rewrite.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3306,7 +3270,7 @@ the equality.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3316,7 +3280,7 @@ the equality.
.. coqtop:: all
Lemma test (H : forall t u, t + u * 0 = t) x y : x + y * 4 + 2 * 0 = x + 2 * 0.
- rewrite [x + _]H.
+ Fail rewrite [x + _]H.
Indeed the left hand side of ``H`` does not match
the redex identified by the pattern ``x + y * 4``.
@@ -3329,7 +3293,7 @@ Occurrence switches and redex switches
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3358,7 +3322,7 @@ repetition.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3388,7 +3352,7 @@ rewrite operations prescribed by the rules on the current goal.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3397,7 +3361,7 @@ rewrite operations prescribed by the rules on the current goal.
Section Test.
- .. coqtop:: all
+ .. coqtop:: all abort
Variables (a b c : nat).
Hypothesis eqab : a = b.
@@ -3411,10 +3375,6 @@ rewrite operations prescribed by the rules on the current goal.
``(eqab, eqac)`` is actually a |Coq| term and we can name it with a
definition:
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Definition multi1 := (eqab, eqac).
@@ -3431,7 +3391,7 @@ literal matches have priority.
.. example::
- .. coqtop:: all
+ .. coqtop:: all abort
Definition d := a.
Hypotheses eqd0 : d = 0.
@@ -3448,11 +3408,7 @@ repeated anew.
.. example::
- .. coqtop:: none
-
- Abort.
-
- .. coqtop:: all
+ .. coqtop:: all abort
Hypothesis eq_adda_b : forall x, x + a = b.
Hypothesis eq_adda_c : forall x, x + a = c.
@@ -3475,10 +3431,6 @@ tactic rewrite ``(=~ multi1)`` is equivalent to ``rewrite multi1_rev``.
.. example::
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Hypothesis eqba : b = a.
@@ -3498,7 +3450,7 @@ reasoning purposes. The library also provides one lemma per such
operation, stating that both versions return the same values when
applied to the same arguments:
-.. coqtop:: in
+.. coqdoc::
Lemma addE : add =2 addn.
Lemma doubleE : double =1 doublen.
@@ -3514,7 +3466,7 @@ hand side. In order to reason conveniently on expressions involving
the efficient operations, we gather all these rules in the definition
``trecE``:
-.. coqtop:: in
+.. coqdoc::
Definition trecE := (addE, (doubleE, oddE), (mulE, add_mulE, (expE, mul_expE))).
@@ -3534,7 +3486,7 @@ Anyway this tactic is *not* equivalent to
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3550,11 +3502,7 @@ Anyway this tactic is *not* equivalent to
while the other tactic results in
- .. coqtop:: none
-
- Undo.
-
- .. coqtop:: all
+ .. coqtop:: all restart abort
rewrite (_ : forall x, x * 0 = 0).
@@ -3572,14 +3520,14 @@ cases:
+ |SSR| never accepts to rewrite indeterminate patterns like:
- .. coqtop:: in
+ .. coqdoc::
Lemma foo (x : unit) : x = tt.
|SSR| will however accept the
ηζ expansion of this rule:
- .. coqtop:: in
+ .. coqdoc::
Lemma fubar (x : unit) : (let u := x in u) = tt.
@@ -3588,7 +3536,7 @@ cases:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3611,11 +3559,7 @@ cases:
there is no occurrence of the head symbol ``f`` of the rewrite rule in the
goal.
- .. coqtop:: none
-
- Undo.
-
- .. coqtop:: all
+ .. coqtop:: all restart fail
rewrite H.
@@ -3625,21 +3569,13 @@ cases:
occurrence), using tactic ``rewrite /f`` (for a global replacement of
f by g) or ``rewrite pattern/f``, for a finer selection.
- .. coqtop:: none
-
- Undo.
-
- .. coqtop:: all
+ .. coqtop:: all restart
rewrite /f H.
alternatively one can override the pattern inferred from ``H``
- .. coqtop:: none
-
- Undo.
-
- .. coqtop:: all
+ .. coqtop:: all restart
rewrite [f _]H.
@@ -3658,7 +3594,7 @@ corresponding new goals will be generated.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrfun ssrbool.
Set Implicit Arguments.
@@ -3666,7 +3602,7 @@ corresponding new goals will be generated.
Unset Printing Implicit Defensive.
Set Warnings "-notation-overridden".
- .. coqtop:: all
+ .. coqtop:: all abort
Axiom leq : nat -> nat -> bool.
Notation "m <= n" := (leq m n) : nat_scope.
@@ -3689,10 +3625,6 @@ corresponding new goals will be generated.
As in :ref:`apply_ssr`, the ``ssrautoprop`` tactic is used to try to
solve the existential variable.
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Lemma test (x : 'I_2) y (H : y < 2) : Some x = insub 2 y.
@@ -3729,7 +3661,7 @@ copy of any term t. However this copy is (on purpose) *not
convertible* to t in the |Coq| system [#8]_. The job is done by the
following construction:
-.. coqtop:: in
+.. coqdoc::
Lemma master_key : unit. Proof. exact tt. Qed.
Definition locked A := let: tt := master_key in fun x : A => x.
@@ -3741,7 +3673,7 @@ selective rewriting, blocking on the fly the reduction in the term ``t``.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrfun ssrbool.
From Coq Require Import List.
@@ -3765,7 +3697,7 @@ definition.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3793,14 +3725,14 @@ some functions by the partial evaluation switch ``/=``, unless this
allowed the evaluation of a condition. This is possible thanks to another
mechanism of term tagging, resting on the following *Notation*:
-.. coqtop:: in
+.. coqdoc::
Notation "'nosimpl' t" := (let: tt := tt in t).
The term ``(nosimpl t)`` simplifies to ``t`` *except* in a definition.
More precisely, given:
-.. coqtop:: in
+.. coqdoc::
Definition foo := (nosimpl bar).
@@ -3816,7 +3748,7 @@ Note that ``nosimpl bar`` is simply notation for a term that reduces to
The ``nosimpl`` trick only works if no reduction is apparent in
``t``; in particular, the declaration:
- .. coqtop:: in
+ .. coqdoc::
Definition foo x := nosimpl (bar x).
@@ -3824,14 +3756,14 @@ Note that ``nosimpl bar`` is simply notation for a term that reduces to
function, and to use the following definition, which blocks the
reduction as expected:
- .. coqtop:: in
+ .. coqdoc::
Definition foo x := nosimpl bar x.
A standard example making this technique shine is the case of
arithmetic operations. We define for instance:
-.. coqtop:: in
+.. coqdoc::
Definition addn := nosimpl plus.
@@ -3851,7 +3783,7 @@ Congruence
Because of the way matching interferes with parameters of type families,
the tactic:
-.. coqtop:: in
+.. coqdoc::
apply: my_congr_property.
@@ -3875,7 +3807,7 @@ which the function is supplied:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3902,7 +3834,7 @@ which the function is supplied:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3925,7 +3857,7 @@ which the function is supplied:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -3946,7 +3878,7 @@ which the function is supplied:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4047,7 +3979,7 @@ For a quick glance at what can be expressed with the last
:token:`r_pattern`
consider the goal ``a = b`` and the tactic
-.. coqtop:: in
+.. coqdoc::
rewrite [in X in _ = X]rule.
@@ -4126,7 +4058,7 @@ parentheses are required around more complex patterns.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4148,14 +4080,14 @@ patterns over simple terms, but to interpret a pattern with double
parentheses as a simple term. For example, the following tactic would
capture any occurrence of the term ``a in A``.
-.. coqtop:: in
+.. coqdoc::
set t := ((a in A)).
Contextual patterns can also be used as arguments of the ``:`` tactical.
For example:
-.. coqtop:: in
+.. coqdoc::
elim: n (n in _ = n) (refl_equal n).
@@ -4165,7 +4097,7 @@ Contextual patterns in rewrite
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4246,7 +4178,7 @@ context shortcuts.
The following example is taken from ``ssreflect.v`` where the
``LHS`` and ``RHS`` shortcuts are defined.
-.. coqtop:: in
+.. coqdoc::
Notation RHS := (X in _ = X)%pattern.
Notation LHS := (X in X = _)%pattern.
@@ -4254,7 +4186,7 @@ The following example is taken from ``ssreflect.v`` where the
Shortcuts defined this way can be freely used in place of the trailing
``ident in term`` part of any contextual pattern. Some examples follow:
-.. coqtop:: in
+.. coqdoc::
set rhs := RHS.
rewrite [in RHS]rule.
@@ -4287,13 +4219,13 @@ The view syntax combined with the ``elim`` tactic specifies an elimination
scheme to be used instead of the default, generated, one. Hence the
|SSR| tactic:
-.. coqtop:: in
+.. coqdoc::
elim/V.
is a synonym for:
-.. coqtop:: in
+.. coqdoc::
intro top; elim top using V; clear top.
@@ -4303,13 +4235,13 @@ Since an elimination view supports the two bookkeeping tacticals of
discharge and introduction (see section :ref:`basic_tactics_ssr`),
the |SSR| tactic:
-.. coqtop:: in
+.. coqdoc::
elim/V: x => y.
is a synonym for:
-.. coqtop:: in
+.. coqdoc::
elim x using V; clear x; intro y.
@@ -4329,7 +4261,7 @@ generation (see section :ref:`generation_of_equations_ssr`).
The following script illustrates a toy example of this feature. Let us
define a function adding an element at the end of a list:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect List.
Set Implicit Arguments.
@@ -4367,13 +4299,13 @@ command) can be combined with the type family switches described
in section :ref:`type_families_ssr`.
Consider an eliminator ``foo_ind`` of type:
-.. coqtop:: in
+.. coqdoc::
foo_ind : forall …, forall x : T, P p1 … pm.
and consider the tactic:
-.. coqtop:: in
+.. coqdoc::
elim/foo_ind: e1 … / en.
@@ -4404,7 +4336,7 @@ Here is an example of a regular, but nontrivial, eliminator.
Here is a toy example illustrating this feature.
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect FunInd.
Set Implicit Arguments.
@@ -4424,14 +4356,14 @@ Here is an example of a regular, but nontrivial, eliminator.
The following tactics are all valid and perform the same elimination
on this goal.
- .. coqtop:: in
+ .. coqdoc::
elim/plus_ind: z / (plus _ z).
elim/plus_ind: {z}(plus _ z).
elim/plus_ind: {z}_.
elim/plus_ind: z / _.
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect FunInd.
Set Implicit Arguments.
@@ -4456,7 +4388,7 @@ Here is an example of a regular, but nontrivial, eliminator.
``plus (plus x y) z`` thus instantiating the last ``_`` with ``z``.
Note that the tactic:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect FunInd.
Set Implicit Arguments.
@@ -4473,7 +4405,7 @@ Here is an example of a regular, but nontrivial, eliminator.
.. coqtop:: all
- elim/plus_ind: y / _.
+ Fail elim/plus_ind: y / _.
triggers an error: in the conclusion
of the ``plus_ind`` eliminator, the first argument of the predicate
@@ -4486,7 +4418,7 @@ Here is an example of a truncated eliminator:
Consider the goal:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect FunInd.
Set Implicit Arguments.
@@ -4494,7 +4426,7 @@ Here is an example of a truncated eliminator:
Unset Printing Implicit Defensive.
Section Test.
- .. coqtop:: in
+ .. coqdoc::
Lemma test p n (n_gt0 : 0 < n) (pr_p : prime p) :
p %| \prod_(i <- prime_decomp n | i \in prime_decomp n) i.1 ^ i.2 ->
@@ -4505,7 +4437,7 @@ Here is an example of a truncated eliminator:
where the type of the ``big_prop`` eliminator is
- .. coqtop:: in
+ .. coqdoc::
big_prop: forall (R : Type) (Pb : R -> Type)
(idx : R) (op1 : R -> R -> R), Pb idx ->
@@ -4518,7 +4450,7 @@ Here is an example of a truncated eliminator:
inferred one is used instead: ``big[_/_]_(i <- _ | _ i) _ i``,
and after the introductions, the following goals are generated:
- .. coqtop:: in
+ .. coqdoc::
subgoal 1 is:
p %| 1 -> exists2 x : nat * nat, x \in prime_decomp n & p = x.1
@@ -4550,7 +4482,7 @@ disjunction.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4571,7 +4503,7 @@ disjunction.
This operation is so common that the tactic shell has specific
syntax for it. The following scripts:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4584,13 +4516,13 @@ disjunction.
Lemma test a : P (a || a) -> True.
- .. coqtop:: all undo
+ .. coqtop:: all
move=> HPa; move/P2Q: HPa => HQa.
or more directly:
- .. coqtop:: all undo
+ .. coqtop:: all restart
move/P2Q=> HQa.
@@ -4606,7 +4538,7 @@ equation name generation mechanism (see section :ref:`generation_of_equations_ss
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4624,7 +4556,7 @@ equation name generation mechanism (see section :ref:`generation_of_equations_ss
This view tactic performs:
- .. coqtop:: in
+ .. coqdoc::
move=> HQ; case: {HQ}(Q2P HQ) => [HPa | HPb].
@@ -4639,7 +4571,7 @@ relevant for the current goal.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4661,14 +4593,14 @@ relevant for the current goal.
the double implication into the expected simple implication. The last
script is in fact equivalent to:
- .. coqtop:: in
+ .. coqdoc::
Lemma test a b : P (a || b) -> True.
move/(iffLR (PQequiv _ _)).
where:
- .. coqtop:: in
+ .. coqdoc::
Lemma iffLR P Q : (P <-> Q) -> P -> Q.
@@ -4683,7 +4615,7 @@ assumption to some given arguments.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4712,7 +4644,7 @@ bookkeeping steps.
The following example use the ``~~`` prenex notation for boolean negation:
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -4768,7 +4700,7 @@ analysis:
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect.
Set Implicit Arguments.
@@ -4785,7 +4717,7 @@ analysis
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -4810,7 +4742,7 @@ decidable predicate to its boolean version.
First, booleans are injected into propositions using the coercion
mechanism:
-.. coqtop:: in
+.. coqdoc::
Coercion is_true (b : bool) := b = true.
@@ -4827,7 +4759,7 @@ To get all the benefits of the boolean reflection, it is in fact
convenient to introduce the following inductive predicate ``reflect`` to
relate propositions and booleans:
-.. coqtop:: in
+.. coqdoc::
Inductive reflect (P: Prop): bool -> Type :=
| Reflect_true : P -> reflect P true
@@ -4838,9 +4770,9 @@ logically equivalent propositions.
For instance, the following lemma:
-.. coqtop:: in
+.. coqdoc::
- Lemma andP: forall b1 b2, reflect (b1 /\ b2) (b1 && b2).
+ Lemma andP: forall b1 b2, reflect (b1 /\ b2) (b1 && b2).
relates the boolean conjunction to the logical one ``/\``. Note that in
``andP``, ``b1`` and ``b2`` are two boolean variables and the
@@ -4853,20 +4785,20 @@ to the case analysis of |Coq|’s inductive types.
Since the equivalence predicate is defined in |Coq| as:
-.. coqtop:: in
+.. coqdoc::
Definition iff (A B:Prop) := (A -> B) /\ (B -> A).
where ``/\`` is a notation for ``and``:
-.. coqtop:: in
+.. coqdoc::
Inductive and (A B:Prop) : Prop := conj : A -> B -> and A B.
This make case analysis very different according to the way an
equivalence property has been defined.
-.. coqtop:: in
+.. coqdoc::
Lemma andE (b1 b2 : bool) : (b1 /\ b2) <-> (b1 && b2).
@@ -4875,7 +4807,7 @@ Let us compare the respective behaviors of ``andE`` and ``andP``.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -4888,11 +4820,15 @@ Let us compare the respective behaviors of ``andE`` and ``andP``.
Lemma test (b1 b2 : bool) : if (b1 && b2) then b1 else ~~(b1||b2).
- .. coqtop:: all undo
+ .. coqtop:: all
case: (@andE b1 b2).
- .. coqtop:: all undo
+ .. coqtop:: none
+
+ Restart.
+
+ .. coqtop:: all
case: (@andP b1 b2).
@@ -4912,7 +4848,7 @@ The view mechanism is compatible with reflect predicates.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -4920,17 +4856,13 @@ The view mechanism is compatible with reflect predicates.
Unset Printing Implicit Defensive.
Section Test.
- .. coqtop:: all
+ .. coqtop:: all abort
Lemma test (a b : bool) (Ha : a) (Hb : b) : a /\ b.
apply/andP.
Conversely
- .. coqtop:: none
-
- Abort.
-
.. coqtop:: all
Lemma test (a b : bool) : a /\ b -> a.
@@ -4950,13 +4882,13 @@ Specializing assumptions
The |SSR| tactic:
-.. coqtop:: in
+.. coqdoc::
move/(_ term1 … termn).
is equivalent to the tactic:
-.. coqtop:: in
+.. coqdoc::
intro top; generalize (top term1 … termn); clear top.
@@ -5013,13 +4945,13 @@ If ``term`` is a double implication, then the view hint will be one of
the defined view hints for implication. These hints are by default the
ones present in the file ``ssreflect.v``:
-.. coqtop:: in
+.. coqdoc::
Lemma iffLR : forall P Q, (P <-> Q) -> P -> Q.
which transforms a double implication into the left-to-right one, or:
-.. coqtop:: in
+.. coqdoc::
Lemma iffRL : forall P Q, (P <-> Q) -> Q -> P.
@@ -5034,7 +4966,7 @@ but they also allow complex transformation, involving negations.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -5067,7 +4999,7 @@ actually uses its propositional interpretation.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -5123,13 +5055,13 @@ equality, while the second term is the one applied to the right hand side.
In this context, the identity view can be used when no view has to be applied:
-.. coqtop:: in
+.. coqdoc::
Lemma idP : reflect b1 b1.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -5145,7 +5077,7 @@ In this context, the identity view can be used when no view has to be applied:
The same goal can be decomposed in several ways, and the user may
choose the most convenient interpretation.
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -5198,7 +5130,7 @@ in sequence. Both move and apply can be followed by an arbitrary
number of ``/term``. The main difference between the following two
tactics
-.. coqtop:: in
+.. coqdoc::
apply/v1/v2/v3.
apply/v1; apply/v2; apply/v3.
@@ -5210,7 +5142,7 @@ line would apply the view ``v2`` to all the goals generated by ``apply/v1``.
Note that the NO-OP intro pattern ``-`` can be used to separate two views,
making the two following examples equivalent:
-.. coqtop:: in
+.. coqdoc::
move=> /v1; move=> /v2.
move=> /v1 - /v2.
@@ -5221,7 +5153,7 @@ pass a given hypothesis to a lemma.
.. example::
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
@@ -5280,7 +5212,7 @@ equivalences are indeed taken into account, otherwise only single
looks for any notation that contains fragment as a substring. If the
``ssrbool.v`` library is imported, the command: ``Search "~~".`` answers :
- .. coqtop:: reset
+ .. coqtop:: reset none
From Coq Require Import ssreflect ssrbool.
Set Implicit Arguments.
diff --git a/doc/sphinx/proof-engine/tactics.rst b/doc/sphinx/proof-engine/tactics.rst
index 7eef504ea9..b5e9a902c6 100644
--- a/doc/sphinx/proof-engine/tactics.rst
+++ b/doc/sphinx/proof-engine/tactics.rst
@@ -749,39 +749,39 @@ Applying theorems
The direct application of ``Rtrans`` with ``apply`` fails because no value
for ``y`` in ``Rtrans`` is found by ``apply``:
- .. coqtop:: all
+ .. coqtop:: all fail
- Fail apply Rtrans.
+ apply Rtrans.
A solution is to ``apply (Rtrans n m p)`` or ``(Rtrans n m)``.
- .. coqtop:: all undo
+ .. coqtop:: all
apply (Rtrans n m p).
Note that ``n`` can be inferred from the goal, so the following would work
too.
- .. coqtop:: in undo
+ .. coqtop:: in restart
apply (Rtrans _ m).
More elegantly, ``apply Rtrans with (y:=m)`` allows only mentioning the
unknown m:
- .. coqtop:: in undo
+ .. coqtop:: in restart
apply Rtrans with (y := m).
Another solution is to mention the proof of ``(R x y)`` in ``Rtrans``
- .. coqtop:: all undo
+ .. coqtop:: all restart
apply Rtrans with (1 := Rnm).
... or the proof of ``(R y z)``.
- .. coqtop:: all undo
+ .. coqtop:: all restart
apply Rtrans with (2 := Rmp).
@@ -789,7 +789,7 @@ Applying theorems
finding ``m``. Then one can apply the hypotheses ``Rnm`` and ``Rmp``. This
instantiates the existential variable and completes the proof.
- .. coqtop:: all
+ .. coqtop:: all restart abort
eapply Rtrans.
@@ -2332,6 +2332,7 @@ and an explanation of the underlying technique.
where :n:`@ident` is the identifier for the last introduced hypothesis.
.. tacv:: inversion_clear @ident
+ :name: inversion_clear
This behaves as :n:`inversion` and then erases :n:`@ident` from the context.
@@ -2490,47 +2491,51 @@ and an explanation of the underlying technique.
*Non-dependent inversion*.
- Let us consider the relation Le over natural numbers and the following
- variables:
+ Let us consider the relation :g:`Le` over natural numbers:
- .. coqtop:: all
+ .. coqtop:: reset in
Inductive Le : nat -> nat -> Set :=
| LeO : forall n:nat, Le 0 n
| LeS : forall n m:nat, Le n m -> Le (S n) (S m).
- Variable P : nat -> nat -> Prop.
- Variable Q : forall n m:nat, Le n m -> Prop.
+
Let us consider the following goal:
.. coqtop:: none
+ Section Section.
+ Variable P : nat -> nat -> Prop.
+ Variable Q : forall n m:nat, Le n m -> Prop.
Goal forall n m, Le (S n) m -> P n m.
- intros.
- .. coqtop:: all
+ .. coqtop:: out
- Show.
+ intros.
- To prove the goal, we may need to reason by cases on H and to derive
- that m is necessarily of the form (S m 0 ) for certain m 0 and that
- (Le n m 0 ). Deriving these conditions corresponds to proving that the
- only possible constructor of (Le (S n) m) isLeS and that we can invert
- the-> in the type of LeS. This inversion is possible because Le is the
- smallest set closed by the constructors LeO and LeS.
+ To prove the goal, we may need to reason by cases on :g:`H` and to derive
+ that :g:`m` is necessarily of the form :g:`(S m0)` for certain :g:`m0` and that
+ :g:`(Le n m0)`. Deriving these conditions corresponds to proving that the only
+ possible constructor of :g:`(Le (S n) m)` is :g:`LeS` and that we can invert
+ the arrow in the type of :g:`LeS`. This inversion is possible because :g:`Le`
+ is the smallest set closed by the constructors :g:`LeO` and :g:`LeS`.
- .. coqtop:: undo all
+ .. coqtop:: all
inversion_clear H.
- Note that m has been substituted in the goal for (S m0) and that the
- hypothesis (Le n m0) has been added to the context.
+ Note that :g:`m` has been substituted in the goal for :g:`(S m0)` and that the
+ hypothesis :g:`(Le n m0)` has been added to the context.
- Sometimes it is interesting to have the equality m=(S m0) in the
- context to use it after. In that case we can use inversion that does
+ Sometimes it is interesting to have the equality :g:`m = (S m0)` in the
+ context to use it after. In that case we can use :tacn:`inversion` that does
not clear the equalities:
- .. coqtop:: undo all
+ .. coqtop:: none restart
+
+ intros.
+
+ .. coqtop:: all
inversion H.
@@ -2540,31 +2545,26 @@ and an explanation of the underlying technique.
Let us consider the following goal:
- .. coqtop:: reset none
+ .. coqtop:: none
- Inductive Le : nat -> nat -> Set :=
- | LeO : forall n:nat, Le 0 n
- | LeS : forall n m:nat, Le n m -> Le (S n) (S m).
- Variable P : nat -> nat -> Prop.
- Variable Q : forall n m:nat, Le n m -> Prop.
+ Abort.
Goal forall n m (H:Le (S n) m), Q (S n) m H.
- intros.
- .. coqtop:: all
+ .. coqtop:: out
- Show.
+ intros.
- As H occurs in the goal, we may want to reason by cases on its
- structure and so, we would like inversion tactics to substitute H by
+ As :g:`H` occurs in the goal, we may want to reason by cases on its
+ structure and so, we would like inversion tactics to substitute :g:`H` by
the corresponding @term in constructor form. Neither :tacn:`inversion` nor
- :n:`inversion_clear` do such a substitution. To have such a behavior we
+ :tacn:`inversion_clear` do such a substitution. To have such a behavior we
use the dependent inversion tactics:
.. coqtop:: all
dependent inversion_clear H.
- Note that H has been substituted by (LeS n m0 l) andm by (S m0).
+ Note that :g:`H` has been substituted by :g:`(LeS n m0 l)` and :g:`m` by :g:`(S m0)`.
.. example::
@@ -2933,6 +2933,12 @@ simply :g:`t=u` dropping the implicit type of :g:`t` and :g:`u`.
This applies the :tacn:`change` tactic not to the goal but to the hypothesis :n:`@ident`.
+ .. tacv:: now_show @term
+
+ This is a synonym of :n:`change @term`. It can be used to
+ make some proof steps explicit when refactoring a proof script
+ to make it readable.
+
.. seealso:: :ref:`Performing computations <performingcomputations>`
.. _performingcomputations:
@@ -3307,12 +3313,25 @@ the conversion in hypotheses :n:`{+ @ident}`.
:name: fold
This tactic applies to any goal. The term :n:`@term` is reduced using the
- ``red`` tactic. Every occurrence of the resulting :n:`@term` in the goal is
- then replaced by :n:`@term`.
+ :tacn:`red` tactic. Every occurrence of the resulting :n:`@term` in the goal is
+ then replaced by :n:`@term`. This tactic is particularly useful when a fixpoint
+ definition has been wrongfully unfolded, making the goal very hard to read.
+ On the other hand, when an unfolded function applied to its argument has been
+ reduced, the :tacn:`fold` tactic won't do anything.
+
+ .. example::
+
+ .. coqtop:: all abort
-.. tacv:: fold {+ @term}
+ Goal ~0=0.
+ unfold not.
+ Fail progress fold not.
+ pattern (0 = 0).
+ fold not.
- Equivalent to :n:`fold @term ; ... ; fold @term`.
+ .. tacv:: fold {+ @term}
+
+ Equivalent to :n:`fold @term ; ... ; fold @term`.
.. tacn:: pattern @term
:name: pattern
@@ -3389,129 +3408,140 @@ Automation
This tactic implements a Prolog-like resolution procedure to solve the
current goal. It first tries to solve the goal using the :tacn:`assumption`
- tactic, then it reduces the goal to an atomic one using intros and
+ tactic, then it reduces the goal to an atomic one using :tacn:`intros` and
introduces the newly generated hypotheses as hints. Then it looks at
the list of tactics associated to the head symbol of the goal and
tries to apply one of them (starting from the tactics with lower
cost). This process is recursively applied to the generated subgoals.
- By default, auto only uses the hypotheses of the current goal and the
- hints of the database named core.
+ By default, :tacn:`auto` only uses the hypotheses of the current goal and
+ the hints of the database named ``core``.
+
+ .. warning::
-.. tacv:: auto @num
+ :tacn:`auto` uses a weaker version of :tacn:`apply` that is closer to
+ :tacn:`simple apply` so it is expected that sometimes :tacn:`auto` will
+ fail even if applying manually one of the hints would succeed.
- Forces the search depth to be :token:`num`. The maximal search depth
- is 5 by default.
+ .. tacv:: auto @num
-.. tacv:: auto with {+ @ident}
+ Forces the search depth to be :token:`num`. The maximal search depth
+ is 5 by default.
- Uses the hint databases :n:`{+ @ident}` in addition to the database core.
+ .. tacv:: auto with {+ @ident}
+
+ Uses the hint databases :n:`{+ @ident}` in addition to the database ``core``.
+
+ .. note::
+
+ Use the fake database `nocore` if you want to *not* use the `core`
+ database.
+
+ .. tacv:: auto with *
+
+ Uses all existing hint databases. Using this variant is highly discouraged
+ in finished scripts since it is both slower and less robust than the variant
+ where the required databases are explicitly listed.
.. seealso::
:ref:`The Hints Databases for auto and eauto <thehintsdatabasesforautoandeauto>` for the list of
pre-defined databases and the way to create or extend a database.
-.. tacv:: auto with *
+ .. tacv:: auto using {+ @ident__i} {? with {+ @ident } }
- Uses all existing hint databases.
+ Uses lemmas :n:`@ident__i` in addition to hints. If :n:`@ident` is an
+ inductive type, it is the collection of its constructors which are added
+ as hints.
- .. seealso:: :ref:`The Hints Databases for auto and eauto <thehintsdatabasesforautoandeauto>`
+ .. note::
-.. tacv:: auto using {+ @ident__i} {? with {+ @ident } }
+ The hints passed through the `using` clause are used in the same
+ way as if they were passed through a hint database. Consequently,
+ they use a weaker version of :tacn:`apply` and :n:`auto using @ident`
+ may fail where :n:`apply @ident` succeeds.
- Uses lemmas :n:`@ident__i` in addition to hints. If :n:`@ident` is an
- inductive type, it is the collection of its constructors which are added
- as hints.
+ Given that this can be seen as counter-intuitive, it could be useful
+ to have an option to use full-blown :tacn:`apply` for lemmas passed
+ through the `using` clause. Contributions welcome!
-.. tacv:: info_auto
+ .. tacv:: info_auto
- Behaves like auto but shows the tactics it uses to solve the goal. This
- variant is very useful for getting a better understanding of automation, or
- to know what lemmas/assumptions were used.
+ Behaves like :tacn:`auto` but shows the tactics it uses to solve the goal. This
+ variant is very useful for getting a better understanding of automation, or
+ to know what lemmas/assumptions were used.
-.. tacv:: debug auto
- :name: debug auto
+ .. tacv:: debug auto
+ :name: debug auto
- Behaves like :tacn:`auto` but shows the tactics it tries to solve the goal,
- including failing paths.
+ Behaves like :tacn:`auto` but shows the tactics it tries to solve the goal,
+ including failing paths.
-.. tacv:: {? info_}auto {? @num} {? using {+ @lemma}} {? with {+ @ident}}
+ .. tacv:: {? info_}auto {? @num} {? using {+ @lemma}} {? with {+ @ident}}
- This is the most general form, combining the various options.
+ This is the most general form, combining the various options.
.. tacv:: trivial
:name: trivial
- This tactic is a restriction of auto that is not recursive
+ This tactic is a restriction of :tacn:`auto` that is not recursive
and tries only hints that cost `0`. Typically it solves trivial
equalities like :g:`X=X`.
-.. tacv:: trivial with {+ @ident}
- :undocumented:
-
-.. tacv:: trivial with *
- :undocumented:
-
-.. tacv:: trivial using {+ @lemma}
- :undocumented:
-
-.. tacv:: debug trivial
- :name: debug trivial
- :undocumented:
-
-.. tacv:: info_trivial
- :name: info_trivial
- :undocumented:
-
-.. tacv:: {? info_}trivial {? using {+ @lemma}} {? with {+ @ident}}
- :undocumented:
+ .. tacv:: trivial with {+ @ident}
+ trivial with *
+ trivial using {+ @lemma}
+ debug trivial
+ info_trivial
+ {? info_}trivial {? using {+ @lemma}} {? with {+ @ident}}
+ :name: _; _; _; debug trivial; info_trivial; _
+ :undocumented:
.. note::
- :tacn:`auto` either solves completely the goal or else leaves it
- intact. :tacn:`auto` and :tacn:`trivial` never fail.
-
-The following options enable printing of informative or debug information for
-the :tacn:`auto` and :tacn:`trivial` tactics:
+ :tacn:`auto` and :tacn:`trivial` either solve completely the goal or
+ else succeed without changing the goal. Use :g:`solve [ auto ]` and
+ :g:`solve [ trivial ]` if you would prefer these tactics to fail when
+ they do not manage to solve the goal.
.. flag:: Info Auto
Debug Auto
Info Trivial
Debug Trivial
- :undocumented:
-.. seealso:: :ref:`The Hints Databases for auto and eauto <thehintsdatabasesforautoandeauto>`
+ These options enable printing of informative or debug information for
+ the :tacn:`auto` and :tacn:`trivial` tactics.
.. tacn:: eauto
:name: eauto
This tactic generalizes :tacn:`auto`. While :tacn:`auto` does not try
resolution hints which would leave existential variables in the goal,
- :tacn:`eauto` does try them (informally speaking, it usessimple :tacn:`eapply`
- where :tacn:`auto` uses simple :tacn:`apply`). As a consequence, :tacn:`eauto`
+ :tacn:`eauto` does try them (informally speaking, it internally uses a tactic
+ close to :tacn:`simple eapply` instead of a tactic close to :tacn:`simple apply`
+ in the case of :tacn:`auto`). As a consequence, :tacn:`eauto`
can solve such a goal:
.. example::
.. coqtop:: all
- Hint Resolve ex_intro.
+ Hint Resolve ex_intro : core.
Goal forall P:nat -> Prop, P 0 -> exists n, P n.
eauto.
Note that ``ex_intro`` should be declared as a hint.
-.. tacv:: {? info_}eauto {? @num} {? using {+ @lemma}} {? with {+ @ident}}
+ .. tacv:: {? info_}eauto {? @num} {? using {+ @lemma}} {? with {+ @ident}}
- The various options for :tacn:`eauto` are the same as for :tacn:`auto`.
+ The various options for :tacn:`eauto` are the same as for :tacn:`auto`.
-:tacn:`eauto` also obeys the following options:
+ :tacn:`eauto` also obeys the following options:
-.. flag:: Info Eauto
- Debug Eauto
- :undocumented:
+ .. flag:: Info Eauto
+ Debug Eauto
+ :undocumented:
-.. seealso:: :ref:`The Hints Databases for auto and eauto <thehintsdatabasesforautoandeauto>`
+ .. seealso:: :ref:`The Hints Databases for auto and eauto <thehintsdatabasesforautoandeauto>`
.. tacn:: autounfold with {+ @ident}
diff --git a/doc/sphinx/user-extensions/syntax-extensions.rst b/doc/sphinx/user-extensions/syntax-extensions.rst
index ae66791b0c..4f46a80dcf 100644
--- a/doc/sphinx/user-extensions/syntax-extensions.rst
+++ b/doc/sphinx/user-extensions/syntax-extensions.rst
@@ -181,7 +181,7 @@ rules. Some simple left factorization work has to be done. Here is an example.
.. coqtop:: all
Notation "x < y" := (lt x y) (at level 70).
- Notation "x < y < z" := (x < y /\ y < z) (at level 70).
+ Fail Notation "x < y < z" := (x < y /\ y < z) (at level 70).
In order to factorize the left part of the rules, the subexpression
referred to by ``y`` has to be at the same level in both rules. However the
@@ -486,7 +486,7 @@ Sometimes, for the sake of factorization of rules, a binder has to be
parsed as a term. This is typically the case for a notation such as
the following:
-.. coqtop:: in
+.. coqdoc::
Notation "{ x : A | P }" := (sig (fun x : A => P))
(at level 0, x at level 99 as ident).
@@ -788,9 +788,9 @@ main grammar, or from another custom entry as is the case in
to indicate that ``e`` has to be parsed at level ``2`` of the grammar
associated to the custom entry ``expr``. The level can be omitted, as in
-.. coqtop:: in
+.. coqdoc::
- Notation "[ e ]" := e (e custom expr)`.
+ Notation "[ e ]" := e (e custom expr).
in which case Coq tries to infer it.
@@ -1058,7 +1058,7 @@ Binding arguments of a constant to an interpretation scope
in the scope delimited by the key ``F`` (``Rfun_scope``) and the last
argument in the scope delimited by the key ``R`` (``R_scope``).
- .. coqtop:: in
+ .. coqdoc::
Arguments plus_fct (f1 f2)%F x%R.
@@ -1066,7 +1066,7 @@ Binding arguments of a constant to an interpretation scope
parentheses. In the following example arguments A and B are marked as
maximally inserted implicit arguments and are put into the type_scope scope.
- .. coqtop:: in
+ .. coqdoc::
Arguments respectful {A B}%type (R R')%signature _ _.
@@ -1148,7 +1148,7 @@ Binding types of arguments to an interpretation scope
can be bound to an interpretation scope. The command to do it is
:n:`Bind Scope @scope with @class`
- .. coqtop:: in
+ .. coqtop:: in reset
Parameter U : Set.
Bind Scope U_scope with U.
@@ -1497,12 +1497,12 @@ Numeral notations
for only non-negative integers, and the given numeral is negative.
- .. exn:: @ident should go from Decimal.int to @type or (option @type). Instead of Decimal.int, the types Decimal.uint or Z could be used (you may need to require BinNums or Decimal first).
+ .. exn:: @ident should go from Decimal.int to @type or (option @type). Instead of Decimal.int, the types Decimal.uint or Z or Int63.int could be used (you may need to require BinNums or Decimal or Int63 first).
The parsing function given to the :cmd:`Numeral Notation`
vernacular is not of the right type.
- .. exn:: @ident should go from @type to Decimal.int or (option Decimal.int). Instead of Decimal.int, the types Decimal.uint or Z could be used (you may need to require BinNums or Decimal first).
+ .. exn:: @ident should go from @type to Decimal.int or (option Decimal.int). Instead of Decimal.int, the types Decimal.uint or Z or Int63.int could be used (you may need to require BinNums or Decimal or Int63 first).
The printing function given to the :cmd:`Numeral Notation`
vernacular is not of the right type.