summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2023-12-16 12:39:20 +0100
committerDavid A. Madore <david+git@madore.org>2023-12-16 12:39:20 +0100
commit10782eec65fcddacdfe7a6e1a960e947c3726f47 (patch)
tree38199b077597239c73e73a0de73cca30e92d02b6
parent1823ab864441047c75185e61b772cee1299c39ec (diff)
downloadinf110-lfi-10782eec65fcddacdfe7a6e1a960e947c3726f47.tar.gz
inf110-lfi-10782eec65fcddacdfe7a6e1a960e947c3726f47.tar.bz2
inf110-lfi-10782eec65fcddacdfe7a6e1a960e947c3726f47.zip
Description of the unification phase of Hindley-Milner.
-rw-r--r--transp-inf110-02-typage.tex36
1 files changed, 35 insertions, 1 deletions
diff --git a/transp-inf110-02-typage.tex b/transp-inf110-02-typage.tex
index b0d3028..653b8bb 100644
--- a/transp-inf110-02-typage.tex
+++ b/transp-inf110-02-typage.tex
@@ -4796,7 +4796,7 @@ autres se dérivent par substitution.
\end{frame}
%
\begin{frame}
-\frametitle{Collection des contraintes}
+\frametitle{Première phase : collection des contraintes}
La première phase de l'algorithme de H-M fonctionne comme la
vérification de type du $\lambda$CST
@@ -4858,4 +4858,38 @@ et on renvoie finalement le type $\eta_1 \to \eta_2$.
\end{frame}
%
+\begin{frame}
+\frametitle{Seconde phase : résolution des contraintes}
+
+L'algorithme d'\textbf{unification} prend en entrée un ensemble
+$\mathscr{C}$ de contraintes (équations $\zeta_1 = \zeta_2$ avec
+$\zeta_1,\zeta_2$ deux types) et renvoie une \textbf{substitution} des
+variables de type ($\{\eta \mapsto \tau\}$ avec $\eta$ des variables
+de type et $\tau$ des types \alert{ne faisant pas intervenir} les
+variables substituées) qui vérifie les contraintes, ou « échec » :
+
+\medskip
+
+\itempoint Si $\mathscr{C}$ est vide, renvoyer la substitution vide.
+
+\smallskip
+
+\itempoint Sinon, soit $\zeta_1 = \zeta_2$ une contrainte, et
+$\mathscr{C}' := \mathscr{C} \setminus \{(\zeta_1 = \zeta_2)\}$ le
+reste des contraintes :
+\begin{itemize}
+\item si $\zeta_1 = \zeta_2$ déjà, unifier $\mathscr{C}'$,
+\item si $\zeta_1$ est une \alert{variable} de type $\eta$ :
+ \alert{si} $\zeta_2$ ne fait pas intervenir $\eta$, ajouter $\eta
+ \mapsto \zeta_2$ à la substitution, et unifier $\mathscr{C}'$ où
+ $\eta$ est remplacé par $\zeta_2$ ; \alert{sinon}, \alert{échouer}
+ (« type récursif ») ;
+\item si $\zeta_2$ est une variable de type : symétriquement ;
+\item sinon, $\zeta_1 = (\xi_1 \to \chi_1)$ et $\zeta_2 = (\xi_2 \to
+ \chi_2)$ : unifier $\mathscr{C}'' := \mathscr{C}' \cup \{(\xi_1 =
+ \xi_2), (\chi_1 = \chi_2)\}$.
+\end{itemize}
+
+\end{frame}
+%
\end{document}