diff options
-rw-r--r-- | notes-inf105.tex | 135 |
1 files changed, 83 insertions, 52 deletions
diff --git a/notes-inf105.tex b/notes-inf105.tex index 5c75960..ea0ece6 100644 --- a/notes-inf105.tex +++ b/notes-inf105.tex @@ -151,17 +151,17 @@ sorte de guillemet pour délimiter les chaînes de caractères : on écrira donc \texttt{\char`\"foobar\char`\"} pour parler du mot en question. Dans ces notes, nous utiliserons peu cette convention.) -L'ensemble des mots sur un alphabet $\Sigma$ est généralement -désigné $\Sigma^*$ (on verra que l'étoile fait partie d'un usage plus -général qui sera défini ci-dessous). Par exemple, si $\Sigma = -\{0,1\}$, alors $\Sigma^*$ est l'ensemble (infini !) dont les éléments -sont toutes les suites finies binaires (=suites finies de $0$ et -de $1$). +L'ensemble des mots sur un alphabet $\Sigma$ sera désigné $\Sigma^*$ +(on verra en \ref{kleene-star} ci-dessous cette notation comme un cas +particulier d'une construction « étoile » plus générale). Par +exemple, si $\Sigma = \{0,1\}$, alors $\Sigma^*$ est l'ensemble +(infini !) dont les éléments sont toutes les suites finies binaires +(=suites finies de $0$ et de $1$). \thingy Le nombre $n$ de lettres dans un mot $w \in \Sigma^*$ est appelé la \textbf{longueur} du mot, et généralement notée $|w|$ ou bien $\ell(w)$ : autrement dit, si $x_1,\ldots,x_n \in \Sigma$, alors -la longueur $\ell(x_1\cdots x_n)$ du mot $x_1\cdots x_n$, vaut $n$. +la longueur $|x_1\cdots x_n|$ du mot $x_1\cdots x_n$, vaut $n$. Ceci coïncide bien avec la notion usuelle de longueur d'une chaîne de caractères en informatique. À titre d'exemple, sur l'alphabet $\Sigma=\{a,b,c,d\}$, la longueur du mot $abbcab$ vaut $6$ (on écrira @@ -193,7 +193,8 @@ guillemets.) La notation $\Sigma^+$ est parfois utilisée pour désigner l'ensemble des mots \emph{non vides} sur l'alphabet $\Sigma$ (par opposition à $\Sigma^*$ qui désigne l'ensemble de tous les mots, y compris le mot -vide). +vide) ; on verra en \ref{kleene-plus} ci-dessous que c'est un cas +particulier d'une construction plus générale. \thingy\label{convention-on-words-of-length-one} Les mots d'une seule lettre sont naturellement en correspondance avec les lettres @@ -202,8 +203,8 @@ abusivement, une lettre $x\in\Sigma$ et le mot de longueur $1$ formé de la seule lettre $x$. (En informatique, cette identification entre \emph{caractères} et \emph{chaînes de caractères de longueur $1$} est faite par certains langages de programmation, mais pas par tous : -\textit{caveat programmator}.) Ceci permet d'écrire par exemple -$\Sigma \subseteq \Sigma^*$ ou bien $|x|=1 \liff x\in\Sigma$. +\textit{caveat programmator}.) Cette convention permet d'écrire par +exemple $\Sigma \subseteq \Sigma^*$ ou bien $|x|=1 \liff x\in\Sigma$. \thingy\label{number-of-words-of-length-n} Si le cardinal de l'alphabet $\Sigma$ vaut $\#\Sigma = N$, alors, pour chaque $n$, le @@ -233,7 +234,7 @@ suivants : \varepsilon = w$ quel que soit le mot $w \in \Sigma^*$ ; \item la concaténation est « \textbf{associative} », ce qui signifie par définition : $u(vw) = (uv)w$ quels que soient les mots $u,v,w - \in \Sigma^*$. + \in \Sigma^*$ (on peut donc noter $uvw$ sans parenthèse). \end{itemize} On peut traduire de façon savante ces deux propriétés en une phrase : @@ -264,8 +265,8 @@ signifie exactement ce qui vient d'être dit). précisément que $\Sigma^*$ est le \textbf{monoïde libre} sur l'ensemble $\Sigma$. Par exemple, le morphisme « longueur » $\ell\colon\Sigma^*\to\mathbb{N}$ est le $\ell = \hat\psi$ obtenu en - appliquant cette propriété à la fonction $\psi(x) = 1$ pour - tout $x\in\Sigma$.\par} + appliquant cette propriété à la fonction (constante) $\psi(x) = 1$ + pour tout $x\in\Sigma$.\par} \thingy\label{powers-of-a-word} Lorsque $w \in \Sigma^*$ et $r \in \mathbb{N}$, on définit un mot $w^r$ comme la concaténation de $r$ @@ -283,7 +284,7 @@ Cette définition sert notamment à désigner de façon concise les mots comportant des répétitions d'une même lettre : par exemple, le mot $aaaaa$ peut s'écrire tout simplement $a^5$, et le mot $aaabb$ peut s'écrire $a^3 b^2$. (De même que pour le mot vide, il faut souligner -que ces exposants ne font pas partie de l'alphabet.) +que ces exposants \emph{ne font pas partie} de l'alphabet.) \thingy Lorsque $u,v,w \in \Sigma^*$ vérifient $w = uv$, autrement dit lorsque le mot $w$ est la concaténation des deux mots $u$ et $v$, on @@ -340,21 +341,38 @@ est souvent appelé « sous-chaîne [de caractères] ». Il ne faut cependant pas confondre ce concept avec celui de sous-mot défini ci-dessous. -\thingy\label{definition-subword} Si $u_0,\ldots,u_r$ et -$v_1,\ldots,v_r$ sont des mots sur un même alphabet $\Sigma$, on dira -que $v := v_1\cdots v_r$ est un \textbf{sous-mot} du mot $w := u_0 v_1 -u_1 v_2 \cdots u_{r-1} v_r u_r$. En plus clair, cela signifie que $v$ -est obtenu en ne gardant que certaines lettres du mot $w$ (celles -des $v_i$), dans le même ordre, mais en en effaçant d'autres (celles -des $u_i$) ; à la différence du concept de facteur, celui de sous-mot +\thingy\label{definition-subword} Si $w = x_1\cdots x_n$ est un mot de +longueur $n$, on appelle \textbf{sous-mot} de $w$ un mot de la forme +$x_{i_1} \cdots x_{i_k}$ où $1\leq i_1 < \cdots < i_k \leq n$. En +plus clair, cela signifie que $v$ est obtenu en ne gardant que +certaines lettres du mot $w$, dans le même ordre, mais en en effaçant +d'autres ; à la différence du concept de facteur, celui de sous-mot n'exige pas que les lettres gardées soient consécutives. À titre d'exemple, le mot $acb$ est un sous-mot du mot $abbcab$ (obtenu en gardant les lettres soulignées ici : $\underline{a}bb\underline{c}a\underline{b}$ ; pour se rattacher à la -définition ci-dessus, on pourra prendre $u_0 = \varepsilon$ et $v_1 = -a$ et $u_1 = bb$ et $v_2 = c$ et $u_2 = a$ et $v_3 = b$ et $u_3 = -\varepsilon$). +définition ci-dessus, on pourra prendre $(i_1,i_2,i_3) = (1,4,6)$). + +{\footnotesize\thingy Les remarques de dénombrement suivantes peuvent + aider à mieux comprendre les notations de préfixe, suffixe, facteur + et sous-mot : si $w$ est un mot de longueur $n$, alors il a +\begin{itemize} +\item exactement $n+1$ préfixes (car un préfixe est déterminé par sa + longueur $k$ entre $0$ et $n$), +\item exactement $n+1$ suffixes (raison analogue), +\item au plus $\sum_{k=1}^n (n+1-k) + 1 = \frac{1}{2}(n^2+n+2)$ + facteurs (car un facteur est déterminé par sa longueur $k$ et son + point de départ qui peut être choisi parmi $n+1-k$ possibilités, le + $+1$ final étant mis pour le facteur vide), +\item au plus $2^n$ sous-mots (car un sous-mot est déterminé par + l'ensemble $\{i_1,\ldots,i_k\}$ des indices de ses lettres). +\end{itemize} +Le nombre exact peut être plus petit en cas de coïncidences entre +certains choix (par exemple, $aaa$ n'a que $4$ facteurs, $\varepsilon, +a, aa, aaa$ alors que $abc$ en a bien $\frac{1}{2}(3^2+3+2) = 7$) ; +mais les bornes ci-dessus sont effectivement atteintes pour certains +mots.\par} \thingy\label{definition-mirror-word} Si $w = x_1\cdots x_n$, où $x_1,\ldots,x_n \in \Sigma$, est un mot de longueur $n$ sur un @@ -374,7 +392,7 @@ Un mot $w$ est dit \textbf{palindrome} lorsque $w = w^{\textsf{R}}$. \thingy Un \textbf{langage} $L$ sur l'alphabet $\Sigma$ est simplement un ensemble de mots sur $\Sigma$. Autrement dit, il s'agit d'un sous-ensemble (=une partie) de l'ensemble $\Sigma^*$ de tous les mots -sur $\Sigma^*$ : en symboles, $L \subseteq \Sigma^*$. On souligne +sur $\Sigma$ : en symboles, $L \subseteq \Sigma^*$. On souligne qu'on ne demande pas que $L$ soit fini (mais il peut l'être). \thingy À titre d'exemple, l'ensemble $\{d,dc,dcc,dccc,dcccc,\ldots\} @@ -392,15 +410,16 @@ Voici quelques autres exemples de langages : sur l'alphabet $\Sigma = \{p,q,r\}$. Comme on l'a vu en \ref{number-of-words-of-length-n}, cet ensemble a pour cardinal exactement $3^{42}$. +\item Le langage constitué des mots de longueur exactement $1$ sur un + alphabet $\Sigma$ (=mots de une seule lettre), qu'on peut identifier + à $\Sigma$ lui-même (en identifiant un mot de une lettre à la lettre + en question, cf. \ref{convention-on-words-of-length-one}). \item Le langage (fini) constitué du seul mot vide (=mot de longueur exactement $0$) sur l'alphabet, disons, $\Sigma = \{p,q,r\}$. Ce langage $\{\varepsilon\}$ a pour cardinal $1$ (ou $3^0$ si on veut). Il ne faut pas le confondre avec le suivant : \item Le langage vide, qui ne contient aucun mot (sur un alphabet quelconque). Ce langage a pour cardinal $0$. -\item Le langage constitué des mots de une seule lettre sur un alphabet - $\Sigma$, qu'on peut identifier à $\Sigma$ lui-même (en identifiant - un mot de une lettre à la lettre en question). \item Le langage sur l'alphabet $\Sigma=\{a,b\}$ constitué des mots qui commencent par trois $a$ consécutifs : ou, si on préfère, qui ont le mot $aaa$ comme préfixe. @@ -481,7 +500,7 @@ défini comme l'ensemble des mots $w$ qui peuvent s'écrire comme concaténation d'un mot $w_1$ de $L_1$ et d'un mot $w_2$ de $L_2$, soit \[ \begin{aligned} -L_1 L_2 &= \{w_1 w_2 : w_1 \in L_1,\, w_2 \in L_2\}\\ +L_1 L_2 &:= \{w_1 w_2 : w_1 \in L_1,\, w_2 \in L_2\}\\ &= \{w \in \Sigma^* : \exists w_1 \in L_1\, \exists w_2 \in L_2\,(w = w_1 w_2)\}\\ \end{aligned} \] @@ -514,13 +533,13 @@ longueur exactement $r$ sur $\{a,b\}$, ce n'est pas l'ensemble à deux éléments $\{a^r, b^r\}$ constitué des seuls deux mots $a^r = aaa\cdots a$ et $b^r = bbb\cdots b$. -\thingy Si $L$ est un langage sur l'alphabet $\Sigma$, on définit -enfin l'\textbf{étoile de Kleene} $L^*$ de $L$ comme le langage -constitué des concaténations d'un nombre \emph{quelconque} de mots -appartenant à $L$, c'est-à-dire +\thingy\label{kleene-star} Si $L$ est un langage sur +l'alphabet $\Sigma$, on définit enfin l'\textbf{étoile de Kleene} +$L^*$ de $L$ comme le langage constitué des concaténations d'un nombre +\emph{quelconque} de mots appartenant à $L$, c'est-à-dire \[ \begin{aligned} -L^* &= \bigcup_{r=0}^{+\infty} L^r = \bigcup_{r\in\mathbb{N}} L^r\\ +L^* &:= \bigcup_{r=0}^{+\infty} L^r = \bigcup_{r\in\mathbb{N}} L^r\\ &= \{w_1\cdots w_r : r\in\mathbb{N},\, w_1,\ldots,w_r\in L\}\\ \end{aligned} \] @@ -541,7 +560,7 @@ Le mot vide appartient toujours à $L^*$ (quel que soit $L$) puisque $L^0 = \{\varepsilon\}$ et qu'on peut prendre $r=0$ ci-dessus (autrement dit, le mot vide est la concaténation de zéro mots de $L$). -\thingy\label{kleene-plus} On introduit parfois la notation $L^+ = +\thingy\label{kleene-plus} On introduit parfois la notation $L^+ := \bigcup_{r=1}^{+\infty} L^r = \{w_1\cdots w_r : r>0,\penalty-100\, w_1,\ldots,w_r\in L\}$ pour l'ensemble des mots formés par concaténation d'un nombre \emph{non nul} de mots de $L$. Lorsque le @@ -559,6 +578,8 @@ c'est-à-dire $L^{\mathsf{R}} = \{w^{\mathsf{R}} : w \in L\}$. \subsection{Langages rationnels et expressions rationnelles}\label{subsection-rational-languages} +\textcolor{red}{TODO: Commencer par une explication informelle.} + \thingy Soit $\Sigma$ un alphabet. On va considérer les langages de base triviaux suivants : \begin{itemize} @@ -623,7 +644,7 @@ introduit un nouvel objet, les \textbf{expressions rationnelles} (certains préfèrent le terme d'\textbf{expressions régulières}), qui sont des expressions servant à désigner un langage rationnel. Par exemple, plutôt que d'écrire « $\{d\}(\{c\}^*)$ », on parlera du -langage désigné par l'expression rationnelle $dc{*}$. +langage « désigné par l'expression rationnelle $dc{*}$ ». Plus exactement, une expression rationnelle (sur un alphabet $\Sigma$) est un mot sur l'alphabet $\Sigma \cup \{\bot, @@ -656,7 +677,7 @@ d'expression rationnelle $r$ et de \textbf{langage dénoté} (ou et son langage dénoté est $L_{(r){*}} := L^*$. \end{itemize} -À titre d'exemple, sur l'alphabet $\Sigma = \{a,b,c,d\}$, $c$ est une +\thingy À titre d'exemple, sur l'alphabet $\Sigma = \{a,b,c,d\}$, $c$ est une expression rationnelle qui dénote le langage $\{c\}$, donc $(c){*}$ en est une qui dénote le langage $\{c\}^* = \{\varepsilon, c, cc, ccc,\ldots\}$, et enfin $d(c){*}$ en est une qui dénote le langage $\{d, @@ -689,9 +710,10 @@ $\Sigma = \{a,b,c,d\}$ : Un langage rationnel est par construction la même chose qu'un langage pour lequel il existe une expression rationnelle qui le dénote. -On dira qu'un mot $w$ \textbf{vérifie} une expression rationnelle $r$ -lorsque ce mot appartient au langage qu'elle dénote (i.e., $w \in -L_r$). Par exemple, $dccc$ vérifie l'expression rationnelle $d(c){*}$. +\thingy On dira qu'un mot $w$ \textbf{vérifie} une expression +rationnelle $r$ lorsque ce mot appartient au langage qu'elle dénote +(i.e., $w \in L_r$). Par exemple, $dccc$ vérifie l'expression +rationnelle $d(c){*}$. \thingy Deux expressions rationnelles $r_1,r_2$ sont dites \textbf{équivalentes} lorsqu'elles dénotent le même langage. À titre @@ -730,10 +752,11 @@ que, en informatique, le symbole \texttt{+} est utilisé par de nombreux moteurs d'expressions régulières (par exemple, \texttt{egrep}) pour dénoter l'opération évoquée en \ref{kleene-plus}, i.e., « au moins une répétition » alors que l'étoile signifie « un - nombre quelconque de répétitions » : si on veut, $r{+}$ a le même -sens que $rr{*}$. Dans le même contexte, le symbole \texttt{?} est -souvent utilisé pour désigner « au plus une répétition » : si on veut, -$r{?}$ a le même sens que $(\underline{\varepsilon}|r)$. +nombre quelconque de répétitions » : si on veut, $r{\scriptstyle +}$ a +le même sens que $rr{*}$. Dans le même contexte, le symbole +\texttt{?} est souvent utilisé pour désigner « au plus une +répétition » : si on veut, $r{?}$ a le même sens +que $(\underline{\varepsilon}|r)$ (cf. \ref{remarks-egrep-plus-etc}). \subsection{Remarques sur les moteurs d'expressions régulières en informatique} @@ -759,15 +782,15 @@ désigne le langage $\{a^nba^n : a\in\mathbb{N}\} = \{b,aba, aabaa,\ldots\}$ des mots formés d'un nombre quelconque de $a$ puis d'un $b$ puis de la \emph{même suite de $a$}, et ce langage \emph{n'est pas rationnel} au sens mathématique (ce sera une -conséquence du « lemme de pompage »). +conséquence du « lemme de pompage » \ref{pumping-lemma}). -\thingy Il existe aussi un certain nombre de constructions qui, sans +\thingy\label{remarks-egrep-plus-etc} Il existe aussi un certain nombre de constructions qui, sans dépasser la puissance des expressions rationnelles au sens mathématique, apportent des commodités d'écriture dans un contexte informatique. On a déjà mentionné les symboles \texttt{+} (pour « au - moins une répétition » : $r{+}$ est équivalent à $rr{*}$) et -\texttt{?} (pour « au plus une répétition » : $r{?}$ est équivalent à -$(\underline{\varepsilon}|r)$). Parmi d'autres constructions du +moins une répétition » : $r{\scriptstyle +}$ est équivalent à $rr{*}$) +et \texttt{?} (pour « au plus une répétition » : $r{?}$ est équivalent +à $(\underline{\varepsilon}|r)$). Parmi d'autres constructions du genre, mentionnons encore le point \texttt{.} qui désigne un caractère quelconque de l'alphabet (on peut le voir comme une abréviation pour $(x_1|x_2|\ldots|x_N)$ où $x_1,x_2,\ldots,x_N$ sont tous les éléments @@ -857,6 +880,9 @@ possibles. L'automate prendra une décision (passer dans un nouvel état) en fonction de son état actuel et de la lettre qu'on lui donne à consommer. +\textcolor{red}{TODO: Commencer par une explication informelle et + évoquer les différentes sortes d'automates.} + \subsection{Automates finis déterministes complets (=DFA)} \thingy\label{definition-dfa} Un \textbf{automate fini déterministe} @@ -933,6 +959,9 @@ se trouve l'automate une fois qu'il a consommé le mot $w$, on dira que l'automate \emph{acepte} ou \emph{rejette} le mot selon que $q_n \in F$ ou que $q_n \not\in F$. +\textcolor{red}{TODO: Redire en termes de suites d'états comme + en \ref{rnfa-multiple-transition-relation}.} + Graphiquement, on peut présenter la procédure de la manière suivante : on part de l'état $q_0$ (sommet du graphe représentant l'automate) indiqué par la flèche entrante (pointant de nulle part), et pour @@ -965,6 +994,8 @@ Cette fonction $\delta^*$ étant définie, on dira que l'automate $A$ $\delta^*(q_0,w) =: q_n \in F$ ; dans le cas contraire, on dira qu'il \textbf{rejette} le mot $w$. +\textcolor{red}{TODO: Explication informelle.} + \thingy\label{definition-recognizable-language} L'ensemble $L_A$ des mots acceptés par l'automate $A$ s'appelle \textbf{langage accepté}, ou \textbf{reconnu}, ou \textbf{défini}, par l'automate $A$. @@ -982,7 +1013,7 @@ faire la description informelle suivante : l'automate commence dans l'état $0$, où il reste jusqu'à rencontrer un $a$ qui le fait passer dans l'état $1$, où il reste ensuite jusqu'à rencontrer un $b$ qui le fait passer dans l'état $2$, où il reste définitivement et qui -constitue un état acceptant. +constitue le seul état acceptant. \begin{center} %%% begin example2 %%% @@ -1452,7 +1483,7 @@ partant de $0$ et étiquetée par $a$, tandis que $\delta'(\{0\},b) = \{0\}$ ; ensuite, $\delta'(\{0,1\},a) = \{0,1,2\}$ car $0,1,2$ sont les trois états auxquels on peut arriver dans $A$ par une transition partant de $0$ ou $1$ et étiquetée par $a$ ; et ainsi de suite. En -procédant ainsi, on constuit l'automate à $4$ états qui suit : +procédant ainsi, on construit l'automate à $4$ états qui suit : \begin{center} \footnotesize @@ -2049,7 +2080,7 @@ qu'on doit maintenant demander explicitement que l'ensemble $\delta$ des transitions permises soit fini car l'ensemble $Q \times (\mathrm{regexp}(\Sigma)) \times Q$, lui, ne l'est pas. -\thingy Pour un tel automate, on définit une relation $\delta^* +\thingy\label{rnfa-multiple-transition-relation} Pour un tel automate, on définit une relation $\delta^* \subseteq Q \times \Sigma^* \times Q$ par $(q,w,q') \in \delta^*$ lorsqu'il existe $q_0,\ldots,q_n \in Q$ et $r_1,\ldots,r_n \in \mathrm{regexp}(\Sigma)$ tels que $q_0 = q$ et $q_n = q'$ et |