%% This is a LaTeX document.  Hey, Emacs, -*- latex -*- , get it?
\documentclass[12pt,a4paper]{article}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{ucs}
\usepackage{times}
% A tribute to the worthy AMS:
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
%
\usepackage{mathrsfs}
\usepackage{wasysym}
\usepackage{url}
%
\usepackage{graphics}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,positioning}
\usepackage{hyperref}
%
\theoremstyle{definition}
\newtheorem{comcnt}{Tout}
\newcommand\thingy{%
\refstepcounter{comcnt}\smallskip\noindent\textbf{\thecomcnt.} }
\newcommand\exercice{%
\refstepcounter{comcnt}\bigskip\noindent\textbf{Exercice~\thecomcnt.}\par\nobreak}
\renewcommand{\qedsymbol}{\smiley}
%
\DeclareUnicodeCharacter{00A0}{~}
\DeclareUnicodeCharacter{03B5}{$\varepsilon$}
%
\DeclareMathSymbol{\tiret}{\mathord}{operators}{"7C}
\DeclareMathSymbol{\traitdunion}{\mathord}{operators}{"2D}
%
%
\DeclareFontFamily{U}{manual}{} 
\DeclareFontShape{U}{manual}{m}{n}{ <->  manfnt }{}
\newcommand{\manfntsymbol}[1]{%
    {\fontencoding{U}\fontfamily{manual}\selectfont\symbol{#1}}}
\newcommand{\dbend}{\manfntsymbol{127}}% Z-shaped
\newcommand{\danger}{\noindent\hangindent\parindent\hangafter=-2%
  \hbox to0pt{\hskip-\hangindent\dbend\hfill}}
%
\newcommand{\spaceout}{\hskip1emplus2emminus.5em}
\newif\ifcorrige
\corrigetrue
\newenvironment{corrige}%
{\ifcorrige\relax\else\setbox0=\vbox\bgroup\fi%
\smallbreak\noindent{\underbar{\textit{Corrigé.}}\quad}}
{{\hbox{}\nobreak\hfill\checkmark}%
\ifcorrige\par\smallbreak\else\egroup\par\fi}
\newenvironment{commentaire}%
{\ifcorrige\relax\else\setbox0=\vbox\bgroup\fi%
\smallbreak\noindent{\underbar{\textit{Commentaires.}}\quad}}
{{\hbox{}\nobreak\hfill\maltese}%
\ifcorrige\par\smallbreak\else\egroup\par\fi}
%
%
% NOTE: compile dot files with
% dot2tex --figonly -f tikz --tikzedgelabels --graphstyle=automaton file.dot  > file.tex
\tikzstyle{automaton}=[>=stealth',initial text={},thick,every loop/.style={min distance=7mm,looseness=5}]
\tikzstyle{state}=[]
\tikzstyle{final}=[accepting by arrow]
%
%
%
\begin{document}
\ifcorrige
\title{INF105\\Contrôle de connaissances — Corrigé\\{\normalsize Théorie des langages}}
\else
\title{INF105\\Contrôle de connaissances\\{\normalsize Théorie des langages}}
\fi
\author{}
\date{5 février 2019}
\maketitle

\pretolerance=8000
\tolerance=50000

\vskip1truein\relax

\noindent\textbf{Consignes.}

Les exercices sont totalement indépendants.  Ils pourront être traités
dans un ordre quelconque, mais on demande de faire apparaître de façon
très visible dans les copies où commence chaque exercice.

Dans l'exercice \ref{exercise-on-finite-automata}, les différentes
questions dépendent les unes des autres : il est donc impératif de les
traiter dans l'ordre, et il est conseillé de vérifier soigneusement
chaque réponse avant de passer à la suite.  Dans
l'exercice \ref{exercise-on-context-free-grammars}, les questions
dépendent également les unes des autres, mais l'énoncé fournit toutes
les informations nécessaires pour permettre de traiter la suite si on
ne parvient pas à résoudre une question donnée.

\medbreak

L'usage de tous les documents (notes de cours manuscrites ou
imprimées, feuilles d'exercices, livres) est autorisé.

L'usage des appareils électroniques est interdit.

\medbreak

Durée : 1h30

Barème \emph{indicatif} : 8+8+4.

\ifcorrige
Ce corrigé comporte 9 pages (page de garde incluse)
\else
Cet énoncé comporte 4 pages (page de garde incluse)
\fi

\vfill

{\tiny\noindent
\immediate\write18{sh ./vc > vcline.tex}
Git: \input{vcline.tex}
\immediate\write18{echo ' (stale)' >> vcline.tex}
\par}

\pagebreak


%
%
%

\exercice\label{exercise-on-finite-automata}

Dans cet exercice, on pose $\Sigma = \{a,b\}$.

On considère l'expression rationnelle $r$ suivante : $(ab|ba){*}$ (sur
l'alphabet $\Sigma$).  On appelle $L := L(r)$ le langage qu'elle
dénote.

(0) Donner quatre exemples de mots de $L$ et quatre exemples de mots
n'appartenant pas à $L$.

\begin{corrige}
Par exemple, les mots $\varepsilon$, $ab$, $ba$ et $abba$
appartiennent à $L$.  Les mots $a$, $b$, $aa$ et $aba$ n'appartiennent
pas à $L$.
\end{corrige}

(Il est vivement recommander d'utiliser, dans toute la suite de cet
exercice, les huit mots en question pour tester les réponses qu'on
proposera.  Les erreurs qui auraient dû être détectées de cette
manière seront plus lourdement sanctionnées.)

(1) Traiter l'une \emph{ou} l'autre des questions suivantes :
(i) construire l'automate de Glushkov $\mathscr{A}_1$ de $r$ ;
(ii) construire l'automate de Thompson de $r$, puis éliminer les
transitions spontanées (= $\varepsilon$-transitions) de ce dernier (on
retirera les états devenus inutiles) : on appellera $\mathscr{A}_1$
l'automate ainsi obtenu.

(Dans les deux cas, on obtient le même automate $\mathscr{A}_1$, ayant
$5$ états.  La suite de l'exercice dépendant de cette question, on
conseille de vérifier très soigneusement que $\mathscr{A}_1$ est correct.
À défaut de donner l'automate de Glushkov ou de Thompson, donner un
NFA reconnaissant $L$ pourra apporter une partie des points.)

\begin{corrige}
L'automate $\mathscr{A}_1$ obtenu est le suivant :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (S0) at (0bp,0bp) [draw,circle,state,initial,final,accepting below] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state] {$2$};
\node (S3) at (150bp,35bp) [draw,circle,state,final] {$3$};
\node (S4) at (150bp,-35bp) [draw,circle,state,final] {$4$};
\draw [->] (S0) -- node[auto,near end] {$a$} (S1);
\draw [->] (S0) -- node[auto,below] {$b$} (S2);
\draw [->] (S1) -- node[auto,below] {$b$} (S3);
\draw [->] (S2) -- node[auto] {$a$} (S4);
\draw [->] (S3) -- node[auto,above,very near end] {$b$} (S2);
\draw [->] (S4) -- node[auto,very near end] {$a$} (S1);
\draw [->] (S3) to[out=135,in=45] node[auto,above] {$a$} (S1);
\draw [->] (S4) to[out=225,in=315] node[auto] {$b$} (S2);
\end{tikzpicture}
\end{center}
C'est l'automate de Glushkov.  Si on commence par construire
l'automate de Thompson, on obtient le suivant (à $12$ états) :
\begin{center}
\scalebox{0.70}{%
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (S0) at (0bp,0bp) [draw,circle,state,initial] {};
\node (S0u) at (60bp,0bp) [draw,circle,state] {};
\node (S0a) at (120bp,40bp) [draw,circle,state] {};
\node (S1) at (180bp,40bp) [draw,circle,state] {};
\node (S1u) at (240bp,40bp) [draw,circle,state] {};
\node (S3) at (300bp,40bp) [draw,circle,state] {};
\node (S0b) at (120bp,-40bp) [draw,circle,state] {};
\node (S2) at (180bp,-40bp) [draw,circle,state] {};
\node (S2u) at (240bp,-40bp) [draw,circle,state] {};
\node (S4) at (300bp,-40bp) [draw,circle,state] {};
\node (SF) at (360bp,0bp) [draw,circle,state] {};
\node (SFu) at (420bp,0bp) [draw,circle,state,final] {};
\draw [->] (S0) -- (S0u);
\draw [->] (S0u) -- (S0a);
\draw [->] (S0a) -- node[auto] {$a$} (S1);  \draw [->] (S1) -- (S1u);
\draw [->] (S1u) -- node[auto] {$b$} (S3);  \draw [->] (S3) -- (SF);
\draw [->] (S0u) -- (S0b);
\draw [->] (S0b) -- node[auto] {$b$} (S2);  \draw [->] (S2) -- (S2u);
\draw [->] (S2u) -- node[auto] {$a$} (S4);  \draw [->] (S4) -- (SF);
\draw [->] (SF) -- (SFu);
\draw [->] (SF) to[out=90,in=0] (210bp,70bp) to[out=180,in=90] (S0u);
\draw [->] (S0) to[out=270,in=180] (120bp,-70bp) -- (300bp,-70bp) to[out=0,in=270] (SFu);
\end{tikzpicture}
}
\end{center}
(où toutes les flèches non étiquetées sont des transitions spontanées,
c'est-à-dire qu'il faut les imaginer étiquetées par $\varepsilon$) qui
par élimination des transitions spontanées donne celui $\mathscr{A}_1$
qu'on a tracé au-dessus (les seuls états qui subsistent après
élimination des transitions spontanées sont l'état initial et les
quatre états auxquels aboutissent une transition non spontanée).
\end{corrige}

(2) À partir de $\mathscr{A}_1$, construire un automate fini
déterministe complet reconnaissant $L$.  On appellera $\mathscr{A}_2$
l'automate en question.

\begin{corrige}
L'automate $\mathscr{A}_1$ est déterministe incomplet : il s'agit donc
simplement de lui ajouter un état « puits » pour le rendre complet, ce
qui donne l'automate $\mathscr{A}_2$ suivant :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (S0) at (0bp,0bp) [draw,circle,state,initial,final,accepting below] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state] {$2$};
\node (S3) at (150bp,35bp) [draw,circle,state,final] {$3$};
\node (S4) at (150bp,-35bp) [draw,circle,state,final] {$4$};
\node (Sink) at (220bp,0bp) [draw,circle,state] {$\bot$};
\draw [->] (S0) -- node[auto,near end] {$a$} (S1);
\draw [->] (S0) -- node[auto,below] {$b$} (S2);
\draw [->] (S1) -- node[auto] {$b$} (S3);
\draw [->] (S2) -- node[auto,below] {$a$} (S4);
\draw [->] (S3) -- node[auto,above,very near end] {$b$} (S2);
\draw [->] (S4) -- node[auto,very near end] {$a$} (S1);
\draw [->] (S3) to[out=135,in=45] node[auto,above] {$a$} (S1);
\draw [->] (S4) to[out=225,in=315] node[auto] {$b$} (S2);
\draw [->] (S1) -- node[auto,very near end] {$a$} (Sink);
\draw [->] (S2) -- node[auto,below,very near end] {$b$} (Sink);
\draw [->] (Sink) to[loop right] node[auto] {$a,b$} (Sink);
\end{tikzpicture}
\end{center}
\vskip-\baselineskip\vskip-1ex\strut
\end{corrige}

(3) Minimiser l'automate $\mathscr{A}_2$.  On appellera
$\mathscr{A}_3$ l'automate canonique ainsi obtenu.

(On obtient un automate ayant $4$ états.)

\begin{corrige}
L'algorithme de minimisation identifie les trois états finaux
($0,3,4$) de l'automate $\mathscr{A}_2$, ce qui donne
l'automate $\mathscr{A}_3$ suivant (on note $0$ pour l'état résultant
de l'identification de $0,3,4$) :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (S0) at (0bp,0bp) [draw,circle,state,initial,final,accepting below] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state] {$2$};
\node (Sink) at (140bp,0bp) [draw,circle,state] {$\bot$};
\draw [->] (S0) to[out=75,in=180] node[auto,near end] {$a$} (S1);
\draw [->] (S0) to[out=285,in=180] node[auto,below] {$b$} (S2);
\draw [->] (S1) to[out=270,in=15] node[auto,above] {$b$} (S0);
\draw [->] (S2) to[out=90,in=345] node[auto] {$a$} (S0);
\draw [->] (S1) -- node[auto,near end] {$a$} (Sink);
\draw [->] (S2) -- node[auto,below,near end] {$b$} (Sink);
\draw [->] (Sink) to[loop right] node[auto] {$a,b$} (Sink);
\end{tikzpicture}
\end{center}
\vskip-\baselineskip\vskip-1ex\strut
\end{corrige}

(4) Construire un automate $\mathscr{A}_4$ reconnaissant le langage $M
:= \Sigma^*\setminus L$ complémentaire de $L$.

\begin{corrige}
L'automate $\mathscr{A}_3$ étant un automate fini déterministe complet
reconnaissant $L$, il suffit de marquer finaux les états non-finaux et
vice versa pour obtenir l'automate $\mathscr{A}_4$ suivant :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (S0) at (0bp,0bp) [draw,circle,state,initial] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state,final,accepting above] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state,final,accepting below] {$2$};
\node (Sink) at (140bp,0bp) [draw,circle,state,final,accepting below] {$\bot$};
\draw [->] (S0) to[out=75,in=180] node[auto,near end] {$a$} (S1);
\draw [->] (S0) to[out=285,in=180] node[auto,below] {$b$} (S2);
\draw [->] (S1) to[out=270,in=15] node[auto,above] {$b$} (S0);
\draw [->] (S2) to[out=90,in=345] node[auto] {$a$} (S0);
\draw [->] (S1) -- node[auto,near end] {$a$} (Sink);
\draw [->] (S2) -- node[auto,below,near end] {$b$} (Sink);
\draw [->] (Sink) to[loop right] node[auto] {$a,b$} (Sink);
\end{tikzpicture}
\end{center}
\vskip-\baselineskip\vskip-1ex\strut
\end{corrige}

(5) En appliquant à $\mathscr{A}_4$ la méthode d'élimination des
états, déterminer une expression rationnelle dénotant le langage $M$.

\begin{corrige}
Pour appliquer la méthode d'élimination des états, on commence par
modifier l'automate pour avoir un unique état initial $I$, qui ne soit
pas final, et qui n'ait aucune transition qui y aboutisse, et un
unique état final $F$, qui ne soit pas initial, et sans aucune
transition qui en part :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (SI) at (-70bp,0bp) [draw,circle,state,initial] {$I$};
\node (S0) at (0bp,0bp) [draw,circle,state] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state] {$2$};
\node (Sink) at (140bp,0bp) [draw,circle,state] {$\bot$};
\node (SF) at (210bp,0bp) [draw,circle,state,final] {$F$};
\draw [->] (SI) -- node[auto] {$\underline{\varepsilon}$} (S0);
\draw [->] (S0) to[out=75,in=180] node[auto,near end] {$a$} (S1);
\draw [->] (S0) to[out=285,in=180] node[auto,below] {$b$} (S2);
\draw [->] (S1) to[out=270,in=15] node[auto,above] {$b$} (S0);
\draw [->] (S2) to[out=90,in=345] node[auto] {$a$} (S0);
\draw [->] (S1) -- node[auto,near end] {$a$} (Sink);
\draw [->] (S2) -- node[auto,below,near end] {$b$} (Sink);
\draw [->] (Sink) to[loop above] node[auto] {$a|b$} (Sink);
\draw [->] (S1) to[out=15,in=135] node[auto,near end] {$\underline{\varepsilon}$} (SF);
\draw [->] (S2) to[out=345,in=225] node[auto,near end] {$\underline{\varepsilon}$} (SF);
\draw [->] (Sink) -- node[auto] {$\underline{\varepsilon}$} (SF);
\end{tikzpicture}
\end{center}
On élimine ensuite l'état $\bot$ :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (SI) at (-70bp,0bp) [draw,circle,state,initial] {$I$};
\node (S0) at (0bp,0bp) [draw,circle,state] {$0$};
\node (S1) at (70bp,35bp) [draw,circle,state] {$1$};
\node (S2) at (70bp,-35bp) [draw,circle,state] {$2$};
\node (SF) at (210bp,0bp) [draw,circle,state,final] {$F$};
\draw [->] (SI) -- node[auto] {$\underline{\varepsilon}$} (S0);
\draw [->] (S0) to[out=75,in=180] node[auto,near end] {$a$} (S1);
\draw [->] (S0) to[out=285,in=180] node[auto,below] {$b$} (S2);
\draw [->] (S1) to[out=270,in=15] node[auto,above] {$b$} (S0);
\draw [->] (S2) to[out=90,in=345] node[auto] {$a$} (S0);
\draw [->] (S1) to[out=15,in=135] node[auto,near end] {$\underline{\varepsilon}|a(a|b){*}$} (SF);
\draw [->] (S2) to[out=345,in=225] node[auto,near end] {$\underline{\varepsilon}|b(a|b){*}$} (SF);
\end{tikzpicture}
\end{center}
Puis les états $1$ et $2$ peuvent être éliminés simultanément :
\begin{center}
\begin{tikzpicture}[>=latex,line join=bevel,automaton]
\node (SI) at (-70bp,0bp) [draw,circle,state,initial] {$I$};
\node (S0) at (0bp,0bp) [draw,circle,state] {$0$};
\node (SF) at (210bp,0bp) [draw,circle,state,final] {$F$};
\draw [->] (SI) -- node[auto] {$\underline{\varepsilon}$} (S0);
\draw [->] (S0) -- node[auto] {$a(\underline{\varepsilon}|a(a|b){*})|b(\underline{\varepsilon}|b(a|b){*})$} (SF);
\draw [->] (S0) to[loop above] node[auto] {$ab|ba$} (S0);
\end{tikzpicture}
\end{center}
Et l'expression rationnelle finalement obtenue est la suivante :
\[
(ab|ba){*}(a(\underline{\varepsilon}|a(a|b){*})|b(\underline{\varepsilon}|b(a|b){*}))
\]
On pouvait aussi donner, entre autres choses :
\[
(ab|ba){*}(a|aa(a|b){*}|b|bb(a|b){*})
\]
(obtenue en éliminant les états $1$ et $2$ avant $\bot$).
\end{corrige}


%
%
%

\exercice\label{exercise-on-context-free-grammars}

On considère la grammaire hors-contexte $G$ d'axiome $S$ sur
l'alphabet $\Sigma = \{a,b\}$ donnée par
\[
\begin{aligned}
S &\rightarrow SaSbS\\
S &\rightarrow \varepsilon\\
\end{aligned}
\]

(1) Montrer que cette grammaire $G$ est ambiguë : pour cela, on
exhibera deux arbres d'analyse différents du mot $abab$.

\begin{corrige}
On peut proposer les arbres d'analyse suivants :\\
% S<S<e.>a.S<e.>b.S<S<e.>a.S<e.>b.S<e.>>>
\begin{tikzpicture}[line join=bevel,baseline=(S0.base)]
\node (S0) at (48.000bp,0.000bp) [draw=none] {$S$};
\node (S1) at (0.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S1);
\node (e0) at (0.000bp,-50.000bp) [draw=none] {$\varepsilon$};  \draw (S1) -- (e0);
\node (a0) at (20.000bp,-30.000bp) [draw=none] {$a$};  \draw (S0) -- (a0);
\node (S2) at (40.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S2);
\node (e1) at (40.000bp,-50.000bp) [draw=none] {$\varepsilon$};  \draw (S2) -- (e1);
\node (b0) at (60.000bp,-30.000bp) [draw=none] {$b$};  \draw (S0) -- (b0);
\node (S3) at (120.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S3);
\node (S4) at (80.000bp,-60.000bp) [draw=none] {$S$};  \draw (S3) -- (S4);
\node (e2) at (80.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S4) -- (e2);
\node (a1) at (100.000bp,-60.000bp) [draw=none] {$a$};  \draw (S3) -- (a1);
\node (S5) at (120.000bp,-60.000bp) [draw=none] {$S$};  \draw (S3) -- (S5);
\node (e3) at (120.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S5) -- (e3);
\node (b1) at (140.000bp,-60.000bp) [draw=none] {$b$};  \draw (S3) -- (b1);
\node (S6) at (160.000bp,-60.000bp) [draw=none] {$S$};  \draw (S3) -- (S6);
\node (e4) at (160.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S6) -- (e4);
\end{tikzpicture}
d'une part,\hfill et
% S<S<S<e.>a.S<e.>b.S<e.>>a.S<e.>b.S<e.>>
\begin{tikzpicture}[line join=bevel,baseline=(S0.base)]
\node (S0) at (112.000bp,0.000bp) [draw=none] {$S$};
\node (S1) at (40.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S1);
\node (S2) at (0.000bp,-60.000bp) [draw=none] {$S$};  \draw (S1) -- (S2);
\node (e0) at (0.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S2) -- (e0);
\node (a0) at (20.000bp,-60.000bp) [draw=none] {$a$};  \draw (S1) -- (a0);
\node (S3) at (40.000bp,-60.000bp) [draw=none] {$S$};  \draw (S1) -- (S3);
\node (e1) at (40.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S3) -- (e1);
\node (b0) at (60.000bp,-60.000bp) [draw=none] {$b$};  \draw (S1) -- (b0);
\node (S4) at (80.000bp,-60.000bp) [draw=none] {$S$};  \draw (S1) -- (S4);
\node (e2) at (80.000bp,-80.000bp) [draw=none] {$\varepsilon$};  \draw (S4) -- (e2);
\node (a1) at (100.000bp,-30.000bp) [draw=none] {$a$};  \draw (S0) -- (a1);
\node (S5) at (120.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S5);
\node (e3) at (120.000bp,-50.000bp) [draw=none] {$\varepsilon$};  \draw (S5) -- (e3);
\node (b1) at (140.000bp,-30.000bp) [draw=none] {$b$};  \draw (S0) -- (b1);
\node (S6) at (160.000bp,-30.000bp) [draw=none] {$S$};  \draw (S0) -- (S6);
\node (e4) at (160.000bp,-50.000bp) [draw=none] {$\varepsilon$};  \draw (S6) -- (e4);
\end{tikzpicture}
d'autre part\\
(en fait, on peut se convaincre que ce sont les seuls possibles).
La grammaire $G$ est donc ambiguë.
\end{corrige}

\bigbreak

\emph{Notation :} Si $w \in \Sigma^*$, on notera $|w|_a$ le nombre
total d'occurrences de la lettre $a$ dans le mot $w$, et de façon
analogue $|w|_b$ le nombre total d'occurrences de la lettre $b$ (on a
bien sûr $|w| = |w|_a + |w|_b$ puisque $\Sigma = \{a,b\}$ ; on a par
ailleurs $|vv'|_a = |v|_a + |v'|_a$ et $|vv'|_b = |v|_b + |v'|_b$ pour
tous mots $v,v' \in \Sigma^*$).

\medbreak

On se propose, dans les quelques questions suivantes, de montrer que
le langage $L := L(G)$ engendré par la grammaire $G$ coïncide avec
l'ensemble $M$ des mots $w \in \Sigma^*$ vérifiant les deux propriétés
suivantes :
\begin{itemize}
\item[\quad(A)] $|w|_b = |w|_a$, et
\item[\quad(B)] $|u|_b \leq |u|_a$ pour tout préfixe $u$ de $w$
\end{itemize}
(autrement dit, le nombre de $b$ de n'importe quel préfixe de $w$ est
inférieur ou égal à son nombre de $a$, et pour le mot $w$ tout entier
il y a égalité).

(2) Expliquer pourquoi un mot $w \in \Sigma^*$ appartient à $L$ si et
seulement si $w = \varepsilon$ \emph{ou bien} $w$ s'écrit sous la
forme $w_1 a w_2 b w_3$ où $w_1,w_2,w_3$ appartiennent à $L$.  (On
pourra raisonner sur les arbres d'analyse.)

\begin{corrige}
Si $w \in L$, considérons un arbre d'analyse $\mathscr{T}$ de $w$
pour $G$ : sa racine, étiquetée $S$, doit avoir des fils étiquetés
selon l'une des deux règles de la grammaire, soit $S\rightarrow
\varepsilon$ ou bien $S\rightarrow SaSbS$, autrement dit, soit elle a
un unique fils étiqueté $\varepsilon$, soit elle a cinq fils étiquetés
respectivement $S,a,S,b,S$.  Dans le premier cas, le mot $w$ est
simplement $\varepsilon$ ; dans le second, les sous-arbres
$\mathscr{T}_1, \mathscr{T}_2, \mathscr{T}_3$ ayant pour racine les
trois fils étiquetés $S$ sont encore des arbres d'analyse pour $G$, et
si on appelle $w_1,w_2,w_3$ les mots dont ils sont des arbres
d'analyse (c'est-à-dire que $w_i$ est obtenu en lisant les feuilles de
$\mathscr{T}_i$ par ordre de profondeur), alors on a $w = w_1 a w_2 b
w_3$ et $w_1,w_2,w_3\in L$ (puisqu'ils ont des arbres d'analyse
pour $G$).

La réciproque est analogue : le mot $\varepsilon$ appartient
trivialement à $L$, et si $w_1,w_2,w_3\in L$, ils ont des arbres
d'analyse $\mathscr{T}_1, \mathscr{T}_2, \mathscr{T}_3$ pour $G$, et
on peut fabriquer un arbre d'analyse pour $w := w_1 a w_2 b w_3$ qui a
une racine étiquetée $S$ ayant cinq fils étiquetés $S,a,S,b,S$, les
trois étiquetés $S$ ayant pour descendants des sous-arbres donnés par
$\mathscr{T}_1, \mathscr{T}_2, \mathscr{T}_3$ dans cet ordre.
\end{corrige}

(3) Expliquer brièvement pourquoi, si $w_1, w_2, w_3 \in
\Sigma^*$, alors tout préfixe du mot $w_1 a w_2 b w_3$ est d'une des
trois formes suivantes : (i) $u_1$ pour $u_1$ un préfixe de $w_1$,
(ii) $w_1 a u_2$ pour $u_2$ un préfixe de $w_2$, ou (iii) $w_1 a w_2 b
u_3$ pour $u_3$ un préfixe de $w_3$.  (On rappelle que le mot vide et
le mot tout entier comptent pour préfixes d'un mot.)

\begin{corrige}
Remarquons qu'un préfixe d'une concaténation $v v'$ est soit un
préfixe $u$ de $v$ soit de la forme $v u'$ avec $u'$ préfixe de $v'$
(cela se voit immédiatement en écrivant, disons, $v = x_1 \cdots x_m$
et $v' = y_1 \cdots y_n$ où $x_1,\ldots,x_m$ et $y_1,\ldots,y_n$ sont
les lettres de $v$ et $v'$ respectivement : un préfixe de $x_1 \cdots
x_m y_1 \cdots y_n$ est soit de la forme $x_1 \cdots x_r$ soit de la
forme $x_1 \cdots x_m y_1 \cdots y_s$).

En appliquant cette remarque au produit quintuple $w_1 a w_2 b w_3$ et
en notant qu'un préfixe du mot (d'une lettre) $a$ est simplement
$\varepsilon$ ou $a$, on a les différents cas signalés.
\end{corrige}

(4) Si $w_1, w_2, w_3 \in \Sigma^*$ vérifient tous les trois la
propriété (A) ci-dessus, montrer que c'est encore le cas de $w_1 a w_2
b w_3$.  Si $w_1, w_2, w_3 \in \Sigma^*$ vérifient tous les trois la
propriété (B) ci-dessus, montrer que c'est encore le cas de $w_1 a w_2
b w_3$ (on utilisera pour cela la question (3)).

\begin{corrige}
Si $w_1, w_2, w_3$ vérifient (A) (c'est-à-dire $|w_i|_b = |w_i|_a$),
alors $|w_1 a w_2 b w_3|_a = |w_1|_a + |w_2|_a + |w_3|_a + 1$ et alors
$|w_1 a w_2 b w_3|_b = |w_1|_b + |w_2|_b + |w_3|_b + 1$ donc ces deux
quantités sont égales et $w_1 a w_2 b w_3$ vérifie (A).

Si $w_1, w_2, w_3$ vérifient (B) (c'est-à-dire $|u|_b \leq |u|_a$ pour
tout préfixe $u$ d'un des $w_i$), alors en notant $u_i$ un préfixe
quelconque du $w_i$ correspondant, on a (i) $|u_1|_b \leq |u_1|_a$,
(ii) $|w_1 a u_2|_b = |w_1|_b + |u_2|_b + 1 \leq |w_1|_a + |u_2|_a + 1
= |w_1 a u_2|_a$ et (iii) $|w_1 a w_2 b u_3|_b = |w_1|_b + |w_2|_b
+ |u_3|_b + 1 \leq |w_1|_a + |w_2|_a + |u_3|_a + 1 = |w_1 a w_2 b
u_3|_a$.  D'après la question (3), on peut en conclure que tout
préfixe $u$ de $w_1 a w_2 b w_3$ vérifie $|u|_b \leq |u|_a$,
c'est-à-dire que $w_1 a w_2 b w_3$ vérifie (B).
\end{corrige}

(5) Déduire des questions (2) et (4) que tout mot de $L$ vérifie
(A) et (B).  (Autrement dit, on vient de montrer : $L \subseteq M$.)

\begin{corrige}
On procède par récurrence sur la longueur du mot $w$ de $L$ pour
montrer que $w$ vérifie (A) et (B).  Si $|w|=0$, on a $w = \varepsilon$
qui vérifie manifestement (A) et (B).  Si $w\neq\varepsilon$,
d'après (2), on peut écrire $w = w_1 a w_2 b w_3$ où $w_1,w_2,w_3$
sont dans $L$, et comme ils sont de longueur strictement plus petite
que $w$, d'après l'hypothèse de récurrence ils vérifient (A) et (B),
si bien que $w$ vérifie aussi (A) et (B) d'après la question (4).
\end{corrige}

(6) Soit $w$ un mot \emph{non vide} vérifiant (A) et (B).  \quad
(6.1) Montrer qu'on peut écrire $w = av$ pour un certain $v \in
\Sigma^*$.\quad (6.2) Si $w'$ est le plus long préfixe de $v$
vérifiant (B)\footnote{Autrement dit, le plus long préfixe $w'$ de $v$
  tel que pour tout préfixe $u'$ de $w'$ (y compris $w'$ lui-même) on
  ait $|u'|_b\leq |u'|_a$.}, montrer qu'on a $w = aw'bw''$ pour un
certain $w'' \in \Sigma^*$.\quad (6.3) Montrer que $w'$ vérifie (A).
\quad (6.4) Montrer que $w''$ vérifie (A) et (B).

\begin{corrige}
(6.1) Comme $w$ est un mot non vide, on peut parler de sa première
lettre $x$, qui en est un préfixe (de longueur $1$), et qui doit
vérifier $|x|_b \leq |x|_a$ d'après (B), ce qui n'est évidemment
possible que pour $x=a$.  On a donc $w = av$ où $v$ est le suffixe
correspondant à $a$.

(6.2) Remarquons que $|v|_b = |w|_b = |w|_a = 1 + |v|_a$ donc $|v|_b >
|v|_a$, et en particulier, $v$ \emph{ne} vérifie \emph{pas} (B).  Si
maintenant $w'$ est le plus long préfixe de $v$ vérifiant (B), la
remarque qu'on vient de faire montre que $w' \neq v$, donc il y a au
moins une lettre qui suit $w'$ dans $v$ ; et cette lettre ne peut pas
être $a$ car si $v$ vérifie (B) alors $va$ le vérifie aussi (le seul
préfixe de $va$ qui n'était pas dans $v$ étant $va$ lui-même, qui
vérifie $|va|_b = |v|_b \leq |v|_a < |va|_a$) : on peut donc écrire $v
= w'bw''$ pour un certain $w''\in\Sigma^*$, c'est-à-dire $w =
aw'bw''$.

(6.3) Montrons par l'absurde que $w'$ vérifie (A) : si ce n'est pas le
cas, comme $|w'|_b \leq |w'|_a$ (par (B), que vérifie $w'$), on a
$|w'|_b < |w'|_a$, mais alors $|w'b|_b = |w'|_b + 1 \leq |w'|_a =
|w'b|_a$ donc $w'b$ vérifie encore (B), ce qui contredit le fait que
$w'$ était \emph{le plus long} préfixe de $v$ vérifiant (B).

(6.4) Le mot $w''$ vérifie (A) : en effet, on a $|w|_b = |w|_a$
(puisque $w$ vérifie (A)), c'est-à-dire $|w'|_b + |w''|_b + 1 = |w'|_a
+ |w''|_a + 1$, et comme on vient de voir que $|w'|_b = |w'|_a$, on a
aussi $|w''|_b = |w''|_a$.  Enfin, le mot $w''$ vérifie (B) : en
effet, si $u''$ est un préfixe de $w''$ alors $aw'bu''$ est un préfixe
de $w = aw'bw''$ donc (puisque $w$ vérifie (B)) on a $|aw'bu''|_b \leq
|aw'bu''|_a$, c'est-à-dire $|w'|_b + |u''|_b + 1 \leq |w'|_a + |u''|_a
+ 1$ donc (toujours puisque $|w'|_b = |w'|_a$ qu'on vient de voir)
$|u''|_b \leq |u''|_a$ comme annoncé.
\end{corrige}

(7) Déduire des questions (2) et (6) que tout mot vérifiant (A) et (B)
appartient à $L$.  (Autrement dit, on vient de montrer : $M \subseteq
L$.  On a donc $L = M$.)

\begin{corrige}
On procède par récurrence sur la longueur du mot $w$ vérifiant
(A) et (B) pour montrer que $w$ appartient à $L$.  Si $|w|=0$, on a $w
= \varepsilon$ qui appartient manifestement à $L$.  Si
$w\neq\varepsilon$, d'après (6), on peut écrire $w = aw'bw''$ où
$w',w''$ vérifient (A) et (B), et comme ils sont de longueur
strictement plus petite que $w$, d'après l'hypothèse de récurrence ils
appartiennent à $L$, si bien que $w$ appartient aussi à $L$ d'après la
question (4).

\emph{Remarque :} On a en fait montré que $L = L(G)$ coïncide avec le
langage $L'$ engendré par la grammaire $S \rightarrow \varepsilon\;|\;
aSbS$ ; en effet, la question (7) montre que $M\subseteq L'$, la
question (5) montre que $L\subseteq M$, et on a évidemment
$L'\subseteq L$ : donc $L=L'=M$.
\end{corrige}

(8) En notant $N = \{a^i b^j : i,j\in\mathbb{N}\}$ le langage défini
par l'expression rationnelle $a{*}b{*}$, et en utilisant la
description qu'on vient de trouver pour $L$ (comme l'ensemble des mots
vérifiant (A) et (B)), déterminer $L \cap N$, et observer qu'il n'est
pas rationnel.

\begin{corrige}
Montrons que $L\cap N = \{a^k b^k : k\in\mathbb{N}\}$ : si $w \in
L\cap N$, alors $w$ s'écrit sous la forme $a^i b^j$ puisque $w\in N$,
et comme $w\in L$ vérifie (A) d'après la question (5), on a $j = |w|_b
= |w|_a = i$, c'est-à-dire que $w$ est de la forme $a^k b^k$ ;
réciproquement, si $w$ est de la forme $a^k b^k$ alors $w \in N$ et il
vérifie manifestement (A), et par ailleurs, tout préfixe $u$ de $w$
est de la forme $a^\ell$ ou bien $a^k b^\ell$ où $0\leq \ell\leq k$ et
dans les deux cas vérifie $|u|_b \leq |u|_a$, c'est-à-dire que $w$
vérifie (B), donc $w\in L$ d'après la question (7), bref $w \in L\cap
N$.

On sait (comme application vue en cours du lemme de pompage) que le
langage $\{a^k b^k : k\in\mathbb{N}\}$ n'est pas rationnel.
\end{corrige}

(9) Le langage $L$ est-il rationnel ?  (On ne cherchera pas à
appliquer le lemme de pompage pour cette question.)

\begin{corrige}
Rappelons que le langage $N$ est rationnel (puisque dénoté par une
expression rationnelle).

Si le langage $L$ était rationnel, alors son intersection $L\cap N$
avec le langage rationnel $N$ serait aussi rationnelle, mais on vient
de voir que $L\cap N$ n'est pas rationnel ; c'est donc que $L$ n'est
pas rationnel.
\end{corrige}


%
%
%

\exercice

On rappelle la définition du problème de l'arrêt : c'est l'ensemble
$H$ des couples\footnote{Pour être rigoureux, on a fixé un codage
  permettant de représenter les programmes $e$, les entrées $x$ à ces
  programmes, et les couples $(e,x)$, comme des éléments
  de $\mathbb{N}$ (ou bien de $\Sigma^*$ sur un alphabet
  $\Sigma\neq\varnothing$ arbitraire).  Il n'est pas nécessaire de
  faire apparaître ce codage dans la description des algorithmes
  proposés, qui peut rester informelle.} $(e,x)$ formés d'un programme
(=algorithme) $e$ et d'une entrée $x$, tels que l'exécution du
programme $e$ sur l'entrée $x$ termine en temps fini.  On a vu en
cours que $H$ était semi-décidable mais non décidable\footnote{Une
  variante consiste à considérer l'ensemble des $e$ tels que $e$
  termine sur l'entrée $e$ : l'ensemble $H$ qu'on vient de définir s'y
  ramène facilement.}.

On considère l'ensemble $H'$ des triplets $(e_1,e_2,x)$ tels que
$(e_1,x) \in H$ \emph{ou bien} $(e_2,x) \in H$ (ou les deux).
Autrement dit, au moins l'un des programmes $e_i$ termine en temps
fini quand on l'exécute sur l'entrée $x$.

(1) L'ensemble $H'$ est-il semi-décidable ?

\begin{corrige}
Nous allons montrer que $H'$ est semi-décidable.

Considérons l'algorithme suivant : donné en entrée un triplet
$(e_1,e_2,x)$, on exécute en parallèle, en fournissant à chacun
l'entrée $x$, les programmes (codés par) $e_1$ et $e_2$ (au moyen
d'une machine universelle), et en s'arrêtant immédiatement si l'un des
deux s'arrête, et on renvoie alors « vrai ».  Manifestement, cet
algorithme termine (en renvoyant « vrai ») si et seulement si
$(e_1,e_2,x) \in H'$, ce qui montre que $H'$ est semi-décidable.
\end{corrige}

(2) L'ensemble $H'$ est-il décidable ?

\begin{corrige}
Nous allons montrer que $H'$ n'est pas décidable.

Supposons par l'absurde qu'il existe un algorithme $T$ qui
décide $H'$.  Soit $e'$ (le code d')un programme quelconque qui
effectue une boucle infinie (quelle que soit son entrée) : comme $e'$
ne termine jamais, un triplet $(e,e',x)$ appartient à $H'$ si et
seulement si $(e,x)$ appartient à $H$.  Considérons maintenant
l'algorithme suivant : donné en entrée un couple $(e,x)$, on applique
l'algorithme $T$ supposé exister pour décider si $(e,e',x) \in H'$ ;
comme on vient de l'expliquer, ceci équivaut à $(e,x) \in H$.  On a
donc fabriqué un algorithme qui décide $H$, ce qui est impossible,
d'où la contradiction annoncée.
\end{corrige}

%
%
%
\end{document}
