aboutsummaryrefslogtreecommitdiff
path: root/doc/sphinx
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sphinx')
-rw-r--r--doc/sphinx/user-extensions/proof-schemes.rst403
-rw-r--r--doc/sphinx/using/libraries/funind.rst144
2 files changed, 144 insertions, 403 deletions
diff --git a/doc/sphinx/user-extensions/proof-schemes.rst b/doc/sphinx/user-extensions/proof-schemes.rst
deleted file mode 100644
index 34197c4fcf..0000000000
--- a/doc/sphinx/user-extensions/proof-schemes.rst
+++ /dev/null
@@ -1,403 +0,0 @@
-.. _proofschemes:
-
-Proof schemes
-===============
-
-.. _proofschemes-induction-principles:
-
-Generation of induction principles with ``Scheme``
---------------------------------------------------------
-
-The ``Scheme`` command is a high-level tool for generating automatically
-(possibly mutual) induction principles for given types and sorts. Its
-syntax follows the schema:
-
-.. cmd:: Scheme @ident__1 := Induction for @ident__2 Sort @sort {* with @ident__i := Induction for @ident__j Sort @sort}
-
- This command is a high-level tool for generating automatically
- (possibly mutual) induction principles for given types and sorts.
- Each :n:`@ident__j` is a different inductive type identifier belonging to
- the same package of mutual inductive definitions.
- The command generates the :n:`@ident__i`\s to be mutually recursive
- definitions. Each term :n:`@ident__i` proves a general principle of mutual
- induction for objects in type :n:`@ident__j`.
-
-.. cmdv:: Scheme @ident := Minimality for @ident Sort @sort {* with @ident := Minimality for @ident' Sort @sort}
-
- Same as before but defines a non-dependent elimination principle more
- natural in case of inductively defined relations.
-
-.. cmdv:: Scheme Equality for @ident
- :name: Scheme Equality
-
- Tries to generate a Boolean equality and a proof of the decidability of the usual equality. If `ident`
- involves some other inductive types, their equality has to be defined first.
-
-.. cmdv:: Scheme Induction for @ident Sort @sort {* with Induction for @ident Sort @sort}
-
- If you do not provide the name of the schemes, they will be automatically computed from the
- sorts involved (works also with Minimality).
-
-.. example::
-
- Induction scheme for tree and forest.
-
- A mutual induction principle for tree and forest in sort ``Set`` can be defined using the command
-
- .. coqtop:: none
-
- Axiom A : Set.
- Axiom B : Set.
-
- .. coqtop:: all
-
- Inductive tree : Set := node : A -> forest -> tree
- with forest : Set :=
- leaf : B -> forest
- | cons : tree -> forest -> forest.
-
- Scheme tree_forest_rec := Induction for tree Sort Set
- with forest_tree_rec := Induction for forest Sort Set.
-
- You may now look at the type of tree_forest_rec:
-
- .. coqtop:: all
-
- Check tree_forest_rec.
-
- This principle involves two different predicates for trees andforests;
- it also has three premises each one corresponding to a constructor of
- one of the inductive definitions.
-
- The principle `forest_tree_rec` shares exactly the same premises, only
- the conclusion now refers to the property of forests.
-
-.. example::
-
- Predicates odd and even on naturals.
-
- Let odd and even be inductively defined as:
-
- .. coqtop:: all
-
- Inductive odd : nat -> Prop := oddS : forall n:nat, even n -> odd (S n)
- with even : nat -> Prop :=
- | evenO : even 0
- | evenS : forall n:nat, odd n -> even (S n).
-
- The following command generates a powerful elimination principle:
-
- .. coqtop:: all
-
- Scheme odd_even := Minimality for odd Sort Prop
- with even_odd := Minimality for even Sort Prop.
-
- The type of odd_even for instance will be:
-
- .. coqtop:: all
-
- Check odd_even.
-
- The type of `even_odd` shares the same premises but the conclusion is
- `(n:nat)(even n)->(P0 n)`.
-
-
-Automatic declaration of schemes
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. flag:: Elimination Schemes
-
- Enables automatic declaration of induction principles when defining a new
- inductive type. Defaults to on.
-
-.. flag:: Nonrecursive Elimination Schemes
-
- Enables automatic declaration of induction principles for types declared with the :cmd:`Variant` and
- :cmd:`Record` commands. Defaults to off.
-
-.. flag:: Case Analysis Schemes
-
- This flag governs the generation of case analysis lemmas for inductive types,
- i.e. corresponding to the pattern matching term alone and without fixpoint.
-
-.. flag:: Boolean Equality Schemes
- Decidable Equality Schemes
-
- These flags control the automatic declaration of those Boolean equalities (see
- the second variant of ``Scheme``).
-
-.. warning::
-
- You have to be careful with these flags since Coq may now reject well-defined
- inductive types because it cannot compute a Boolean equality for them.
-
-.. flag:: Rewriting Schemes
-
- This flag governs generation of equality-related schemes such as congruence.
-
-Combined Scheme
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. cmd:: Combined Scheme @ident from {+, @ident__i}
-
- This command is a tool for combining induction principles generated
- by the :cmd:`Scheme` command.
- Each :n:`@ident__i` is a different inductive principle that must belong
- to the same package of mutual inductive principle definitions.
- This command generates :n:`@ident` to be the conjunction of the
- principles: it is built from the common premises of the principles
- and concluded by the conjunction of their conclusions.
- In the case where all the inductive principles used are in sort
- ``Prop``, the propositional conjunction ``and`` is used, otherwise
- the simple product ``prod`` is used instead.
-
-.. example::
-
- We can define the induction principles for trees and forests using:
-
- .. coqtop:: all
-
- Scheme tree_forest_ind := Induction for tree Sort Prop
- with forest_tree_ind := Induction for forest Sort Prop.
-
- Then we can build the combined induction principle which gives the
- conjunction of the conclusions of each individual principle:
-
- .. coqtop:: all
-
- Combined Scheme tree_forest_mutind from tree_forest_ind,forest_tree_ind.
-
- The type of tree_forest_mutind will be:
-
- .. coqtop:: all
-
- Check tree_forest_mutind.
-
-.. example::
-
- We can also combine schemes at sort ``Type``:
-
- .. coqtop:: all
-
- Scheme tree_forest_rect := Induction for tree Sort Type
- with forest_tree_rect := Induction for forest Sort Type.
-
- .. coqtop:: all
-
- Combined Scheme tree_forest_mutrect from tree_forest_rect, forest_tree_rect.
-
- .. coqtop:: all
-
- Check tree_forest_mutrect.
-
-.. _functional-scheme:
-
-Generation of induction principles with ``Functional`` ``Scheme``
------------------------------------------------------------------
-
-
-.. cmd:: Functional Scheme @ident__0 := Induction for @ident' Sort @sort {* with @ident__i := Induction for @ident__i' Sort @sort}
-
- This command is a high-level experimental tool for
- generating automatically induction principles corresponding to
- (possibly mutually recursive) functions. First, it must be made
- available via ``Require Import FunInd``.
- Each :n:`@ident__i` is a different mutually defined function
- name (the names must be in the same order as when they were defined). This
- command generates the induction principle for each :n:`@ident__i`, following
- the recursive structure and case analyses of the corresponding function
- :n:`@ident__i'`.
-
-.. warning::
-
- There is a difference between induction schemes generated by the command
- :cmd:`Functional Scheme` and these generated by the :cmd:`Function`. Indeed,
- :cmd:`Function` generally produces smaller principles that are closer to how
- a user would implement them. See :ref:`advanced-recursive-functions` for details.
-
-.. example::
-
- Induction scheme for div2.
-
- We define the function div2 as follows:
-
- .. coqtop:: all
-
- Require Import FunInd.
- Require Import Arith.
-
- Fixpoint div2 (n:nat) : nat :=
- match n with
- | O => 0
- | S O => 0
- | S (S n') => S (div2 n')
- end.
-
- The definition of a principle of induction corresponding to the
- recursive structure of `div2` is defined by the command:
-
- .. coqtop:: all
-
- Functional Scheme div2_ind := Induction for div2 Sort Prop.
-
- You may now look at the type of div2_ind:
-
- .. coqtop:: all
-
- Check div2_ind.
-
- We can now prove the following lemma using this principle:
-
- .. coqtop:: all
-
- Lemma div2_le' : forall n:nat, div2 n <= n.
- intro n.
- pattern n, (div2 n).
- apply div2_ind; intros.
- auto with arith.
- auto with arith.
- simpl; auto with arith.
- Qed.
-
- We can use directly the functional induction (:tacn:`function induction`) tactic instead
- of the pattern/apply trick:
-
- .. coqtop:: all
-
- Reset div2_le'.
-
- Lemma div2_le : forall n:nat, div2 n <= n.
- intro n.
- functional induction (div2 n).
- auto with arith.
- auto with arith.
- auto with arith.
- Qed.
-
-.. example::
-
- Induction scheme for tree_size.
-
- We define trees by the following mutual inductive type:
-
- .. original LaTeX had "Variable" instead of "Axiom", which generates an ugly warning
-
- .. coqtop:: reset all
-
- Axiom A : Set.
-
- Inductive tree : Set :=
- node : A -> forest -> tree
- with forest : Set :=
- | empty : forest
- | cons : tree -> forest -> forest.
-
- We define the function tree_size that computes the size of a tree or a
- forest. Note that we use ``Function`` which generally produces better
- principles.
-
- .. coqtop:: all
-
- Require Import FunInd.
-
- Function tree_size (t:tree) : nat :=
- match t with
- | node A f => S (forest_size f)
- end
- with forest_size (f:forest) : nat :=
- match f with
- | empty => 0
- | cons t f' => (tree_size t + forest_size f')
- end.
-
- Notice that the induction principles ``tree_size_ind`` and ``forest_size_ind``
- generated by ``Function`` are not mutual.
-
- .. coqtop:: all
-
- Check tree_size_ind.
-
- Mutual induction principles following the recursive structure of ``tree_size``
- and ``forest_size`` can be generated by the following command:
-
- .. coqtop:: all
-
- Functional Scheme tree_size_ind2 := Induction for tree_size Sort Prop
- with forest_size_ind2 := Induction for forest_size Sort Prop.
-
- You may now look at the type of `tree_size_ind2`:
-
- .. coqtop:: all
-
- Check tree_size_ind2.
-
-.. _derive-inversion:
-
-Generation of inversion principles with ``Derive`` ``Inversion``
------------------------------------------------------------------
-
-.. cmd:: Derive Inversion @ident with @ident Sort @sort
- Derive Inversion @ident with (forall {* @binder }, @ident @term) Sort @sort
-
- This command generates an inversion principle for the
- :tacn:`inversion ... using ...` tactic. The first :token:`ident` is the name
- of the generated principle. The second :token:`ident` should be an inductive
- predicate, and :token:`binders` the variables occurring in the term
- :token:`term`. This command generates the inversion lemma for the sort
- :token:`sort` corresponding to the instance :n:`forall {* @binder }, @ident @term`.
- When applied, it is equivalent to having inverted the instance with the
- tactic :g:`inversion`.
-
-.. cmdv:: Derive Inversion_clear @ident with @ident Sort @sort
- Derive Inversion_clear @ident with (forall {* @binder }, @ident @term) Sort @sort
-
- When applied, it is equivalent to having inverted the instance with the
- tactic inversion replaced by the tactic `inversion_clear`.
-
-.. cmdv:: Derive Dependent Inversion @ident with @ident Sort @sort
- Derive Dependent Inversion @ident with (forall {* @binder }, @ident @term) Sort @sort
-
- When applied, it is equivalent to having inverted the instance with
- the tactic `dependent inversion`.
-
-.. cmdv:: Derive Dependent Inversion_clear @ident with @ident Sort @sort
- Derive Dependent Inversion_clear @ident with (forall {* @binder }, @ident @term) Sort @sort
-
- When applied, it is equivalent to having inverted the instance
- with the tactic `dependent inversion_clear`.
-
-.. example::
-
- Consider the relation `Le` over natural numbers and the following
- parameter ``P``:
-
- .. coqtop:: all
-
- 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).
-
- Parameter P : nat -> nat -> Prop.
-
- To generate the inversion lemma for the instance :g:`(Le (S n) m)` and the
- sort :g:`Prop`, we do:
-
- .. coqtop:: all
-
- Derive Inversion_clear leminv with (forall n m:nat, Le (S n) m) Sort Prop.
- Check leminv.
-
- Then we can use the proven inversion lemma:
-
- .. the original LaTeX did not have any Coq code to setup the goal
-
- .. coqtop:: none
-
- Goal forall (n m : nat) (H : Le (S n) m), P n m.
- intros.
-
- .. coqtop:: all
-
- Show.
-
- inversion H using leminv.
diff --git a/doc/sphinx/using/libraries/funind.rst b/doc/sphinx/using/libraries/funind.rst
index adabc56c50..18f9ba246a 100644
--- a/doc/sphinx/using/libraries/funind.rst
+++ b/doc/sphinx/using/libraries/funind.rst
@@ -1,3 +1,6 @@
+Tactics
+-------
+
.. tacn:: function induction (@qualid {+ @term})
:name: function induction
@@ -85,3 +88,144 @@
:n:`@qualid__1` and :n:`@qualid__2` are valid candidates to
functional inversion, this variant allows choosing which :token:`qualid`
is inverted.
+
+.. _functional-scheme:
+
+Generation of induction principles with ``Functional`` ``Scheme``
+-----------------------------------------------------------------
+
+
+.. cmd:: Functional Scheme @ident__0 := Induction for @ident' Sort @sort {* with @ident__i := Induction for @ident__i' Sort @sort}
+
+ This command is a high-level experimental tool for
+ generating automatically induction principles corresponding to
+ (possibly mutually recursive) functions. First, it must be made
+ available via ``Require Import FunInd``.
+ Each :n:`@ident__i` is a different mutually defined function
+ name (the names must be in the same order as when they were defined). This
+ command generates the induction principle for each :n:`@ident__i`, following
+ the recursive structure and case analyses of the corresponding function
+ :n:`@ident__i'`.
+
+.. warning::
+
+ There is a difference between induction schemes generated by the command
+ :cmd:`Functional Scheme` and these generated by the :cmd:`Function`. Indeed,
+ :cmd:`Function` generally produces smaller principles that are closer to how
+ a user would implement them. See :ref:`advanced-recursive-functions` for details.
+
+.. example::
+
+ Induction scheme for div2.
+
+ We define the function div2 as follows:
+
+ .. coqtop:: all
+
+ Require Import FunInd.
+ Require Import Arith.
+
+ Fixpoint div2 (n:nat) : nat :=
+ match n with
+ | O => 0
+ | S O => 0
+ | S (S n') => S (div2 n')
+ end.
+
+ The definition of a principle of induction corresponding to the
+ recursive structure of `div2` is defined by the command:
+
+ .. coqtop:: all
+
+ Functional Scheme div2_ind := Induction for div2 Sort Prop.
+
+ You may now look at the type of div2_ind:
+
+ .. coqtop:: all
+
+ Check div2_ind.
+
+ We can now prove the following lemma using this principle:
+
+ .. coqtop:: all
+
+ Lemma div2_le' : forall n:nat, div2 n <= n.
+ intro n.
+ pattern n, (div2 n).
+ apply div2_ind; intros.
+ auto with arith.
+ auto with arith.
+ simpl; auto with arith.
+ Qed.
+
+ We can use directly the functional induction (:tacn:`function induction`) tactic instead
+ of the pattern/apply trick:
+
+ .. coqtop:: all
+
+ Reset div2_le'.
+
+ Lemma div2_le : forall n:nat, div2 n <= n.
+ intro n.
+ functional induction (div2 n).
+ auto with arith.
+ auto with arith.
+ auto with arith.
+ Qed.
+
+.. example::
+
+ Induction scheme for tree_size.
+
+ We define trees by the following mutual inductive type:
+
+ .. original LaTeX had "Variable" instead of "Axiom", which generates an ugly warning
+
+ .. coqtop:: reset all
+
+ Axiom A : Set.
+
+ Inductive tree : Set :=
+ node : A -> forest -> tree
+ with forest : Set :=
+ | empty : forest
+ | cons : tree -> forest -> forest.
+
+ We define the function tree_size that computes the size of a tree or a
+ forest. Note that we use ``Function`` which generally produces better
+ principles.
+
+ .. coqtop:: all
+
+ Require Import FunInd.
+
+ Function tree_size (t:tree) : nat :=
+ match t with
+ | node A f => S (forest_size f)
+ end
+ with forest_size (f:forest) : nat :=
+ match f with
+ | empty => 0
+ | cons t f' => (tree_size t + forest_size f')
+ end.
+
+ Notice that the induction principles ``tree_size_ind`` and ``forest_size_ind``
+ generated by ``Function`` are not mutual.
+
+ .. coqtop:: all
+
+ Check tree_size_ind.
+
+ Mutual induction principles following the recursive structure of ``tree_size``
+ and ``forest_size`` can be generated by the following command:
+
+ .. coqtop:: all
+
+ Functional Scheme tree_size_ind2 := Induction for tree_size Sort Prop
+ with forest_size_ind2 := Induction for forest_size Sort Prop.
+
+ You may now look at the type of `tree_size_ind2`:
+
+ .. coqtop:: all
+
+ Check tree_size_ind2.