Ajout de la preuve du premier théorème de typage.
This commit is contained in:
parent
a9a5154c1e
commit
ac36aa6a5e
291
RapportStage.tex
291
RapportStage.tex
@ -192,7 +192,15 @@
|
||||
\end{array}\]
|
||||
|
||||
\section{Des tests plus ciblés}
|
||||
|
||||
|
||||
\paragraph{Abandon de l'expression \fj{main}}
|
||||
|
||||
Tous les tests vus dans la section précédente visaient à tester un programme entier (Une \eng{class table} et une expression). Il semble cependant étrange de procéder ainsi. En effet, nous allons souvent comparer uniquement des librairies, ce qui correspondrai à nos \eng{class tables}. On ne cherche plus à savoir si deux programmes \enquote{font la même chose}, mais plutôt est-ce que ces deux \eng{class tables} fournissent les mêmes fonctions.
|
||||
|
||||
En bonus, l'étude des \eng{class tables} est tout aussi complète que l'étude des programmes entiers, car nous pouvons toujours rajouter une classe \fj{Main} qui n'aie qu'une méthode \fj{Main.main} dont le corps soit l'expression de notre programme. Alors tester cette nouvelle \eng{class table} reviendra à tester le programme entier.
|
||||
|
||||
\paragraph{Idée d'une nouvelle structure}
|
||||
|
||||
Le problème de tous les contextes ci-dessus est qu'ils imposent tous une structure trop précise aux \eng{class tables} comparées. Elles doivent toutes avoir impérativement les mêmes classes, attributs et méthodes, là où on aimerai justement les comparer sur certaines classes, attributs ou méthodes.
|
||||
|
||||
Nous allons donc créer une structure appelée \eng{test interface} (ou interface de test) qui permet de restreindre les tests à l'utilisation de classes, attributs et méthodes spécifiques. La restriction se fera à l'aide du typage.
|
||||
@ -257,6 +265,7 @@
|
||||
|
||||
Il peut sembler au premier abord qu'il manque à cette définition des \eng{test sets} une façon de définir la constructabilité d'un objet et certains nom d'attributs sans en préciser l'ordre. Cependant, avec un test simple, si l'on peut construire et accéder à un certain attribut \fj{field} sur un type \fj{C}, Si l'objet est constructible, c'est à dire qu'il existe une expression \fj{new C(new P1($e_1$),...,new Pn($e_n$))}, alors on peut créer pour chaque nom de classe \fj{Pk} des paramètres une sous-classe \fj{Pk\_k} (les \fj{Pk} pouvaient se confondre, mais les \fj{Pk\_k} sont tous distincts). Alors la construction suivante renverra une valeur de type \fj{PP\_k}, et on aura ainsi accès à l'indice du paramètre constructeur de l'attribut \fj{field}.
|
||||
\[\fj{new C(new P1_1($e_1$),new P2_2($e_2$),...,new Pn_n($e_n$)).field}\]
|
||||
% TODO Ajouter une note sur l'abscence de tolérance lorsque les champs sont spécifiés.
|
||||
|
||||
La troisième règle permet d'éviter les définitions implicites, en suivant la convention du papier original \cite{fjdef}. On peut dans tous les cas rajouter pour une classe \fj{C} non définie une ligne de la forme \fj{C \{\}}.
|
||||
|
||||
@ -297,7 +306,7 @@
|
||||
|
||||
\paragraph{Opérateur d'implémentation}
|
||||
|
||||
Nous allons maintenant définir un opérateur \enquote{d'implémentation} noté $\triangleright$, qui décrit l'idée qu'une class table $\mathcal{A}$ implémente une \enquote{test interface}, c'est à dire qu'elle vérifie toutes les contraintes que cette dernière impose. Les règles d'inférence définissant la relation sur les \eng{test interface rules} sont définies \autoref{fig:tiDefImpl}. On indique ensuite que $\mathcal{A} \triangleright \mathfrak{T}$ lorsque pour toute règle $TR\in\mathfrak{T}$, $\mathcal{A}\triangleright TR$.
|
||||
Nous allons maintenant définir un opérateur \enquote{d'implémentation} noté $\triangleright$, qui décrit l'idée qu'une class table $\mathcal{A}$ implémente une \enquote{test interface}, c'est à dire qu'elle vérifie toutes les contraintes que cette dernière impose. Les règles d'inférence définissant la relation sur les \eng{test interface rules} sont définies \autoref{fig:tiDefImpl}. On indique ensuite que $\mathcal{A} \triangleright \mathfrak{T}$ lorsque pour toute règle $TR\in\mathfrak{T}$, $\mathcal{A}\triangleright TR$, et que $\mathcal{A}$ est bien typé ($\mathcal{A}\;\textsc{OK}$).
|
||||
|
||||
\begin{figure}
|
||||
\ttfamily
|
||||
@ -324,10 +333,12 @@
|
||||
|
||||
\infer
|
||||
{\mathcal{A} \triangleright \left[\fj{ C ( $\overline{\texttt{E}}\;\overline{\texttt{f}}$)}\right]}
|
||||
{\exists \overline{\fj{f'}}\quad
|
||||
\overline{\fj{f0}} = \overline{\fj{f}}+\overline{\fj{f'}} \land
|
||||
{\begin{array}{l}
|
||||
\exists \overline{\fj{f'}}\quad \overline{\fj{f0}} = \overline{\fj{f}}+\overline{\fj{f'}} \\
|
||||
\exists \overline{\fj{E'}} \quad \overline{\fj{F}} = \overline{\fj{E}} \backslash \overline{\fj{E'}} \\
|
||||
\overline{\fj{E}} \subclass \overline{\fj{F}} \quad \land \quad
|
||||
\overline{\fj{F}}\;\overline{\fj{f0}} = \operatorname{fields}_\mathcal{A}(C)
|
||||
\quad \overline{\fj{F}}\subclass_\mathcal{A}\overline{\fj{E}}
|
||||
\end{array}
|
||||
}
|
||||
&\newtag{\textrm{\textsc{(TRI-Cstr)}}}{rule:tri:constructor}\\[1em]
|
||||
|
||||
@ -347,7 +358,7 @@
|
||||
|
||||
\subsection{Définition du typage et d'un premier préordre}
|
||||
|
||||
Maintenant, nous allons définir le typage d'expressions dans une \eng{test interface}. L'opérateur de typage sera noté $\Vdash$ pour la différencier de celle définie dans Featherweight Java, notée $\vdash$. Une expression sera sera typée sous une \eng{test interface} $\mathfrak{T}$, une \eng{class table} $\mathcal{A}$ et un environnement de typage $\Gamma$.
|
||||
Maintenant, nous allons définir le typage d'expressions dans une \eng{test interface}. L'opérateur de typage sera noté $\Vdash$ pour la différencier de celle définie dans Featherweight Java, notée $\vdash$. Une expression sera sera typée sous une \eng{test interface} $\mathfrak{T}$, une \eng{class table} $\mathcal{B}$ et un environnement de typage $\Gamma$.
|
||||
|
||||
Pour simplifier les définitions, nous allons rajouter une nouvelle application $\operatorname{construct}$ en plus des applications $\operatorname{fields}$, $\operatorname{mtype}$ et $\operatorname{mbody}$ qui sont définies dans le papier original, et que nous allons aussi surcharger. Maintenant, ces fonctions \enquote{recherchent} à la fois dans la \eng{class table} et dans la \eng{test interface}. Les définitions étendues sont présentées \autoref{fig:typops}.
|
||||
|
||||
@ -359,11 +370,11 @@
|
||||
\begin{tabular}{c@{\hskip 6em}l}
|
||||
\infer
|
||||
{\operatorname{construct}(\fj{C}) = \overline{\fj{D}}}
|
||||
{\fj{class C\{C($\overline{\texttt{D}}\;\overline{\texttt{f}}$)\{...\} ... \}}\in \mathcal{A}}
|
||||
{\left[\fj{C($\overline{\texttt{D}}\;\overline{\texttt{?f}}$)}\right] \in \mathfrak{T}}
|
||||
& \newtag{\textrm{\textsc{LTi-Cstr}}}{rule:lti-construct}\\[1em]
|
||||
\infer
|
||||
{\operatorname{construct}(\fj{C}) = \overline{\fj{D}}}
|
||||
{\left[\fj{C($\overline{\texttt{D}}\;\overline{\texttt{?f}}$)}\right] \in \mathfrak{T}}
|
||||
{\fj{class C\{C($\overline{\texttt{D}}\;\overline{\texttt{f}}$)\{...\} ... \}}\in \mathcal{B}}
|
||||
& \newtag{\textrm{\textsc{LCt-Cstr}}}{rule:lct-construct}\\[1em]
|
||||
\infer
|
||||
{\operatorname{fields}(\fj{C}) = \overline{\fj{D}}\;\overline{\fj{f}} + \bigcup_{C \subclass E}\operatorname{fields}(\fj{E})}
|
||||
@ -375,7 +386,7 @@
|
||||
& \newtag{\textrm{\textsc{LTi-AttrC}}}{rule:lti-fields2}\\[1.5em]
|
||||
\infer
|
||||
{\operatorname{fields}(\fj{C}) = \overline{\fj{D}}\;\overline{\fj{f}} + \bigcup_{C \subclass E}\operatorname{fields}(\fj{E})}
|
||||
{\fj{class C \{$\overline{\texttt{D}}\;\overline{\texttt{f}}$; ...\}} \in \mathcal{A}}
|
||||
{\fj{class C \{$\overline{\texttt{D}}\;\overline{\texttt{f}}$; ...\}} \in \mathcal{B}}
|
||||
& \newtag{\textrm{\textsc{LCt-Attr}}}{rule:lct-fields}\\[1em]
|
||||
\infer
|
||||
{\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}}\rightarrow\fj{E}}
|
||||
@ -383,7 +394,7 @@
|
||||
& \newtag{\textrm{\textsc{LTi-MethC}}}{rule:lti-method}\\[1em]
|
||||
\infer
|
||||
{\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}}\rightarrow\fj{E}}
|
||||
{\fj{class C \{...; E m($\overline{\texttt{D}}\;\overline{\texttt{x}}$)\}} \in \mathcal{A}}
|
||||
{\fj{class C \{...; E m($\overline{\texttt{D}}\;\overline{\texttt{x}}$)\}} \in \mathcal{B}}
|
||||
& \newtag{\textrm{\textsc{LCt-Meth}}}{rule:lct-method}\\[1em]
|
||||
\infer
|
||||
{\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}}\rightarrow\fj{E}}
|
||||
@ -393,48 +404,48 @@
|
||||
\end{center}
|
||||
\end{tcolorbox}
|
||||
\rmfamily
|
||||
$\subclass$ dénote ici la cloture transitive et réflexive de l'union des relations $<:$ sur $\mathfrak{T}$ et $extends$ dans $\mathcal{A}$.
|
||||
$\subclass$ dénote ici la cloture transitive et réflexive de l'union des relations $<:$ sur $\mathfrak{T}$ et $extends$ dans $\mathcal{B}$.
|
||||
|
||||
\caption{Opérateurs supplémentaires pour le typage}
|
||||
\label{fig:typops}
|
||||
\end{figure}
|
||||
|
||||
Grâce à ces méthodes, nous pouvons réutiliser les règles de typage de Featherweight Java à l'identique, qui sont rappelées \autoref{fig:typti}. Nous avons enlevé la règle de typage \textsc{T-SCast} qui autorisait les casts \enquote{stupides}, entre deux types qui n'étaient pas parents l'un de l'autre.
|
||||
Grâce à ces méthodes, nous pouvons réutiliser les règles de typage de Featherweight Java presque à l'identique, qui sont rappelées \autoref{fig:typti}. Nous avons enlevé la règle de typage \textsc{T-SCast} qui autorisait les casts \enquote{stupides}, entre deux types qui n'étaient pas parents l'un de l'autre.
|
||||
|
||||
Nous vérifions aussi évidement la \eng{class table} $\mathcal{A}$, en vérifiant que le corps de chaque méthode est bien typé par le type attendu dans la méthode, que les champs de la \eng{class table} ne contredisent pas la \eng{test interface}. Les seules contradictions sont grammaticales si l'on a déjà vérifié que les applications $\operatorname{fields}$, $\operatorname{construct}$ et $\operatorname{mtype}$ n'étaient pas redéfinies ou ma définies.
|
||||
Nous vérifions aussi évidement la \eng{class table} $\mathcal{B}$, en vérifiant que le corps de chaque méthode est bien typé par le type attendu dans la méthode, que les champs de la \eng{class table} ne contredisent pas la \eng{test interface}. On note alors $\mathcal{B} \OKin \mathfrak{T}$. Les seules contradictions sont grammaticales si l'on a déjà vérifié que les applications $\operatorname{fields}$, $\operatorname{construct}$ et $\operatorname{mtype}$ n'étaient pas redéfinies ou mal définies.%TODO à prouver
|
||||
|
||||
\begin{figure}
|
||||
\begin{tcolorbox}[left=5pt,right=2pt,top=5pt,bottom=5pt,boxrule=1pt,rounded corners=all,colback=white!92!blue]
|
||||
\def\arraystretch{1.5}
|
||||
\begin{tabular}{c@{\hskip 2em}l}
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{x} : \Gamma(\fj{x})}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{x} : \Gamma(\fj{x})}
|
||||
{\fj{x} \in \Gamma}
|
||||
& \newtag{\textrm{\textsc{TI-Var}}}{rule:ti:variable}
|
||||
\\[3ex]
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{e.f} : \fj{E}}
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash e : \fj{C} \quad \fj{E}\;\fj{f} \in \operatorname{fields}(\fj{C})}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{$e$.f} : \fj{C}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{C0} \quad \fj{C}\;\fj{f} \in \operatorname{fields}(\fj{C0})}
|
||||
& \newtag{\textrm{\textsc{TI-Field}}}{rule:ti:field}
|
||||
\\[3ex]
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{e.m($\overline{\texttt{e'}}$)} : \fj{R}}
|
||||
{\begin{array}{c}\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{e} : \fj{C} \quad \mathfrak{T},\mathcal{A},\Gamma \Vdash \overline{\fj{e'}} : \overline{\fj{E}} \\[-1.4ex] \overline{\fj{E}} \subclass \overline{\fj{G}} \quad \operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{G}} \rightarrow \fj{R} \end{array}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{$e$.m($\overline{e_x}$)} : \fj{C}}
|
||||
{\begin{array}{c}\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{C0} \quad \mathfrak{T},\mathcal{B},\Gamma \Vdash \overline{e_x} : \overline{\fj{CX}} \\[-1.4ex] \overline{\fj{CX}} \subclass \overline{\fj{D}} \quad \operatorname{mtype}(\fj{m},\fj{C0}) = \overline{\fj{D}} \rightarrow \fj{C} \end{array}}
|
||||
& \newtag{\textrm{\textsc{TI-Invk}}}{rule:ti:invoke}
|
||||
\\[3ex]
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{new D(}\overline{\fj{e}}\fj{)} : \fj{D}}
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \overline{\fj{e}} : \overline{\fj{E}} \quad \overline{\fj{E}} \subclass \overline{\fj{G}} \quad \operatorname{constructor}(\fj{D}) = \overline{\fj{G}}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{new C(}\overline{e_x}\fj{)} : \fj{C}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \overline{e_x} : \overline{\fj{CX}} \quad \overline{\fj{CX}} \subclass \overline{\fj{D}} \quad \operatorname{constructor}(\fj{C}) = \overline{\fj{D}}}
|
||||
& \newtag{\textrm{\textsc{TI-New}}}{rule:ti:new}
|
||||
\\[3ex]
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{(D)e} : \fj{D}}
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{e} : \fj{C} \quad \fj{C} \subclass \fj{D}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{(C)$e$} : \fj{C}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{D} \quad \fj{D} \subclass \fj{C}}
|
||||
& \newtag{\textrm{\textsc{TI-DCast}}}{rule:ti:downCast}
|
||||
\\[3ex]
|
||||
\infer
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{(D)e} : \fj{D}}
|
||||
{\mathfrak{T},\mathcal{A},\Gamma \Vdash \fj{e} : \fj{C} \quad \fj{D} \subclass \fj{C} \quad \fj{C} \neq \fj{D}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{(C)$e$} : \fj{C}}
|
||||
{\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{D} \quad \fj{C} \subclass \fj{D} \quad \fj{C} \neq \fj{D}}
|
||||
& \newtag{\textrm{\textsc{TI-UCast}}}{rule:ti:upCast}
|
||||
\end{tabular}
|
||||
\end{tcolorbox}
|
||||
@ -442,40 +453,60 @@
|
||||
\label{fig:typti}
|
||||
\end{figure}
|
||||
|
||||
Nous allons maintinant vérifier la définition de cette opération de typage $\Vdash$ en démontrant le théorème suivant:
|
||||
Nous allons maintenant vérifier la définition de cette opération de typage $\Vdash$ en démontrant le théorème suivant:
|
||||
|
||||
\begin{theorem}
|
||||
Soit une \eng{test interface} $\mathfrak{T}$, une \eng{class table} $\mathcal{A}$ et un test $(\mathcal{C},e)$ vérifiant
|
||||
\label{thm:tiTyp}
|
||||
Soit une \eng{test interface} $\mathfrak{T}$, une \eng{class table} $\mathcal{A}$ et un test $(\mathcal{B},e)$ vérifiant
|
||||
\begin{itemize}
|
||||
\item $\mathcal{A} \triangleright \mathfrak{T}$
|
||||
\item $\mathcal{C} \text{\textsc{ OK in }} \mathfrak{T}$
|
||||
\item $\mathfrak{T},\mathcal{C} \Vdash e : \fj{D}$
|
||||
\item $\mathcal{B} \OKin \mathfrak{T}$
|
||||
\item $\mathfrak{T},\mathcal{B} \Vdash e : \fj{D}$
|
||||
\end{itemize}
|
||||
|
||||
Alors il existe \fj{C} tel que $\mathcal{A} \oplus \mathcal{C} \vdash e : \fj{C}$ et $\fj{C} \subclass \fj{D}$.
|
||||
Alors il existe \fj{C} tel que $\mathcal{A} \oplus \mathcal{B} \vdash e : \fj{C}$ et $\fj{C} \subclass \fj{D}$.
|
||||
|
||||
Cette dernière condition est nécessaire à cause de la tolérance de l'opérateur $\triangleright$.
|
||||
\end{theorem}
|
||||
|
||||
Ce théorème se prouve par induction sur la preuve de $\mathfrak{T},\mathcal{C} \Vdash e : \fj{D}$. La preuve est donnée en \autoref{anx:proofTyptyp}.
|
||||
Ce théorème se prouve par induction sur la preuve de $\mathfrak{T},\mathcal{B} \Vdash e : \fj{D}$. La preuve est donnée en \autoref{anx:proofTyptyp}.
|
||||
|
||||
On peut donc définir un préordre sur les \eng{class tables} de la manière suivante.
|
||||
On peut alors définir un préordre sur les \eng{class tables} de la manière suivante.
|
||||
|
||||
\begin{definition}
|
||||
Soit une \eng{test interface} $\mathfrak{T}$.
|
||||
|
||||
Soit deux \eng{class tables} $\mathcal{A}$ et $\mathcal{B}$ qui implémentent toutes deux $\mathfrak{T}$
|
||||
|
||||
\[\mathcal{A} \prec \mathcal{B} \ssi \forall (\mathcal{C},e) \left|\begin{array}{l}
|
||||
\mathcal{C} \text{\textsc{ OK in }} \mathfrak{T}\\
|
||||
\mathfrak{T},\mathcal{C} \Vdash e : \fj{D}\\
|
||||
\mathcal{A}\oplus\mathcal{C} \Downarrow v
|
||||
\end{array}\right. \implies \mathcal{B}\oplus\mathcal{C}\Downarrow v\]
|
||||
\[\mathcal{A} \prec \mathcal{A'} \ssi \forall (\mathcal{B},e) \left|\begin{array}{l}
|
||||
\mathcal{B} \OKin \mathfrak{T}\\
|
||||
\mathfrak{T},\mathcal{B} \Vdash e : \fj{D}\\
|
||||
\mathcal{A}\oplus\mathcal{B} \Downarrow v
|
||||
\end{array}\right. \implies \mathcal{A'}\oplus\mathcal{B}\Downarrow v\]
|
||||
\end{definition}
|
||||
|
||||
|
||||
\subsection{Renforcage de ce préordre avec les valeurs infinies}
|
||||
|
||||
Nous souhaiterions pouvoir démontrer un \eng{context lemma} sur les préordres précédents, c'est à dire un théorème qui dise que pour toute expression à trou $h$
|
||||
|
||||
\[(\mathcal{A},e)\prec(\mathcal{B},f) \implies (\mathcal{A},h\bracket{e})\prec(\mathcal{A},h\bracket{f})\]
|
||||
|
||||
Cependant, cela est généralement faux, puisque il est possible en Featherweight Java de considérer des expressions qui vont se réduire à l'infini, mais que l'on peut \enquote{utiliser} avec des appels à méthodes ou des attributs. Nous pouvons par exemples utiliser les listes infinies, définies en annexe (\autoref{anx:classes:listes}). Cette classe définie deux attributs, dont un de son propre type.
|
||||
|
||||
\begin{figure}
|
||||
\begin{fjlisting}
|
||||
\fjclass{Static}{}{
|
||||
\fjmethod{IList}{intList}{Int i}{new IList(i, intList(i+1))}
|
||||
\fjmethod{IList}{zeroList}{}{new IList(0, zeroList())}
|
||||
}
|
||||
\end{fjlisting}
|
||||
\label{fig:ilistsDefs}
|
||||
\caption{Définitions de listes infinies}
|
||||
\end{figure}
|
||||
|
||||
Par exemple, avec la \eng{class table} définie \autoref{fig:ilistsDefs}, nous pouvons considérer les deux expressions $e = \fj{intList(0)}$ et $e' = \fj{zeroList()}$.
|
||||
|
||||
\section{Vers des équivalences plus pratiques}
|
||||
|
||||
\subsection{Une équivalence entre les expressions}
|
||||
@ -500,7 +531,7 @@
|
||||
\begin{fjlisting}
|
||||
\fjclass{Bool}{}{
|
||||
\fjmethod{Object}{ite}{Object oTrue, Object oFalse}{oTrue}
|
||||
}
|
||||
}\\
|
||||
\fjclass[Bool]{OBool}{}{
|
||||
\fjmethod{Object}{ite}{Object oTrue, Object oFalse}{oFalse}
|
||||
}
|
||||
@ -513,7 +544,7 @@
|
||||
\begin{fjlisting}
|
||||
\fjclass{Int}{}{
|
||||
\fjmethod{Bool}{isNull}{}{true}
|
||||
}
|
||||
}\\
|
||||
\fjclass{SInt}{\fjattr[Int]{prec}}{
|
||||
\fjmethod{Bool}{isNull}{}{false}
|
||||
}
|
||||
@ -523,7 +554,191 @@
|
||||
\[\fj{0} = \fj{new Int()}\]
|
||||
\[n = \fj{new SInt(n-1)}\]
|
||||
|
||||
\subsection{Les listes}
|
||||
\label{anx:classes:listes}
|
||||
\begin{fjlisting}
|
||||
// Listes Infinies\\
|
||||
\fjclass{IList}{\fjattr[IList]{next}\fjattr{obj}}{}\\
|
||||
// Listes Finies\\
|
||||
\fjclass{List}{}{
|
||||
\fjmethod{Bool}{isEmpty}{}{true}
|
||||
}\\
|
||||
\fjclass[List]{Cons}{\fjattr[List]{queue}\fjattr{head}}{
|
||||
\fjmethod{Bool}{isEmpty}{}{false}
|
||||
}
|
||||
\end{fjlisting}
|
||||
|
||||
On ajoute aussi les notations des listes :
|
||||
\[\fj{[]} = \fj{new List()}\]
|
||||
\[\fj{$o$::$e$} = \fj{new Cons($e$,$o$)}\]
|
||||
|
||||
\section{Preuve du théorème de cohérence du typage des \eng{test interfaces}}
|
||||
\label{anx:proofTyptyp}
|
||||
|
||||
Cette section a pour but de présenter la preuve complète du \autoref{thm:tiTyp}, sur la cohérence du typage des \eng{test interfaces}.
|
||||
|
||||
Nous avons $\mathfrak{T}$ une \eng{test interface}, $\mathcal{C}$ une \eng{class table} telle que $\mathcal{A} \triangleright \mathfrak{T}$ et $(\mathcal{B}, e)$ un programme test, tel que $\mathcal{B}\OKin\mathfrak{T}$.
|
||||
|
||||
Nous allons donc essayer de montrer, par induction sur la preuve de la prémisse, la propriété suivante
|
||||
|
||||
\[\mathfrak{T},\mathcal{B}, \Gamma \Vdash e : \fj{C} \implies \exists \fj{C'}\quad \mathcal{A}\oplus\mathcal{B},\Gamma \vdash e : \fj{C'} \quad\text{et}\quad \fj{C'} \subclass \fj{C}\]
|
||||
|
||||
\subsection{Propriétés sur les fonctions utilitaires}
|
||||
|
||||
La définition de $\vdash$ dans Featherweight Java de base utilise les fonctions utilitaires non surchargées. Afin de bien les différencier, nous allons noter avec un prime les versions surchargées définies \autoref{fig:typops}.
|
||||
|
||||
Par exemple, $(\operatorname{fields'})$ correspond à la définition surchargée dans la \eng{test interface} $\mathfrak{T}$ et la \eng{class table} de tests $\mathcal{B}$, et $(\operatorname{fields})$ correspond à la définition originale dans la \eng{class table} $\mathcal{A} \oplus \mathcal{B}$. Il en va de même pour l' opérateur $(\subclass')$, qui dénotera la cloture transitive et réflexive de l'union des relations \fj{<:} sur $\mathfrak{T}$ et \fj{extends} dans $\mathcal{B}$ et l'opérateur $(\subclass)$ qui dénotera la relation de sous-typage sur la \eng{class table} $\mathcal{A} \oplus \mathcal{B}$.
|
||||
|
||||
Nous allons déjà montrer les trois propriétés suivantes sur ces fonctions utilitaires:
|
||||
|
||||
\[
|
||||
\begin{array}{rcl}
|
||||
\fj{C}\;\fj{f} \in \operatorname{fields'}(\fj{C0}) &\implies& \exists \fj{C'}\subclass\fj{C}\quad\fj{C'}\;\fj{f} \in \operatorname{fields}(\fj{C0}) \\
|
||||
\operatorname{mtype'}(\fj{m},\fj{C0}) = \overline{\fj{D}}\rightarrow\fj{C} & \implies& \exists \fj{C'}\subclass \fj{C}\ \exists \overline{\fj{D'}} \superclass \overline{\fj{D}}\quad \operatorname{mtype}(\fj{m},\fj{C0}) = \overline{\fj{D'}}\rightarrow\fj{C'}\\
|
||||
\operatorname{construct'}(\fj{C0}) = \overline{\fj{D}} & \implies & \exists \overline{\fj{D'}} \superclass \overline{\fj{D}}\quad\exists \overline{\fj{f}} \quad \operatorname{fields}(\fj{C0}) = \overline{\fj{D'}}\;\overline{\fj{f}}
|
||||
\end{array}
|
||||
\]
|
||||
|
||||
\paragraph{Première propriété}
|
||||
Montrons cette propriété par induction sur la relation $\subclass'$.
|
||||
|
||||
En inversant la règle qui a permis de prouver $\fj{C}\;\fj{f} \in \operatorname{fields'}(\fj{C0})$, il y a quatre possibilités.
|
||||
|
||||
\subparagraph{Cas $\fj{C}\;\fj{f} \in \bigcup_{\fj{C}\subclass'\fj{E}}\operatorname{fields'}(\fj{E})$}
|
||||
On applique alors directement l’hypothèse d'induction.
|
||||
|
||||
\subparagraph{Cas $\fj{class C0 \{C f;...\}} \in \mathcal{B}$ (\textnormal{\ref{rule:lct-fields})}}
|
||||
Alors, par construction de $\operatorname{fields}$, on a $\fj{C}\;\fj{f} \in \operatorname{fields}(C0)$
|
||||
|
||||
\subparagraph{Cas $\left[\fj{C0 \{C f, ...\}}\right] \in \mathfrak{T}$ (\textnormal{\ref{rule:lti-fields})}}
|
||||
Alors, puisque $\mathcal{A} \triangleright \mathfrak{T}$, c'est nécessairement par la règle \ref{rule:tri:attributes}, et on a donc
|
||||
\[\fj{C'} \fj{f} \in \operatorname{fields}_\mathcal{A}(\fj{C0})\quad\text{et}\quad \fj{C'}\subclass\fj{C}\]
|
||||
|
||||
\subparagraph{Cas $\left[\fj{C0 (..., C f, ...)}\right] \in \mathfrak{T}$ (\textnormal{\ref{rule:lti-fields2})}}
|
||||
Alors, puisque $\mathcal{A} \triangleright \mathfrak{T}$, c'est nécessairement par la règle \ref{rule:tri:constructor}, et on a donc, puisque le field \fj{f} est défini,
|
||||
\[\fj{C'} \fj{f} \in \operatorname{fields}_\mathcal{A}(\fj{C0})\quad\text{et}\quad \fj{C'}\subclass\fj{C}\]
|
||||
|
||||
\paragraph{Seconde propriété}
|
||||
Procédons un peu de la même manière, par induction sur la définition de $\operatorname{mtype'}$.
|
||||
|
||||
Nous avons comme hypotèse $\operatorname{mtype'}(\fj{C0}) = \overline{\fj{D}} \rightarrow \fj{C}$.
|
||||
|
||||
\subparagraph{Cas $\left[\fj{C0 : C m($\overline{\texttt{D}}$)}\right] \in \mathfrak{T}$ (\textnormal{\ref{rule:lti-method})}}
|
||||
Alors, puisque $\mathcal{A} \triangleright \mathfrak{T}$, c'est nécessairement par la règle \ref{rule:tri:method}, et on a donc.
|
||||
\[\operatorname{mtype}_\mathcal{A}(\fj{m},\fj{C}) = \overline{\fj{D'}} \rightarrow \fj{C'}\quad;\quad\overline{\fj{D}} \subclass \overline{\fj{D'}}\quad;\quad \fj{C'}\subclass\fj{C}\]
|
||||
CQFD.
|
||||
|
||||
\subparagraph{Cas $\fj{class C0 \{...,C m($\overline{\texttt{D}}\;\overline{\texttt{x}}$)\}}\in \mathcal{B}$ (\textnormal{\ref{rule:lct-method}})}
|
||||
Alors, par définition de $\operatorname{mtype}$, on a que
|
||||
\[\operatorname{mtype}_\mathcal{B}(\fj{m},\fj{C0}) = \overline{\fj{D}} \rightarrow \fj{E}\quad\text{et}\quad\fj{C0}\subclass\fj{C0}\]
|
||||
CQFD.
|
||||
\subparagraph{Cas $\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}} \rightarrow \fj{E}$ et $\fj{C}\subclass'\fj{C0}$ (\textnormal{\ref{rule:lup-method}})}
|
||||
|
||||
\label{proof:mtype:cchain}
|
||||
Puisque $\fj{C}\subclass'\fj{C0}$, alors, il existe une chaine de classes
|
||||
\[\fj{C} = \fj{C}_0 , \fj{C}_1 , \dots , \fj{C}_n = \fj{C0}\]
|
||||
|
||||
telles que $\fj{C}_k\;\fj{extends}\;\fj{C}_{k+1}$ dans $\mathcal{A}$ ou $\mathcal{B}$.
|
||||
|
||||
Or, on sait que les défintions de $\mathcal{A}$ et $\mathcal{B}$ sont $\textsc{OK}$ (c'est imposé par la définition de $\mathcal{A}\triangleright\mathfrak{T})$.
|
||||
On a donc que pour chacune de ces classes:
|
||||
|
||||
\[\operatorname{mtype}(\fj{m},\fj{C}_n) = \operatorname{mtype}(\fj{m},\fj{C}_{n-1}) = \cdots = \operatorname{mtype}(\fj{m},\fj{C}_0)\]
|
||||
|
||||
Donc $\operatorname{mtype}(\fj{m},\fj{C0}_n) = \overline{\fj{D}}\rightarrow \fj{E}$. CQFD
|
||||
|
||||
\paragraph{Troisième propritété}
|
||||
|
||||
Une dernière fois, inversons la règle qui a permis de prouver $\operatorname{construct'}(\fj{C0}) = \overline{\fj{D}}$.
|
||||
|
||||
\subparagraph{Cas $\left[\fj{C0 ($\overline{\texttt{D}}\;\overline{\texttt{f}}$)}\right] \in \mathfrak{T}$ (\textnormal{\ref{rule:lti-construct})}}
|
||||
|
||||
Alors, puisque $\mathcal{A} \triangleright \mathfrak{T}$, c'est nécessairement par la règle (\ref{rule:tri:constructor}), et on a donc
|
||||
\[\exists \overline{\fj{D'}}\quad\overline{\fj{D'}}\;\overline{\fj{f0}} = \operatorname{fields}_\mathcal{A}(C)\]
|
||||
CQFD
|
||||
|
||||
\subparagraph{Cas $\fj{class C0\{C0($\overline{\texttt{D}}\;\overline{\texttt{f}}$)\{...\} ... \}}\in \mathcal{B}$ (\textnormal{\ref{rule:lct-construct}})}
|
||||
|
||||
Alors, puisqu'en Featherweight Java, les objets sont immuables et les constructeurs définissent tous les fields, on sait que les paramètres du constructeurs sont \emph{exactement} les champs de la classe. Et donc
|
||||
|
||||
\[\operatorname{fields}(\fj{C0}) = \overline{\fj{D}} \quad\text{et}\quad \overline{\fj{D}} \subclass \overline{\fj{D}}\]
|
||||
|
||||
\subsection{Corps de la preuve}
|
||||
|
||||
Démarrons l'induction sur la preuve de la propriété présentée au début de la section.
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:variable}}}}
|
||||
|
||||
\begin{hyps}
|
||||
\item e = \fj{x}
|
||||
\item \fj{C} = \Gamma(\fj{x})
|
||||
\item \fj{x} \in \operatorname{dom}(\Gamma)
|
||||
\end{hyps}
|
||||
|
||||
Alors, d'après la règle FJ \textsc{T-Var}
|
||||
\[\mathcal{A}\oplus\mathcal{B},\Gamma \vdash \fj{x} : \Gamma(\fj{x})\]
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:field}}}}
|
||||
\begin{hyps}
|
||||
\item e = \fj{$e_0$.f}
|
||||
\item \fj{C} = \fj{C}
|
||||
\item \mathfrak{T},\mathcal{B},\Gamma \Vdash e_0 : \fj{C0} \quad \text{donc} \quad \mathcal{A}\oplus\mathcal{B}\vdash e_0 : \fj{C0'}\quad\text{et}\quad \fj{C0'}\subclass\fj{C0}
|
||||
\item \fj{C}\;\fj{f} \in \operatorname{fields'}(\fj{C0})
|
||||
\end{hyps}
|
||||
|
||||
On peut alors appliquer la première propriété sur la quatrième hypotèse qui nous donne
|
||||
\[\exists\fj{C'}\subclass \fj{C} \quad \fj{C'}\;\fj{f} \in \operatorname{fields}(\fj{C0})\]
|
||||
|
||||
Alors, on peut directement appliquer la règle FJ \textsc{T-Field}
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:invoke}}}}
|
||||
\begin{hyps}
|
||||
\item e = \fj{$e_0$.m($\overline{e_x}$)}
|
||||
\item \fj{C} = \fj{C}
|
||||
\item \mathfrak{T},\mathcal{B},\Gamma \Vdash e_0 : \fj{C0} \quad \text{donc} \quad \mathcal{A}\oplus\mathcal{B}\vdash e_0 : \fj{C0'}\quad\text{et}\quad \fj{C0'}\subclass\fj{C0}
|
||||
\item \mathfrak{T},\mathcal{B},\Gamma \Vdash \overline{e_x} : \overline{\fj{CX}} \quad \text{donc} \quad \mathcal{A}\oplus\mathcal{B}\vdash \overline{e_x} : \overline{\fj{CX'}}\quad\text{et}\quad \overline{\fj{CX'}}\subclass\overline{\fj{CX}}
|
||||
\item \operatorname{mtype'}(\fj{m},\fj{C0}) = \overline{\fj{D}} \rightarrow \fj{C}
|
||||
\item \overline{\fj{CX}} \subclass \overline{\fj{C}}
|
||||
\end{hyps}
|
||||
|
||||
On peut alors appliquer la seconde propriété sur la cinquième hypothèse, on obtient que
|
||||
\[\operatorname{mtype}(\fj{m}, \fj{C0}) = \overline{\fj{D'}} \rightarrow \fj{C'} \quad\text{et}\quad \overline{\fj{D}}\subclass\overline{\fj{D'}}\quad\text{et}\quad\fj{C'}\subclass\fj{C}\]
|
||||
|
||||
Alors, en utilisant la même preuve que pendant la preuve de la sous propriété (\autoref{proof:mtype:cchain})
|
||||
|
||||
\[\operatorname{mtype}(\fj{m},\fj{C0'}) = \overline{\fj{D'}}\rightarrow\fj{C'} \quad\text{et}\quad \overline{\fj{CX'}} \subclass \overline{\fj{CX}} \subclass \overline{\fj{D}} \subclass \overline{\fj{D'}}\]
|
||||
|
||||
On peut maintenant appliquer la règle FJ \textsc{T-Invk} et obtenir le résultat.
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:new}}}}
|
||||
\begin{hyps}
|
||||
\item e = \fj{new C($\overline{e_x}$)}
|
||||
\item \fj{C} = \fj{C}
|
||||
\item \mathfrak{T},\mathcal{B},\Gamma \Vdash \overline{e_x} : \overline{\fj{CX}} \quad \text{donc} \quad \mathcal{A}\oplus\mathcal{B}\vdash \overline{e_x} : \overline{\fj{CX'}}\quad\text{et}\quad \overline{\fj{CX'}}\subclass\overline{\fj{CX}}
|
||||
\item \operatorname{construct'}(\fj{C}) = \overline{\fj{D}}
|
||||
\item \overline{\fj{CX}} \subclass \overline{\fj{D}}
|
||||
\end{hyps}
|
||||
|
||||
On peut appliquer la troisième propriété sur la quatrième hypothèse. On obtient alors que :
|
||||
\[\operatorname{fields}(\fj{C}) = \overline{\fj{D'}}\;\overline{\fj{f}} \quad\text{et}\quad \overline{\fj{CX'}} \subclass \overline{\fj{CX}} \subclass \overline{\fj{D}} \subclass \overline{\fj{D'}}\]
|
||||
|
||||
On peut maintenant appliquer la règle FJ \textsc{T-New} et obtenir le résultat.
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:upCast}}}}
|
||||
\begin{hyps}
|
||||
\item e = \fj{(C)$e_0$}
|
||||
\item \fj{C} = \fj{C}
|
||||
\item \mathfrak{T},\mathcal{B},\Gamma \Vdash e_0 : \fj{C} \quad \text{donc} \quad \mathcal{A}\oplus\mathcal{B}\vdash e_0 : \fj{D}\quad\text{et}\quad \fj{D}\subclass\fj{C}
|
||||
\item \fj{D} \subclass \fj{C}
|
||||
\end{hyps}
|
||||
|
||||
On a alors l'inégalité suivante :
|
||||
\[\fj{D'} \subclass \fj{D} \subclass \fj{C}\]
|
||||
|
||||
On peut donc appliquer directement la règle \textsc{T-UCast}
|
||||
|
||||
\subparagraph{\textnormal{\textsc{\ref{rule:ti:downCast}}}}
|
||||
Exactement la même preuve que le point précédent en appliquant la règle \textsc{T-UCast}
|
||||
|
||||
|
||||
\end{document}
|
||||
|
||||
27
header.tex
27
header.tex
@ -27,6 +27,10 @@
|
||||
\usepackage{biblatex}
|
||||
\usepackage{xparse}
|
||||
\usepackage{cprotect}
|
||||
\usepackage{titlesec}
|
||||
\usepackage{xpatch}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{amsfonts}
|
||||
|
||||
\usepackage{csquotes}
|
||||
\usepackage[lighttt]{lmodern}
|
||||
@ -86,9 +90,30 @@
|
||||
\DeclareMathOperator{\new}{\text{\textbf{new}}}
|
||||
\DeclareMathOperator{\CT}{CT}
|
||||
\DeclareRobustCommand{\leftsarrow}{\text{\reflectbox{$\;\rightarrow^*$}}}
|
||||
\newcommand\subclass{<:}
|
||||
\newcommand\subclass{\mathrel{<:}}
|
||||
\newcommand\superclass{\mathrel{:>}}
|
||||
\newcommand\OKin{\text{\textnormal{\textsc{ OK in }}}}
|
||||
|
||||
% Création des environnements spécifiques au document
|
||||
\newcounter{hyp}
|
||||
|
||||
\makeatletter
|
||||
\newif\if@mathitemize
|
||||
\newif\if@closemathitem
|
||||
\let\orig@item=\item
|
||||
\newenvironment{hypenumerate}{\enumerate}{\endenumerate}
|
||||
\newcommand{\hypitem}{\if@closemathitem$\fi\orig@item\if@mathitemize\@closemathitemtrue$\fi}
|
||||
\newenvironment{hyps}{\let\item\hypitem \@mathitemizetrue\hypenumerate\@closemathitemfalse}{$\endhypenumerate}
|
||||
\makeatother
|
||||
|
||||
|
||||
%%% Subparaghaphs box
|
||||
\newtcbox{\subparaghaphbox}{nobeforeafter,tcbox raise base, arc=9pt, outer arc=9pt, boxsep=2pt,left=2pt,right=2pt,top=2pt,bottom=2pt,boxrule=1pt,colback=white!85!orange}
|
||||
\newcommand{\subparaghaphboxedcontent}[1]{\subparaghaphbox{#1}\newline}
|
||||
\titleformat{\subparagraph}[runin]
|
||||
{\normalfont\normalsize\bfseries}{}{0em}{\subparaghaphboxedcontent}
|
||||
|
||||
\titlespacing*{\subparagraph}{0pt}{3.25ex plus 1ex minus .2ex}{0.5em}
|
||||
|
||||
%%% Blocs colorés pour le code FeatherweightJava
|
||||
\newtcbox{\fjmaincodebox}{nobeforeafter,tcbox raise base, arc=0pt, outer arc=0pt, boxsep=0pt,left=2pt,right=2pt,top=2pt,bottom=2pt,boxrule=0pt,colback=white!85!black}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user