blob: c85270895716db27312e1ec26b4de395e2053bba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
\achapter{\protect{Miscellaneous extensions}}
\asection{Program derivation}
Coq comes with an extension called {\tt Derive}, which supports
program derivation. Typically in the style of Bird and Meertens. To
use the {\tt Derive} extension it must first be required with
{\tt Require Coq.Derive.Derive}. When the extension is loaded, it
provides the following command.
\subsection[\tt Derive \ident$_1$ From \term$_1$ Upto \term$_2$ As \ident$_2$]
{\tt Derive \ident$_1$ From \term$_1$ Upto \term$_2$ As \ident$_2$\comindex{Derive}}
This commands opens a new proof with two goals. The first one has, as
conclusion, the type of $\term_1$, but is shelved (see
Section~\ref{shelve}). The visible goal has type {\tt \term$_2$
\term$_1$ ?x} where {\tt ?x} is the existential variable
corresponding to the shelved goal.
When the proof ends two constants are defined
\begin{itemize}
\item The first one is name $\ident_1$ and is defined as the proof of
the shelved goal (which is also the value of {\tt ?x}). It is always
transparent.
\item The second one is name $\ident_2$. It has type {\tt \term$_1$
\term$_2$ \ident$_1$}, and its body is the proof of the initially
visible goal. It is opaque if the proof ends with {\tt Qed}, and
transparent if the proof ends with {\tt Defined}.
\end{itemize}
\Example
\begin{coq_example*}
Require Coq.Derive.Derive.
Require Coq.Numbers.Natural.Peano.NPeano.
Section P.
Variables (n m k:nat).
\end{coq_example*}
\begin{coq_example}
Derive p From ((k*n)+(k*m)) Upto eq As h.
Proof.
rewrite <- Mult.mult_plus_distr_l.
reflexivity.
\end{coq_example}
\begin{coq_example*}
Qed.
End P.
\end{coq_example*}
\begin{coq_example}
Print p.
Check h.
\end{coq_example}
As $\term_2$ does not need to be a symmetric relation, the
{\tt Derive} extension may also be used for program refinement.
|