Примечание: это продолжение и пересмотр моего другого ответа .
Проблемы с редукцией
Напомним решение проблемы:
Существует ли идеальная мозаика, покрывающая данную ( n + 1 ) × ( n + 2 ) сетку с N уникальными плитками?
Таким образом, для сетки ( n + 1 ) × ( n + 2 ) мы можем использовать только N переменных.
Но:
- Наше сокращение требует много уникальных переменных, намного больше, чем O (n) .
- Кроме того, наши провода имеют открытый конец, что приводит к:
- Откуда мы знаем, что можем плиточить открытые площадки?
Чтобы решить первую проблему, мы искусственно увеличиваем игровое поле; по сути, мы делаем равным количеству переменных, которые нам действительно нужны, затем создаем сетку размером ( n + 1 ) × ( n + 2 ) и помещаем нашу сетку в нижний левый угол. Это приведет к квадратичному взрыву.N( n + 1 ) × ( n + 2 )
Что касается второй проблемы, мы должны немного переосмыслить наши гаджеты.
Может показаться немного утомительным, чтобы доказать, что мы можем успешно разложить остальную часть доски в соответствии с правилом. Итак, мы начнем с той же стратегии, которую использовали бы для создания игровых плат размером :( n + 1 ) × ( n + 2 )
Сначала мы генерируем набор всех возможных плиток. Все эти плитки должны быть размещены на доске. Затем убираем плитки и оставляем позади их квадраты.
Однако наши гаджеты не гарантируют, что будет размещен конкретный набор плиток; укладка плитки зависит от состояния. Поэтому мы должны тщательно модифицировать гаджеты, чтобы гарантировать удаление определенных плиток, независимо от того, какое состояние выбрано.
Тогда давайте рассмотрим наши гаджеты.
Проволока и шлагбаум проблематичны по двум причинам.
- Мы не знаем, что квадраты, окружающие провод или ворота, могут быть правильно выложены плиткой; в конце концов, некоторые провода могут быть сдвинуты влево, другие - вправо, и разбиение оставшихся пустых квадратов на нет становится нетривиальным. Мы будем называть эту проблему проблемой «потока».
- Нет способа узнать, какие плитки удалить из набора плиток; в одном состоянии один набор квадратов в проводе или элементе-воротах будет выложен плиткой, в другом состоянии - совершенно другой набор квадратов.
Чтобы решить эти проблемы:
- Сначала мы генерируем набор всех возможных плиток. Все эти плитки должны быть размещены на доске; разместив их на доске, мы удалим плитку из набора. Хотя поначалу мы можем не знать , так как нам еще предстоит полностью описать формулировку, мы можем добавлять все новые возможности тайлов по мере увеличения n по мере необходимости. Все плитки, которые мы удаляем из этого набора, должны быть гарантированно размещаемыми (по крайней мере, гарантированно размещаемыми, если формула выполнима). Мы называем удаление плитки из набора плиток, чтобы «выгрузить» плитку из набора плиток, чтобы выполнить наше обязательство разместить ее на игровой доске.NN
- Мы должны тщательно разработать гаджеты, чтобы гарантировать удаление определенных плиток независимо от того, какое состояние выбрано.
- Мы должны закрыть наши гаджеты, чтобы они не толкали плитки по всей доске в зависимости от их состояния; скорее все их государства должны занимать только определенную четко определенную область.
- В качестве альтернативы, все их государства должны быть в состоянии занять четко определенную область; это гарантирует удовлетворительное разбиение, но не гарантирует, что будет иметь место конкретное разбиение. Это то же самое, что и игра Dominosa:
- Сначала плитки генерируются в набор;
- Затем плитки размещаются в случайной конфигурации,
- Поскольку каждая плитка размещена, она удаляется из набора плиток.
- Затем плитки снимаются с доски, оставляя за собой квадраты.
- Это не гарантирует, что будет выбрана предполагаемая конфигурация ,
- Скорее, это гарантирует, что предполагаемая конфигурация может быть выбрана, и, таким образом, решение существует. Мы можем сделать то же самое здесь.
- После размещения всех гаджетов композиции, вместо размещения уникальных квадратов по умолчанию, то есть на всех «пробельных», мы уверены , пробельные представляет собой прямоугольную область с одной четной размерности, или сломать пробелы в прямоугольники с одной четной размерности и мы просто разбиваем пробелы на оставшиеся тайлы в наборе тайлов.⋆
- После размещения всех плиток из набора мы знаем, что все можно разместить.
- Некоторые плитки будут, очевидно, размещаться, например плитки в стенах, другие будут размещаться только в том случае, если формула выполнима из-за характера отношений между гаджетами.
- Затем убираем плитки и оставляем позади их квадраты.
Тогда давайте рассмотрим наши гаджеты.
Принудительный гаджет
Мы можем создать произвольное количество строительных блоков, убедившись, что они не могут быть соединены друг с другом.
Например, допустим, мы хотим наложить плитку , чтобы мы могли использовать 1 ⋆ в качестве строительного блока. (заметьте, 1 ⋆ - произвольная переменная, которую мы хотим объединить в пару, а не обязательно как строительный блок, так как мы использовали значение 1 ранее)( 1 ⋆ , 1 ⋆ )1 ⋆1 ⋆1
Для гарантии того, что наши -построения блочных резервы ( 1 ⋆ , 1 ⋆ ) , мы разместим его на нижнюю стенку в следующей конфигурации: мы разместим зарезервированное число, назовем его - ⋆ к стене , как up-tack (в форме ⊥ ); 3 против стены и один во втором ряду посередине. Затем мы разместим еще два числа, назовем их 2 ⋆ и 3 ⋆ ; они уникальны для этого гаджета. Мы размещаем их сверху слева и справа 1 ⋆ .1 ⋆( 1 ⋆ , 1 ⋆ )1 ⋆⊥32 ⋆3 ⋆1 ⋆
Как показано ниже, общая черная рамка - это нижняя часть игрового поля, описание слева направо.
- Конфигурация гаджета. Каждый и 3 ⋆ здесь являются уникальными для этого гаджета.2 ⋆3 ⋆
- 3 возможных состояния облицовки центра .1 ⋆
После этого мы можем гарантировать, что наш гаджет может быть облицован определенным набором плиток, при этом гарантируя, что наш гаджет должен форсировать пару .( 1 ⋆ , 1 ⋆ )
- Мы знаем, что должно произойти, потому что все 3 возможных состояния мозаики нижней средней 1 ⋆ , плитки как ( 1 ⋆ , 1 ⋆ ) , как показано на рисунке справа выше.( 1 ⋆ , 1 ⋆ )1 ⋆( 1 ⋆ , 1 ⋆ )
- Остальные плитки могут быть черепицей , как и ( 1 ⋆ , 3 ⋆ ) , охватывающий гаджет. Таким образом, мы можем удалить эти плитки из нашего глобального набора плиток. Иллюстрировано ниже.( 1 ⋆ , 2 ⋆ )( 1 ⋆ , 3 ⋆ )
Описание слева направо:
- Слева, вверху: состояние слева, слева, снизу: действительный список оставшихся квадратов.
- Середина, вверху: среднее состояние, середина, внизу: действительный список оставшихся квадратов.
- Справа вверху: правое состояние, справа внизу: действительный список оставшихся квадратов.
Обратите внимание, что разбиение оставшихся квадратов не является принудительным , поскольку они могут располагаться рядом с соседними соседями вместо , но, поскольку это действительное разбиение игрового поля во всех состояниях, мы можем удалить их из набор плиток, и предположим, что они будут выложены именно так. Поскольку мы знаем, что существует допустимый возможный тайлинг, у нас есть по крайней мере один возможный тайлинг игрового поля, если формула выполнима. Хотя нет гарантии, что они будут размещены таким образом, есть гарантия, что плитка ( 1 ⋆ , 1 ⋆ ) будет принудительной.1 ⋆( 1 ⋆ , 1 ⋆ )
Примечание: если вас это не устраивает или вас смущает различие между «способностью к мозаике» и «принуждением к мозаике», вы можете просто расположить стену вокруг гаджета , так же, как мы сделайте стену 3 × 2 внизу для клаузулы.3 × 23 × 2
Этот гаджет не закрыт, потому что он не должен быть (но вы можете, если хотите). Так не должно быть, потому что он имеет выполнимую конфигурацию, которую мы можем удалить из набора плиток. Хотя может быть возможно сделать другую конфигурацию, это не влияет на выполнимость проблемы.
Следующие плитки гарантированно должны быть выложены плиткой (таким образом, их можно удалить из набора плиток): ( 1 ⋆ , 1 ⋆ )
Следующие плитки гарантированно могут быть выложены плиткой (таким образом, их можно удалить из набора плиток): ( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Если вы решите закрыть этот гаджет на стене, то также гарантированно будут закрыты.( 1 ⋆ , 2 ⋆ ) , ( 1 ⋆ , 3 ⋆ )
Новые ворота Wire and Clause
Из-за проблем с потоком и опустошением набора тайлов нам нужно немного переделать провод.
Один из способов решения проблемы потока состоит в том, чтобы сделать провод цепью, а не просто левым и правым состояниями; то есть он будет круглым, а не линией, и поэтому, если верхняя часть круга будет сдвинута вправо, нижняя будет сдвинута влево. Это решает проблему потока.
Следуя этому маршруту, мы можем изменить провод и шлюз, чтобы решить обе проблемы.
Резервирование и FTF
Введем две новые универсальные ценности, и F . Эти два значения универсальны; фактические значения в сетке, такие как квадратные значения 2 и 3 (так как по договоренности мы зарезервировали 1 как строительный блок для стен), или все, что вы выберете. Они представляют истину и ложь соответственно.TF231
Мы принудительно зарезервируем плитки , ( T , T ) , ( F , F ) следующим образом; иллюстрация ниже, описание слева направо:( Т, F)( Т, Т)( F, F)
- Мы используем ту же схему, что и принудительное использование любого тайла, используя T как 1 ⋆ . Каждый 2 ⋆ и 3 ⋆ здесь являются уникальными для этого гаджета.( 1 ⋆ , 1 ⋆ )T1 ⋆2 ⋆3 ⋆
- Мы используем ту же схему, что и форсирование любого тайла, используя F как 1 ⋆ Каждые 2 ⋆ и 3 ⋆ здесь уникальны для этого гаджета.( 1 ⋆ , 1 ⋆ )F1 ⋆2 ⋆3 ⋆
- Мы используем ту же схему, что и форсирование плитки , используя F в качестве 1 ⋆ в центре и используя T в других местах повышения. Это заставляет ( F , T ) укладываться на плитку. 2 ⋆ и 3 ⋆ способны плитки с Т , поэтому мы удаляем их из мозаичного набора. Каждый 2 ⋆ и 3 ⋆ здесь являются уникальными для этого гаджета.( 1 ⋆ , 1 ⋆ )F1 ⋆T( F, Т)2 ⋆3 ⋆T2 ⋆3 ⋆
провод
Каждый провод будет начинаться и заканчиваться значением, назовем его , который является уникальным для провода. Для каждого предложения, в котором участвует проводник, провод будет иметь два значения проводника, x ⋆ и x ′ ⋆ , которые уникальны для каждого провода и участвуют в одном и том же предложении. Иллюстрация ниже, с описанием слева направо.A ⋆х ⋆Икс'⋆
- Провод, который участвует в одном предложении. Проволока имеет высоту , и имеет длину 2 * р + 3 , где р представляет собой число статей проволочные участвует в. Проволока дополняется два A ⋆ квадратами слева и два справа. Разумеется, со всех сторон он окружен стеной, обозначенной синим контуром. Обратите внимание, что 1 ⋆ является уникальным для данного провода, и будет использоваться только в проводе, и положение он участвует в.22 ∗ p + 3пA ⋆1 ⋆
Ниже показаны два состояния, описания слева направо.
- Провод, который участвует в одном предложении, в истинном состоянии. Проволока считается истинным, когда квадраты в паре с Т квадратов, и х ' ⋆ квадраты в паре с F квадратов. Это считается ложным в другом состоянии, где тайлинг перевернут. Обратите внимание , как плиточные вынужден однажды A ⋆ плитка выбрана: ( T , F ) уже вынуждены ранее, таким образом , остальная часть плитки должна быть горизонтальной.х ⋆TИкс'⋆FA ⋆( Т, F)
- Тот же провод в ложном состоянии.
При участии в большем числе предложений больше значений и x ′ ⋆ , по одной паре для каждого предложения, в котором участвует провод. Они чередуются сверху и снизу, как и квадраты T и F , разделяющие каждый x ⋆ , x ′ ⋆ пара.х ⋆Икс'⋆TFх ⋆ , х'⋆
Два соответствующих состояния.
Этот гаджет закрыт , поэтому нет «проблемы с потоком».
Обратите внимание, что в любом из этих состояний мы собираем следующие фрагменты независимо от состояния: , ( A ⋆ , T ) , ( A ⋆ , F ) .( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)
Однако есть некоторые тайлы, в которых мы не уверены; в одном состоянии мы можем удалить из набора плиток, находясь в другом состоянии, мы можем удалить ( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2( 1 ⋆ , т) , ( 1'⋆ , F) , ( 2 ⋆ , Т) , ( 2'⋆ , F) . , ,из набора плиток, так какие же плитки мы можем на самом деле удалить? Ответ таков: у ворот предложения есть та же проблема, но с противоположным набором плиток. Он всегда будет собирать оставшиеся, противоположные и несобранные плитки, как мы увидим в следующем разделе. Поскольку каждый из них связан с воротами предложения, мы сможем удалить их обоих.( 1 ⋆ , F) , ( 1'⋆ , Т) , ( 2 ⋆ , F) , ( 2'⋆ , Т) . , ,
пункт
Далее мы создадим первую итерацию нового элемента предложения. Он состоит из гаджета , обнесенного стенами. Внутри гаджета мы размещаем один F в верхнем центре и два T квадрата в нижних углах; один в левом нижнем углу и один в правом нижнем. Остальные квадраты будут значениями, представляющими переменные проводов трех разных проводов. Назовем эти ⋆ , б ⋆ , и с ⋆ . Р будет вынуждены спариваться с одним из проволочных переменных, а остальные провода-переменные будут спариваться с Т значениями. Иллюстрации ниже, описания слева направо.2 × 3FTa ⋆ , b ⋆ ,с ⋆FT
- Слева: конфигурация для первой итерации нового предложения-гейта.
- Справа Три возможных состояния мозаики.F
Эти три состояния приводят к трем возможным изменениям. Иллюстрация ниже, описания слева направо.
- Слева, сверху : выложенный плиткой влево, Слева, снизу: Черепица над оставшимися квадратами.F
- Середина, вверху : выложенная плиткой справа, Середина, внизу: мозаика для оставшихся квадратов.F
- Справа вверху : мозаика вниз, справа внизу: мозаика оставшихся квадратов.F
Поскольку будет связан с одной из переменных-проводовв предложении, эта переменная-проводник больше не может быть связана с F в проводе; таким образом заставляя провод к истине. И наоборот, оставшиеся переменные проводов, которые располагаются с T, будут вынуждены располагаться с F внутри своих проводов. Это в точности то же ограничениекак 1 -in- 3 - S Т п.FF TF1 -in- 3 - S Т
Обратите внимание, и с ⋆ являются проволочные-переменные, но каждыйних может относиться к х ⋆ или х ' ⋆ проволоки переменной; использование x ′ ⋆ по существу отрицает переменную провода.a ⋆ , b ⋆ ,с ⋆х ⋆Икс'⋆Икс'⋆
Одно дополнение: чтобы выполнить обязательство знать, какие плитки можно удалить из набора плиток, мы должны «удвоить и противопоставить» предложение. Что я имею в виду, чтобы сделать еще гаджет, с 3 -х дополнительных переменных , представляющих отрицаний в ⋆ , б ⋆ , и с ⋆ . Назовем эти ' ⋆ , б ' ⋆ , и с ' ⋆ . Это должны быть отрицательные значения переменной переменной a ⋆ , b ⋆3 × 23a ⋆ , b ⋆ ,с ⋆a'⋆ , б'⋆ ,с'⋆ И с ⋆ . Этотгаджет 3 × 2 отличается тем, что у него будет T в центре и два F ⋆ ) , ( Т , х ' ⋆ ) , ( F , х ⋆ ) , ( Р , хa ⋆ , b ⋆ ,с ⋆3 × 2TFзначения по углам; как раз противоположность пункту гаджета, описанному до сих пор. «Удваивая» предложение таким образом, мы снова добавляем те же ограничения, что и гаджет, описанный выше. Однако мы также разряжаем все комбинации из мозаичного набора, для каждой переменной (иследовательнодля ⋆ , б ⋆ ,и с ⋆ , а также, потому что ониконце концов, проволочные-переменные). Иллюстрировано ниже, описания слева направо.( Т, х ⋆ ) , ( Т, х'⋆ ),( F, х ⋆ ) , ( F, х'⋆ )a ⋆ , b ⋆ ,с ⋆
- «Двойное и противозачаточное» предложение. Нижний раздел - это пункт, описанный выше; верхний раздел - это недавно описанный контрацептивный пункт. Новое предложение имеет точно такие же логические ограничения; это противоположно нижнему пункту. Вместе эти комбинированные устройства и выпускной проволоки все из комбинаций из набора элементов мозаичного изображения, для каждая переменная провода, участвующая в предложении.( Т, х ⋆ ) , ( F, х ⋆ ) , ( Т, х'⋆ ),( F, х'⋆ )
- Синяя линия в центре самой левой фигуры предназначена для удобства просмотра; в действительности это может быть удалено, не допуская больше состояний.
Итак, давайте возьмем пример, чтобы показать, что все плитки разряжаются, как и было обещано. Иллюстрированный ниже, описание слева направо.
- Рисунок провода, участвующего в одном пункте; государство выбрано для оговорки. Здесь мы используем , в то время ⋆ и б ⋆ представляет другое проволочное-значение в данном пункте.1 ⋆ = б ⋆⋆б ⋆
- Для данного состояния в предложении, то значение вынуждены работать в паре с соседним Т .1 ⋆T
- Это приводит к тому, что провод вынужден быть истинно оцененным (вы можете сказать, что положительная переменная провода вынуждена соединяться с , а отрицательная переменная вынуждена соединяться с F , как объяснено выше).TF
- Это вынуждает в контрапозиции пункта (верхняя секция оговорки) , чтобы работать в паре с Т в п. Теперь, если вы посмотрите на провод, каждая ячейка внутри провода гарантированно будет разряжена: либо разряжена в самом проводе, либо в соответствующем пункте-гаджете. В этом состоянии у нас есть плитки, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 11'⋆T( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)( 1 ⋆ , т) , ( 1 ′ ⋆ , F ) и ( 1 ′ ⋆ , T ) .( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , Т)
Пробуя другое состояние, мы получаем иллюстрацию ниже, описание слева направо.
- Предложение находится в другом состоянии, мозаичное одним из двух способов.( 1 ⋆ , т
- Следовательно, вынужден на проволоке,( 1 ⋆ , F
- Приведите остальную часть провода к плитке соответственно и оцените провод как ложный.
- Наконец, в противоположном / верхнем разделе предложения-гаджета должен располагаться мозаично, потому что ( 1 ′ ⋆ , T ) берется в провод. В этом состоянии мы имеем плитки, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 1 ⋆ , F( 1'⋆ , F)( 1'⋆ , Т)( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)( 1 ⋆ , т) , ( 1 ′ ⋆ , F ) и ( 1 ′ ⋆ , T ) . Это те же плитки, что и в другом штате.( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , Т)
Таким образом, в любом состоянии мы разряжаем одни и те же плитки. Следовательно, проволока и предложение вместе успешно разряжают конкретные тайлы, если есть удовлетворительное назначение.
Этот гаджет закрыт , поэтому проблем с потоком не возникнет.
Гаджет-предложение вместе с гаджетом-проводником гарантированно всегда выводит одинаковые значения пары тайлов , и, таким образом, мы можем их выгружать, даже если не знаем, каким образом он будет генерироваться.
Теперь все наши гаджеты соответствуют критериям.
формулировка
В нашей окончательной формулировке мы создаем три ряда гаджетов, каждый из которых разделен горизонтальной стеной.
- Внизу мы размещаем гаджеты-насильники высотой две плитки. Нам нужен принуждая гаджет для строительного блока, а также для комбинаций и F . Размещаем гаджеты принудительно рядом друг с другом.TF
- В среднем ряду мы размещаем гаджеты, расположенные горизонтально, высотой две плитки. Проволочные гаджеты должны быть отделены друг от друга вертикальной стенкой.
- В верхнем ряду мы размещаем миниатюрные гаджеты высотой четыре плитки. Гаджеты раздела должны быть отделены друг от друга вертикальной стеной.
Иллюстрации следуют, описания над каждой фигурой. Нажмите на изображение для полного разрешения. Исходный код для воспроизведения / генерации изображений указан в нижней части страницы.
Используя в качестве примера формулу , имеем удовлетворительное решение ( ¬ x 1 , x 2 , x 3 , ¬ x 4 )Φ ( x ) = ( x1, ¬ x2, х3) ∧ ( х2, ¬ x3, х4) ∧ ( х1, х2, ¬ x4)( ¬ x1,х2,х3, ¬x4) как свидетель.
Сначала мы начнем с горизонтальных стен, разделяющих ряды гаджетов. Мы показываем квадраты и пары, которые вынуждены укладывать плитки внутри стен.
Далее мы покажем гаджеты. Синий контур представляет границы гаджетов; пунктирная синяя подсветка для гаджетов, так как они не будут окружены стенами. Обратите внимание, что линия в середине гаджета не окружена стеной; это там для удобства просмотра; удаление линии не позволяет больше состояниям появляться в предложении, как объяснено выше, но мы показываем синюю линию для этой демонстрации. Обратите внимание: мы используем квадратные имена, чтобы придать числам семантическую читабельность, когда это применимо. Каждое имя представляет собой числовое значение.
Здесь мы заполняем вертикальные стены.
Здесь мы заполняем свидетельское решение; то есть это решение для листов, если для его создания используется решение SAT.
Затем мы выкладываем область заполнения; остальная часть доски, настолько большая, насколько это необходимо, для такой большой, как N , требуется для того, чтобы выложить до сих пор. Таким образом мы разряжаем оставшиеся пары в наборе плиток. Пунктирные линии здесь представляют действительный, но не принудительный тайлинг; мог бы быть другой способ выложить это. Здесь мы показываем нижний левый угол.
Здесь мы заполняем оставшиеся квадраты тривиальным допустимым листом.
Здесь мы показываем нижний правый угол сетки.
Здесь мы показываем верхний правый угол сетки. Обратите внимание, как вертикальные плитки больше не подходят; поэтому мы выкладываем верхний ряд горизонтально, если это необходимо.
И, наконец, верхний левый угол.
Генерирование всей игровой доски одновременно с TeX завершается неудачно с ошибками нехватки памяти от pdflatex, поэтому, если вы хотите его увидеть, вам нужно будет сгенерировать клипы и соединить их вместе. Обязательно ознакомьтесь с программой просмотра ноутбука .
Источники TikZ
Генератор игр:
graphtex.py
Преобразует TeX в SVG, используя pdflatex, pdfcairo (poppler) и rsvg-convert (libsvg)
dominosa.py
Содержит логику преобразования, проверку игрового решения и логику рисования
dominosa_demo.py
Исполняемый демонстрационный пример, который генерирует изображения, используемые в ответе выше. Сбрасывает изображения в текущий рабочий каталог.
dominosa_demo.ipynb
Демонстрация ipython, которая генерирует изображения, использованные в ответе выше.
- Смотрите блокнот для просмотра результатов