polygones.pl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. %********** Facts **********
  2. cotesEgaux(X) :- ask(cotesEgaux, 'Combien la figure a-t-elle de côtés égaux ? ', X).
  3. angleDroit(X) :- ask(angleDroit, 'La figure possède-t-elle des angles droits (oui, non) ? ', X).
  4. cotesParalleles(X) :- ask(cotesParalleles, 'Combien la figure a-t-elle de côtés parallèles (0, 2 ou 4) ? ', X).
  5. ordre(X) :- ask(ordre, 'Combien de côtés ? ', X).
  6. %********** Moteur **********
  7. :- dynamic memory/2.
  8. solve :-
  9. retractall(memory(_,_)),
  10. findall(X, nom(X), R),
  11. write(R).
  12. ask(Pred, _, X) :-
  13. memory(Pred, X).
  14. ask(Pred, _, _) :-
  15. memory(Pred, _),
  16. !,
  17. fail.
  18. ask(Pred, Question, X) :-
  19. write(Question),
  20. read(Y),
  21. asserta(memory(Pred, Y)),
  22. X == Y.
  23. %********** Rules **********
  24. % Triangles
  25. nom(triangle) :-
  26. ordre(3).
  27. nom(triangleIsocele) :-
  28. nom(triangle),
  29. cotesEgaux(2).
  30. nom(triangleRectangle) :-
  31. nom(triangle),
  32. angleDroit(oui).
  33. nom(triangleRectangleIsocele) :-
  34. nom(triangleIsocele),
  35. nom(triangleRectangle).
  36. nom(triangleEquilateral) :-
  37. nom(triangle),
  38. cotesEgaux(3).
  39. % Quadrilateres
  40. nom(quadrilatere) :-
  41. ordre(4).
  42. nom(trapeze) :-
  43. nom(quadrilatere),
  44. cotesParalleles(2).
  45. nom(parallelogramme) :-
  46. nom(quadrilatere),
  47. cotesParalleles(4).
  48. nom(rectangle) :-
  49. nom(parallelogramme),
  50. angleDroit(oui).
  51. nom(losange) :-
  52. nom(parallelogramme),
  53. cotesEgaux(4).
  54. nom(carre) :-
  55. nom(losange),
  56. nom(rectangle).