Comments on Débriefing de mon cours Logique et Fondements de l'Informatique

fakbill (2024-05-23T06:38:27Z)

"Disons que si un ingénieur n'est pas un chercheur (dont le métier consiste à proposer de nouvelles théories), il n'est pas non plus un technicien (dont le métier consiste à appliquer des techniques existantes) : l'ingénieur est justement là pour faire le pont entre les deux, pour appliquer la théorie à la création de nouvelles techniques ou au perfectionnement de celles qui existent, ce qui implique de bien maîtriser la théorie de son domaine, avec un certain recul sur celle-ci, pas juste comme des recettes de cuisine apprises par cœur."

Oui, mais connaitre les détails de la théorie de Fourier n'est ni nécessaire ni suffisant pour "penser Fourier" dans les cas physiques où c'est utile. Connaitre les détails théoriques des méthodes d'optimisation n'est ni nécessaire ni suffisant pour les appliquer correctement quand on en a besoin sur un cas réel.
C'est comme la musique. On a besoin de faire des gammes pour bien apprendre à s'amuser en jouant, mais on n'a pas besoin des détails théoriques sur la propagation des ondes sonores. Ce n'est ni nécessaire, ni suffisant.

Il existe un monde (dans beaucoup d'universités anglo-saxonnes par ex) dans lequel on se confronte aux problèmes, on apprend alors les finesses d'usage des outils pour les résoudre, PUIS, pour ceux que ça intéresse, on va regarder le détail de la théorie.
Le faire "à la française" est également possible, mais le risque est de perdre la majorité des étudiants et de produire des gens qui ne se rappelleront que de morceaux de théorie, tout en étant infoutu de penser au bon outil en situation.

Ruxor (2024-05-12T17:49:38Z)

@Subbak: Je pense à des choses comme le préprocesseur C, où le langage n'est pas Turing-complet tel quel, mais il le devient si on ajoute la capacité de lire sa propre sortie, ou quelque chose de ce genre, ce qui est précisément une façon d'ajouter une machine universelle. Mais tu as raison, j'abuse sans doute en prétendant que ce cas de figure est courant.

Subbak (2024-05-06T04:44:46Z)

Quand tu dis que la possibilité de faire des fonctions récursives avec Quine + une machine universelle "permet de bien comprendre pourquoi on tombe si facilement sur des langages Turing-complets", tu penses à quoi ?
Je n'ai pas l'impression que ça explique particulièrement pourquoi des jeux comme Minecraft ou Magic: the Gathering sont Turing-complets vu qu'ils ne sont pas conçus pour avoir une machine universelle. Donc j'imagine que tu parles de vrais langages conçus dans un but de décrire des algorithmes, mais là je ne vois pas quel langage aurait été fait en cherchant à éviter le Turing-complétude (vu qu'un tel langage serait a priori interprété ou compilé en utilisant un langage générique donr on sait qu'il est Turing-complet).

Tom (2024-05-03T00:46:15Z)

Je n'aime pas les transparents moi non plus. Sur une conf assez courte où l'on veut faire passer quelques idées et quelques résultats, ça va. Mais sur des cours, je crois que pas grand monde n'aime ça. Le seul avantage est que c'est moins fatiguant pour le prof : plus facile que de faire défiler des transparents que de gratter au tableau.

J'aime bien les cours à l'américaine, ils écrivent en tout gros sur leurs tableaux https://www.youtube.com/watch?v=Tw1k46ywN6E
Leur cours est complémentaire aux supports, typiquement des bouquins de références.

Quand j'enseignais à la fac, je choisissais autant que possible les TD ou les projets. Je trouve que c'est là que j'ai une valeur ajoutée en temps qu'enseignant. Quand ce sont des transparents, je sais que je suis soporifique.

jeanas (2024-05-02T15:02:05Z)

@Héhéhé : Vous trouverez très peu d'enseignement de Lean ou de Haskell en France en général par rapport à Coq et OCaml, tout simplement parce que les deux derniers sont développés à l'Inria. Il y a peut-être une part de chauvinisme/NIH contestable là-dedans, mais c'est aussi tout simplement qu'un certain nombre des enseignants-chercheurs qui enseignent ces cours travaillent avec ces outils dans leur recherche, voire les développent.

Thomas (2024-05-02T15:01:44Z)

J'ai profité du mauvais temps d'hier pour lire un peu plus de ton cours, voici quelques remarques sur la partie call/cc (en espérant ne pas dire trop de bêtises).

---
En se basant uniquement sur tes transparents, il est très compliqué pour quelqu'un comme moi qui ne connaît pas Scheme de comprendre ce qu'est call/cc.

En revanche, <URL: http://www.madore.org/~david/computers/callcc.html> est beaucoup plus intelligible car elle le rapproche d'autres notions plus évocatrices pour des gens habitués aux langages de programmation "classiques".

(L'analogie (cf <URL: https://stackoverflow.com/a/46518215/943524>) avec un niveau spécial dans un jeu vidéo où la continuation serait un objet permettant de revenir au déroulement normal du jeu est intéressante, même si elle mérite d'être précisée pour montrer que ce n'est pas juste un appel de fonction avec un return.)

Une autre difficulté dans ton cours, c'est que tu présentes call/cc au milieu d'une partie liée au typage. Je ne connais rien au typage en général mais le fait que dans un langage typé doté de call/cc, la continuation puisse être de type A -> B *avec n'importe quel B* n'est pas quelque chose d'évident.

Ce que je comprends, c'est que dans ce cas on a le droit de typer la continuation ainsi car par construction cette fonction ne retourne jamais (de fait, le contexte dans lequel elle est appelée disparaît quand on l'invoque).

Mais moi, quand on me dit A -> B, je m'attends à avoir un objet qui prend un truc de type A et renvoie un truc de type B et la construction qui précède ressemble alors plus à une astuce pour mettre un type sur une construction non classique.
---

Pour résumer : je trouve la construction call/cc intéressante mais ça ne me semble pas évident de s'émerveiller sur sa traduction en terme de correspondance de CH si on n'est pas déjà bien familier avec le sujet. Et ça me semble être un sujet trop "niche" pour prendre le risque de perdre des gens qui découvrent avec.

Héhéhé (2024-05-02T11:55:13Z)

Pourquoi avoir choisi Coq plutôt que Lean ?

Tom (2024-05-02T11:13:49Z)

L'informatique "théorique" est bien intégrée dans les cursus info traditionnels (je crois que même Epita a de la calculabilité et du lambda calcul au programme). Dans ma fac, on faisait de la déduction naturelle en L1, de la logique du 1er ordre en L2 (50h), de la calculabilité en L3 (lambda calcul simplement typé, machines de Turing). Pour la suite, ça dépendait des spécialités, mais on pouvait trouver du Coq ou de la compilation de langages fonctionnels en M1, et puis les choses plus pointues dans les M2 spécialisés.

En école d'ingénieur, c'était similaire, mais on allait plus vite parce que les élèves étaient meilleurs, et il y avait quand même un biais pour faire des choses plus utiles.

Grosso-modo, les élèves qui ne sont pas passé par une prépa ont du mal à rédiger des preuves mathématiques. Par contre, les "formalismes" style sémantiques à petit pas ne posent pas trop de problème : après tout, c'est juste des notations pour décrire des programmes.

> J'ai tout de même le sentiment qu'idéalement, les ressources pédagogiques autour de ces sujets devraient former un continuum entre l'informatique "pratique" et l'informatique théorique, mais que ce n'est pas le cas.

En général, les profs qui s'intéressent à la théorique ne s'intéressent pas trop à la pratique et réciproquement. Et les manuels de référence font rarement le lien.

Thomas (2024-05-01T12:20:57Z)

Tout d'abord, félicitations pour ce cours !

Pour ma part, ça m'a motivé à m'intéresser un peu, enfin, à ce qu'est la calculabilité.

Je dois dire que je me suis aidé de plusieurs sources :
* Le livre The Nature of Computation <Url: https://nature-of-computation.org/>
* Tes transparents, qui ont le mérite d'être plus rigoureux que le livre ci-dessus, mais ceci peut aussi être un désavantage car le bouquin s'autorise plus de distance avec le formalisme pour faire passer certaines idées.
* Ce papier sur l'équivalence entre les différents modèles de calculabilité <Url: https://arxiv.org/abs/2010.15600>, car tout le monde dit qu'ils sont équivalents mais je ne trouvais pas de présentation satisfaisante sur ce point.

Étant un ancien élève de Télécom (enfin, je n'y ai fait qu'un an après l'X), le plan de ton cours m'a paru assez ambitieux par rapport à ce qu'on y faisait de mon temps et j'ai sauté pas mal de choses pour lesquelles je n'avais pas la disponibilité/motivation intellectuelle (j'y reviendrai peut-être).

Je peux témoigner qu'il n'est pas facile d'assimiler autant de choses en si peu de temps et je pense effectivement que tu pourrais retirer certaines parties qui ont posé plus de problèmes, quitte à les proposer en ressources complémentaires optionnelles.

Concernant le côté "à quoi ça sert ?", je ne sais moi-même pas vraiment y répondre. Je trouve qu'une question comme "Pourquoi les langages de programmation classique comportent-ils des constructions à risque comme while/goto et pourrait-on s'en passer ?" est fondamentale et devrait intéresser toute personne bossant dans l'informatique. Néanmoins, je constate en discutant avec des collègues que beaucoup de gens ne montrent aucun intérêt pour ce genre de questions.

J'ai tout de même le sentiment qu'idéalement, les ressources pédagogiques autour de ces sujets devraient former un continuum entre l'informatique "pratique" et l'informatique théorique, mais que ce n'est pas le cas.

jeanas (2024-05-01T10:31:41Z)

> C'est clairement la sémantique des ouverts qui leur a le plus « parlé » […]. La sémantique de Tarski m'a semblé avoir été assez bien compris aussi

Tu voulais dire Kripke ?

> Là aussi je suis certainement allé trop vite. Le sujet est délicat et il y a des chausse-trapes un peu partout[#11]. Le codage des couples n'est pas évident, l'utilisation du combinateur Y n'est pas évident, et comme mes élèves n'ont a priori pas fait de langage fonctionnel non typé avant (p.ex., pas de Scheme), ce n'est pas du tout facile de raccrocher ça à des notions qui leur parlent.

Est-ce que tu leur as directement parlé du combinateur Y (c'est mon impression d'après tes transparents), ou d'abord de la récursion plus naïve par simple auto-application avec « self self » pour faire les appels récursifs (dont tu parles très bien dans <URL:http://www.madore.org/~david/weblog/d.2023-12-01.2771.cours-lfi-2.html>) ?

Ça vaut ce que ça vaut (pas grand-chose), mais je peux donner mon expérience personnelle quand on m'a enseigné ça : la première fois qu'on m'a montré le combinateur Y, j'ai trouvé ça un peu obscur et miraculeux, alors que je comprenais beaucoup mieux la récursion naïve, mais je n'avais pas fait le lien. J'ai mis un temps fou à comprendre que c'est juste un moyen de faire de la récursion avec « self » au lieu de « self self », et surtout, que c'est bootstrappé via la récursion naïve. Je reste infoutu de connaître par cœur les combinateurs Y et Θ, mais maintenant je sais les retrouver à partir de `let curry f = let rec fixed = f fixed in fixed` et `let rec turing f = f (turing f)`.

Geo (2024-04-30T22:42:23Z)

Sur ce sujet, je recommande le cours de Xavier Leroy au collège de France de cette année.

https://www.college-de-france.fr/fr/agenda/cours/structures-de-controle-de-goto-aux-effets-algebriques

Geo (2024-04-30T22:38:32Z)

> Ensuite, j'ai passé un bon bout de temps de mon cours à parler de continuations, de la fonction call/cc (=call-with-current-continuation) et de continuation-passing-style (CPS).

Dommage, parce que comme tu le dis aussi, "ça sert vraiment" ! En plus, ce sont des constructions que l'on peut facilement programmer et rendre très concrètes grace à l'interaction avec l'ordinateur.

Personnellement, j'en suis un peu revenu de la théorie : j'en ai mangé pas mal en tant que prof et thésard, et je trouve que ça n'a pas été payant. Pour beaucoup d'élèves, les formalismes compliquent plus les choses qu'ils ne les éclairent, surtout quand ils sont introduits avant les concepts. Je pense que c'est plus naturel de jouer avec scheme ou ocaml, d'expérimenter avec le call/cc et les gestionnaires d'effet pendant quelques semaines, avant de chercher à écrire des règles de typage ou des sémantiques dénotationnelles.

C'est une spécificité assez française de promouvoir une rigueur poussée mais je me demande si c'est la bonne approche si le but est de former des ingénieur (par opposition à fournir des thésards dans les labos locaux).

Bon cela dit, ton cours a l'air super et tu as la chance d'avoir des étudiants qui sont demandeurs.


You can post a comment using the following fields:
Name or nick (mandatory):
Web site URL (optional):
Email address (optional, will not appear):
Identifier phrase (optional, see below):
Attempt to remember the values above?
The comment itself (mandatory):

Optional message for moderator (hidden to others):

Spam protection: please enter below the following signs in reverse order: abb767


Recent comments