%% This is a LaTeX document. Hey, Emacs, -*- latex -*- , get it? \documentclass[12pt,a4paper]{article} \usepackage[a4paper,hmargin=2cm,vmargin=3cm]{geometry} \usepackage[shorthands=off,french]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{newtxtext} % 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} \usepackage{hyperref} % \theoremstyle{definition} \newtheorem{comcnt}{Tout} \newcommand\thingy{% \refstepcounter{comcnt}\smallbreak\noindent\textbf{\thecomcnt.} } \renewcommand{\thefootnote}{\fnsymbol{footnote}} % \DeclareUnicodeCharacter{00A0}{~} \DeclareUnicodeCharacter{2026}{...} % % % \begin{document} \title{Logique et Fondements de l'Informatique\\Bibliographie et conseils de lecture} \author{David A. Madore} \maketitle \centerline{\textbf{CSC-3TC34-TP / INF110}} {\footnotesize \immediate\write18{sh ./vc > vcline.tex} \begin{center} Git: \input{vcline.tex} \end{center} \immediate\write18{echo ' (stale)' >> vcline.tex} \par} % % % \setlength{\parskip}{6pt plus 6pt} Ce document rassemble quelques conseils de lecture pour \emph{prolonger} ou bien \emph{compléter} le cours de « Logique et Fondements de l'Informatique », ou simplement en rapport avec des thématiques évoquées dans ce cours. \begin{itemize} \item\setlength{\parskip}{6pt plus 6pt}Commençons par un livre de vulgarisation, qui est aussi un grand classique (et une référence de toute une génération de geeks): \textit{Gödel, Escher, Bach} de Douglas Hofstadter (1979). C'est un livre très difficile à classer, ou même à décrire, puisqu'il intercale des chapitres sérieux avec des dialogues humoristiques, et qu'il parle à la fois de sciences et d'art (ça va des maths à la biologie en passant par la physique, la linguistique, la philosophie zen, la linguistique… et bien sûr les dessins d'Escher et la musique de Bach, ainsi que des réflexions sur l'intelligence artificielle qui restent étonnamment pertinentes pas loin de 50 ans après). Le thème général est celui de la récursion et de l'auto-référence (et en particulier, de variations sur le théorème de Gödel et l'astuce de Quine). On trouve aussi dedans une formalisation précise de l'arithmétique du premier ordre (mais présentée à un niveau grand public) ainsi qu'une description d'un langage de programmation (« BlooP ») qui calcule précisément les fonctions primitives récursives. En tout cas, je recommande très vivement ce livre (à la lecture duquel je dois beaucoup d'être moi-même devenu mathématicien) à tous ceux qui trouvent intéressants les thèmes abordés par ce cours. L'original est en anglais, mais il y a une excellente traduction française, à laquelle l'auteur lui-même a contribué. \item Sur la \textbf{calculabilité}, il existe de nombreux ouvrages, parmi lesquels on peut par exemple recommander : \begin{itemize} \item\textit{Computability Theory} de Barry Cooper (2003) : assez court et pas trop indigeste \item\textit{Calculabilité} de Benoît Monin \& Ludovic Patey (2022) : beaucoup plus complet, mais très bien présenté \item\textit{Turing Computability: Theory and Applications} de Robert I. Soare (2016) : concis et complet \item\textit{Computability Theory: An Introduction to Recursion Theory} de Herbert B. Enderton (2011) : beaucoup plus élémentaire et moins complet que les précédents \end{itemize} \item\setlength{\parskip}{6pt plus 6pt}Sur le \textbf{typage}, le livre \textit{Types and Programming Languages} de Benjamin Pierce (2002) aborde les aspects à la fois théoriques et pratiques du typage dans différents langages de programmation de manière bien plus complète que ce que j'ai pu faire en cours. Beaucoup plus costaud : {\textit{Proofs and Types}} de Jean-Yves Girard (disponible à l'adresse \url{http://www.paultaylor.eu/stable/prot.pdf} ; il s'agit de la traduction anglaise d'un original français, mais je crois que l'original est devenu introuvable). Contient des définitions précises de divers systèmes logiques et de typage, la preuve de leur normalisation, et les explications mathématiquement précises sur la correspondance de Curry-Howard. \item\setlength{\parskip}{6pt plus 6pt}Sur le \textbf{théorème de Gödel} : \textit{Gödel's Theorem (An Incomplete Guide to its Use and Abuse)} de Torkel Franzén (2005) est un ouvrage de semi-vulgarisation très bien écrit, et il prend notamment le temps d'expliquer plein de malentendus sur l'usage fait de ce théorème (notamment par des non-mathématiciens). Je peux aussi recommander \textit{An Introduction to Gödel's Theorems} de Peter Smith (Cambridge University Press, 2013), qui est moins de la vulgarisation et plus précis et complet, et qui est également très bien écrit, mais il est difficile à trouver. \item\setlength{\parskip}{6pt plus 6pt}Sur la \textbf{programmation fonctionnelle} : si ce style de programmation vous intéresse, je vous recommande fortement d'apprendre au moins un des langages de programmation Scheme (non typé, proche du $\lambda$-calcul) et/ou Haskell (fortement typé, mais diffère du OCaml en ce qu'il est « paresseux » et « purement fonctionnel », c'est-à-dire sans effets de bord, et c'est très instructif de comprendre ce que cela permet). \item\setlength{\parskip}{6pt plus 6pt}Concernant la programmation fonctionnelle \textbf{non typée}, le livre \textit{Structure and Interpretation of Computer Programs} d'Abelson et Sussman (1996 ; aussi appelé le « Wizard Book », aussi bien en référence à l'illustration de couverture que la compétence qu'il vous fera acquérir) est un grand classique, qui a servi pendant des années de support de cours au MIT. Il est épuisé au format papier, mais il est librement disponible en ligne à l'adresse \url{https://web.mit.edu/6.001/6.037/sicp.pdf} sur le site du MIT. Il est basé sur le Scheme (mais ne présuppose pas la connaissance du Scheme), mais il ne s'agit pas non plus d'un cours de Scheme : il s'agit d'un cours de programmation fonctionnelle non typée et des concepts fondamentaux qui vont avec. (Il y a aussi une “édition JavaScript” du livre, plus récente, si vous préférez ce langage ; mais je ne sais pas ce qu'elle vaut.) Notamment, ce livre explique comment écrire un interpréteur Scheme en Scheme (et ensuite comment le modifier), autrement dit, un programme universel, et ce que ça nous apprend sur la programmation et la sémantique des languages de programmation. (L'exposé \textit{The Most Beautiful Program Ever Written} de William Byrd, disponible sur YouTube à l'adresse \url{https://www.youtube.com/watch?v=OyfBQmvr2Hc}, peut également être intéressant comme une sorte de version très abrégée de ce point.) Le livre de Christian Queinnec \textit{Lisp in Small Pieces} (2007 ; traduction d'un original français \textit{Les langages Lisp} devenu introuvable) est également très instructif. \item\setlength{\parskip}{6pt plus 6pt}Concernant la programmation fonctionnelle \textbf{typée}, outre le OCaml, le Haskell est un langage très intéressant (y compris mathématiquement). À son sujet, le livre de Christopher Allen et Julie Moronuki \textit{Haskell Programming from first principles} me semble bien (il n'existe pas au format papier, mais le PDF est achetable en ligne à l'adresse \url{https://haskellbook.com/}). \end{itemize} \bigskip J'aurai certainement des ajouts à faire à cette liste ultérieurement. % % % \end{document}