Programmation Fonctionnelle et Symbolique - Introduction



1.a Un peu d'histoire

Souvent présentés comme le summum de la technologie, les ordinateurs sont en fait des machines assez simples (dans leur principe), fabriquées à partir de quelques types de circuits élémentaires : registres, mémoires, additionneurs, décodeurs etc...

Ces machines fonctionnent de la manière suivante : elles exécutent séquentiellement des programmes (enregistrés dans une mémoire) qui sont des suites d'instructions élémentaires. Les données (également en mémoire) que peuvent manipuler ces instructions appartiennent à quelques types bien connus: nombres entiers ou réels, caractères, adresses, et c'est à peu près tout...

Ceci convenait toutefois très bien aux premières applications des calculateurs : il s'agissait en effet d'effectuer des suites de calculs longues et répétitives, pour établir des tables numériques (par exemples calculs balistiques sur le «directeur de tir antiaérien M9» fabriqué par Bell vers 1942), décrypter des messages secrets (machines britanniques Robinson et Colossus, même époque), calculs numériques (ENIAC) etc..

Les programmes de l'époque ne pouvaient guère être compliqués, en raison de la très faible capacité des mémoires disponibles. Cette capacité augmentant naturellement au fil des années, on s'est avisé qu'il pouvait être intéressant :

On remarque que cette évolution préserve deux traits fondamentaux de l'informatique des origines : ce qu'on appelle «programmation impérative» puisqu'il s'agit de faire exécuter une suite d'ordres par une machine bête mais disciplinée.

Ne pouvant dire à la machine «c'est votre problème débrouillez-vous», le programmeur doit décrire la suite exhaustive des actions à exécuter, en envisageant les nombreux cas particuliers qui ne manquent jamais de se poser.

Vous connaissez tous l'aspect fastidieux de ce genre d'activité; qui demande par ailleurs une formation particulière (songez à vos premiers démêlés avec l'algorithmique).

1.b Programmation Impérative / Déclarative

La plupart des langages de programmation (il en existe plusieurs milliers) relèvent de la susdite Programmation Impérative; il existe cependant une autre catégorie : les langages déclaratifs.

Dans un langage déclaratif, l'activité de programmation consiste essentiellement à décrire le rapport qui existe entre les données et les résultats que l'on veut obtenir, plutôt que la séquence de traitements qui mène des unes aux autres (évidemment ceci représente un idéal...)

Deux approches sont fréquemment utilisées :

1.c Intelligence Artificielle et Programmation Symbolique

Dès la fin des années 50, un certain nombre d'équipes ont mené des recherches importantes dans le domaine baptisé communément Intelligence Artificielle : en particulier des programmes de démonstration automatique (Logic Theorist écrit en IPL par Newell, Shaw et Simon); des programmes de jeu (Echecs, Dames), etc...

Qu'est-ce que l'IA ? C'est de faire faire par une machine des choses qui nous paraissent relever de l'Intelligence humaine (ou au moins animale).

Une des particularités de la programmation en Intelligence Artificielle est la nécessité de manipuler facilement des symboles et des listes de symboles plutôt que des nombres ou des chaînes de caractères : ce qu'on appelle la Programmation Symbolique.

Les langages de l'époque n'offrant pas ce genre de facilités, un chercheur du MIT, John MacCarthy s'est lancé vers 56-58 dans la définition d'un langage ad hoc baptisé LISP (LISt Processing language).

Depuis LISP 1.5 (la première version largement diffusée), plusieurs centaines d'implémentations de «dialectes Lisp» ont été développées; en effet l'écriture d'un interprèteur LISP n'est pas un travail énorme (quelques milliers d'instructions) comparativement au développement d'un compilateur pour un langage classique (plusieurs dizaines de milliers d'instructions); d'où l'éclosion (années 60-70) de centaines de versions différentes (presque autant que d'utilisateurs, disent les mauvaises langues !).

Ce phénomène est également dù au milieu Lispien: les chercheurs en IA étaient de fait d'excellents programmeurs peu liés par des contraintes extérieures de délais; dont le travail consistait d'une part à trouver des idées; d'autre part à les tester en écrivant des programmes prototypes qui seront entièrement réécrits si l'idée s'avère fructueuse, et finiront au panier dans le cas contraire (le plus fréquent).

1.d La famille Lisp

L'engouement récent pour l'IA aidant, la tendance est à la standardisation du langage LISP : il est évidemment plus économique de disposer du même langage sur toutes les machines sur lesquelles on désire porter un logiciel commercial. Parmi les LISP récents citons : Il est à noter que certains logiciels (par exemple l'éditeur de textes Emacs, ou logiciel de CAO AutoCad) contiennent un petit interprèteur Lisp qui permet à l'utilisateur d'écrire des programmes qui étendent les possibilités de base du logiciel.
M. BILLAUD Département Informatique IUT-A Bordeaux (1989)