Une tribune de Jean Rohmer, enseignant-chercheur, Docteur-Ingénieur ENSIMAG, Docteur-ès-Sciences – HDR en Informatique, initialement publiée dans The Conversation.
Peut-on apprendre à compter à un ordinateur ? Vous me direz « à quoi bon ? » puisque ce genre de machines possède déjà des circuits qui font fort bien les additions et les multiplications. Mais là n’est pas notre propos : peut-on enseigner à une machine les connaissances de base de l’arithmétique, puis lui demander de les appliquer en raisonnant, en lui posant un problème comme : « trouver tous les nombres entiers dont le produit fait 80 ».
Si nous réussissons, nous pouvons envisager plus généralement de transmettre à une machine bien d’autres sortes de connaissances, pour qu’elle puisse résoudre une grande variété de problèmes. Tel est un des buts de l’intelligence artificielle symbolique, étudiée depuis les années 1950, et très utilisée dans les années 1980.
Apprendre à parler le Prolog
Vous allez voir que toutes les connaissances permettant de maîtriser l’addition tiennent en deux phrases, et nous verrons comment les coder dans le langage Prolog.
L’intelligence artificielle symbolique se différencie de l’intelligence artificielle connexionniste, sous les feux de la rampe depuis une dizaine d’années, bien qu’aussi ancienne. La première part de connaissances générales transmises à la machine par des humains pour résoudre des problèmes, la seconde part d’exemples de solutions qu’elle essaie d’extrapoler par des méthodes statistiques.
Prolog est un langage informatique inventé en 1972 à L’université de Marseille par Alain Colmerauer. Basé sur la logique, il est une des principales innovations en informatique de ces cinquante dernières années.
Nous allons procéder comme nous le faisons avec les jeunes enfants pour leur apprendre les premiers rudiments des mathématiques.
D’abord, il faut apprendre à compter, à l’aide de comptines que l’on apprend par cœur :
Un, deux, trois, quatre, cinq, six…
Qu’est-ce qu’il y a après sept ? huit. Très bien !
Tu sais compter jusqu’à combien ? vingt. Excellent !
Avec Prolog, on va dire à l’ordinateur :
apres(un,deux).
apres(deux,trois).
apres(trois,quatre).
apres(quatre,cinq).
[…]
apres(douze,treise).
Vous vous arrêtez quand vous voulez, vous pouvez faire quelques fautes d’orthographe… Maintenant, on peut poser des questions à la machine :
apres(trois,X) ?
Elle nous répond gentiment : X = quatre
apres(douze,X) ? :
Réponse : X = treise
Un peu plus difficile (pour les enfants)
apres(X,dix) ? :
Réponse : X = neuf
Quels sont les deux nombres avant sept ?
apres(X,Y), apres(Y,sept) ?
Réponse : X = cinq, Y = six
Pas si mal.
Passons aux additions
Une première solution est d’apprendre à la machine la table d’addition :
somme(un,un, deux).
somme(un,trois,quatre).
…
somme(un, douze, treise).
…
somme(trois,cinq,huit).
somme(trois,six,neuf).
…
Ensuite vous pouvez demander :
somme(trois,quatre,X) ? :
Réponse : X= sept.
Bravo ! Et, beaucoup plus fort, la machine en sait maintenant assez pour faire des soustractions :
somme(trois,X,sept) ?
Réponse : X = quatre.
Mais encore :
somme(X,Y,quatre) ?
Réponse : X = un, Y = trois
X = deux, Y = deux
X = trois, Y = un
Quand les enfants découvrent les algorithmes
Vous me direz qu’il n’y a pas grand-chose d’intelligent là-dedans, juste du par cœur. Mais nous sommes déjà si fiers quand nos chères têtes blondes font aussi bien.
On préfère néanmoins quand ils commencent à nous expliquer leurs propres raisonnements : « pour ajouter trois à cinq, je pars de cinq et je cherche le nombre suivant trois fois : six, puis sept, puis huit » Ils viennent de découvrir un algorithme ! Pour cela, il leur a fallu d’abord acquérir la notion, le sens de « addition », comment ils ressentent ça dans la vraie vie.
Maman a des bonbons dans son panier, et Papa en a d’autres dans le sien. Une addition, c’est quand ils versent leurs paniers dans mon panier. Le nombre des bonbons dans mon panier à la fin est la somme du nombre des bonbons dans leurs paniers. Une fois la notion d’addition ainsi définie, les enfants se font très vite une idée de sa propriété essentielle : plus il y a de bonbons dans leurs paniers, plus il y en a dans le mien !
Ce que, en bons agents rationnels et pragmatiques, ils expriment vite par la propriété minimale suivante : un bonbon de plus dans le panier de Papa ou de Maman, ça fait un bonbon de plus dans mon panier.
Ils viennent tout simplement de découvrir un des axiomes de Peano :
Si a + b = c, alors a + (b+1) = (c+1)
Ou encore, une condition suffisante pour que a + (b+1)= (c+1) est que a + b = c. On va coder ça en Prolog :
somme(Maman_T1,Papa_T2,Moi_T2) :-
apres(Papa_T1,Papa_T2),apres(Moi_T1,Moi_T2), somme(Maman_T1,Papa_T1,Moi_T1).
T1 et T2 voulant dire « au temps T1 : avant d’ajouter un bonbon » et « au temps T2 : après avoir ajouté un bonbon »
En Prolog les symboles :- dans A :- B,C,D signifient : A est vrai si B et C et D sont vrais. L’énoncé en Prolog doit se lire :
S’il y a un bonbon de plus dans le panier de Papa :
apres(Papa_T1,Papa_T2)
Alors il y a un bonbon de plus dans le mien :
apres(Moi_T1,Moi_T2)
Pourvu que le panier de Maman reste inchangé : on a utilisé Maman_T1 des deux côtés du :-
Les mathématiques ne peuvent exister que parce que les humains sont d’accord entre eux sur ces intuitions dès l’âge de 3 ans. Notre définition de l’addition est récursive : on calcule la somme de grands nombres et ajoutant « un » aux résultats de l’addition de plus petits nombres. Mais cette récursion ne peut être infinie, car il n’y a pas de plus petit nombre que « un ». Il nous faut une autre connaissance pour ne pas tomber dans le cercle vicieux : « pour faire une addition, faites une addition ». la seule autre connaissance dont nous disposons est la succession des nombres : « apres ».
La solution – comme les jeunes enfants la trouvent tous seuls- est de se rendre compte que ajouter « un » à un nombre est la même chose que de trouver son successeur.
Ce qui en Prolog donne
somme(X,un,Y) :-apres(X,Y).
Le tour est joué !
Tout tient en ces deux phrases, plus la liste des « apres »
somme(X,un,Y) :-apres(X,Y).
somme(Maman_T1,Papa_T2,Moi_T2) :-
apres(Papa_T1,Papa_T2),apres(Moi_T1,Moi_T2),somme(Maman_T1,Papa_T1,Moi_T1).
Nous avons appris l’addition à la machine.
Vérifions avec Prolog :
somme(trois,cinq,X) ?
Réponse : X = huit
somme(deux,X,six) ?
Réponse X = quatre
somme(X,Y,cinq)
X=un, Y= quatre
X=deux, Y = trois
X=trois, Y = deux
X=quatre, Y = un
Pour exécuter en vrai ce programme, téléchargez SWI Prolog, développé par l’Université d’Amsterdam, avec le fichier suivant :
apres(un,deux).
apres(deux,trois).
apres(trois,quatre).
…
apres(douze,treise).
somme(X,un,Y) :-apres(X,Y).
somme(Maman_T1,Papa_T2,Moi_T2) :-
apres(Papa_T1,Papa_T2),apres(Moi_T1,Moi_T2),somme(Maman_T1,Papa_T1,Moi_T1).
Une fois tout ça bien assimilé, posez-vous le problème de la multiplication, définissez « mult » en Prolog de façon que :
mult(deux,quatre,X) réponde X = huit
Quelques indications : ça prend aussi deux lignes, en suivant le même principe que l’addition : une expression récursive, et qui utilise des connaissances déjà exprimées.
Et bien sûr, commencez par retrouvez votre âme d’enfant, en vous demandant d’abord ce que peut bien vouloir signifier une multiplication, avec notre histoire de paniers et de bonbons.
Retrouvez les coordonnées de Jean Rohmer et l’actualité du De Vinci Research Center.
Plus d’infos sur la majeure IBO, Informatique, Big Data et objets connectés à l’ESILV.