/tutorial/backtracking/tiny_prolog/test_pam.e

http://github.com/tybor/Liberty · Specman e · 213 lines · 150 code · 55 blank · 8 comment · 0 complexity · e04f4c087beec2c1e2a37ad43b5a471c MD5 · raw file

  1. class TEST_PAM
  2. inherit
  3. PAM_GLOBALS
  4. creation
  5. make
  6. feature
  7. pam_pro: PAM_PROCESSOR;
  8. pam_printer: PAM_PRINTER;
  9. pam_parser : PAM_EXPR_PARSER;
  10. feature
  11. make is
  12. do
  13. !!pam_pro.make;
  14. !!pam_printer.make;
  15. !!pam_parser.make;
  16. -- test1;
  17. -- test2;
  18. -- test3;
  19. -- test4;
  20. -- test5;
  21. -- test6;
  22. test7;
  23. -- test8;
  24. end
  25. parse (txt: STRING) is
  26. do
  27. pam_parser.parse (txt);
  28. if
  29. pam_parser.error_detected
  30. or else
  31. pam_parser.warning_detected
  32. or else
  33. pam_parser.query
  34. then
  35. print (pam_parser.error_message);
  36. die_with_code (exit_failure_code);
  37. end
  38. end
  39. query (txt: STRING) is
  40. do
  41. pam_parser.parse (txt);
  42. if
  43. pam_parser.error_detected
  44. or else
  45. pam_parser.warning_detected
  46. or else
  47. pam_parser.fact
  48. then
  49. print (pam_parser.error_message);
  50. die_with_code (exit_failure_code);
  51. end;
  52. pam_pro.query (pam_parser.parsed_expr);
  53. end
  54. feature -- tests
  55. test1 is
  56. do
  57. print ("-----------%N");
  58. parse("p(f(X),h(Y,f(a)),Y).");
  59. pam_printer.print_fact(pam_parser.parsed_expr,-1);
  60. parse("p(Z,h(Z,W),f(W)).");
  61. pam_printer.print_fact(pam_parser.parsed_expr,-1);
  62. parse("p(Z,h(Z,W),f(W)):-t(Z,W),!,y(W,_).");
  63. pam_printer.print_fact(pam_parser.parsed_expr,-1);
  64. print ("-----------%N");
  65. end
  66. test2 is
  67. do
  68. print ("-----------%N");
  69. parse("cons([],R,R).");
  70. parse("cons([H1|T1],L2,[H1|R]) :- cons(T1,L2,R).");
  71. print ("-----------%N");
  72. query("cons([a,b,c],[e,f,g],R)?");
  73. end
  74. test3 is
  75. do
  76. print ("-----------%N");
  77. parse("mix([],[],[]).");
  78. parse("mix([H1|T1],L2,[H1|R]) :- mix(T1,L2,R).");
  79. parse("mix(L1,[H2|T2],[H2|R]) :- mix(L1,T2,R).");
  80. print ("-----------%N");
  81. query("mix([a,b],[e],R)?");
  82. end
  83. test4 is
  84. do
  85. print ("-----------%N");
  86. parse("dans([X|Y],[],X,Y).");
  87. parse("dans([X|Y],[X|T],D,Q):-dans(Y,T,D,Q).");
  88. print ("-----------%N");
  89. query("dans([a,b,c,d,e],T,R,Q)?");
  90. query("dans([a,b,c,d,e],_,R,L)?");
  91. end
  92. test5 is
  93. do
  94. print ("-----------%N");
  95. parse("permu([],[]).");
  96. parse("permu([X|Y],[D|R]):-dans([X|Y],T,D,Q),cons(T,Q,Z),permu(Z,R).");
  97. print ("-----------%N");
  98. query("permu([a,b,c,d],R)?");
  99. end
  100. test6 is
  101. do
  102. print ("-----------%N");
  103. --parse("in([c|Y],c):-!.");
  104. parse("in([X|Y],X).");
  105. parse("in([_|Y],Z):-in(Y,Z).");
  106. print ("-----------%N");
  107. query("in([a,b,c],R)?");
  108. end
  109. test7 is
  110. do
  111. print ("-----------%N");
  112. parse("clues(Maisons):-%
  113. %maison(A, Maisons), couleur(A, rouge), nationalite(A, anglais), %
  114. %maison(B, Maisons), nationalite(B, espagnol), animal(B, chien), %
  115. %maison(C, Maisons), couleur(C, vert), boit(C, cafe), %
  116. %maison(D, Maisons), nationalite(D, ukrainien), boit(D, the), %
  117. %adroite(Maisons, E, F), couleur(E, vert), couleur(F, ivoire), %
  118. %maison(G, Maisons), fume(G, winston), animal(G, escargot), %
  119. %maison(H, Maisons), fume(H, kools), couleur(H, jaune), %
  120. %milieu(Maisons, I), boit(I, lait), %
  121. %premiere(Maisons, J), nationalite(J, norvegien), %
  122. %voisins(Maisons, K, L), fume(K, chesterfields), animal(L, renard), %
  123. %voisins(Maisons, M, N), fume(M, kools), animal(N, cheval), %
  124. %maison(O, Maisons), fume(O, luckystrike), boit(O, jus_d_orange), %
  125. %maison(P, Maisons), nationalite(P, japonais), fume(P, parliaments), %
  126. %voisins(Maisons, Q, R), nationalite(Q, norvegien), couleur(R, bleu).");
  127. parse("couleur(maison(C,_,_,_,_), C).");
  128. parse("nationalite(maison(_,N,_,_,_), N).");
  129. parse("animal(maison(_,_,P,_,_), P).");
  130. parse("boit(maison(_,_,_,D,_), D).");
  131. parse("fume(maison(_,_,_,_,S), S).");
  132. parse("premiere(maisons(X,_,_,_,_), X).");
  133. parse("milieu(maisons(_,_,X,_,_), X).");
  134. parse("adroite(maisons(L,R,_,_,_), R, L).");
  135. parse("adroite(maisons(_,L,R,_,_), R, L).");
  136. parse("adroite(maisons(_,_,L,R,_), R, L).");
  137. parse("adroite(maisons(_,_,_,L,R), R, L).");
  138. parse("voisins(Xs, X, Y):-adroite(Xs, X, Y).");
  139. parse("voisins(Xs, X, Y):-adroite(Xs, Y, X).");
  140. parse("maison(X, maisons(X,_,_,_,_)).");
  141. parse("maison(X, maisons(_,X,_,_,_)).");
  142. parse("maison(X, maisons(_,_,X,_,_)).");
  143. parse("maison(X, maisons(_,_,_,X,_)).");
  144. parse("maison(X, maisons(_,_,_,_,X)).");
  145. print ("-----------%N");
  146. query("clues(Maisons),%
  147. %maison(X, Maisons), animal(X, zebre), nationalite(X, ZebraOwner),%
  148. %maison(Y, Maisons), boit(Y, eau), nationalite(Y, WaterDrinker)?");
  149. end
  150. test8 is
  151. do
  152. print ("-----------%N");
  153. parse("plus(s(X),Y,s(Z)):-plus(X,Y,Z).");
  154. parse("plus(z,X,X).");
  155. print ("-----------%N");
  156. query("plus(X,Y,s(s(s(s(z)))))?");
  157. end
  158. end -- class TEST_PAM