%% This is a LaTeX document. Hey, Emacs, -*- latex -*- , get it? \documentclass[mathserif,a4paper,aspectratio=169]{beamer} %\documentclass[a4paper]{article} %\usepackage[envcountsect,noxcolor]{beamerarticle} \usepackage[shorthands=off,francais]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \DeclareUnicodeCharacter{00A0}{~} \DeclareUnicodeCharacter{2026}{...} \DeclareUnicodeCharacter{1E25}{\d{h}} % Beamer theme: \usetheme{Goettingen} %\usecolortheme{albatross} %\usecolortheme{lily} %\setbeamercovered{transparent} % A tribute to the worthy AMS: \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{amsthm} % \usepackage{mathrsfs} % \usepackage{graphicx} \usepackage{tikz} \usetikzlibrary{arrows,automata,calc} % \newcommand{\itempoint}{\strut\hbox{\color{beamerstructure}\donotcoloroutermaths$\blacktriangleright$}\nobreak\hskip.5em plus.5em\relax} \renewcommand{\thefootnote}{\textdagger} % % % \title{Calculabilité} \subtitle{INF110 (Logique et Fondements de l'Informatique)} \author[David Madore]{David A. Madore\\ {\footnotesize Télécom Paris}\\ \texttt{david.madore@enst.fr}} \date{2023–2024} \mode{% \beamertemplatenavigationsymbolsempty \usenavigationsymbolstemplate{\vbox{\hbox{\footnotesize\hyperlinkslideprev{$\leftarrow$}\insertframenumber/\inserttotalframenumber\hyperlinkslidenext{$\rightarrow$}}}} } \setbeamercolor{myhighlight}{fg=black,bg=white!90!green} \begin{document} \mode
{\maketitle} % \setlength\abovedisplayskip{2pt plus 2pt minus 2pt} \setlength\belowdisplayskip{2pt plus 2pt minus 2pt} % \begin{frame} \titlepage {\footnotesize\center{\url{http://perso.enst.fr/madore/inf110/transp-inf110.pdf}}\par} {\tiny \immediate\write18{sh ./vc > vcline.tex} \begin{center} Git: \input{vcline.tex} \end{center} \immediate\write18{echo ' (stale)' >> vcline.tex} \par} \end{frame} % \section*{Plan} \begin{frame} \frametitle{Plan} \tableofcontents \end{frame} % \section{Introduction} \begin{frame} \frametitle{Qu'est-ce que la calculabilité ?} \itempoint À l'interface entre \textbf{logique mathématique} et \textbf{informatique théorique} \begin{itemize} \item née de préoccupations venues de la logique (Hilbert, Gödel), \item à l'origine des 1\textsuperscript{ers} concepts informatiques ($\lambda$-calcul, machine de Turing). \end{itemize} \bigskip \itempoint But : étudier les limites de ce que \textbf{peut ou ne peut pas faire un algorithme} \begin{itemize} \item sans limite de ressources (temps, mémoire juste « finis »), \item sans préoccupation d'efficacité ($\neq$ complexité, algorithmique), \item y compris résultats négatifs (« \emph{aucun} algorithme ne peut… »), \item voire relatifs (calculabilité relative), \item admettant diverses généralisations (calculabilité supérieure). \end{itemize} \end{frame} % \begin{frame} \frametitle{Quelques noms} \itempoint Muḥammad ibn Mūsá al-\b{H}wārizmī (v.780–v.850) : $\rightsquigarrow$« algorithme » \itempoint Blaise Pascal (1623–1662) : machine à calculer $\rightsquigarrow$automates \itempoint Charles Babbage (1791–1871) : \textit{Analytical Engine} (Turing-complète !) \itempoint Ada (née Byron) Countess of Lovelace (1815–1852) : programmation \itempoint Richard Dedekind (1831–1916) : définitions primitives récursives \itempoint David Hilbert (1862–1943) : \textit{Entscheidungsproblem} (décider la vérité) \itempoint Jacques Herbrand (1908–1931) : fonctions générales récursives \itempoint Kurt Gödel (1906–1978) : incomplétude en logique \itempoint Alonzo Church (1903–1995) : $\lambda$-calcul \itempoint Alan M. Turing (1912–1954) : machine de Turing, problème de l'arrêt \itempoint Emil Post (1897–1954) : ensembles calculablement énumérables \itempoint Stephen C. Kleene (1909–1994) : $\mu$-récursion, th. de récursion, forme normale \end{frame} % \begin{frame} \frametitle{Fonction calculable} « Définition » : une fonction $f$ est \textbf{calculable} quand il existe un algorithme qui \begin{itemize} \item prenant en entrée un $x$ du domaine de définition de $f$, \item \textbf{termine en temps fini}, \item et renvoie la valeur $f(x)$. \end{itemize} \bigskip Difficultés : \begin{itemize} \item Comment définir ce qu'est un algorithme ? \item Quel type de valeurs ? \item Et si l'algorithme ne termine pas ? \item Distinction entre intention (l'algorithme) et extension (la fonction). \end{itemize} \end{frame} % \begin{frame} \frametitle{Sans préoccupation d'efficacité} \itempoint La calculabilité \alert{ne s'intéresse pas à l'efficacité} des algorithmes qu'elle étudie, uniquement leur \textbf{terminaison en temps fini}. \medskip P.ex. : pour savoir si $n$ est premier, on peut tester si $i\times j=n$ pour tout $i$ et $j$ allant de $2$ à $n-1$. (Hyper inefficace ? On s'en fout.) \bigskip \itempoint La calculabilité \alert{n'a pas peur des grands entiers}. \medskip P.ex. : \textbf{fonction d'Ackermann} définie par : \[ \begin{aligned} A(m,n,0) &= m+n \\ A(m,1,k+1) &= m \\ A(m,n+1,k+1) &= A(m,\,A(m,n,k+1),\,k) \end{aligned} \] définition algorithmique par récursion, donc calculable. \smallskip Mais $A(2,6,3) = 2^{2^{2^{2^{2^2}}}} = 2^{2^{65\,536}}$ et $A(2,4,4) = A(2,65\,536,3)$ est inimaginablement grand (et que dire de $A(100,100,100)$ ?). $\Rightarrow$ Ingérable sur un vrai ordinateur. \end{frame} % \begin{frame} \frametitle{Approches de la calculabilité} \itempoint Approche informelle : \textbf{algorithme = calcul finitiste} mené par un humain ou une machine, selon des instructions précises, en temps fini, sur des données finies \medskip \itempoint Approche pragmatique : tout ce qui peut être fait sur un langage de programmation « Turing-complet » (Python, Java, C, Caml…) idéalisé \begin{itemize} \item sans limites d'implémentation (p.ex., entiers arbitraires !), \item sans source de hasard ou de non-déterminisme. \end{itemize} \medskip \itempoint Approches formelles, p.ex. : \begin{itemize} \item fonctions générales récursives (Herbrand-Gödel-Kleene), \item $\lambda$-calcul (Church) ($\leftrightarrow$ langages fonctionnels), \item machine de Turing (Turing), \item machines à registres (Post…). \end{itemize} \bigskip \itempoint\textbf{« Thèse » de Church-Turing} : \alert{tout ceci donne la même chose}. \end{frame} % \begin{frame} \frametitle{Thèse de Church-Turing} \itempoint\textbf{Théorème} (Post, Turing) : les fonctions (disons $\mathbb{N} \dasharrow \mathbb{N}$) \textbf{(1)} générales récursives, \textbf{(2)} exprimables en $\lambda$-calcul, et \textbf{(3)} calculables par machine de Turing, coïncident toutes. \smallskip $\Rightarrow$ On parle de \alert{calculabilité au sens de Church-Turing}. \bigskip \itempoint\textbf{Observation} : tous les langages de programmation informatiques généraux usuels, idéalisés, calculent aussi exactement ces fonctions. \bigskip \itempoint\textbf{Thèse philosophique} : la calculabilité de C-T définit précisément la notion d'algorithme finitiste. \bigskip \itempoint\textbf{Conjecture physique} : la calculabilité de C-T correspond aux calculs réalisables mécaniquement dans l'Univers (en temps/énergie finis mais illimités). {\footnotesize $\uparrow$ (même avec un ordinateur quantique)} \bigskip Pour toutes ces raisons, le sujet mérite d'être étudié ! \end{frame} % \begin{frame} \frametitle{Données finies} Un algorithme travaille sur des \textbf{données finies}. \medskip Qu'est-ce qu'une « donnée finie » ? Tout objet représentable informatiquement : booléen, entier, chaîne de caractères, structure, liste/tableau de ces choses, ou même plus complexe (p.ex., graphe). \medskip $\rightarrow$ Comment y voir plus clair ? \bigskip Deux approches opposées : \begin{itemize} \item\textbf{typage} : distinguer toutes ces données, \item\textbf{codage de Gödel} : tout représenter comme des entiers ! \end{itemize} \bigskip Le typage est plus élégant, plus satisfaisant, plus proche de l'informatique réelle. \smallskip Le codage de Gödel simplifie l'approche/définition de la calculabilité (on étudie juste des fonctions $\mathbb{N} \dasharrow \mathbb{N}$). \end{frame} % \begin{frame} \frametitle{Codage de Gödel (« tout est un entier »)} \itempoint Représenter \textbf{n'importe quelle donnée finie par un entier}. \bigskip \itempoint Codage des couples : par exemple, \[ \langle m,n\rangle := m + \frac{1}{2}(m+n)(m+n+1) \] définit une bijection calculable $\mathbb{N}^2 \to \mathbb{N}$. \bigskip \itempoint Codage des listes finies : par exemple, \[ \langle\!\langle a_0,\ldots,a_{k-1}\rangle\!\rangle := \langle a_0, \langle a_1, \langle\cdots,\langle a_{k-1},0\rangle+1\cdots\rangle+1\rangle+1 \] définit une bijection calculable $\{\text{suites finies dans $\mathbb{N}$}\} \to \mathbb{N}$. \bigskip \itempoint Il sera aussi utile de représenter les programmes par des entiers. \bigskip \itempoint Les détails du codage sont \textbf{sans importance}. \bigskip \itempoint\alert{Ne pas utiliser dans la vraie vie} (hors calculabilité) ! \end{frame} % \begin{frame} \frametitle{Fonctions partielles} \itempoint Même si on s'intéresse à des algorithmes qui \textbf{terminent}, la définition de la calculabilité \alert{doit forcément} passer aussi par ceux qui ne terminent pas. {\footnotesize (Aucun langage Turing-complet ne peut exprimer uniquement des algorithmes qui terminent toujours, à cause de l'indécidabilité du problème de l'arrêt.)\par} \bigskip \itempoint Lorsque l'algorithme censé calculer $f(n)$ ne termine pas, on dira que $f$ n'est pas définie en $n$, et on notera $f(n)\uparrow$. Au contraire, s'il termine, on note $f(n)\downarrow$. \bigskip \itempoint Notation : $f\colon \mathbb{N} \dasharrow \mathbb{N}$ : une fonction $D \to \mathbb{N}$ définie sur une partie $D \subseteq \mathbb{N}$. \itempoint Notation : $f(n) \downarrow$ signifie « $n \in D$ », et $f(n) \uparrow$ signifie « $n \not\in D$ ». \itempoint Notation : $f(n) \downarrow = g(m)$ signifie « $f(n)\downarrow$ et $g(m)\downarrow$ et $f(n) = g(m)$ ». \itempoint Convention : $f(n) = g(m)$ signifie « $f(n)\downarrow$ ssi $g(m)\downarrow$, et $f(n) = g(m)$ si $f(n)\downarrow$ ». (Certains préfèrent $f(n) \simeq g(m)$ pour ça.) \end{frame} % \end{document}