Utiliser le langage d'intelligence artificielle PROLOG pour résoudre des jeux mathématiques et géométriques: combien y-a-t-il de de triangles dans une figure ?
1. COMPTER LES TRIANGLES
Avec le langage d’Intelligence Artificielle PROLOG
Copyright Jean Rohmer Avril 2020
Pôle Léonard de Vinci
Institut Fredrik Bull
Vous connaissez sans doute l’exercice de réflexion ou « test d’intelligence » qui consiste à compter
combien il y a de triangles dans la figure ci-dessus.
Essayer de les compter vous-même avant de lire la suite de l’article. Cela vous donnera une idée de la
mature du problème.
Nous allons voir comment écrire un programme d’intelligence artificielle avec le génial langage
PROLOG pour faire ce comptage. C’est très simple, tout le monde peut comprendre, en allant
doucement. Cela va prendre seulement 5 (cinq) lignes de PROLOG. Et vous apprendrez au passage
les bases du langage PROLOG.
Commençons par décrire la figure. Elle est composée de segments de droite -dans la suite on parlera
juste de droites- qui se coupent en des points.
Il y a 7 droites, que nous allons appeler af, ai, aj, ak, be, fe et fk.
Et elles se coupent en 11 points : a, b, c, d, e, f, g, h, i, j, k.
Pour décrire la figure en PROLOG, on va dire à quelles droites appartient chaque point. On peut
l’écrire comme ça :
ligne_point(af,a).
ligne_point(af,b).
ligne_point(af,f).
ligne_point(ak,a).
etc …
ligne_point(fe,e).
ligne_point(fk,f).
2. ligne_point(fk,i).
ligne_point(fk,j).
ligne_point(fk,k).
ligne_point(l,p) étant la manière que nous avons choisie de dire que le point p est sur la ligne l.
On dira que ligne_point(l,p) est une affirmation.
Un point est au moins sur deux lignes, le point a est sur 4 lignes, le point k sur 2 lignes.
Maintenant, il faut expliquer à la machine ce que veut dire « un triangle ».
On sera d’accord pour dire qu’un triangle abc est constitué de trois points et de trois lignes, chaque
point -ou sommet- étant sur les deux lignes -ou côtés- qui y aboutissent.
Donc si abc est un triangle, les 6 affirmations suivantes sont vraies :
ligne_point(ab,a).
ligne_point(ab,b).
ligne_point(bc,b).
ligne_point(bc,c).
ligne_point(ca,c).
ligne_point(ca,a).
En PROLOG, nous allons exprimer ça de manière générale, et non pas pour chaque cas particulier.
triangle([A,B,C]):-ligne_point(AB,A),ligne_point(AB,B),ligne_point(BC,B),ligne_point(BC,C),ligne_point(CA,C),ligne_point(CA,A).
Comprenons soigneusement cette formule, car elle illustre le cœur de PROLOG :
Elle se compose de deux parties séparées par les caractères :-
A gauche, une affirmation :
triangle([A,B,C])
A droite, plusieurs -6- affirmations :
ligne_point(AB,A), ligne_point(AB,B), …
mais à la différence de tout à l’heure, on a utilisé des MAJUSCULES : A plutôt que a, BC plutôt que bc
Pour PROLOG, ça veut dire que ce sont des variables, des inconnues (comme en maths : Y = aX + b ),
donc que l’on a écrit une définition générale ce qu’est un triangle :
Le sens de cette ligne est le suivant :
Pour que l’affirmation de gauche soit vraie -A, B et C sont les sommets d’un triangle- il suffit que les 6
affirmations de droite soient vraies, c’est-à-dire que :
Il existe une droite AB qui contient le point A
3. Et que cette même droite AB contienne le point B
Et qu’il existe une droite BC qui contient ce même point B
Et que cette même droite BC contienne le point C
Etc …
Avec cette ligne de PROLOG, on a expliqué à la machine ce que c’est qu’un triangle.
On a transmis des connaissances à la machine.
Maintenant, on va lui demander de les appliquer, un peu comme on demande aux élèves, une fois
qu’ils ont appris des théorèmes, de résoudre des problèmes.
Si on pose à la machine le problème :
triangle ([b,c,g]).
elle va répondre « faux » : bcg n’est pas un triangle
Au problème :
triangle([b,e,f])
elle va répondre “vrai” : bef est est un triangle
Pas mal.
Mais il y a plus fort :
Problème : triangle ([a,f,X]).
Elle va répondre :
X = e ou bien X = k ou bien X = …
On avait mis la variable, l’inconnue X dans le problème, et PROLOG nous trouve toutes les valeurs de
X qui répondent au problème. En quelque sorte, il a résolu une équation.
Pour en revenir à notre jeu de réflexion du début, -savoir combien il y a de triangles dans la figure- il
suffit de poser le problème suivant à la machine :
triangle (X)
et de compter les réponses.
Essayons. La première réponse qui va sortir est
X = [a,a,a]
4. Bizarre …
Ça nous dit que le point a est un triangle. Ce n’est pas tout à fait idiot : c’est un triangle qui aurait
des côtés de longueur nulle.
On va être d’accord pour dire que les sommets d’un triangle doivent être trois points différents.
On va l’exprimer comme ça, par trois affirmations que l’on va ajouter aux 6 premières :
A = B , B = C , C = A
= devant se lire comme « non égal ». Les notations des langage informatiques ne sont pas toujours
élégantes, même en PROLOG …
Reposons maintenant notre problème : triangle([X]).
Cela nous propose maintenant :
X = [a,b,f]
C’est-à-dire un triangle complètement « aplati » sur la droite af
Ça n’est pas non plus complètement stupide : c’est le cas où les deux plus petits côtés se confondent
avec le plus grand.
Pareillement, imposons donc que les trois côtés du triangle ne soient pas sur la même droite, en
ajoutant:
AB = BC , BC = CA , CA = AB
Reposons maintenant notre problème : triangle([X]).
Ça commence à nous donner les solutions suivantes :
X = [a, b, c] ;
X = [a, b, d] ;
X = [a, b, e] ;
X = [a, f, g] ;
X = [a, f, h] ;
X = [a, f, e] ;
X = [a, f, i] ;
X = [a, f, j] ;
X = [a, f, k] ;
X = [b, a, e] ;
X = [b, a, c] ;
X = [b, a, d];
Etc …
Tout commence bien, avec 9 triangles qui ont acomme sommet.
5. Mais, mais, le dixième est bae. C’est certes bien un triangle, mais il ressemble beaucoup au
triangle abe trouvé en troisième position !
Il y a 6 manières de nommer un triangle avec ses sommets … abc acb bac ….
Pas grave, on demande toutes les solutions, chaque triangle apparaîtra sous ses 6 noms, donc on
divise par 6 leur nombre, et le tour est joué, on a compté les triangles !
NB : si on est perfectionniste :
Pour utiliser une manière unique de les nommer, on va imposer que les sommets soient énoncés par
ordre alphabétique. Il faut que A précède B et que B précède C dans l’ordre alphabétique.
Pour cela, on écrit en PROLOG une affirmation precede(A,B), qui sera vraie si A est avant B dans
l’ordre alphabétique. Elle est donnée plus bas dans le programme complet.
Et on ajoute à la définition de « triangle » les affirmations : precede(A,B), precede(B,C)
Finalement, notre problème triangle([X]).
Va nous sortir LES triangles :
X = [a, b, c] ;
X = [a, b, d] ;
X = [a, b, e] ;
X = [a, f, g] ;
X = [a, f, h] ;
X = [a, f, i] ;
X = [a, f, j] ;
X = [a, f, k] ;
X = [a, e, f] ;
X = [a, e, g] ;
X = [a, e, h] ;
X = [a, c, d] ;
X = [a, c, e] ;
X = [a, g, h] ;
X = [a, i, j] ;
X = [a, i, k] ;
X = [a, d, e] ;
X = [a, j, k] ;
X = [b, e, f] ;
X = [c, e, g] ;
X = [d, e, h] ;
X = [f, g, i] ;
X = [f, h, j] ;
X = [e, f, k] ;
Y-a-plus qu’à les compter 😊
Si vous voulez vérifier ou «jouer » avec Prolog, téléchargez gratuitement SWI PROLOG
https://www.swi-prolog.org/Download.html
6. Et créez un fichier plus bas avec le suffixe .pl (que vous pourrez éditer comme un fichier .txt), dans
lequel vous mettez le programme listé plus bas, qui, hors la description de la figure, fait bien juste 5
lignes. Bien sûr, ce programme marchera pour n’importe figure géométrique que vous aurez décrite
pareillement. Et si vous voulez chercher d’autres polygones, réfléchissez à comment les définir par
analogie avec ce que l’on a fait pour le triangle.
Pour lancer le programme Prolog, double-cliquez sur le fichier .pl, et entrez le problème : triangle(X).
Sans oublier le point à la fin. La succession des solutions est obtenue en tapant sur la barre espace
après chaque solution.
Pour en savoir plus sur Prolog et commencer à programmer:
https://prolog.developpez.com/cours/
Pour avoir d’autres exemples pédagogiques et ludiques comme celui-ci d’introduction à PROLOG :
https://www.linkedin.com/posts/rohmer_intelligence-artificielle-r%C3%A9solution-de-activity-
6647914236632682496-x-ed
Programme complet de comptage des triangles
ligne_point(af,a).
ligne_point(af,b).
ligne_point(af,f).
ligne_point(ak,a).
ligne_point(ak,e).
ligne_point(ak,k).
ligne_point(ai,a).
ligne_point(ai,c).
ligne_point(ai,g).
ligne_point(ai,i).
ligne_point(aj,a).
ligne_point(aj,d).
ligne_point(aj,h).
ligne_point(aj,j).
ligne_point(be,b).
ligne_point(be,c).
ligne_point(be,d).
ligne_point(be,e).
ligne_point(fe,f).
ligne_point(fe,g).
ligne_point(fe,h).
ligne_point(fe,e).
ligne_point(fk,f).
ligne_point(fk,i).
ligne_point(fk,j).
ligne_point(fk,k).
triangle([A,B,C]):-
ligne_point(AB,A),ligne_point(AB,B),B=A,ligne_point(BC,B),BC=AB,ligne_point(BC,C),C=A,C=B,lign
e_point(CA,C),CA=AB,CA=BC,ligne_point(CA,A),precede(A,B),precede(B,C).