From d172f1182f69612c5ca3dcb335d905e3fcc2ff78 Mon Sep 17 00:00:00 2001
From: "David A. Madore" <david+git@madore.org>
Date: Thu, 19 Oct 2017 20:14:39 +0200
Subject: Various clarifications, corrections, todos...

---
 notes-inf105.tex | 135 ++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 83 insertions(+), 52 deletions(-)

(limited to 'notes-inf105.tex')

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
-- 
cgit v1.2.3

