%********** Facts ********** cotesEgaux(X) :- ask(cotesEgaux, 'Combien la figure a-t-elle de côtés égaux ? ', X). angleDroit(X) :- ask(angleDroit, 'La figure possède-t-elle des angles droits (oui, non) ? ', X). cotesParalleles(X) :- ask(cotesParalleles, 'Combien la figure a-t-elle de côtés parallèles (0, 2 ou 4) ? ', X). ordre(X) :- ask(ordre, 'Combien de côtés ? ', X). %********** Moteur ********** :- dynamic memory/2. solve :- retractall(memory(_,_)), findall(X, nom(X), R), write(R). ask(Pred, _, X) :- memory(Pred, X). ask(Pred, _, _) :- memory(Pred, _), !, fail. ask(Pred, Question, X) :- write(Question), read(Y), asserta(memory(Pred, Y)), X == Y. %********** Rules ********** % Triangles nom(triangle) :- ordre(3). nom(triangleIsocele) :- nom(triangle), cotesEgaux(2). nom(triangleRectangle) :- nom(triangle), angleDroit(oui). nom(triangleRectangleIsocele) :- nom(triangleIsocele), nom(triangleRectangle). nom(triangleEquilateral) :- nom(triangle), cotesEgaux(3). % Quadrilateres nom(quadrilatere) :- ordre(4). nom(trapeze) :- nom(quadrilatere), cotesParalleles(2). nom(parallelogramme) :- nom(quadrilatere), cotesParalleles(4). nom(rectangle) :- nom(parallelogramme), angleDroit(oui). nom(losange) :- nom(parallelogramme), cotesEgaux(4). nom(carre) :- nom(losange), nom(rectangle).