\documentclass{article} \usepackage[T1]{fontenc} \usepackage{xcolor} \usepackage[french]{babel} \usepackage{syntax} \usepackage{listings} \usepackage{amsmath} \lstset{ language=caml, columns=[c]fixed, basicstyle=\small\ttfamily, keywordstyle=\bfseries, upquote=true, commentstyle=, breaklines=true, showstringspaces=false} %% installer texlive-lang-french pour cela % ci-dessous: commenté car non offert sur les machines libre-service. % décommentez si vous le souhaitez. %\usepackage[french]{babel} % pour compiler: % faire pdflatex ex-rapport % (si les references aux numeros de parties apparaissent comme des % "?", recompiler une fois) % la compilation de la bibliographie est davantage une "incantation": % faire bibtex ex-biblio % puis pdflatex ex-rapport (un nombre premier de fois) % vous pouvez ensuite ouvrir le fichier ex-rapport.pdf % elements du titre \title{Pieuvre: le mini assitant de preuve} \author{Marwan et Augustin} \date{} % definition de quelques macros, pour les maths \newcommand{\litt}{\alpha} \newcommand{\non}[1]{\overline{#1}} \newcommand{\TODO}[1]{\textbf{\color{red}#1}} \begin{document} \maketitle \section{Présentation} Nous avons programmé \textbf{Pieuvre}, un assistant de preuve pour la logique intuitionniste en \textbf{OCaml}. Il permet, à l'aide d'une boucle interactive, de prouver des prédicats simples. Nous indiquons dans la partie~\ref{s:opt} comment compiler, lancer et utiliser notre programme. Nous exposons ensuite à la partie~\ref{s:orga} comment notre programme est structuré. Nous présentons enfin dans~\ref{s:stlc} notre implémentation du $\lambda$-calcul simplement typé puis \ref{s:proof} notre implémentation des preuves. \section{Compiler et exécuter} \label{s:opt} Pour compiler : \lstinline{make pieuvre} Pour exécuter \textbf{Pieuvre} et entrer dans la boucle interactive de l'assistant de preuve, il suffit d'entrer la commande \lstinline{./pieuvre}. Sinon, on peut spécifier un des modes suivants: \begin{itemize} \item \texttt{-alpha} qui vérifie l'$\alpha$-équivalence de deux $\lambda$-termes séparés par \lstinline{&}. \item \texttt{-reduce} qui affiche les $\beta$-réduction successives du $\lambda$-terme. \end{itemize} \section{Organisation du code} \label{s:orga} Le code est structuré de la manière suivante~: \begin{itemize} \item \lstinline{parser.mly} et \lstinline{lexel.mll} qui définissent l'analyse syntaxique du $\lambda$-calcul simplément typé ainsi que des tactiques. \item \lstinline{lam.ml} qui contient notre implémentation du $\lambda$-calcul simplement typé. \item \lstinline{types.ml} qui contient la définition des \lstinline{types} et \lstinline{typing.ml} qui implémente l'algorithme de typage bidirectionnel défini dans la partie~\ref{s:stlc}. \item \lstinline{proof.ml} qui définit la structure d'une preuve et implémente les tactiques. \item \lstinline{main.ml} le point d'entrée de notre programme qui fait l'interface avec l'utilisateur. \end{itemize} \section{$\lambda$-calcul simplement typé} \label{s:stlc} Avant de pouvoir réaliser des preuves, il faut pouvoir les encoder. On utilise le $\lambda$-calcul simplement typé. Dans notre programme, on utilise la syntaxe suivante pour les types et pour les termes: \begin{grammar} ::= \lstinline{X} \alt \lstinline{A -> B} \alt \lstinline{A /\ B} \alt \lstinline{A \/ B} \alt \lstinline{false} \end{grammar} \begin{grammar} ::= x \alt \lstinline{fun (x : A) => M} \alt \lstinline{M N} \alt \lstinline{exf (M : A)} \end{grammar} Les termes ainsi définis se réduisent à l'aide des règles de $\beta$-réduction rappelées dans les notes de Selinger~\cite{SelingerNotes}. Avant d'être $\beta$-réduit par \lstinline{betastep}, les termes sont d'abord $\alpha$-convertis avec \lstinline{alpha_convert} afin d'éviter les problèmes de substitution. On remarque que l'on impose d'annoter le type de l'argument d'une $\lambda$-abstraction. Tous les termes sont alors typables avec les règles bidirectionnelles suivantes: \TODO{règles de typage} \[ \dfrac {\lstinline{x : A} \in \Gamma} {\Gamma \vdash \lstinline{x : A}} \] \[ \dfrac {\Gamma \vdash \lstinline{M : B}} {\Gamma \vdash \lstinline{fun (x : A) => M : A -> B}} \] \[ \dfrac{\Gamma \vdash M : \lstinline{A -> B} \quad \Gamma \vdash N : \lstinline{A}} {\Gamma \vdash \lstinline{M N} : \lstinline{B}} \] \[ \dfrac {\Gamma \vdash \lstinline{M : false}} {\Gamma \vdash \lstinline{exf (M : A) : A}} \] \section{Preuves} \label{s:proof} \TODO{Augustin} \section{Vérification des preuves} \TODO{parler de la vérification de preuve, quelles difficultés ? quelles certitudes ?} \bibliographystyle{plain} \bibliography{ex-biblio} \end{document}