stage-2022/DiaposSoutenance.tex

782 lines
27 KiB
TeX
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% !TeX spellcheck = fr_FR
\documentclass[12pt]{beamer}
% Loading packages
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bbm}
\usepackage{stmaryrd}
\usepackage[main=french,english]{babel}
\usepackage{csquotes}
\usepackage{listings}
\usepackage{lstautogobble}
\usepackage{algorithm2e}
\usepackage{svg}
\usepackage{tikz}
\usepackage{multirow}
\usepackage{multicol}
\usepackage{tcolorbox}
\usepackage{mdframed}
\usepackage{proof}
\usepackage{biblatex}
\usepackage{xparse}
\usepackage{cprotect}
\usepackage{xpatch}
\usepackage{enumitem}
\usepackage{amsfonts}
\usepackage{mathtools}
\usepackage{geometry}
\usepackage{subcaption}
\usepackage{csquotes}
\usepackage[lighttt]{lmodern}
\usetikzlibrary{shapes.geometric,positioning}
% Macros caractères globales
\newcommand{\pgrph}{\P}
\newcommand{\hsep}{\vspace{.2cm}\centerline{\rule{0.8\linewidth}{.05pt}}\vspace{.4cm}}
\renewcommand{\P}{\mathbb{P}}
\newcommand{\E}{\mathbb{E}}
\newcommand{\1}{\scalebox{1.2}{$\mathbbm{1}$}}
\newcommand{\floor}[1]{\left\lfloor#1\right\rfloor}
\newcommand{\littleO}{o}
\newcommand{\bigO}{\mathcal{O}}
\newcommand{\longdash}{\:\textrm{---}\:}
\newcommand\hole{\left[\raisebox{-0.25ex}{\scalebox{1.2}{$\cdot$}}\right]}
\newcommand\bracket[1]{\!\left[#1\right]}
\newcommand{\ssi}{\quad\text{\underline{ssi}}\quad}
\newcommand\eng[1]{\textit{\foreignlanguage{english}{#1}}}
\newcommand\spacebar{\;|\;}
\def\nDownarrow{\not\mspace{1mu}\Downarrow}
\let\pprec\preccurlyeq
\DeclareUnicodeCharacter{03BB}{$\lambda$}
\DeclareUnicodeCharacter{03B1}{$\alpha$}
\DeclareUnicodeCharacter{03C0}{$\pi$}
% Création des environnement globaux
\newtheorem{property}{Propriété}
\newcounter{rule}
% Commandes logiques globales
\newcommand{\ifnullthenelse}[3]{
\ifnum\value{#1}=0
#2
\else
#3
\fi
}
%%% Commande \newtag permettant de changer le label d'une equation
\makeatletter
\newcommand\newtag[2]{#1\def\@currentlabel{#1}\label{#2}}
\makeatother
% Macros caractères spécifiques au document
\newcommand{\methprec}[1]{\prec\mkern-8mu\left[\fj{#1}\right]}
\DeclareMathOperator{\varnull}{varnull}
\DeclareMathOperator{\nextop}{next}
\DeclareMathOperator{\new}{\text{\textbf{new}}}
\DeclareMathOperator{\CT}{CT}
\DeclareRobustCommand{\leftsarrow}{\text{\reflectbox{$\;\rightarrow^*$}}}
\newcommand\subclass{\mathrel{<:}}
\newcommand\superclass{\mathrel{:>}}
\newcommand\OKin{\text{\textnormal{\textsc{ OK in }}}}
% Création des environnements spécifiques au document
%%% 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}
\newtcbox{\fjind}{nobeforeafter,tcbox raise base, rounded corners=all, boxsep=0pt,left=1pt,right=1pt,top=1pt,bottom=1pt,boxrule=0pt,colback=white!52!orange}
\newenvironment{fjlisting}[1][]
{
\begin{tcolorbox}[left=5pt,right=2pt,top=5pt,bottom=5pt,boxrule=1pt,rounded corners=all,colback=white!96!black,#1]
\ttfamily
}{
\end{tcolorbox}
}
% Langage Featherweight Java
\makeatletter
\newcommand*\idstyle{%
\expandafter\id@style\the\lst@token\relax
}
\def\id@style#1#2\relax{%
\ifcat#1\relax\else
\ifnum`#1=\lccode`#1%
\ttfamily
\fi
\fi
}
\makeatother
\lstdefinelanguage{FeatherweightJava}{
keywords = {new, this, true, false},
basicstyle=\ttfamily,
identifierstyle=\idstyle,
literate=%
{à}{{\`a}}1
{é}{{\'e}}1
{è}{{\`e}}1
{ù}{{\`u}}1
}
\lstset{literate=%
{à}{{\`a}}1
{é}{{\'e}}1
{è}{{\`e}}1
{ù}{{\`u}}1}
%% Commande 4
\NewDocumentEnvironment{textenv}{b}{\text{\textnormal{#1}}}{}
%\lstMakeShortInline[language=FeatherweightJava]|
\newcommand{\fj}[1]{\begin{textenv}\lstinline[language=FeatherweightJava,mathescape=true]~#1~\end{textenv}}
% Définition des macros pour l'écriture des trucs Featherweight Java
\newcommand\fjattr{\GenericWarning{$\backslash$ fjattr doit être utilisé dans une fjclass}}
\newcounter{fjargcount}
\newcommand{\fjparamattributes}[2][Object]{
\null\qquad #1 #2;\newline
}
\newcommand{\printcomma}{,}
\newcommand{\fjparamconstparameters}[2][Object]{
\ifnullthenelse{fjargcount}{}{,$\text{ }$} \text{#1} \;\text{#2}
\stepcounter{fjargcount}
}
\newcommand{\fjparamconstassign}[2][Object]{
\null\qquad\qquad \textbf{this}.#2 = #2;\newline
}
\newcommand{\fjmethod}[4]{
\null\qquad #1 #2(#3)\{\newline
\null\qquad\qquad \textbf{return} \lstinline[language=FeatherweightJava]{#4};\newline
\null\qquad\}\newline
}
\newcommand{\fjmain}[1]{
\noindent\fjmaincodebox{\lstinline[language=Java]{#1}}
}
% Premier argument: Nom de la classe
% Second argument: \fjattr{x}[Object] \fjattr{attr}[A]
% Troisième argument \fjmethod{C}{metname}{Object w, B par}{((D)obj).apply(par)} plusieurs fois
% Argument optionnel: la classe que l'on extend
\newcommand{\fjclass}[4][Object]{%
\noindent \textbf{class} #2 \textbf{extends} #1 \{\newline
% Attributs
\let\fjattr\fjparamattributes
#3
% Constructeur
\let\fjattr\fjparamconstparameters
\setcounter{fjargcount}{0}
\null\qquad #2(\ifx&#3&\else $#3$\fi) \{\newline
\null\qquad\qquad \textbf{super}();\newline
\let\fjattr\fjparamconstassign%
#3
\null\qquad\}\\
% Méthodes
#4
\}
}
\addbibresource{Bilibibio.bib}
\usetheme{Madrid}
\hypersetup{pdfpagemode=FullScreen}
% Transition en fade-in par défaut
\addtobeamertemplate{background canvas}{\transfade[duration=0.4]}{}
\addtobeamertemplate{frametitle}{
\let\insertframetitle\insertsubsectionhead}{}
\makeatletter
\CheckCommand*\beamer@checkframetitle{\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\renewcommand*\beamer@checkframetitle{\global\let\beamer@frametitle\relax\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\makeatother
\author{Samy Avrillon}
\title{Définition d'un préordre sur les programmes Featherweight Java}
\subtitle{Notes sur mon stage au LACL}
\logo{\includesvg[width=1.5cm]{logoEns}}
\institute{ENS de Lyon}
\begin{document}
\begin{frame}[plain]
\maketitle
\end{frame}
\section*{Sommaire}
\begin{frame}
\begin{multicols}{2}
\tableofcontents[pausesections,hideallsubsections]
\end{multicols}
\end{frame}
\section{Introduction}
\section{Featherweight Java}
\subsection{Sa grammaire}
\begin{frame}
\begin{center}
\refstepcounter{rule}
\begin{tabular}{rll}
$e$ $:=$ & \fj{x} & \qquad \textrm{\textsc{E-Var}} \\
| & \fj{new C($\overline{e}$)} & \qquad \newtag{\textrm{\textsc{E-Cstr}}}{rule:expr:constructor} \\
| & \fj{$e$.f} & \qquad \newtag{\textrm{\textsc{E-Field}}}{rule:expr:field} \\
| & \fj{$e$.m($\overline{e}$)} & \qquad \newtag{\textrm{\textsc{E-Meth}}}{rule:expr:method} \\
| & \fj{(C)$e$} & \qquad \newtag{\textrm{\textsc{E-Cast}}}{rule:expr:cast}
\end{tabular}
\end{center}
\[\fj{new Paire((D)new B().get(), new C(new A())).snd.apply()}\]
\end{frame}
\subsection{Ses structures}
\begin{frame}
\begin{fjlisting}
\textbf{class} A \textbf{extends} Object \{...\}\\
\textbf{class} B \textbf{extends} Object \{...\}\\
\fjclass{Paire}{\fjattr{fst} \fjattr{snd}}{}\\
\pause
\fjmain{new Paire(new A(), new B())}
\end{fjlisting}
\end{frame}
\subsection{Sa réduction}
\begin{frame}
\begin{itemize}
\item $\fj{new C(e1,e2,...,en).field} \rightarrow \fj{ek}$ (\textsc{R-Field})
\item $\fj{new C(e1,e2,...,en).meth(f1,f2,...,fn)} \rightarrow e_{\fj{C.meth}}\bracket{\fj{new C(e1,e2,...,en)}\middle/ \fj{this},\fj{f1}\middle/\fj{x1},\fj{f2}\middle/\fj{x2},...,\fj{fn}\middle/\fj{xn}}$ (\textsc{R-Invk})
\item $\fj{(C) expr} \rightarrow \fj{expr}$ (\textsc{R-Cast})
\end{itemize}
\end{frame}
\subsection{Son typage}
\begin{frame}
\[\infer
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{x} : \Gamma(\fj{x})}
{\fj{x} \in \Gamma}
\]\[
\infer
{\mathfrak{T},\mathcal{B},\Gamma \Vdash \fj{$e$.f} : \fj{C}}
{\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{Cc} \quad \fj{C}\;\fj{f} \in \operatorname{fields}(\fj{Cc})}
\]\[
\infer
{\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{Cc} \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{Cc}) = \overline{\fj{D}} \rightarrow \fj{C} \end{array}}
\]\[
\infer
{\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}}}
{\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}}
\]\[
\infer
{\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}}
\]
\end{frame}
\section{Notre problème}
\subsection{Qu'est-ce qu'une équivalence}
\begin{frame}
\begin{itemize}
\item Deux programmes «font la même chose»
\item Assez stricte
\item Assez large
\end{itemize}
\begin{itemize}
\item Utiliser un autre algorithme (complexités)
\item Utiliser une version plus sécurisée
\item Effectuer une optimisation
\end{itemize}
\end{frame}
\subsection{La méthode classique}
\begin{frame}
\[C\]
\[C\bracket{P}\]
\[P \prec Q \iff \forall C\quad C\bracket{P} \implies C\bracket{Q}\]
\[P \equiv Q \iff P \prec Q \land Q \prec P\]
\end{frame}
\section{Équivalences simples}
\subsection{Expressions à trou}
\begin{frame}
\[h := \hole \spacebar \fj{new C($\overline{e}$,$h$,$\overline{e}$)} \spacebar \fj{$h$.f} \spacebar \fj{$h$.m($\overline{e}$)} \spacebar \fj{$e$.m($\overline{e}$,$h$,$\overline{e}$)} \spacebar \fj{(C) $h$}\]
\pause
\begin{align*}
\hole[e] &= e\\
(\fj{new C($\overline{e_1}$,$h$,$\overline{e_2}$)})[e] &= \fj{new C($\overline{e_1}$,$h[e]$,$\overline{e_2}$)}\\
(\fj{$h$.f})[e] &= \fj{$h[e]$.f}\\
(\fj{$h$.m($\overline{e_1}$)})[e] &= \fj{$h[e]$.m($\overline{e_1}$)}\\
(\fj{$e_1$.m($\overline{e_2}$,$h$,$\overline{e_3}$)})[e] &= \fj{$e_1$.m($\overline{e_2}$,$h[e]$,$\overline{e_3}$)}\\
(\fj{(C) $h$})[e] &= \fj{(C) $h[e]$}
\end{align*}
\end{frame}
\begin{frame}
\[C = h \qquad C\bracket{P} = (\mathcal{A},h\bracket{e})\]
\pause
\begin{fjlisting}
class A \{\}\\
class B \{\}\\
...\\
\only<2>{\fjmain{expr}}
\only<3>{\fjmain{expr.field}}
\only<4>{\fjmain{expr.meth()}}
\only<5>{\fjmain{new Z().meth(expr)}}
\only<6>{\fjmain{new K(expr).snd}}
\only<7>{\fjmain{new K().snd.get(expr.snd)}}
\end{fjlisting}
\end{frame}
\subsection{Premier problème}
\begin{frame}
\begin{tcolorbox}
\small
\lstinputlisting[language=FeatherweightJava,breaklines=true,linerange=1-8]{NeedTestCT.java}
\}
\end{tcolorbox}
\end{frame}
\begin{frame}
\begin{tcolorbox}
\small
\lstinputlisting[language=FeatherweightJava,breaklines=true,linerange={1-4,9-13}]{NeedTestCT.java}
\end{tcolorbox}
\end{frame}
\subsection{Second problème}
\begin{frame}
\[\forall e \exists h \forall p \quad h\bracket{p} \rightarrow^*e\]
\begin{tcolorbox}
\begin{center}
$\fj{new Paire($\hole$,$e$).snd} \rightarrow e$
\end{center}
\end{tcolorbox}
\[\fj{new C(new D(...), ..., new E(...))}\]
\end{frame}
\subsection{Tentatives de correction}
\begin{frame}
\begin{itemize}
\item Ajout d'une \eng{class table} de test
\item Restreindre les \eng{class tables}
\end{itemize}
\[\mathcal{A} \prec \mathcal{B} \iff \forall e \forall v \quad (\mathcal{A},e)\Downarrow v \implies (\mathcal{B},e)\Downarrow v\]
\[C\bracket{P} = (\mathcal{C}, h\bracket{e})\qquad \underline{\text{si } \mathcal{A} \prec \mathcal{C}}\]
\begin{tcolorbox}
\[P = (\mathcal{A}, e_P) \prec Q = (\mathcal{B}, e_Q) \ssi\]
\[\forall C=(\mathcal{C}, e_C)\quad
\begin{dcases}\mathcal{A} \prec \mathcal{C}\\ \mathcal{B} \prec \mathcal{C} \\
\forall v\quad C\bracket{P}\Downarrow v \implies C\bracket{Q}\Downarrow v\end{dcases} \]
\end{tcolorbox}
\end{frame}
\begin{frame}
\begin{multicols}{2}
\begin{fjlisting}
\fjclass{Get}{
\fjattr[A]{a}
\fjattr[B]{b}
}{
\fjmethod{Object}{get}{}{this.a}
}
\end{fjlisting}
\columnbreak
\begin{fjlisting}
\fjclass{Get}{
\fjattr[A]{a}
\fjattr[B]{b}
}{
\fjmethod{Object}{get}{}{this.b}
}
\end{fjlisting}
\end{multicols}
\end{frame}
\begin{frame}
\[\begin{array}{c}
e_A = \fj{(A)(new Get(new A(), new B()).get())} \\
e_B = \fj{(B)(new Get(new A(), new B()).get())}
\end{array}\]
\[\begin{array}{cc}
(CL_A,e_A)\Downarrow \new A()& (CL_A,e_B)\nDownarrow \\
(CL_B,e_A)\nDownarrow & (CL_B,e_B)\Downarrow \new B()
\end{array}\]
\end{frame}
\section{Idée d'une nouvelle structure}
\subsection{Comparer uniquement les CT}
\begin{frame}
\begin{center}
\begin{multicols}{2}
\null\vfill
\begin{fjlisting}[width=.49\textwidth]
\textbf{class} XXX \textbf{extends} XXX \{\}\\
\vdots\\
\fjmain{expression}
\end{fjlisting}
\vfill\null
\columnbreak
\begin{fjlisting}[width=.49\textwidth]
\textbf{class} XXX \textbf{extends} XXX \{\\
\}\\
\vdots\\
\textbf{class} Main \{\\
\fjmethod{Object}{main}{}{expr}
\}
\end{fjlisting}
\end{multicols}
\end{center}
\[\fj{new Main().main()}\rightarrow \fj{expr}\]
\end{frame}
\subsection{Idées d'une structure}
\begin{frame}
\begin{itemize}
\item Besoin de restreindre les contextes
\item Empêcher au test d'accéder à tout
\item Utiliser un mécanisme déjà là
\item Inspiration: \eng{header file} en C
\end{itemize}
\end{frame}
\subsection{Exemple et théorème}
\begin{frame}
\begin{fjlisting}
Number \{\}\\\null
Int \{\}\\
Int : Int suivant(Int)\\
Int : Int add(Int,Int)\\
Int <: Number\\\null
\end{fjlisting}
\end{frame}
\begin{frame}
\begin{fjlisting}
Frac(Int numerateur, Int denominateur)\\
Frac : Frac inverted()\\
Frac : Int floor()\\
Frac <: Number\\\null
RichInt \{Int value\}\\
RichInt : Int getInt()\\
RichInt <: Int
\end{fjlisting}
\end{frame}
\begin{frame}
\begin{itemize}
\item Opérateur d'implémentation ($\triangleright$)
\item Typage avec la TI ($\Vdash$)
\item Validation d'une CT dans une TI
\end{itemize}
\begin{theorem}
\begin{itemize}
\item $\mathcal{A} \triangleright \mathfrak{T}$
\item $\mathcal{B} \OKin \mathfrak{T}$
\item $\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{D}$
\end{itemize}
\[\mathcal{A} \oplus \mathcal{B},\Gamma \vdash e : \fj{C}\quad\text{et}\quad\fj{C} \subclass \fj{D}\]
\end{theorem}
\end{frame}
\section{Formalisation des \eng{test interfaces}}
\subsection{Leur grammaire}
\begin{frame}
\begin{tcolorbox}[left=5pt,right=2pt,top=5pt,bottom=5pt,boxrule=1pt,rounded corners=all,colback=white!92!blue]
\begin{center}
\refstepcounter{rule}
\begin{tabular}{rll}
TR := & C : C m($\overline{\fj{C}}$) & \qquad \newtag{\textrm{\textsc{TIG-Meth}}}{rule:tsg:method} \\
| & C \{$\overline{\fj{C}}$ $\overline{\fj{f}}$\} & \qquad \newtag{\textrm{\textsc{TIG-Attr}}}{rule:tsg:attributes} \\
| & C ($\overline{\fj{C}}$ $\overline{\fj{?}\fj{f}}$) & \qquad \newtag{\textrm{\textsc{TIG-Cstr}}}{rule:tsg:constructor} \\
| & C <: C & \qquad \newtag{\textrm{\textsc{TIG-Cast}}}{rule:tsg:cast}
\end{tabular}
\end{center}
\end{tcolorbox}
\begin{itemize}
\item Chaque nom de classe est défini au plus une fois par ou bien une \autoref{rule:tsg:attributes} ou bien une \autoref{rule:tsg:constructor}.
\item Chaque nom de methode est défini au plus une fois par nom de classe par une \autoref{rule:tsg:method}.
\item Les noms de classe utilisés sont définis (sauf éventuellement \fj{Object}).
\end{itemize}
\end{frame}
\subsection{L'opérateur d'implémentation}
\begin{frame}
\begin{exampleblock}{}
\infer
{\mathcal{A} \triangleright \left[\fj{C : G m($\overline{\texttt{F}}$)}\right]}
{
\operatorname{mtype}_\mathcal{A}(\fj{m},\fj{C}) = \fj{$\overline{\texttt{E}}$} \rightarrow \fj{H}
\quad \overline{\fj{F}}\subclass_\mathcal{A}\overline{\fj{E}}
\quad \fj{H}\subclass_\mathcal{A}\fj{G}
}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\mathcal{A} \triangleright \left[\fj{ C \{ $\overline{\texttt{E}}\;\overline{\texttt{f}}$\}}\right]}
{
\overline{\fj{F}}\;\overline{\fj{f}} \subset \operatorname{fields}_\mathcal{A}(C)
\quad \overline{\fj{F}}\subclass_\mathcal{A}\overline{\fj{E}}
}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\mathcal{A} \triangleright \left[\fj{ C ( $\overline{\texttt{E}}\;\overline{\texttt{f}}$)}\right]}
{\begin{array}{l}
\exists \overline{\fj{f'}}\quad \overline{\fj{f0}} = \overline{\fj{f}}\boxplus\overline{\fj{f'}} \\
\overline{\fj{F}} = \overline{\fj{E}} \quad\text{\fj{f} est défini} \\
\overline{\fj{E}} \subclass \overline{\fj{F}} \quad \land \quad
\overline{\fj{F}}\;\overline{\fj{f0}} = \operatorname{fields}_\mathcal{A}(C)
\end{array}
}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\mathcal{A} \triangleright \left[\fj{C} \subclass \fj{D}\right]}
{\fj{C} \subclass_\mathcal{A} \fj{D}}
\end{exampleblock}
\end{frame}
\subsection{Nouvelles applications de \eng{lookup}}
\begin{frame}
\ttfamily
\begin{center}
\begin{multicols}{2}
\begin{exampleblock}{}
\infer
{\operatorname{construct}(\fj{C}) = \overline{\fj{D}}}
{\left[\fj{C($\overline{\texttt{D}}\;\overline{\texttt{?f}}$)}\right] \in \mathfrak{T}}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\operatorname{construct}(\fj{C}) = \overline{\fj{D}}}
{\fj{class C\{C($\overline{\texttt{D}}\;\overline{\texttt{f}}$)\{...\} ... \}}\in \mathcal{B}}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\operatorname{fields}(\fj{C}) = \overline{\fj{D}}\;\overline{\fj{f}} + \bigcup_{C \subclass E}\operatorname{fields}(\fj{E})}
{\left[\fj{ C \{ $\overline{\texttt{D}}\;\overline{\texttt{f}}$\}}\right] \in \mathfrak{T}}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\operatorname{fields}(\fj{C}) = \underbrace{\overline{\fj{D}}\;\overline{\fj{f}}}_{\text{\textrm{pour \fj{f} défini}}} + \bigcup_{C \subclass E}\operatorname{fields}(\fj{E})}
{\left[\fj{ C ( $\overline{\texttt{D}}\;\overline{\texttt{f}}$)}\right] \in \mathfrak{T}}
\end{exampleblock}
\begin{exampleblock}{}
\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{B}}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}}\rightarrow\fj{E}}
{\left[\fj{ C : E m( $\overline{\texttt{D}}$)}\right] \in \mathfrak{T}}
\end{exampleblock}
\begin{exampleblock}{}
\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{B}}
\end{exampleblock}
\begin{exampleblock}{}
\infer
{\operatorname{mtype}(\fj{m},\fj{C}) = \overline{\fj{D}}\rightarrow\fj{E}}
{\operatorname{mtype}(\fj{m},\fj{C'}) = \overline{\fj{D}}\rightarrow\fj{E}\quad \fj{C} \subclass \fj{C'}}
\end{exampleblock}
\end{multicols}
\end{center}
\end{frame}
\subsection{Nouveau typage}
\begin{frame}
\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{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{B},\Gamma \Vdash \fj{$e$.f} : \fj{C}}
{\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{Cc} \quad \fj{C}\;\fj{f} \in \operatorname{fields}(\fj{Cc})}
& \newtag{\textrm{\textsc{(TI-Field)}}}{rule:ti:field}
\\[3ex]
\infer
{\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{Cc} \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{Cc}) = \overline{\fj{D}} \rightarrow \fj{C} \end{array}}
& \newtag{\textrm{\textsc{(TI-Invk)}}}{rule:ti:invoke}
\\[3ex]
\infer
{\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{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}
\\[3ex]
\infer
{\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}
\end{tabular}
\end{tcolorbox}
\end{frame}
\subsection{Théorème de cohérence}
\begin{frame}
\begin{theorem}
\label{thm:tiTyp}
Soit une \eng{test interface} $\mathfrak{T}$, une \eng{class table} $\mathcal{A}$, un couple $(\mathcal{B},e)$ \eng{class table} $\times$ expression fermée appelée \enquote{test}, et un environnement de typage $\Gamma$ vérifiant
\begin{itemize}
\item $\mathcal{A} \triangleright \mathfrak{T}$
\item $\mathcal{B} \OKin \mathfrak{T}$
\item $\mathfrak{T},\mathcal{B},\Gamma \Vdash e : \fj{D}$
\end{itemize}
Alors il existe \fj{C} tel que $\mathcal{A} \oplus \mathcal{B},\Gamma \vdash e : \fj{C}$ et $\fj{C} \subclass \fj{D}$.
\end{theorem}
\end{frame}
\subsection{Définition du préordre}
\begin{frame}
\begin{definition}
Soit une \eng{test interface} $\mathfrak{T}$.
Soient deux \eng{class tables} $\mathcal{A}$ et $\mathcal{B}$ qui implémentent toutes deux $\mathfrak{T}$
Alors
\[\mathcal{A} \prec_\mathfrak{T} \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\]
$\mathcal{A} \oplus \mathcal{B}$ dénote l'ensemble des classes de $\mathcal{A}$ auquel on a ajouté les classes de $\mathcal{B}$ dont les noms n'étaient pas déjà dans $\mathcal{A}$.
\end{definition}
\end{frame}
\section{Les valeurs infinies}
\subsection{Qu'est-ce qu'un context lemma}
\begin{frame}
\[(\mathcal{A},e)\prec(\mathcal{B},f) \implies (\mathcal{A},h\bracket{e})\prec(\mathcal{A},h\bracket{f})\]
\end{frame}
\subsection{Pourquoi est-il faux ici}
\begin{frame}
\begin{fjlisting}
public Static \{\\
\fjmethod{IList}{intList}{Int i}{new IList(i, intList(i+1))}
\fjmethod{IList}{zeroList}{}{new IList(0, zeroList())}
\}
\end{fjlisting}
\[e_i = \fj{intList(0)} \quad\text{et}\quad e_0 = \fj{zeroList()}\]
\end{frame}
\begin{frame}
\[
\begin{array}{rcl}
h\bracket{e_i} &=& \fj{intList(0).next.obj}\\
&\rightarrow& \fj{new IList(0, intList(0+1)).next.obj}\\
&\rightarrow& \fj{intList(0+1).obj}\\
&\rightarrow& \fj{new IList(0+1, intList(0+1+1)).obj}\\
&\rightarrow& \fj{0+1}\\
&\rightarrow^{\!*}& \fj{1}\\
h\bracket{e_0} &=& \fj{zeroList().next.obj}\\
&\rightarrow& \fj{new IList(0, zeroList()).next.obj}\\
&\rightarrow& \fj{zeroList().obj}\\
&\rightarrow& \fj{new IList(0, zeroList()).obj}\\
&\rightarrow& \fj{0}
\end{array}
\]
\end{frame}
\subsection{Idée de valeurs infinies}
\subsection{Explication de la formalisation}
\begin{frame}
\textsc{E-Var} et \textsc{E-Cstr}
\[\fj{new C(x,new S(new S(y,new G()),z))}\]
\[(\mathcal{A},e)\pprec(\mathcal{B},f) \ssi \forall \hbar \forall \alpha \quad \left(e \rightarrow_\mathcal{A}^* \hbar\bracket{\alpha} \implies \exists \beta\quad f \rightarrow_\mathcal{B}^* \hbar\bracket{\beta}\right)\]
\end{frame}
\subsection{Redéfinition des préordres}
\begin{frame}
\[\mathcal{A}\pprec\mathcal{B} \ssi \forall e \quad (\mathcal{A},e) \pprec (\mathcal{B},e)\]
\end{frame}
\subsection{Propriétés}
\begin{frame}
\begin{property}
\[\forall \hbar \forall \alpha \quad \hbar\bracket{\alpha}\rightarrow^* e' \implies \exists \beta\quad e' = \hbar\bracket{\beta}\]
\end{property}
\begin{property}
\[\mathcal{A} \pprec \mathcal{B} \implies \mathcal{A} \prec \mathcal{B}\]
\end{property}
\begin{property}[Context Lemma]
\begin{gather*}
\forall \mathcal{A} \quad\forall e,f \quad\forall (h,\mathcal{B})\\
(e,\mathcal{A})\pprec(f,\mathcal{B}) \implies (h[e],\mathcal{A} \oplus \mathcal{B})\pprec(h[f],\mathcal{A}\oplus\mathcal{B})
\end{gather*}
\end{property}
\end{frame}
\section{Exemple concret}
\begin{frame}
\begin{tcolorbox}
\lstinputlisting[language=Java,breaklines=true,linerange={2-26}]{FinalExample.java}
\lstinputlisting[language=Java,breaklines=true,linerange={29-62}, texcl]{FinalExample.java}
\lstinputlisting[language=FeatherweightJava,breaklines=true,linerange={65-78}]{FinalExample.java}
\end{tcolorbox}
\end{frame}
\section{Conclusion}
\begin{frame}
\begin{tcolorbox}
\begin{itemize}
\item On a créé un préordre
\item Assez puissant (sémantique)
\item Assez tolérant
\item Context Lemma
\item Utilisable autre part
\end{itemize}
\end{tcolorbox}
\begin{tcolorbox}
\begin{itemize}
\item Comparer uniquement certains types de retour
\item Théorèmes pour simplifier l'équivalence
\end{itemize}
\end{tcolorbox}
\end{frame}
\begin{frame}
\LARGE\[\mathfrak{FIN}\]
\end{frame}
\end{document}