diff --git a/03_ResultatsFondamentaux.tex b/03_ResultatsFondamentaux.tex index 9a88ad0..8aeaaf6 100644 --- a/03_ResultatsFondamentaux.tex +++ b/03_ResultatsFondamentaux.tex @@ -431,7 +431,7 @@ \section{Problème de l'arrêt} \draw[very thick,blue] \ellipse{1,-1}{1.5}{2.5}; \draw (-1.5,0) node {$\bullet$}; \draw (-1.5,0) node[above] {$halt$}; - + %Partie de droite \draw[red] (7,5) node[above] {Ensembles}; \draw[very thick, red] \ellipse{7,0}{3}{5}; @@ -461,11 +461,11 @@ \section{Insuffisance des fonctions totales} Dans un modèle de calcul (langage de programmation) dans lequel tous les programmes se terminent, la fonction \emph{halt} est trivialement calculable (fonction constante 1). Étant donné que les problèmes pratiques que l'on doit résoudre sont des fonctions totales, on peut se demander. Mais on va montrer qu'un tel modèle est restrictif; il ne permet pas de calculer toutes les fonctions totales calculables. \begin{myexem} -Un exemple de modèle de calcul ne permettant que le calcul de fonctions totales est par exemple \textbf{BLOOP} (défini plus loin) ou encore \textbf{MiniJava}, c'est-à-dire Java sans récursivité ni boucle while et où les boucles for ne peuvent modifier le compteur de boucle. +Un exemple de modèle de calcul ne permettant que le calcul de fonctions totales est par exemple \textbf{BLOOP} (défini plus loin) ou encore \textbf{MiniJava}, c'est-à-dire Java sans récursivité ni boucle while et où les boucles for ne peuvent modifier le compteur de boucle. \end{myexem} Posons Q un langage (\textbf{non trivial}) dont tous les programmes se terminent (ils ne calculent que des fonctions totales) et pour -lequel il existe un interpréteur calculable, $interpret(n,x){} =\phi'_n$, où +lequel il existe un interpréteur calculable, $interpret(n,x){} =\phi'_n$, où $\phi'_n$ est la fonction calculée par le programme $Q_n$. L'interpréteur est une fonction totale car il donne toujours une réponse vu que tous les programmes se terminent. Par langage de programmation non trivial, on entend un langage où les opérations de base telles que l'addition peuvent être réalisées. \begin{mytheo}[Hoare-Allison] @@ -497,13 +497,13 @@ \section{Insuffisance des fonctions totales} d'écrire un programme qui calcule $diag'$ en utilisant $diag$) \item Contradiction :\\ - Comme $diag'$ est calculable dans Q, il existe un programme $Q_d$ qui calcule $diag'$. + Comme $diag'$ est calculable dans Q, il existe un programme $Q_d$ qui calcule $diag'$. Mais quelle est la valeur de $diag'(d)$ ? Par définition de $diag'$, on a $diag'(d) = interpret(d,d)+1$. \\ Mais, comme $Q_d$ calcule $diag'$, par définition $diag'(d) = Q_d(d) = \phi_d(d) = interpret(d,d)$. En effet, calculer $\phi_d(d)$ revient à interpréter le programme d avec la donnée d. \\ - On obtient donc $interpret(d,d)+1 = interpret(d,d)$, ce qui est impossible car $interpret(d,d)$ est un entier. + On obtient donc $interpret(d,d)+1 = interpret(d,d)$, ce qui est impossible car $interpret(d,d)$ est un entier. \item Conclusion : $diag'$ n'est pas calculable dans $Q$, donc $diag$ n'est pas calculable dans Q, et donc interpret n'est pas calculable dans $Q$. dans Q. @@ -587,8 +587,8 @@ \subsection{Énoncé et démonstration} \begin{mytheo}[Rice] Si $A$ est récursif et $A\neq \emptyset, A \neq \N$. \\ Alors $\exists i \in A$ et $\exists j \in \N \setminus A$ tel que $\phi _i = \phi _j$ - - Si A est récursif et qu'il n'est ni nul, ni ne contient l'ensemble des programmes existant, alors il existe deux programmes dans A et $\stcomp{A}$ tel qu'ils calculent la même fonction. + + Si A est récursif et qu'il n'est ni nul, ni ne contient l'ensemble des programmes existant, alors il existe deux programmes dans A et $\stcomp{A}$ tel qu'ils calculent la même fonction. \end{mytheo} On utilise le plus souvent le théorème de Rice en ayant recourt à sa contraposée: @@ -616,15 +616,15 @@ \subsection{Énoncé et démonstration} while true do; \end{lstlisting} $P_k$ ne s'arrête jamais, il vaut donc en permanence \textit{bottom} : $\forall x \ \phi_k(x) = \perp$ - + \item $\stcomp{A}\neq \emptyset$ car $A \neq \N$, supposons $k\in \stcomp{A}$ (hypothèse sans importance, car montrer que $A$ ou $\stcomp{A}$ est non récursif revient au même, car $A$ non récursif $ \Leftrightarrow $ $\stcomp{A}$ non récursif) \item $A\neq \emptyset$ par hypothèse. Prenons un élément quelconque $m$ de cet ensemble ($m\in A$) - \item Par hypothèse $\forall i \in A, \forall j \in \stcomp{A}$ $\phi_i \neq \phi_j$. Donc + \item Par hypothèse $\forall i \in A, \forall j \in \stcomp{A}$ $\phi_i \neq \phi_j$. Donc $\phi_m \neq \phi_k$ - \item Pour $n$ et $x$ fixé, analysons le programme $P(z)$ suivant. + \item Pour $n$ et $x$ fixé, analysons le programme $P(z)$ suivant. $P(z) \equiv $ \begin{lstlisting} P_n(x); @@ -633,8 +633,8 @@ \subsection{Énoncé et démonstration} Ce programme a un numéro $d$. Quelle est la fonction $\phi_d(z)$ calculée par $P(z)$ ? Il n'y a que deux possibilités. \begin{itemize} - \item Si $P_n(x)$ ne se termine pas, alors le programme $P(z)$ ne se termine pour aucune valeur de $z$. On a donc $\phi_d =\phi_k$. - \item Si $P_n(x)$ se termine, alors le programme $P(z)$ calcule la même fonction que $P_m(z)$. On a donc $\phi_d =\phi_m$. + \item Si $P_n(x)$ ne se termine pas, alors le programme $P(z)$ ne se termine pour aucune valeur de $z$. On a donc $\phi_d =\phi_k$. + \item Si $P_n(x)$ se termine, alors le programme $P(z)$ calcule la même fonction que $P_m(z)$. On a donc $\phi_d =\phi_m$. \end{itemize} Pour déterminer si $\phi_d =\phi_k$ ou $\phi_d =\phi_m$, il suffit de tester si $d \in A$. Par hypothèse $\forall i \in A, \forall j \in \stcomp{A}$ $\phi_i \neq \phi_j$. Nous avons aussi $k\in \stcomp{A}$ et $m\in A$. @@ -643,8 +643,8 @@ \subsection{Énoncé et démonstration} \item Si $d \in \stcomp{A}$, alors $\phi_d \neq \phi_m$, donc $\phi_d =\phi_k$. \end{itemize} En résumé : si $d \in A$ alors l'exécution de $P_n(x)$ se termine, sinon l'exécution de $P_n(x)$ ne se termine pas. - - On peut alors écrire le programme suivant qui décide \textbf{HALT}. + + On peut alors écrire le programme suivant qui décide \textbf{HALT}. $halt(n,x) \equiv $ \begin{lstlisting} construire un programme P(z)= P_n(x); P_m(z) ; @@ -652,8 +652,8 @@ \subsection{Énoncé et démonstration} if d in A then print(1); else print(0); \end{lstlisting} - - + + \item Contradiction, car \textbf{HALT} n'est pas récursif. \item Conclusion: $A$ n'est pas récursif. \end{enumerate} @@ -682,7 +682,7 @@ \subsection{Analyse} \item Les propriétés intéressantes d'un programme concernant la fonction qu'il calcule, non pas sa forme (syntaxe), sont non calculables. - + \item La plupart des problèmes intéressants au sujet des programmes sont non calculables \end{itemize} @@ -840,7 +840,7 @@ \section{Théorème du point fixe} \end{myrem} \item $h(u,v)=\phi_{S(u)}(v)$\\ - Ceci est une application de la propriété S (propriété S-m-n affaiblie), avec $S$ totale calculable, + Ceci est une application de la propriété S (propriété S-m-n affaiblie), avec $S$ totale calculable, \item $g(u)=f(S(u))$\\ $g$ est totale calculable car $S$ et $f$ le sont ($f$ @@ -897,7 +897,7 @@ \section{Théorème du point fixe} f(x) = \begin{cases} m & \text{si }x \in A,\\ - n & \text{si }x \in \bar{A}. + n & \text{si }x \in $\bar{A}$. \end{cases} \] On remarque que comme $A$ est récursif, @@ -1025,4 +1025,3 @@ \section{Conclusion} % subsection conclusion (end) % section r_sultats_fondamentaux (end) -