Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 5.98 KB | None | 0 0
  1. % Auteur: Ira
  2. % Date: 09/11/2010
  3.  
  4. % max( +, +, ? )
  5. % max..
  6. max( X, Y, X ) :- X >= Y, !.
  7. max( _, Y, Y ) :- !.
  8.  
  9. % min( +, +, ? )
  10. % min quoi ~~
  11. min( X, Y, X ) :- X =< Y, !.
  12. min( _, Y, Y ) :- !.
  13.  
  14. % minListe( +, ? )
  15. % Retroune le plus petit nombre dans la liste
  16. minListe( [X], X ).
  17. minListe( [X, Y | Reste], Min ) :-
  18.          minListe( [Y | Reste], MinReste ),
  19.          min( X, MinReste, Min ),
  20.          !.
  21.          
  22. % minListe( +, ? )
  23. % Retroune le plus grand nombre dans la liste
  24. maxListe( [X], X ).
  25. maxListe( [X, Y | Reste], Max ) :-
  26.          maxListe( [Y | Reste ], MaxReste ),
  27.          max( X, MaxReste, Max ),
  28.          !.
  29.          
  30. % ls_minX( +, +, ? )
  31. % Renvoi le couple [X,Y] dont la composante X est la plus faible
  32. % parmir les deux couples founi
  33. % Si deux couples ont une composante X identique, celui avec la plus
  34. % faible composante Y sera renvoyé (pour tester les carrés)
  35. ls_minX( [A,X], [B,_], [A,X] ) :-
  36.          B > A,
  37.          !.
  38.  
  39. ls_minX( [A,X], [B,Y], [A,X] ) :-
  40.          B =:= A,
  41.          X =< Y,
  42.          !.
  43.  
  44. ls_minX( _, [B,Y], [B,Y] ).
  45.  
  46. % ls_minListeX( +, ? )
  47. % Renvoi le couple [X,Y] dont la composante X est la plus faible
  48. % parmi la liste de couple fournie
  49. ls_minListeX( [[A,X]], [A,X] ):- !.
  50. ls_minListeX( [[A,X],[B,Y] | Reste], Min ) :-
  51.               ls_minListeX( [[B,Y] | Reste], MinReste ),
  52.               ls_minX( [A,X], MinReste, Min ),
  53.               !.
  54.  
  55. % chk_line_ord( + )
  56. % Verifie si c'est une ligne, les points doivent etre ordonnés (useless ?)
  57. % chk_line_ord( [[1,1],[2,1],[3,1],[4,1]] ).
  58. chk_line_ord( [[A,Y],[B,Y],[C,Y],[D,Y]] ) :-
  59.               ( A =:= 0; A =:= 1 ),
  60.               D =:= C+1,
  61.               C =:= B+1,
  62.               B =:= A+1,
  63.               !.
  64.  
  65. % chk_row_ord( + )
  66. % Verifie si c'est une colonne, les points doivent etre ordonnés (useless ?)
  67. % chk_row_ord( [[0,0],[0,1],[0,2],[0,3]] ).
  68. chk_row_ord( [[X,A],[X,B],[X,C],[X,D]] ) :-
  69.              ( A =:= 0; A =:= 1 ),
  70.              D =:= C+1,
  71.              C =:= B+1,
  72.              B =:= A+1,
  73.              !.
  74.  
  75. % chk_suite( + )
  76. % Vérifie si la liste de nombre fournie forme une suite
  77. % chk_suite( [2,3,4,1] ).
  78. chk_suite( [A,B,C,D] ) :-
  79.            minListe( [A,B,C,D], Min ),
  80.            ( Min =:= 0 ; Min =:= 1 ),
  81.            chk_plus( [A,B,C,D], Min ),
  82.            N is Min+1,
  83.            chk_plus( [A,B,C,D], N ),
  84.            N2 is N+1,
  85.            chk_plus( [A,B,C,D], N2 ),
  86.            !.
  87.  
  88. % chk_plus( +, + )
  89. % Vérifie si N+1 est présent dans la liste fournie
  90. chk_plus( [H|_], N ) :-
  91.           H =:= N+1,
  92.           !.
  93.  
  94. chk_plus( [_|R], N ) :-
  95.           chk_plus( R, N ),
  96.           !.
  97.          
  98. % chk_plus_diag_down( +, + )
  99. % regarde si un couple [X+1,Y+1] existe dans la liste pour un couple
  100. % [X,Y] donné
  101. chk_plus_diag_down( [[X,Y]|_], [Xa,Ya] ) :-
  102.                X =:= Xa+1,
  103.                Y =:= Ya+1,
  104.                !.
  105.  
  106. chk_plus_diag_down( [_|R], N ) :-
  107.                chk_plus_diag_down( R, N ),
  108.                !.
  109.  
  110. % chk_plus_diag_down( +, + )
  111. % regarde si un couple [X+1,Y-1] existe dans la liste pour un couple
  112. % [X,Y] donné
  113. chk_plus_diag_up( [[X,Y]|_], [Xa,Ya] ) :-
  114.                X =:= Xa+1,
  115.                Y =:= Ya-1,
  116.                !.
  117.  
  118. chk_plus_diag_up( [_|R], N ) :-
  119.              chk_plus_diag_up( R, N ),
  120.              !.
  121.  
  122. % chk_plus_right( +, + )
  123. % regarde si un couple [X+1,Y] existe dans la liste pour un couple
  124. % [X,Y] donné
  125. chk_plus_right( [[X,Y]|_], [Xa,Ya] ) :-
  126.                X =:= Xa+1,
  127.                Y =:= Ya,
  128.                !.
  129.  
  130. chk_plus_right( [_|R], N ) :-
  131.              chk_plus_right( R, N ),
  132.              !.
  133.  
  134. % chk_plus_bottom( +, + )
  135. % regarde si un couple [X,Y+1] existe dans la liste pour un couple
  136. % [X,Y] donné
  137. chk_plus_bottom( [[X,Y]|_], [Xa,Ya] ) :-
  138.                X =:= Xa,
  139.                Y =:= Ya+1,
  140.                !.
  141.  
  142. chk_plus_bottom( [_|R], N ) :-
  143.              chk_plus_bottom( R, N ),
  144.              !.
  145.  
  146. % chk_line( + )
  147. % Véfirie si la liste de couple [X,Y] fournie forme une ligne
  148. chk_line( [[A,Y],[B,Y],[C,Y],[D,Y]] ) :-
  149.           chk_suite( [A,B,C,D] ),
  150.           !.
  151.  
  152. % chk_row( + )
  153. % Véfirie si la liste de couple [X,Y] fournie forme une colonne
  154. chk_row( [[X,A],[X,B],[X,C],[X,D]] ) :-
  155.           chk_suite( [A,B,C,D] ),
  156.           !.
  157.  
  158. % chk_diag( + )
  159. % Véfirie si la liste de couple [X,Y] fournie forme une diagonale
  160. chk_diag( L ) :-
  161.           ls_minListeX( L, [X,Y] ),
  162.           X >= 0,
  163.           X =< 1,
  164.           ( chk_diag_down( L, X, Y ) ; chk_diag_up( L, X, Y ) ),
  165.           !.
  166.  
  167. % chk_diag_down( +, +, + )
  168. % Verifie si une diagonale descendante est présente
  169. chk_diag_down( L, X, Y ) :-
  170.                Y >= 0,
  171.                Y =< 1,
  172.                chk_plus_diag_down( L, [X,Y] ),
  173.                X2 is X+1,
  174.                Y2 is Y+1,
  175.                chk_plus_diag_down( L, [X2,Y2] ),
  176.                X3 is X2+1,
  177.                Y3 is Y2+1,
  178.                chk_plus_diag_down( L, [X3,Y3] ).
  179.  
  180. % chk_diag_up( +, +, + )
  181. % Verifie si une diagonale montante est présente
  182. chk_diag_up( L, X, Y ) :-
  183.              Y >= 3,
  184.              Y =< 4,
  185.              chk_plus_diag_up( L, [X,Y] ),
  186.              X2 is X+1,
  187.              Y2 is Y-1,
  188.              chk_plus_diag_up( L, [X2,Y2] ),
  189.              X3 is X+2,
  190.              Y3 is Y-2,
  191.              chk_plus_diag_up( L, [X3,Y3] ).
  192.  
  193. % chk_square( + )
  194. % Verifie si un carré est présent dans la liste
  195. % chk_square( [[0,0],[1,1],[0,1],[1,0]] ).
  196. chk_square( L ) :-
  197.             ls_minListeX( L, [X,Y] ),
  198.             chk_plus_right( L, [X,Y] ),
  199.             chk_plus_bottom( L, [X,Y] ),
  200.             chk_plus_diag_down( L, [X,Y] ).
  201.  
  202. % win( + )
  203. % Détermine si la partie est gagnée pour la liste des pions donnée
  204. % (oue spas francais, osef)
  205. % win( [ [0,0],[0,1],[0,3],[0,2] ] ).
  206. % win( [ [2,3],[1,3],[3,3],[4,3] ] ).
  207. % win( [ [0,1],[2,3],[1,2],[3,4] ] ).
  208. % win( [ [2,3],[1,4],[3,2],[4,1] ] ).
  209. % win( [ [0,0],[1,1],[0,1],[1,0] ] ).
  210. win( L ) :-
  211.      ( chk_line( L ), ! );
  212.      ( chk_row( L ), ! );
  213.      ( chk_diag( L ), ! );
  214.      chk_square( L ).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement