diff options
| author | msozeau | 2007-08-26 17:00:55 +0000 |
|---|---|---|
| committer | msozeau | 2007-08-26 17:00:55 +0000 |
| commit | 9d8825bd03f647dc304d6fd36effd80ae3214631 (patch) | |
| tree | c1e47349e69eb8af272bff9ac3421dcec934ddc3 /doc/refman/Program.tex | |
| parent | b1524e6ae5f93f04020801a5367bc5b8f0f3e7cc (diff) | |
Add info on measure based defs.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10095 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'doc/refman/Program.tex')
| -rw-r--r-- | doc/refman/Program.tex | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/doc/refman/Program.tex b/doc/refman/Program.tex index 9bd4f8b843..4357f57e8a 100644 --- a/doc/refman/Program.tex +++ b/doc/refman/Program.tex @@ -174,6 +174,14 @@ context, the proof of the obligation is \emph{required} to be declared transpare No such problems arise when using measures or well-founded recursion. +An important point about wellfounded and measure-based functions is the following: +The recursive prototype of a function of type +{\binder$_1$}\ldots{\binder$_n$} \{ {\tt measure m \binder$_i$} \}:{\type$_1$}, +inside the body is +\verb|{|{\binder$_i'$ \verb$|$ {\tt m} $x_i'$ < {\tt m} $x_i$}\verb|}|\ldots{\binder$_n$},{\type$_1$}. +So any arguments appearing before the recursive one are ignored for the +recursive calls, hence they are constant. + \subsection{\tt Program Lemma {\ident} : type. \comindex{Program Lemma} \label{ProgramLemma}} @@ -215,6 +223,39 @@ The module {\tt Coq.Program.Tactics} defines the default tactic for solving obligations called {\tt program\_simpl}. Importing {\tt Coq.Program.Program} also adds some useful notations, as documented in the file itself. +\section{Frequently Asked Questions + \comindex{Program FAQ} + \label{ProgramFAQ}} + +\begin{itemize} +\item {Ill-formed recursive definitions} + This error can happen when one tries to define a + function by structural recursion on a subset object, which means the Coq + function looks like: + + \verb$Program Fixpoint f (x : A | P) := match x with A b => f b end.$ + + Supposing $b : A$, the argument at the recursive call to f is not a + direct subterm of x as b is wrapped inside an exist constructor to build + an object of type \verb${x : A | P}$. Hence the definition is rejected + by the guardedness condition checker. However you can do + wellfounded recursion on subset objects like this: + +\begin{verbatim} +Program Fixpoint f (x : A | P) { measure size } := + match x with A b => f b end. +\end{verbatim} + + You will then just have to prove that the measure decreases at each recursive + call. There are three drawbacks though: + \begin{enumerate} + \item You have to define size yourself; + \item The reduction is a little more involved, although it works + using lazy evaluation; + \item Mutual recursion isn't possible anymore. What would it mean ? + \end{enumerate} +\end{itemize} + %%% Local Variables: %%% mode: latex %%% TeX-master: "Reference-Manual" |
