Определить, возможно ли построить из заданных костяшек домино непрерывные цепочки - Prolog
Формулировка задачи:
Совершенно не знаю синтаксис языка Prolog, но надо написать программу для зачёта.
d(2,6) это домино
Есть задача: "Написать программу, которой дается набор костяшек домино, а она определяют, возможно ли построить из них непрерывные цепочки или нет"
Пример работы:
?- playout([d(2,6),d(0,4),d(2,4),d(1,3),d(1,6),d(0,1),d(4,4)]).
true
Потому, что можно разместить в таком порядке
[d(1,0),d(0,4),d(4,4),d(4,2),d(2,6),d(6,1),d(1,3)]
?- playout([d(0,3),d(1,2),d(5,6),d(5,5),d(0,2),d(0,5),d(3,5)]).
false.
Решение задачи: «Определить, возможно ли построить из заданных костяшек домино непрерывные цепочки»
textual
Листинг программы
playout_d2(Ds) :- select1(d(D1, D2), Ds, Ds1), ( P1 = d(D1, D2) ; P1 = d(D2, D1) ), playout_d2(Ds1, P1), !. playout_d2([], _). playout_d2(Ds, P1) :- select1(d(D1, D2), Ds, Ds1), ( P1 = d(_, D1), P2 = d(D1, D2) ; P1 = d(_, D2), P2 = d(D2, D1) ), playout_d2(Ds1, P2). select1(Elem, [Elem | Tail], Tail). select1(Elem, [Head | Tail], [Head | Rest]) :- select1(Elem, Tail, Rest).
Объяснение кода листинга программы
Код представляет собой реализацию игры Нарды (или Нарды Нарды) с двумя игроками, где игроки по очереди кладут кости в свой ход. Код определяет два различных способа расположения костей на игровой доске: правильный и зеркальный. В правильном расположении кости располагаются в порядке возрастания, а в зеркальном - в порядке убывания.
Вот список ключевых шагов в коде:
- В функции
playout_d2/2костяшки доминошки разделяются на две группы:D1иD2. Это делается с помощью функцииselect1/3, которая выбирает первый элемент из списка и помещает его вD1, а оставшуюся часть списка помещает вD2. - Затем проверяется, является ли
D1полным (то есть, содержит все возможные значения от 1 до 6) или нет. Если это так, то это означает, что игрок, который положил эту кость, победил. - Если
D1не полный, то костяшки изD2переносятся вD1с помощью функцииselect1/3. Это делается путем выбора первого элемента изD2и добавления его вD1. - Этот процесс продолжается до тех пор, пока
D1не станет полным или пока не будет достигнут конец игры. - Если
D1становится полным, то это означает, что игрок, который положил последнюю кость, победил. - Если игра достигает конца (то есть, все костяшки были положены), и ни один игрок не победил, то это означает ничью.
Вот список ключевых переменных в коде:
Ds: список костяшек доминошки, представленный в виде списка пар чисел от 1 до 6.P1: текущая кость, которую игрок 1 положил на доску.P2: текущая кость, которую игрок 2 положил на доску.D1: список костяшек, которые игрок 1 положил на доску.D2: список костяшек, которые игрок 2 положил на доску.Tail: оставшаяся часть списка костяшек, которые еще не были положены на доску.Head: первый элемент из спискаTail, который будет положен на доску следующим. Вот список ключевых терминов в коде:select1/3: функция, которая выбирает первый элемент из списка и помещает его в новый список.playout_d2/2: рекурсивная функция, которая реализует игруНарды.playout_d2([], _): базовый случай, когда на доске нет костяшек.playout_d2(Ds, P1): рекурсивный случай, когда на доске есть костяшки, и игрок 1 положилP1.P1 = d(_, D1): условие, которое проверяет, является лиD1полным.P1 = d(_, D2): альтернативное условие, которое проверяет, является лиD2полным.playout_d2(Ds1, P2): рекурсивный случай, когда на доске есть костяшки, и игрок 2 положилP2.select1(Elem, [Elem | Tail], Tail): функция, которая выбирает первый элемент из списка и помещает его в новый список.select1(Elem, [Head | Tail], [Head | Rest]): рекурсивный случай, когда первый элемент из спискаTailуже был выбран.