Ajout du diapo pour la soutenance.
This commit is contained in:
parent
43839abed3
commit
741155f474
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
||||
build/
|
||||
svg-inkscape/
|
||||
|
||||
782
DiaposSoutenance.tex
Normal file
782
DiaposSoutenance.tex
Normal file
@ -0,0 +1,782 @@
|
||||
% !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&\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{où \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\]
|
||||
|
||||
où $\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}
|
||||
19
logoEns.svg
Normal file
19
logoEns.svg
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="575.86176"
|
||||
height="197.8877"
|
||||
id="svg4656">
|
||||
<defs
|
||||
id="defs4658" />
|
||||
<g
|
||||
transform="translate(-62.06913,-433.41833)"
|
||||
id="layer1">
|
||||
<path
|
||||
d="m 605.19182,591.17738 4.30134,0 17.5692,30.37576 0.0975,0 0,-30.37576 3.41116,0 0,34.5341 -4.6002,0 -17.2703,-29.78445 -0.0975,0 0,29.78445 -3.41116,0 0,-34.5341 z m -21.66391,-0.59452 c 10.38297,0 15.28858,8.50522 15.18464,17.86159 -0.0908,10.59088 -5.23696,17.86158 -15.18464,17.86158 -9.94762,0 -15.08714,-7.2707 -15.19757,-17.86158 -0.0908,-9.35637 4.80161,-17.86159 15.19757,-17.86159 m -11.77341,17.86159 c 0,7.32268 3.65807,14.89225 11.77341,14.89225 8.11537,0 11.77344,-7.56957 11.77344,-14.89225 0,-7.32266 -3.65807,-14.89223 -11.77344,-14.89223 -8.11534,0 -11.77341,7.56957 -11.77341,14.89223 m -22.91078,2.62303 -12.81306,-19.88878 3.95697,0 10.54543,16.87397 10.83129,-16.87397 3.71003,0 -12.81301,19.88878 0,14.64534 -3.41767,0 0,-14.64534 z m -25.93144,-19.8901 3.41767,0 0,31.56477 13.8526,0 0,2.96933 -17.27027,0 0,-34.5341 z m -38.19095,0 16.92596,0 0,2.96933 -13.50823,0 0,12.31925 12.81304,0 0,2.96936 -12.81304,0 0,13.30683 14.09954,0 0,2.96933 -17.51724,0 0,-34.5341 z m -33.2898,0 8.55714,0 c 12.37127,0 17.27034,7.12126 17.27034,17.21832 0,12.51417 -8.36225,17.31578 -19.7913,17.31578 l -6.03618,0 0,-34.5341 z m 3.41116,31.56477 2.81992,0 c 9.79823,0 16.17872,-3.95697 16.17872,-14.54134 0,-10.54541 -6.28309,-14.0541 -13.99556,-14.0541 l -5.00308,0 0,28.59544 z m -42.54613,-1.43268 c 2.0272,1.2865 4.40531,2.02723 7.62155,2.02723 4.25583,0 7.76449,-2.17668 7.76449,-7.07578 0,-6.77685 -15.83439,-7.61507 -15.83439,-16.67254 0,-5.54234 4.85363,-9.00552 10.93523,-9.00552 1.68289,0 4.40534,0.24694 6.78339,1.13706 l -0.54577,3.11881 c -1.53339,-0.83819 -3.95697,-1.28651 -6.28304,-1.28651 -3.56718,0 -7.47861,1.48791 -7.47861,5.9387 0,6.92633 15.8408,6.97177 15.8408,17.0689 0,6.97825 -5.99065,9.74621 -11.33806,9.74621 -3.35921,0 -5.97769,-0.69525 -7.81647,-1.48146 l 0.35099,-3.5151 z m -32.49978,-30.13209 4.30785,0 17.56269,30.37576 0.0975,0 0,-30.37576 3.41117,0 0,34.5341 -4.60021,0 -17.2703,-29.78445 -0.0908,0 0,29.78445 -3.4177,0 0,-34.5341 z m -24.29342,0 16.91942,0 0,2.96933 -13.50175,0 0,12.31925 12.81304,0 0,2.96936 -12.81304,0 0,13.30683 14.09954,0 0,2.96933 -17.51721,0 0,-34.5341 z m 210.14613,-53.35862 22.93608,0 44.34531,0 c 0,16.99091 -14.7818,25.48313 -44.34531,25.48313 l -128.44222,0 0,-25.48313 105.50614,0 z m -61.15432,-99.39844 19.8758,0 108.55991,0 0,25.48958 -108.55991,0 -64.22762,0 c 0,-16.99091 14.78828,-25.48958 44.35182,-25.48958 m 128.43571,74.42214 -172.78753,0 0,-24.97633 172.78753,0 0,24.97633 z m -369.63264,-74.42413 41.79181,0 22.94261,0 44.34535,0 19.86925,0 c 29.22568,0 43.83203,8.50522 43.83203,25.48964 l -43.83203,0 -64.2146,0 -64.73442,0 0,-25.48964 z m 0,49.44585 44.85212,0 0,24.97635 -44.85212,0 0,-24.97635 z m 44.85212,49.95265 0,25.48311 -44.85212,0.25978 0,-25.743 44.85212,0 z m 84.0969,-49.95265 44.09193,0 0,24.97635 -44.09193,0 0,-24.97635 z m 0,49.95265 43.83203,0 0,25.48311 -43.83203,0 0,-25.48311 z m -325.17813,-99.3985 44.85209,0 19.88231,0 44.3388,0 19.88228,0 43.82554,0 0,25.48964 -43.82554,0 -64.22108,0 -64.7344,0 0,-25.48964 z m 0,74.4222 0,-24.97635 44.85209,0 19.88231,0 44.3388,0 19.88228,0 44.08544,0 0,24.97635 -44.08544,0 -64.22108,0 -64.7344,0 z m 44.85209,24.9763 19.88231,0 44.3388,0 19.88228,0 43.82554,0 0,25.48311 -43.82554,0 -64.22108,0 -64.7344,0 0,-25.48311 44.85209,0 z"
|
||||
id="path666"
|
||||
style="fill:#1a171b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
Loading…
x
Reference in New Issue
Block a user