%% 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 :\\ % Sa.Sb.Sa.Sb.S>> \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 % Sa.Sb.S>a.Sb.S> \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}