derniers changements du rapport et catch de Not_found

This commit is contained in:
Marwan 2024-05-20 16:32:29 +02:00
parent 8b3b135184
commit 6151f6771a
5 changed files with 41 additions and 17 deletions

Binary file not shown.

View File

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

View File

@ -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}

View File

@ -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) ->