%% 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.}} \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 rattrapage — Corrigé\\{\normalsize Théorie des langages}} \else \title{INF105\\Contrôle de rattrapage\\{\normalsize Théorie des langages}} \fi \author{} \date{22 mars 2018} \maketitle {\footnotesize \immediate\write18{sh ./vc > vcline.tex} \begin{center} Git: \input{vcline.tex} \end{center} \immediate\write18{echo ' (stale)' >> vcline.tex} \par} \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. \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} : $7+8+5$ points. \ifcorrige %Ce corrigé comporte 7 pages (page de garde incluse) \else Cet énoncé comporte 4 pages (page de garde incluse) \fi \pagebreak % % % \exercice Dans cet exercice, on pose $\Sigma = \{a,b,c\}$. On appelle $L$ le langage des mots sur $\Sigma$ qui ont $abc$ comme sous-mot, c'est-à-dire, qui contiennent un $a$, un $b$ et un $c$ dans cet ordre mais non nécessairement consécutivement (à titre d'exemple, $abac \in L$). (1) Proposer un automate non-déterministe (NFA), sans transition spontanée, $\mathscr{A}_1$ qui reconnaît le langage $L$. On justifiera rapidement pourquoi l'automate proposé convient. (2) Déterminiser (si nécessaire) l'automate $\mathscr{A}_1$ trouvé en (1) ; on appellera $\mathscr{A}_2$ l'automate résultant. (3) Minimiser (si nécessaire) l'automate $\mathscr{A}_2$ obtenu en (2) ; on appellera $\mathscr{A}_3$ l'automate minimal (=canonique) résultant. (4) Construire un automate $\mathscr{A}_4$ reconnaissant le langage $M := \Sigma^*\setminus L$ complémentaire de $L$. (5) En appliquant à $\mathscr{A}_4$ la méthode d'élimination des états, déterminer une expression rationnelle dénotant le langage $M$. % % % \exercice Dans cet exercice, on pose $\Sigma = \{a,b\}$. On appelle $L = L(G)$ le langage défini par la hors-contexte $G$ d'axiome $S$ et de nonterminaux $N = \{S\}$ sur l'alphabet $\Sigma$ donnée par \[ \begin{aligned} S &\rightarrow aSbS \;|\; aS \;|\; \varepsilon\\ \end{aligned} \] (1) Donner deux arbres d'analyse (pour $G$) différents du mot $aab$. Que peut-on dire de la grammaire $G$ ? L'objet des questions suivantes (qui ne dépendent pas de la précédente) est de montrer que $L$ n'est pas rationnel. Soit $M$ le langage $\{a^i b^j : i,j\in\mathbb{N}\}$ constitué des mots de la forme $a^i b^j$ avec $i$ et $j$ deux entiers naturels quelconques. (2) Donner une expression rationnelle qui dénote $M$. Soit $P$ le langage $\{a^i b^j : i\geq j\}$ constitué des mots de la forme $a^i b^j$ avec $i$ et $j$ deux entiers naturels vérifiant $i\geq j$ (autrement dit, les mots de $M$ qui ont au moins autant de $a$ que de $b$). (3) Montrer que $P \subseteq L$. (4) Montrer que $L\cap M \subseteq P$. (5) Montrer que $P$ n'est pas rationnel. (6) Déduire des questions (2) à (5) que $L$ n'est pas rationnel. % % % \exercice Dans cet exercice, on s'intéresse au langage $L$ formé des programmes $e$ (codés, dans un langage Turing-complet fixé quelconque, comme des entiers naturels ou comme des mots sur un alphabet fixé sans importance) qui, quelle que soit le paramètre $n$ qu'on leur fournit en entrée, terminent en temps fini et retournent la valeur $0$ : soit $L = \{e : (\forall n) {\varphi_e(n)\downarrow} = 0\}$. Si l'on préfère, $L$ est l'ensemble de toutes les façons de coder la fonction constante égale à $0$. On appellera aussi $M$ le complémentaire de $L$. On se demande si $L$ ou $M$ sont semi-décidables. \smallskip (1) Thésée et Hippolyte se disputent pour savoir si $L$ est semi-décidable. Thésée pense qu'il l'est, et il tient le raisonnement suivant pour l'expliquer : {\narrower Pour savoir si un programme $e$ est dans l'ensemble $L$, il suffit de l'examiner pour vérifier que toutes les instructions qui mettent fin au programme renvoient la valeur $0$ : si c'est le cas, on termine en répondait « oui » (c'est-à-dire $e\in L$) ; sinon, on rentre dans une boucle infinie. Ceci fournit un algorithme qui semi-décide $L$. \par} \smallskip \noindent Hippolyte, elle, pense que $L$ n'est pas semi-décidable. Son argument est le suivant : {\narrower Si $L$ était semi-décidable, je pourrais m'en servir pour résoudre le problème de l'arrêt. En effet, donné un programme $e'$ et une entrée $m$ sur laquelle je cherche à tester l'arrêt de $e'$, je peux fabriquer le programme $e$ qui prend une entrée $n$, lance l'exécution de $e'$ sur l'entrée $m$ pendant au plus $n$ étapes et à la fin renvoie $1$ si ces $n$ étapes ont suffi à terminer l'exécution de $e'$, et $0$ sinon. Dire que $e \in L$ signifie que $e'$ ne termine jamais sur $m$, donc pouvoir semi-décider $L$ permet de résoudre algorithmiquement le problème de l'arrêt, ce qui est impossible. \par} \smallskip \noindent Qui a raison ? Expliquer précisément quelle est l'erreur commise par le raisonnement incorrect, et détailler les éventuels passages incomplets dans le raisonnement correct. \medskip (2) Achille et Patrocle se disputent pour savoir si $M$ est semi-décidable. Achile pense qu'il l'est, et il tient le raisonnement suivant pour l'expliquer : {\narrower Pour savoir si un programme $e$ est dans l'ensemble $M$, il suffit de tester successivement les valeurs $\varphi_e(n)$ pour tous les $n$ possibles : si l'on rencontre un $n$ tel que $\varphi_e(n)$ n'est pas $0$, alors on termine en répondant « oui » (c'est-à-dire $e\in M$) ; sinon, on ne va jamais terminer, et cela signifie que $e\not\in M$. Ceci fournit un algorithme qui semi-décide $M$. \par} \smallskip \noindent Patrocle, lui, pense que $M$ n'est pas semi-décidable. Son argument est le suivant : {\narrower Si $M$ était semi-décidable, je pourrais m'en servir pour résoudre le problème de l'arrêt. En effet, donné un programme $e'$ et une entrée $m$ sur laquelle je cherche à tester l'arrêt de $e'$, je peux fabriquer le programme $e$ qui prend une entrée $n$, l'ignore purement et simplement, exécute $e'$ sur l'entrée $m$ et à la fin renvoie $0$. Dire que $e\in M$ signifie que $e'$ ne termine pas sur $m$, donc pouvoir semi-décider $M$ permet de résoudre algorithmiquement le problème de l'arrêt, ce qui est impossible. \par} \smallskip \noindent Qui a raison ? Expliquer précisément quelle est l'erreur commise par le raisonnement incorrect, et détailler les éventuels passages incomplets dans le raisonnement correct. % % % \end{document}