\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.