\begin{question}Rdigez en Caml une fonction de signature: \begin{programme}\begin{verbatim}filtre : ('a -> bool) -> 'a list -> 'a list \end{verbatim}\end{programme}\noindent spcifie comme suit: \verb+filtre p l+ dresse la liste (prsente dans un ordre quelconque) des lments de $\ell$ qui satisfont le prdicat $p$. Par exemple, \verb+filtre (fun x -> x>0) [-2;3;7;-1;0;11;-8]+ doit rendre ( l'ordre prs) la liste \verb+[3;7;11]+.\end{question}\begin{question}Rdigez en Caml une fonction de signature: \begin{programme}\begin{verbatim}cherche_paires : 'a list -> 'a list \end{verbatim}\end{programme}\noindent spcifie comme suit: \verb+cherche_paires l+ dresse la liste (prsente dans un ordre quelconque) des lments qui apparaissent \emph{exactement} deux fois dans la liste $\ell$. Par exemple, \verb+cherche_paires [8;2;3;8;1;3;1;9;7]+ doit rendre ( l'ordre prs) la liste \verb+[8;3;1]+.\end{question}\begin{panneau}Nous dfinissons la fonction: \begin{programme}\begin{verbatim}let rec castor c = match c with | (_,[]) | (_,[_]) -> c | (t,a::b::q) when a<=b -> let (t',r) = castor(t,b::q) in (t',a::r) | (t,a::b::q) -> let (_,r) = castor(t,a::q) in (true,b::r) ;; \end{verbatim}\end{programme}\noindentClairement, le type de \verb+castor+ est \verb+(bool,'a list) -> (bool,'a list)+. Soient $b$ un boolen, $\ell = (x_1,\ldots,x_n)$ une liste, et $(b',\ell')$ le rsultat rendu par \verb+castor(b,l)+.\end{panneau}\begin{panneau}Pour les trois questions suivantes, les preuves doivent se faire par induction structurelle.\end{panneau}\begin{question}Montrez que $\ell'$ a mme longueur que $\ell$.\end{question}\begin{panneau}Pour les trois questions suivantes, nous supposons $n1$; autrement dit, la liste $\ell$ n'est pas vide.\end{panneau}\begin{question}Nous avons donc $\ell' = (y_1,\ldots,y_n)$. Montrez que les listes $\ell$ et $\ell'$ contiennent les mmes lments, l'ordre prs.\end{question}\begin{question}Montrez que $y_n$ est le plus grand lment de $\ell$.\end{question}\begin{question}Caractrisez les listes $\ell$ pour lesquelles l'valuation de \verb+castor(false,l)+ donne un couple dont la premire composante est \verb+true+.\end{question}\begin{question}Nous dfinissons la fonction: \begin{programme}\begin{verbatim}let rec pollux l = match castor(false,l) with | (false,r) -> r | (true,r) -> pollux r ;; \end{verbatim}\end{programme}\noindentQuel est le rsultat rendu par \verb+pollux l+ o \verb+l+ est une liste $(x_1,\ldots,x_n)$?\end{question}\begin{question}L'unit de cot est la comparaison entre deux lments d'une liste. Exprimez le cot maximal de l'valuation de \verb+pollux l+, en fonction de la longueur $n$ de la liste $\ell$.\end{question}\endinput\begin{question}\DoubleEtoilePar mgarde, Marcel \NomPropre{Malencontreux}, en saisissant la fonction \verb+castor+, a saisi la ligne~3 \fbox{\texttt{a