SlideShare une entreprise Scribd logo
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).
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
 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]
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.
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
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).
precede(A,B):-ordre(L),rang(A,L,RA),rang(B,L,RB),RB>RA.
ordre([a,b,c,d,e,f,g,h,i,j,k,l,m]).
rang(X,[X|L],1).
rang(X,[Y|L],N):-X=Y,rang(X,L,N1),N is N1+1.

Contenu connexe

Tendances

Analyse factorielle des_correspondances-afc
Analyse factorielle des_correspondances-afcAnalyse factorielle des_correspondances-afc
Analyse factorielle des_correspondances-afc
Rémi Bachelet
 
Chapitre i introduction et motivations
Chapitre i introduction et motivationsChapitre i introduction et motivations
Chapitre i introduction et motivations
Sana Aroussi
 
Serie recurrents & arithmetiques
Serie recurrents & arithmetiquesSerie recurrents & arithmetiques
Serie recurrents & arithmetiques
mohamed_SAYARI
 
éNoncés+corrections bac2009
éNoncés+corrections bac2009éNoncés+corrections bac2009
éNoncés+corrections bac2009
Morom Bil Morom
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
L’Université Hassan 1er Settat
 
Les algorithmes d'arithmetique
Les algorithmes d'arithmetiqueLes algorithmes d'arithmetique
Les algorithmes d'arithmetique
mohamed_SAYARI
 
exercices-corriges-dalgorithmique
exercices-corriges-dalgorithmiqueexercices-corriges-dalgorithmique
exercices-corriges-dalgorithmique
fast xp
 

Tendances (20)

Chapitre5 les chaînes de caractères - Copy.pptx
Chapitre5 les chaînes de caractères - Copy.pptxChapitre5 les chaînes de caractères - Copy.pptx
Chapitre5 les chaînes de caractères - Copy.pptx
 
Analyse factorielle des_correspondances-afc
Analyse factorielle des_correspondances-afcAnalyse factorielle des_correspondances-afc
Analyse factorielle des_correspondances-afc
 
Chapitre i introduction et motivations
Chapitre i introduction et motivationsChapitre i introduction et motivations
Chapitre i introduction et motivations
 
Exercices sur-python-turtle-corrige
Exercices sur-python-turtle-corrigeExercices sur-python-turtle-corrige
Exercices sur-python-turtle-corrige
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
 
Serie2
Serie2Serie2
Serie2
 
Algorithmes de tri
Algorithmes de triAlgorithmes de tri
Algorithmes de tri
 
Lec 5 asymptotic notations and recurrences
Lec 5 asymptotic notations and recurrencesLec 5 asymptotic notations and recurrences
Lec 5 asymptotic notations and recurrences
 
Serie recurrents & arithmetiques
Serie recurrents & arithmetiquesSerie recurrents & arithmetiques
Serie recurrents & arithmetiques
 
Exercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombresExercices en turbo pascal sur les nombres
Exercices en turbo pascal sur les nombres
 
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo202 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
 
éNoncés+corrections bac2009
éNoncés+corrections bac2009éNoncés+corrections bac2009
éNoncés+corrections bac2009
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
Tp4 - PHP
Tp4 - PHPTp4 - PHP
Tp4 - PHP
 
Cours Piles et files en utilisant lesl istes chainées Prof. KHALIFA MANSOURI
Cours Piles et files en utilisant lesl istes chainées Prof. KHALIFA MANSOURI Cours Piles et files en utilisant lesl istes chainées Prof. KHALIFA MANSOURI
Cours Piles et files en utilisant lesl istes chainées Prof. KHALIFA MANSOURI
 
Correction
CorrectionCorrection
Correction
 
Fiche de TP 2 sur les Feuilles de calculs avec les Tableurs
Fiche de TP 2 sur les Feuilles de calculs avec les Tableurs Fiche de TP 2 sur les Feuilles de calculs avec les Tableurs
Fiche de TP 2 sur les Feuilles de calculs avec les Tableurs
 
آموزش روش های حل روابط بازگشتی - بخش یکم
آموزش روش های حل روابط بازگشتی - بخش یکمآموزش روش های حل روابط بازگشتی - بخش یکم
آموزش روش های حل روابط بازگشتی - بخش یکم
 
Les algorithmes d'arithmetique
Les algorithmes d'arithmetiqueLes algorithmes d'arithmetique
Les algorithmes d'arithmetique
 
exercices-corriges-dalgorithmique
exercices-corriges-dalgorithmiqueexercices-corriges-dalgorithmique
exercices-corriges-dalgorithmique
 

Similaire à Compter les triangles en PROLOG

Polynesie2014maths s-oblig&spe
Polynesie2014maths s-oblig&spePolynesie2014maths s-oblig&spe
Polynesie2014maths s-oblig&spe
Fabrice Lallemand
 
Exercice nombres complexes
Exercice nombres complexesExercice nombres complexes
Exercice nombres complexes
Yessin Abdelhedi
 
Bac s 2014_centres_etrangers
Bac s 2014_centres_etrangersBac s 2014_centres_etrangers
Bac s 2014_centres_etrangers
Fabrice Lallemand
 
Algorithmique seconde (corrigés et commentaires)
Algorithmique seconde (corrigés et commentaires)Algorithmique seconde (corrigés et commentaires)
Algorithmique seconde (corrigés et commentaires)
DriNox NordisTe
 
4 t série5-1314-wa-alphamaths
4 t série5-1314-wa-alphamaths4 t série5-1314-wa-alphamaths
4 t série5-1314-wa-alphamaths
Smaali Mondher
 

Similaire à Compter les triangles en PROLOG (20)

CAPES maths 2019 composition 1 (option informatique)
CAPES maths 2019 composition 1 (option informatique)CAPES maths 2019 composition 1 (option informatique)
CAPES maths 2019 composition 1 (option informatique)
 
Articles fr les mathematiques_7
Articles fr les mathematiques_7Articles fr les mathematiques_7
Articles fr les mathematiques_7
 
les matrices
les matricesles matrices
les matrices
 
Polynesie2014maths s-oblig&spe
Polynesie2014maths s-oblig&spePolynesie2014maths s-oblig&spe
Polynesie2014maths s-oblig&spe
 
Exercice nombres complexes
Exercice nombres complexesExercice nombres complexes
Exercice nombres complexes
 
Les vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdfLes vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdf
 
Tp3 matlab
Tp3 matlabTp3 matlab
Tp3 matlab
 
Bac s 2014_centres_etrangers
Bac s 2014_centres_etrangersBac s 2014_centres_etrangers
Bac s 2014_centres_etrangers
 
Algorithmique seconde (corrigés et commentaires)
Algorithmique seconde (corrigés et commentaires)Algorithmique seconde (corrigés et commentaires)
Algorithmique seconde (corrigés et commentaires)
 
Oral 1 CAPES Maths - L'intégration en terminale
Oral 1 CAPES Maths - L'intégration en terminaleOral 1 CAPES Maths - L'intégration en terminale
Oral 1 CAPES Maths - L'intégration en terminale
 
Muscu4
Muscu4Muscu4
Muscu4
 
4 t série5-1314-wa-alphamaths
4 t série5-1314-wa-alphamaths4 t série5-1314-wa-alphamaths
4 t série5-1314-wa-alphamaths
 
Chapitre_03_Analyse_syntaxique.pdf
Chapitre_03_Analyse_syntaxique.pdfChapitre_03_Analyse_syntaxique.pdf
Chapitre_03_Analyse_syntaxique.pdf
 
Enrichissez vos-classes-avec-extends-20
Enrichissez vos-classes-avec-extends-20Enrichissez vos-classes-avec-extends-20
Enrichissez vos-classes-avec-extends-20
 
Matlab Travaux Pratique
Matlab Travaux Pratique Matlab Travaux Pratique
Matlab Travaux Pratique
 
Les vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptxLes vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptx
 
Corrige math s1-s3_r_1er_gr_2013
Corrige math s1-s3_r_1er_gr_2013Corrige math s1-s3_r_1er_gr_2013
Corrige math s1-s3_r_1er_gr_2013
 
Cours architecture
Cours architectureCours architecture
Cours architecture
 
Examen organigrame
Examen organigrameExamen organigrame
Examen organigrame
 
Examen organigrame
Examen organigrameExamen organigrame
Examen organigrame
 

Plus de Jean Rohmer

Internet in 2020 rohmer open world forum 2011
Internet in 2020 rohmer open world forum 2011Internet in 2020 rohmer open world forum 2011
Internet in 2020 rohmer open world forum 2011
Jean Rohmer
 

Plus de Jean Rohmer (16)

Pub microsoft et health data hub
Pub microsoft et health data hubPub microsoft et health data hub
Pub microsoft et health data hub
 
De la pub microsoft dans les articles sur le health data hub
De la pub microsoft dans les articles sur le health data hubDe la pub microsoft dans les articles sur le health data hub
De la pub microsoft dans les articles sur le health data hub
 
Les 40 ans de l'Institut Fredrik Bull avec liens video: 40 ans d'informatique...
Les 40 ans de l'Institut Fredrik Bull avec liens video: 40 ans d'informatique...Les 40 ans de l'Institut Fredrik Bull avec liens video: 40 ans d'informatique...
Les 40 ans de l'Institut Fredrik Bull avec liens video: 40 ans d'informatique...
 
Ideliance mental reseau semantique
Ideliance mental reseau semantiqueIdeliance mental reseau semantique
Ideliance mental reseau semantique
 
Arithmetics with symbolic Artificial Intelligence and Prolog: it's a child's...
Arithmetics with symbolic Artificial Intelligence  and Prolog: it's a child's...Arithmetics with symbolic Artificial Intelligence  and Prolog: it's a child's...
Arithmetics with symbolic Artificial Intelligence and Prolog: it's a child's...
 
Semantic architectures for Artificial Intelligence
Semantic architectures for Artificial IntelligenceSemantic architectures for Artificial Intelligence
Semantic architectures for Artificial Intelligence
 
L'informatique n'est pas l'amie des données
L'informatique n'est pas l'amie des donnéesL'informatique n'est pas l'amie des données
L'informatique n'est pas l'amie des données
 
Expériences de gestion des connaissances avec IDELIANCE: supprimons le document!
Expériences de gestion des connaissances avec IDELIANCE: supprimons le document!Expériences de gestion des connaissances avec IDELIANCE: supprimons le document!
Expériences de gestion des connaissances avec IDELIANCE: supprimons le document!
 
Artificial Intelligence Past Present and Future
Artificial Intelligence Past Present and FutureArtificial Intelligence Past Present and Future
Artificial Intelligence Past Present and Future
 
Knowledge representation: structured or unstructured?
Knowledge representation: structured or unstructured?Knowledge representation: structured or unstructured?
Knowledge representation: structured or unstructured?
 
Semantic networks, business rules, inference engines, and complex event proc...
Semantic networks, business rules, inference engines,  and complex event proc...Semantic networks, business rules, inference engines,  and complex event proc...
Semantic networks, business rules, inference engines, and complex event proc...
 
De l'IA au Calcul Littéraire: Pourquoi j'ai zappé le Web Sémantique
De l'IA au Calcul Littéraire: Pourquoi j'ai zappé le Web Sémantique De l'IA au Calcul Littéraire: Pourquoi j'ai zappé le Web Sémantique
De l'IA au Calcul Littéraire: Pourquoi j'ai zappé le Web Sémantique
 
Ideliance semantic network 2000
Ideliance semantic network 2000Ideliance semantic network 2000
Ideliance semantic network 2000
 
Standards considered harrmful
Standards considered harrmfulStandards considered harrmful
Standards considered harrmful
 
Litteratus calculus fundamentals
Litteratus calculus fundamentalsLitteratus calculus fundamentals
Litteratus calculus fundamentals
 
Internet in 2020 rohmer open world forum 2011
Internet in 2020 rohmer open world forum 2011Internet in 2020 rohmer open world forum 2011
Internet in 2020 rohmer open world forum 2011
 

Compter les triangles en PROLOG

  • 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).