Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. %=============================================================================================
  2. % pocitani matice moznych prvku
  3. %=============================================================================================
  4.  
  5. % seznamyMoznosti(+Sudoku, -Seznamy moznosti pro kazde pole).
  6. % budu potrebovat transpozici matice
  7. % ten rozdil inicialni udelam pro kazdy radek jen jednou
  8. seznamyMoznosti(I,M):- transpozice(I,T),radkySloupce(I,T,M0),zmensiMat(I,B),odectiBloky(M0,B,M).
  9.  
  10. % radkySloupce(+Sudoku, +Transpozice, -Seznamy moznosti co nejsou v radku ani ve sloupci).
  11. radkySloupce([],_,[]).
  12. radkySloupce([R|Rs],T,[O|Os]):-X0=[1,2,3,4,5,6,7,8,9],subtract(X0,R,X1),seznamyRadky(X1,T,O),radkySloupce(Rs,T,Os).
  13. seznamyRadky(_,[],[]).
  14. seznamyRadky(M,[S|Ss],[O|Os]):- subtract(M,S,O), seznamyRadky(M,Ss,Os).
  15.  
  16. % odectiBloky(+Moznosti jen bez radku a sloupcu, +SumaBloku, -Moznosti i s odectenymi bloky).
  17. odectiBloky([],_,[]).
  18. odectiBloky([I0,I1,I2|Is],[B|Bs],[M0,M1,M2|Ms]):-odectiRadky(I0,B,M0),odectiRadky(I1,B,M1),odectiRadky(I2,B,M2),
  19. odectiBloky(Is,Bs,Ms).
  20. odectiRadky([],_,[]).
  21. odectiRadky([R0,R1,R2|Rs],[B|Bs],[V0,V1,V2|Vs]):-subtract(R0,B,V0),subtract(R1,B,V1),subtract(R2,B,V2),
  22. odectiRadky(Rs,Bs,Vs).
  23.  
  24. % transpozice(+M, -TM):-TM je transpozice matice M
  25. transpozice(M, []):-vsePrazdne(M).
  26. transpozice(M, [H|TM]):-hlavyZbytky(M, H, Z), transpozice(Z, TM).
  27. % vsePrazdne(+SeznamSeznamu):-vsechny seznamy v SeznamSeznamu jsou prazdne
  28. vsePrazdne([]).
  29. vsePrazdne([[]|Z]):-vsePrazdne(Z).
  30. % hlavyZbytky(+SeznamSeznamu, -Hlavy, -Zbytky):-rozdeli vsechny seznamu v SeznamSeznamu na Hlavy a Zbytky
  31. hlavyZbytky([], [], []).
  32. hlavyZbytky([[H|T] | Z], [H|PP], [T|ZB]):-hlavyZbytky(Z, PP, ZB).
  33.  
  34. % zmensi matici, vzdy cely blok strci do jednoho prvku
  35. zmensiMat([],[]).
  36. zmensiMat([A,B,C|Xs],[[Y0,Y1,Y2]|Ys]):-zmensiRad(A,[A0,A1,A2]),zmensiRad(B,[B0,B1,B2]),zmensiRad(C,[C0,C1,C2]),
  37. append(A0,B0,X0),append(X0,C0,Y0),
  38. append(A1,B1,X1),append(X1,C1,Y1),
  39. append(A2,B2,X2),append(X2,C2,Y2),zmensiMat(Xs,Ys).
  40. zmensiRad([],[]).
  41. zmensiRad([A,B,C|Xs],[[A,B,C]|Ys]):-zmensiRad(Xs,Ys).
  42.  
  43. %=============================================================================================
  44. % funkce pro selekci prvku na radku
  45. %=============================================================================================
  46.  
  47. % jenjiste(+Radek, +SeznamMoznosti, -NovyRadek).
  48. % asi by se to dalo delat iterativne, ale ted se mi nechce
  49. jenjiste([.|Rs],[[X]|_],[X|Rs]).
  50. jenjiste([R|Rs],[_|Ms],[R|Xs]):- jenjiste(Rs,Ms,Xs).
  51. tip2([.|Rs],[[A,B]|_],[X|Rs]):- X = A; X = B.
  52. tip2([R|Rs],[_|Ms],[R|Xs]):- tip2(Rs,Ms,Xs).
  53. tip3([.|Rs],[[A,B,C]|_],[X|Rs]):- X = A; X = B; X = C.
  54. tip3([R|Rs],[_|Ms],[R|Xs]):- tip3(Rs,Ms,Xs).
  55. tipN([.|Rs],[M|_],[X|Rs]):- member(X,M).
  56. tipN([R|Rs],[_|Ms],[R|Xs]):- tipN(Rs,Ms,Xs).
  57.  
  58. % podobne jako tipN, ale dosazuje konkretni, cislo o kterem uz vim ze je tam jen jednou
  59. dosadCislo(N,[.|Rs],[M|_],[N|Rs]):- member(N,M).
  60. dosadCislo(N,[R|Rs],[_|Ms],[R|Xs]):- dosadCislo(N,Rs,Ms,Xs).
  61.  
  62. % jedinevradku(+Radek, +SeznamMoznosti, -NovyRadek).
  63. jedinevradku(I,M,O):- jedinevradku(1,I,M,O).
  64. jedinevradku(N,I,M,O):- najdiJedineCislo(N,M), dosadCislo(N,I,M,O).
  65. jedinevradku(N,I,M,O):- N1=N+1, N1<10, jedinevradku(N1,I,M,O).
  66.  
  67. % uspeje, pokud se cislo vyskytuje jen jednou na radku moznosti
  68. najdiJedineCislo(N,[M|Ms]):- (member(N,M), \+najdiCislo(N,Ms)); najdiJedineCislo(N,Ms).
  69. % uspeje, pokud se tam vyskytuje cislo libovolnekrat
  70. najdiCislo(N,[M|Ms]):- member(N,M); najdiCislo(N,Ms).
  71.  
  72. %=============================================================================================
  73. % rizeni programu, centralni cast kodu
  74. %=============================================================================================
  75.  
  76. % zjisti jestli je sudoku vyplnene
  77. vyplnene([]).
  78. vyplnene([X|Xs]):- \+member(.,X), vyplnene(Xs).
  79.  
  80. % doplni jedno cislo, prvni zkusi jen jiste a kdyztak zkusi vsechny
  81. krok(I,O):- seznamyMoznosti(I,M),(vyzkousejPoRadcich(jenjiste,I,M,O);
  82. vyzkousejPoRadcich(jedinevradku,I,M,O);
  83. vyzkousejPoSloupcich(jedinevradku,I,M,O);
  84. vyzkousejPoRadcich(tip2,I,M,O);
  85. vyzkousejPoRadcich(tip3,I,M,O);
  86. vyzkousejPoRadcich(tipN,I,M,O)).
  87.  
  88. % vyzkousejPoRadcich(+Funkce, +In, +Moznosti, -Out)
  89. % vyzkousejPoRadcich(_,[],_,[]). chci aby to selhalo pokud se nic nenajde
  90. vyzkousejPoRadcich(F,[I|Is],[M|_],[O|Is]):- call(F,I,M,O). % mozna ! ale jen u jistych
  91. vyzkousejPoRadcich(F,[I|Is],[_|Ms],[I|Os]):- vyzkousejPoRadcich(F,Is,Ms,Os).
  92.  
  93. vyzkousejPoSloupcich(F,I,M,O):- transpozice(I,TI), transpozice(M,TM), vyzkousejPoRadcich(F,TI,TM,TO), transpozice(TO,O).
  94.  
  95. %============================================================================================================
  96. % vstup do programu a testovaci metody
  97. %============================================================================================================
  98.  
  99. % vypln(+Sudoku, -Reseni).
  100. vypln(S,S):-vyplnene(S),!.
  101. vypln(A,C):-krok(A,B), vypln(B,C).
  102.  
  103. % primitivni
  104. test1(X):- vypln(
  105. [[3,6,4,7,8,5,.,.,9],
  106. [.,8,2,4,3,9,6,5,7],
  107. [7,9,5,2,.,6,8,3,4],
  108. [4,7,1,5,9,2,3,6,8],
  109. [9,5,.,3,7,8,4,1,2],
  110. [8,2,3,6,4,1,7,9,5],
  111. [2,1,8,.,6,4,5,7,3],
  112. [6,3,9,8,5,7,.,4,1],
  113. [5,4,7,1,2,3,9,8,6]],X),!.
  114.  
  115. test2(X):- vypln(
  116. [[3,6,4,7,8,5,.,.,9],
  117. [.,8,2,4,3,9,6,5,7],
  118. [7,9,5,2,.,6,8,3,4],
  119. [4,7,1,5,9,2,3,6,8],
  120. [9,5,.,3,7,8,4,1,2],
  121. [8,2,3,6,4,1,7,9,5],
  122. [.,.,.,.,6,4,5,7,3],
  123. [.,.,.,8,5,7,.,4,1],
  124. [.,.,.,1,2,3,9,8,6]],X),!.
  125.  
  126. % lehke
  127. test3(X):- vypln(
  128. [[1,.,.,.,8,.,6,7,3],
  129. [.,.,.,.,.,7,4,.,5],
  130. [5,.,.,.,.,.,2,.,.],
  131. [6,.,3,.,.,9,.,.,1],
  132. [7,4,.,5,.,6,.,3,2],
  133. [9,.,.,4,.,.,8,.,7],
  134. [.,.,9,.,.,.,.,.,4],
  135. [4,.,7,6,.,.,.,.,.],
  136. [8,3,1,.,4,.,.,.,6]],X),!.
  137.  
  138. % stredni
  139. test4(X):- vypln(
  140. [[.,.,2,8,7,1,9,.,4],
  141. [.,.,4,9,.,.,.,5,.],
  142. [.,.,3,.,.,.,6,1,8],
  143. [.,.,6,1,8,.,.,.,.],
  144. [9,.,.,2,.,4,.,.,1],
  145. [.,.,.,.,6,7,8,.,.],
  146. [6,8,7,.,.,.,4,.,.],
  147. [.,4,.,.,.,3,7,.,.],
  148. [3,.,9,7,4,8,1,.,.]],X),!.
  149.  
  150. % tezke
  151. test5(X):- vypln(
  152. [[.,.,9,.,5,.,.,.,3],
  153. [.,8,.,.,9,2,.,7,.],
  154. [.,4,.,.,3,.,.,.,8],
  155. [.,9,7,.,.,4,.,8,2],
  156. [8,.,.,3,.,9,.,.,1],
  157. [4,2,.,5,.,.,3,9,.],
  158. [7,.,.,.,4,.,.,5,.],
  159. [.,3,.,8,1,.,.,2,.],
  160. [2,.,.,.,7,.,1,.,.]],X),!.
  161.  
  162. % zapeklite
  163. test6(X):- vypln(
  164. [[.,9,.,.,.,4,5,.,.],
  165. [.,.,.,.,.,.,4,1,8],
  166. [6,.,.,.,.,5,.,2,.],
  167. [8,.,.,9,4,.,.,.,6],
  168. [.,4,6,.,3,.,2,8,.],
  169. [3,.,.,.,8,6,.,.,5],
  170. [.,5,.,6,.,.,.,.,2],
  171. [2,8,9,.,.,.,.,.,.],
  172. [.,.,3,2,.,.,.,9,.]],X),!.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement