fork download
  1. % Представление костяшек домино. Каждая костяшка представлена фактом.
  2. домино(0,0). домино(0,1). домино(0,2). домино(0,3). домино(0,4). домино(0,5). домино(0,6).
  3. домино(1,1). домино(1,2). домино(1,3). домино(1,4). домино(1,5). домино(1,6).
  4. домино(2,2). домино(2,3). домино(2,4). домино(2,5). домино(2,6).
  5. домино(3,3). домино(3,4). домино(3,5). домино(3,6).
  6. домино(4,4). домино(4,5). домино(4,6).
  7. домино(5,5). домино(5,6).
  8. домино(6,6).
  9.  
  10. % Правила домино: Проверка, можно ли соединить две костяшки.
  11. соединить(A, B, C, D) :- B = C. % A-B и C-D можно соединить
  12.  
  13. % Преобразование костяшки в подходящее для вывода представление.
  14. % Это упростит чтение результатов.
  15. представить_костяшку(X, Y, Строка) :-
  16. atomic_list_concat(['[', X, '|', Y, ']'], Строка).
  17.  
  18.  
  19. % Предикат для поиска решения. Основные этапы:
  20. % 1. Сгенерировать возможные комбинации костяшек для каждой буквы.
  21. % 2. Проверить, что суммы для каждой буквы равны.
  22. % 3. Проверить, что использованы все костяшки.
  23. % 4. Вывести результат.
  24.  
  25. решить_игру(Решение) :-
  26. findall((A, B, C, D, E, F), буква_и(A, B, C, D, E, F), И),
  27. findall((G, H, I, J), буква_г(G, H, I, J), Г),
  28. findall((K, L, M), буква_р(K, L, M), Р),
  29. findall((N, O, P, Q), буква_а(N, O, P, Q), А),
  30.  
  31. member((A, B, C, D, E, F), И),
  32. member((G, H, I, J), Г),
  33. member((K, L, M), Р),
  34. member((N, O, P, Q), А),
  35.  
  36. сумма_буквы_и(A, B, C, D, E, F, Сумма),
  37. сумма_буквы_г(G, H, I, J, Сумма),
  38. сумма_буквы_р(K, L, M, Сумма),
  39. сумма_буквы_а(N, O, P, Q, Сумма),
  40.  
  41. использованные_костяшки((A, B, C, D, E, F), (G, H, I, J), (K, L, M), (N, O, P, Q), Костяшки),
  42. уникальные_костяшки(Костяшки), % Проверка, что все костяшки используются только один раз.
  43.  
  44. Решение = [И: (A, B, C, D, E, F), Г: (G, H, I, J), Р: (K, L, M), А: (N, O, P, Q)],
  45. format('\nРешение найдено:\n'),
  46. представить_решение(Решение).
  47.  
  48. % Предикаты для формирования букв. Необходимо подобрать костяшки так,
  49. % чтобы они образовывали нужную букву и удовлетворяли правилам домино.
  50. % Эти предикаты возвращают костяшки, образующие букву.
  51. % Важно: необходимо учитывать, что костяшку можно перевернуть.
  52. % Пример: буква "И" может состоять из шести костяшек: две вертикальные, две
  53. % горизонтальные сверху и снизу и две костяшки по диагонали.
  54.  
  55. буква_и(A, B, C, D, E, F) :-
  56. домино(A, B), домино(C, D), домино(E,F). % Очень упрощенный пример! Нужно учитывать правила домино и форму буквы.
  57.  
  58. буква_г(G,H, I, J) :-
  59. домино(G, H), домино(I, J). % Упрощенный пример.
  60.  
  61. буква_р(K, L, M) :-
  62. домино(K, L), домино(L, M). %Упрощенный пример
  63.  
  64. буква_а(N, O, P, Q) :-
  65. домино(N, O), домино(P, Q). % Упрощенный пример
  66.  
  67. % Предикаты для вычисления суммы очков в каждой букве.
  68. сумма_буквы_и(A, B, C, D, E, F, Сумма) :- Сумма is A + B + C + D + E + F.
  69. сумма_буквы_г(G, H, I, J, Сумма) :- Сумма is G + H + I + J.
  70. сумма_буквы_р(K, L, M, Сумма) :- Сумма is K + L + M.
  71. сумма_буквы_а(N, O, P, Q, Сумма) :- Сумма is N + O + P + Q.
  72.  
  73. % Предикат для сбора всех использованных костяшек в один список.
  74. использованные_костяшки((A, B, C, D, E, F), (G, H, I, J), (K, L, M), (N, O, P, Q), [костяшка(A,B), костяшка(C,D), костяшка(E,F), костяшка(G,H), костяшка(I,J), костяшка(K,L), костяшка(L,M), костяшка(N,O), костяшка(P,Q)]).
  75.  
  76.  
  77. % Предикат для проверки, что все костяшки уникальны и использованы только один раз.
  78. % Это самое сложное место. Нужно сгенерировать все 28 костяшек (с дубликатами в виде перевернутых), а затем проверить,
  79. % что список `Костяшки` содержит ровно по одному экземпляру каждой.
  80. уникальные_костяшки(Костяшки) :-
  81. findall(костяшка(X,Y), (домино(X,Y)), ВсеВозможныеКостяшки1),
  82. findall(костяшка(Y,X), (домино(X,Y)), ВсеВозможныеКостяшки2),
  83. append(ВсеВозможныеКостяшки1, ВсеВозможныеКостяшки2, ВсеКостяшкиСДубликатами),
  84. list_to_set(ВсеКостяшкиСДубликатами, УникальныеКостяшки), % Удаляем дубликаты.
  85. length(Костяшки, L),
  86. length(УникальныеКостяшки, 28), %Проверяем что использовано 28 костяшек
  87. subset(Костяшки, УникальныеКостяшки).
  88.  
  89. % Предикат для представления решения в удобочитаемом формате.
  90. представить_решение(Решение) :-
  91. Решение = [И: (A, B, C, D, E, F), Г: (G, H, I, J), Р: (K, L, M), А: (N, O, P, Q)],
  92. format('Буква И: '),
  93. представить_костяшку(A, B, S1), write(S1), write(' '),
  94. представить_костяшку(C, D, S2), write(S2), write(' '),
  95. представить_костяшку(E, F, S3), write(S3), nl,
  96.  
  97.  
  98.  
  99. format('Буква Г: '),
  100. представить_костяшку(G, H, S4), write(S4), write(' '),
  101. представить_костяшку(I, J, S5), write(S5), nl,
  102.  
  103. format('Буква Р: '),
  104. представить_костяшку(K, L, S6), write(S6), write(' '),
  105. представить_костяшку(M, N, S7), write(S7), nl,
  106.  
  107. format('Буква А: '),
  108. представить_костяшку(N, O, S8), write(S8), write(' '),
  109. представить_костяшку(P, Q, S9), write(S9), nl.
  110.  
  111. % Запуск решения
  112. go :- решить_игру(_).
Success #stdin #stdout #stderr 0.04s 6968KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Warning: /home/jOI1ja/prog:11:
	Singleton variables: [A,D]
Warning: /home/jOI1ja/prog:80:
	Singleton variables: [L]
Warning: /home/jOI1ja/prog:90:
	Singleton variables: [И,Г,Р,А]
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit