derniers changements du rapport et catch de Not_found
This commit is contained in:
parent
8b3b135184
commit
6151f6771a
BIN
RapportPresentation/ex-presentation.pdf
Normal file
BIN
RapportPresentation/ex-presentation.pdf
Normal file
Binary file not shown.
@ -92,6 +92,8 @@
|
|||||||
|
|
||||||
\lstinline{Qed}
|
\lstinline{Qed}
|
||||||
|
|
||||||
|
\lstinline{Check}
|
||||||
|
|
||||||
Tactiques:
|
Tactiques:
|
||||||
|
|
||||||
\lstinline{exact}
|
\lstinline{exact}
|
||||||
@ -166,7 +168,7 @@
|
|||||||
|
|
||||||
\begin{frame}{Fiabilité}
|
\begin{frame}{Fiabilité}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Comment être sûrs de nos preuves
|
\item Comment être sûrs de nos preuves ?
|
||||||
\pause
|
\pause
|
||||||
\item Envoyer nos termes de preuves à \textbf{\color{blue}{Coq}}.
|
\item Envoyer nos termes de preuves à \textbf{\color{blue}{Coq}}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
Binary file not shown.
@ -100,8 +100,7 @@ Le code est structuré de la manière suivante~:
|
|||||||
|
|
||||||
\item \lstinline{types.ml} qui contient la définition
|
\item \lstinline{types.ml} qui contient la définition
|
||||||
des \lstinline{types} et \lstinline{typing.ml}
|
des \lstinline{types} et \lstinline{typing.ml}
|
||||||
qui implémente l'algorithme de typage bidirectionnel
|
qui implémente l'algorithme de vérification de type.
|
||||||
défini dans la partie~\ref{s:stlc}.
|
|
||||||
\item \lstinline{hlam.ml} qui décrit les~$\lambda$-termes creux,
|
\item \lstinline{hlam.ml} qui décrit les~$\lambda$-termes creux,
|
||||||
utilisés dans les preuves.
|
utilisés dans les preuves.
|
||||||
\item \lstinline{proof.ml} qui définit la structure d'une preuve
|
\item \lstinline{proof.ml} qui définit la structure d'une preuve
|
||||||
@ -152,7 +151,9 @@ déterministe avec les règles rappelées dans
|
|||||||
le livre de S. Mimram~\cite{SMIM} et \textit{très} brièvement dans le livre de
|
le livre de S. Mimram~\cite{SMIM} et \textit{très} brièvement dans le livre de
|
||||||
Landin~\cite{PJL700}.
|
Landin~\cite{PJL700}.
|
||||||
|
|
||||||
|
L'implémentation du~\textit{OU} et du~\textit{ET} est incomplète.
|
||||||
|
Nous n'avons pas eu le temps d'implémenter les déconstructeurs associés
|
||||||
|
(les projecteurs et le \verb|match|).
|
||||||
|
|
||||||
\section{Preuves}
|
\section{Preuves}
|
||||||
\label{s:proof}
|
\label{s:proof}
|
||||||
@ -173,9 +174,11 @@ Compléter la preuve correspond
|
|||||||
|
|
||||||
Lorsqu'on déclare un but, on lui assigne donc :
|
Lorsqu'on déclare un but, on lui assigne donc :
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item un lambda terme creux (\verb|Ref (ref Hole)|) que l'on construit petit à petit à l'aide des tactiques.
|
\item un lambda terme creux (\verb|Ref (ref Hole)|) que
|
||||||
|
l'on construit petit à petit à l'aide des tactiques.
|
||||||
\item le type associé à ce que l'on souhaite prouver
|
\item le type associé à ce que l'on souhaite prouver
|
||||||
\item son contexte, c'est à dire un liste d'hypothèses (nom de l'hypothèse, type, $\lambda$-terme possiblement encore creux qui sera mis à jour facilement grâce aux \verb|ref|s)
|
\item son contexte, c'est à dire un liste d'hypothèses
|
||||||
|
(nom de l'hypothèse, type, $\lambda$-terme possiblement encore creux qui sera mis à jour facilement grâce aux \verb|ref|s)
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Au moment du \verb|Qed|, ce $\lambda$-terme de preuve qui a
|
Au moment du \verb|Qed|, ce $\lambda$-terme de preuve qui a
|
||||||
été gardé de côté est $\beta$-réduit puis typé contre le type
|
été gardé de côté est $\beta$-réduit puis typé contre le type
|
||||||
@ -190,8 +193,14 @@ Voici les commandes et tactiques implémentées:
|
|||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \verb|Goal| pour émettre un nouveau but
|
\item \verb|Goal| pour émettre un nouveau but
|
||||||
\item \verb|Undo| pour annuler la dernière tactique
|
\item \verb|Undo| pour annuler la dernière tactique.
|
||||||
|
Son implémentation est très brutale, on se contente de maintenir une pile des états
|
||||||
|
du terme de preuve. Appliquer cette tactique revient à dépiler l'état courant et à
|
||||||
|
revenir au précédent. L'implémentation pourrait être plus judicieuse.
|
||||||
\item \verb|Qed| pour clore la preuve d'un but
|
\item \verb|Qed| pour clore la preuve d'un but
|
||||||
|
\item \verb|Check| construit le fichier \lstinline{checker.v} qui contient
|
||||||
|
le but courant ainsi qu'un \lstinline{exact} du terme de preuve.
|
||||||
|
Ce fichier est envoyé au top-level de Coq afin d'être vérifié.
|
||||||
\item \verb|exact| si une hypothèse correspond parfaitement à notre but courant
|
\item \verb|exact| si une hypothèse correspond parfaitement à notre but courant
|
||||||
\item \verb|assumption| recherche automatique d'une hypothèse correspondant au but courant
|
\item \verb|assumption| recherche automatique d'une hypothèse correspondant au but courant
|
||||||
\item \verb|intro| pour défaire une implication
|
\item \verb|intro| pour défaire une implication
|
||||||
@ -209,6 +218,11 @@ Voici les commandes et tactiques implémentées:
|
|||||||
rien ne se passe.
|
rien ne se passe.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
Là encore, il manque la tactique~\lstinline|destruct|.
|
||||||
|
|
||||||
|
On peut prouver~\lstinline{A -> A /\ A} mais pas l'implication inverse.
|
||||||
|
|
||||||
\section{Conlusion}
|
\section{Conlusion}
|
||||||
Nous avons présenté notre assistant de preuve \textbf{Pieuvre}.
|
Nous avons présenté notre assistant de preuve \textbf{Pieuvre}.
|
||||||
Il permet de prouver des prédicats logiques simples.
|
Il permet de prouver des prédicats logiques simples.
|
||||||
@ -225,8 +239,13 @@ Enfin, il faut se poser la question de la fiabilité de notre
|
|||||||
assistant de preuve. Il serait difficile de prouver formellement
|
assistant de preuve. Il serait difficile de prouver formellement
|
||||||
toutes les composantes du programme (la~$\beta$-réduction,
|
toutes les composantes du programme (la~$\beta$-réduction,
|
||||||
l'~$\alpha$-conversion, le \verb|typecheck|, etc.).
|
l'~$\alpha$-conversion, le \verb|typecheck|, etc.).
|
||||||
Ainsi, on propose de sauvegarder les termes de preuves puis de
|
Ainsi, on propose de sauvegarder les termes de preuves
|
||||||
les envoyer à Coq pour valider la preuve.
|
puis de les envoyer à Coq pour valider la preuve.
|
||||||
|
Cette approche est assez satisfaisante dans la mesure où
|
||||||
|
la construction du terme de preuve repose uniquement sur les tactiques
|
||||||
|
et pas sur notre implémentation du~$\lambda$-calcul.
|
||||||
|
Ainsi, on peut supposer qu'on n'a jamais de faux-positif:
|
||||||
|
si Check valide notre preuve, c'est quelle est valide.
|
||||||
|
|
||||||
|
|
||||||
\section{Répartition du travail}
|
\section{Répartition du travail}
|
||||||
|
@ -5,7 +5,10 @@ exception Could_not_infer
|
|||||||
|
|
||||||
let rec typecheck (g : gam) (e : lam) (expected_t : ty) : bool =
|
let rec typecheck (g : gam) (e : lam) (expected_t : ty) : bool =
|
||||||
match e with
|
match e with
|
||||||
Var x -> (List.assoc x g) = expected_t
|
Var x ->
|
||||||
|
begin try (List.assoc x g) = expected_t
|
||||||
|
with Not_found -> false
|
||||||
|
end
|
||||||
| Fun ((x, actual_t1), e) ->
|
| Fun ((x, actual_t1), e) ->
|
||||||
begin match expected_t with
|
begin match expected_t with
|
||||||
Arr (expected_t1, expected_t2) ->
|
Arr (expected_t1, expected_t2) ->
|
||||||
|
Loading…
Reference in New Issue
Block a user