Nota: Esta é uma continuação e revisão da minha outra resposta .
Problemas com a redução
Lembre-se do problema de decisão:
Existe um ladrilho perfeito cobrindo uma dada grade (n+1)×(n+2) com n ladrilhos exclusivos?
Portanto, para uma grade (n+1)×(n+2) , podemos usar apenas n variáveis.
Mas:
- Nossa redução requer muitas variáveis únicas, muito mais que O(n) .
- Além disso, nossos fios são abertos, o que leva a:
- Como sabemos que podemos ladrilhar as áreas abertas?
Para resolver o primeiro problema, aumentamos artificialmente o tabuleiro de jogo; essencialmente fazemos igual ao número de variáveis que realmente exigimos, depois criamos uma grade de tamanho ( n + 1 ) × ( n + 2 ) e colocamos nossa grade no canto inferior esquerdo. Isso levará a uma explosão quadrática.n(n+1)×(n+2)
Para o segundo problema, precisamos repensar um pouco nossos gadgets.
Pode parecer um pouco assustador provar que podemos colocar o resto do quadro de acordo com a regra. Então começamos com a mesma estratégia que se usaria para gerar tabuleiros de tamanho :(n+1)×(n+2)
Primeiro , geramos um conjunto de todos os blocos possíveis. Todas essas peças terão que ser colocadas no tabuleiro. Em seguida , removemos os ladrilhos e deixamos para trás seus quadrados.
No entanto, nossos gadgets não garantem a colocação de um conjunto específico de peças; as peças colocadas dependem do estado. Portanto, devemos modificar cuidadosamente os gadgets para garantir que determinados blocos sejam removidos, independentemente do estado escolhido.
Vamos revisar nossos aparelhos então.
O fio e a porta da cláusula são problemáticos por dois motivos.
- Não sabemos que os quadrados ao redor de um fio ou porta de oração podem ser ladrilhados corretamente; Afinal, alguns fios podem ser empurrados para a esquerda, outros para a direita, e a colocação dos quadrados restantes em espaço em branco torna-se não trivial. Vamos nos referir a esse problema como o problema de "fluxo".
- Não há como saber quais peças remover do conjunto de peças; em um estado, um conjunto de quadrados, no arame ou no portão da cláusula, será lado a lado; em outro estado, um conjunto de quadrados completamente diferente será lado a lado.
Para resolver esses problemas:
- Primeiro, geramos um conjunto de todos os blocos possíveis. Todas essas peças terão que ser colocadas no tabuleiro; quando os colocarmos no tabuleiro, removeremos o ladrilho do conjunto. Embora possamos não conhecer , a princípio , uma vez que ainda precisamos descrever completamente a formulação, podemos adicionar todas as novas possibilidades de blocos à medida que incrementamos n , conforme necessário. Todos os ladrilhos que removemos deste conjunto devem estar garantidos (pelo menos, estar garantidos se a fórmula for satisfatória). Chamamos remover um ladrilho do conjunto de ladrilhos, para "descarregar" o ladrilho do conjunto de ladrilhos, como para cumprir nossa obrigação de colocá-lo no tabuleiro de jogo.nn
- Devemos projetar cuidadosamente os gadgets para garantir que determinados blocos sejam removidos, independentemente do estado escolhido.
- Precisamos fechar nossos gadgets, para que eles não joguem lado a lado, dependendo do estado deles; todos os seus estados devem ocupar apenas uma área específica e bem definida.
- Como alternativa, todos os seus estados devem ter a garantia de poder ocupar uma área bem definida; isso garante um mosaico satisfatório, mas não garante que um mosaico específico ocorra. É assim que um jogo de Dominosa é feito:
- Primeiro, os blocos são gerados em um conjunto;
- Em seguida, os blocos são colocados em uma configuração aleatória,
- À medida que cada peça é colocada, ela é removida do conjunto de peças.
- Em seguida, os ladrilhos são removidos do tabuleiro, deixando para trás seus quadrados.
- Isso não garante que a configuração desejada seja escolhida,
- Em vez disso, garante que a configuração desejada possa ser escolhida e, portanto, exista uma solução. Nós podemos fazer a mesma coisa aqui.
- Depois de colocar todos os gadgets da formulação, em vez de colocar únicas quadrados por padrão, ou seja, em todos os "espaços em branco", certifique-se o espaço em branco é uma área rectangular com uma dimensão ainda, ou quebrar o espaço em branco em retângulos com uma dimensão ainda , e simplesmente ladrilhamos o espaço em branco com os ladrilhos restantes no conjunto de ladrilhos.⋆
- Depois de colocar todas as peças do conjunto, sabemos que tudo é passível de colocação.
- Alguns ladrilhos serão obviamente substituíveis, como os de paredes, outros serão substituídos apenas se a fórmula for satisfatória, devido à natureza dos relacionamentos entre os gadgets.
- Em seguida, removemos os ladrilhos e deixamos para trás seus quadrados.
Vamos revisar nossos aparelhos então.
Forçando o gadget
Podemos criar um número arbitrário de blocos de construção, garantindo que cada um deles não possa ser emparelhado.
Por exemplo, digamos que queremos forçar um bloco , para que possamos usar 1 ⋆ como um bloco de construção. (observe, 1 ⋆ é uma variável arbitrária, que queremos forçar como par a si mesma, não necessariamente um bloco de construção, pois usamos o valor 1 anteriormente)(1⋆,1⋆)1⋆1⋆1
Para garantir que os nossos reservas de bloco -Construção ( 1 ⋆ , 1 ⋆ ) , vamos colocá-lo contra a parede de fundo na seguinte configuração: vamos colocar o número reservado, vamos chamá-lo 1 ⋆ contra a parede como um virada para cima (em forma de ⊥ ); 3 contra a parede e um na 2ª linha no meio. Então colocaremos outros dois números, vamos chamá-los de 2 ⋆ e 3 ⋆ ; estes são exclusivos para este gadget. Colocamos estes no topo da esquerda e da direita 1 ⋆ .1⋆(1⋆,1⋆)1⋆⊥32⋆3⋆1 1⋆
Ilustrado abaixo, a borda preta compartilhada é a parte inferior do tabuleiro de jogo, descrição da esquerda para a direita.
- Configuração do gadget. Cada e 3 ⋆ aqui são exclusivas para este gadget.2⋆3⋆
- Os 3 estados possíveis de ladrilhar o centro .1 1⋆
Depois de fazer isso, podemos garantir que nosso gadget possa ser lado a lado com um conjunto específico de peças, enquanto garantimos que nosso gadget deve forçar o par .( 1 ⋆ , 1 ⋆ )
- Sabemos que deve ocorrer, porque todos os três estados possíveis de lado a lado do meio inferior 1 ⋆ , são lado a lado como ( 1 ⋆ , 1 ⋆ ) , conforme ilustrado na figura à direita acima.( 1 ⋆ , 1 ⋆ )1 ⋆( 1 ⋆ , 1 ⋆ )
- Os ladrilhos restantes podem ser lado a lado como e ( 1 ⋆ , 3 ⋆ ) , cobrindo o gadget. Assim, podemos remover esses blocos de nosso conjunto global de blocos. Ilustrado abaixo.( 1 ⋆ , 2 ⋆ )( 1 ⋆ , 3 ⋆ )
Descrição, da esquerda para a direita:
- Esquerda, superior: estado esquerdo, esquerda, inferior: um lado a lado válido dos quadrados restantes.
- Meio, superior: estado médio, meio, inferior: uma disposição válida dos quadrados restantes.
- Direita, em cima: Estado certo, Direita, em baixo: Uma colocação válida dos quadrados restantes.
Observe que o lado a lado dos quadrados restantes não é forçado , pois eles podem lado a lado com vizinhos próximos em vez de , mas como é um lado válido do tabuleiro de jogo em todos os estados, podemos removê-los do conjunto de peças e suponha que elas serão lado a lado exatamente dessa maneira. Como sabemos que existe um possível ladrilho válido, temos pelo menos um ladrilho possível do tabuleiro de jogo, se a fórmula for satisfatória. Embora não haja garantia de que estes serão colocados lado a lado dessa maneira, há uma garantia de que o lado a lado ( 1 ⋆ , 1 ⋆ ) será forçado.1⋆(1⋆,1⋆)
Nota: se você não estiver satisfeito com isso, ou estiver confuso com a diferença de "poder ladrilhar" vs. "ser forçado a ladrilhar", basta colocar uma parede ao redor do gadget , da mesma forma que faça uma parede 3 × 2 abaixo para o dispositivo de cláusula.3×23×2
Este gadget não está fechado, porque não precisa estar (mas você pode, se quiser). Não precisa ser, porque possui uma configuração viável, que podemos remover do conjunto de blocos. Embora possa ser possível fazer uma configuração diferente, isso não afeta a satisfação do problema.
É garantido que os seguintes ladrilhos sejam ladrilhados (portanto, podem ser removidos do conjunto de ladrilhos): (1⋆,1⋆)
É garantido que os seguintes ladrilhos possam ser ladrilhados (portanto, podem ser removidos do conjunto de ladrilhos): (1⋆,2⋆),(1⋆,3⋆)
Se você optar por fechar este gadget com uma parede, também terá a garantia de cobertura.(1⋆,2⋆),(1⋆,3⋆)
Novos portões Wire and Clause
Por causa dos problemas de escoamento e esvaziamento do conjunto de peças, precisamos redesenhar um pouco o fio.
Uma maneira de resolver o problema do fluxo é transformar o fio em um circuito, em vez de apenas estados simples esquerda-direita; isto é, seria circular em vez de uma linha e, portanto, se a parte superior do círculo for empurrada para a direita, a parte inferior será empurrada para a esquerda. Isso resolve o problema de fluxo.
Seguindo essa rota, podemos alterar o fio e a porta da cláusula para resolver os dois problemas.
Reserva e FTF
Vamos apresentar dois novos valores universais, e F . Esses dois valores são universais; valores reais na grade, como valores quadrados 2 e 3 (por convenção, reservamos 1 como um bloco de construção para paredes) ou o que você escolher. Eles representam verdadeiro e falso, respectivamente.TF231
Nós forçamos a reserva dos ladrilhos , ( T , T ) , ( F , F ) , como a seguir; ilustração abaixo, descrição da esquerda para a direita:(T,F)(T,T)(F,F)
- Usamos o mesmo esquema para forçar qualquer bloco , usando T como 1 ⋆ . Cada 2 ⋆ e 3 ⋆ aqui são exclusivas para este gadget.(1⋆,1⋆)T1⋆2⋆3⋆
- Nós usamos o mesmo esquema como forçar qualquer azulejo, usando F como 1 ⋆ Cada 2 ⋆ e 3 ⋆ aqui são exclusivas para este gadget.(1⋆,1⋆)F1⋆2⋆3⋆
- Usamos o mesmo esquema para forçar um ladrilho , usando F como 1 ⋆ no centro e usando T nos outros locais do alinhamento ascendente. Isso força ( F , T ) a lado a lado. 2 ⋆ e 3 ⋆ podem ser ladrilhados com T , então os removemos do conjunto de ladrilhos. Cada 2 ⋆ e 3 ⋆ aqui são exclusivas para este gadget.(1⋆,1⋆)F1⋆T(F,T)2⋆3⋆T2 ⋆3⋆
Fio
Cada fio começará e terminará com um valor, vamos chamá-lo de , que é único o fio. Para cada cláusula na qual a conexão participa, a ligação terá dois valores de conexão , x ⋆ e x ′ ⋆ , exclusivos de cada ligação, e participará da mesma cláusula. Ilustração abaixo, com descrição da esquerda para a direita.A⋆x⋆x′⋆
- Uma ligação que participa de uma cláusula. O fio tem uma altura de , e tem um comprimento de 2 * p + 3 , em que p é o número de cláusulas participe o arame no. O fio é preenchido por duas Um ⋆ quadrados sobre a esquerda, e dois do lado direito. É, é claro, cercado por uma parede por todos os lados, indicada pelo contorno azul. Observe que o 1 ⋆ é exclusivo para esse fio e só será usado no fio e na cláusula em que ele participa.22∗p+3pA⋆1⋆
Ilustrados abaixo estão os dois estados, descrições da esquerda para a direita.
- Uma ligação que participa de uma cláusula, no estado verdadeiro. O fio é considerada verdadeira, quando os quadrados estão emparelhados com um T quadrados, eo x ' ⋆ quadrados estão emparelhados com F quadrados. É considerado falso no outro estado, onde a telha é invertida. Note como a colocação de azulejos é forçado uma vez que o A ⋆ telha é selecionado: ( T , F ) já são forçados mais cedo, assim o resto das telhas deve ser horizontal.x⋆Tx′⋆FA⋆(T,F)
- O mesmo fio no estado falso.
Ao participar de mais cláusulas, há mais valor e x ′ ⋆ , um par para cada cláusula na qual o fio participa. Eles alternam estar em cima e em baixo, assim como os quadrados T e F que separam cada x ⋆ , x ′ ⋆ par.x⋆x′⋆TFx⋆,x′⋆
Os dois estados correspondentes.
Este gadget está fechado , portanto, não há "problema de fluxo".
Observe como em qualquer um dos estados, coletamos os seguintes blocos, independentemente do estado: , ( A ⋆ , T ) , ( A ⋆ , F ) .( A ⋆ , A ⋆ )( A ⋆ , T)( A ⋆ , F)
Existem algumas peças, no entanto, das quais não temos certeza; em um estado que pode remover do conjunto de peças, enquanto em outro estado podemos remover ( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2(1⋆,T),(1′⋆,F),(2⋆,T),(2′⋆,F)...do conjunto de blocos, quais blocos podemos remover? A resposta é: o portão da cláusula tem o mesmo problema, mas com o conjunto oposto de peças. Ele sempre coletará os blocos restantes, opostos e não coletados, como veremos na próxima seção. Como cada um deles é associado a um gate de cláusula, poderemos remover os dois.( 1 ⋆,F) , (1′⋆,T) , ( 2 ⋆,F) , (2′⋆,T) . . .
Cláusula
Em seguida, criaremos a primeira iteração do novo gate da cláusula. Consiste em um gadget , cercado por paredes. Dentro do gadget, colocamos um F no centro superior e dois quadrados T nos cantos inferiores; um no canto inferior esquerdo e outro no canto inferior direito. Os quadrados restantes serão valores representando variáveis de fio de três fios diferentes. Vamos chamar estes um ⋆ , b ⋆ , e c ⋆ . O F serão forçados a emparelhar com um dos fios-variáveis, e as restantes variáveis fio-vai emparelhar com os T valores. Ilustrações abaixo, descrições da esquerda para a direita.2 × 3FTa ⋆ , b ⋆ ,c ⋆FT
- Esquerda: A configuração para a primeira iteração do novo gate de cláusula.
- Direita Os três estados possíveis da azulejos.F
Esses três estados levam a três possíveis inclinações. Ilustração abaixo, descrições da esquerda para a direita.
- Esquerda, superior : lado a lado esquerdo, esquerda, parte inferior: lado a lado os quadrados restantes.F
- Meio, cima : lado direito, Meio, lado inferior: lado a lado dos quadrados restantes.F
- Direita, superior : lado a lado, Direita, inferior: lado a lado os quadrados restantes.F
Como o será emparelhado com uma das variáveis de fio na cláusula , essa variável de fio não pode mais ser emparelhada com F no fio ; forçando assim o fio a ser verdadeiro. Por outro lado, as demais variáveis de fio que se encaixam em T serão forçadas a encaixar com F dentro de seus fios. São exatamente as mesmas restrições que uma cláusula 1- em- 3 - S A T.FF TF1-in-3-SAT
Nota, e c ⋆ são fio-variáveis, mas eles poderiam cada referem-se a um x ⋆ ou um x ' ⋆ fio-variável; usando um x ' ⋆ é essencialmente negando o fio-variável.a⋆,b⋆,c⋆x⋆x′⋆x′⋆
Uma adição: para cumprir a obrigação de saber quais peças podem ser removidas do conjunto de peças, precisamos "duplicar e contraposificar" a cláusula. O que quero dizer com isto, é fazer com que outro dispositivo, com 3 variáveis adicionais que representam as negações de um ⋆ , b ⋆ , e c ⋆ . Vamos chamar estes uma ' ⋆ , b ' ⋆ , e c ' ⋆ . Estes devem ser os valores de fio variável negados de a ⋆ , b ⋆3×23a⋆,b⋆,c⋆a′⋆,b′⋆,c′⋆ E c ⋆ . Essegadget 3 × 2 é diferente, pois terá um T no centro e doisvalores F nos cantos; exatamente o oposto do gadget da cláusula descrito até agora. Ao "duplicar" a cláusula como esta, adicionamos novamente as mesmas restrições que o gadget descrito acima. No entanto, também descarregamos todas as combinações de ( T , x ⋆ ) , ( T , x ′ ⋆ ) , ( F , x ⋆ ) , ( F , xa⋆,b⋆,c⋆3×2TF da telha-conjunto, para cada uma das variáveis (e, assim, para uma ⋆ , b ⋆ ,e c ⋆ bem, porque eles são apesar de tudo, fio-variáveis). Ilustrado abaixo, descrições da esquerda para a direita.(T,x⋆),(T,x′⋆),(F,x⋆),(F,x′⋆)a⋆,b⋆,c⋆
- Uma cláusula "dupla e contrapositiva". A seção inferior é a cláusula descrita acima; a seção superior é a cláusula contrapositiva recentemente descrita. A nova cláusula tem exatamente as mesmas restrições lógicas; é o contrapositivo da cláusula de baixo. Juntos, estes aparelhos combinados e a descarga de arame todas as combinações de da telha-conjunto, para cada variável de fio participando da cláusula.(T,x⋆),(F,x⋆),(T,x′⋆),(F,x′⋆)
- A linha azul no meio da figura mais à esquerda está lá para facilitar a visualização; na realidade, pode ser removido sem permitir mais estados.
Então, vamos dar um exemplo, para mostrar que todas as peças são descarregadas conforme prometido. Ilustrado abaixo, descrição da esquerda para a direita.
- Figura de um fio participando de uma única cláusula; um estado é escolhido para a cláusula. Aqui, estamos usando , enquanto a ⋆ e b ⋆ estão representando outros valores de fio nesta cláusula.1⋆=b⋆a⋆b⋆
- Para o estado especificado na cláusula, o valor é forçado a ser emparelhado com o T vizinho .1⋆T
- Isso faz com que o fio seja forçado a ter valor verdadeiro (você pode dizer que a variável positiva do fio é forçada a emparelhar com o e a variável negativa é forçada a emparelhar com o F , conforme explicado acima).TF
- This forces the 1′⋆ in the contrapositive clause (the upper section of the clause) to be paired with T within the clause. Now if you look at the wire, every tile within the wire is guaranteed to be discharged: either discharged in the wire itself, or in the corresponding clause-gadget. In this state, we have the tiles, (A⋆,A⋆), (A⋆,T), (A⋆,F), ( 1 ⋆ , T), ( 1 ⋆ , F), ( 1′⋆ , F), and (1′⋆,T).
Trying the other state, we get the illustration below, description from left to right.
- The clause is in the other state, tiling (1⋆,T in one of two ways.
- Therefore, (1⋆,F is forced on the wire,
- Leading the rest of the wire to tile correspondingly, and value the wire as false.
- Finally, in the contrapositive/upper section of the clause-gadget, (1′⋆,F) must tile, because (1′⋆,T) is taken in the wire. In this state, we have the tiles, (A⋆,A⋆), (A⋆,T), (A⋆,F), (1⋆,T), (1⋆,F), (1′⋆,F), and (1′⋆,T). These are the same tiles discharged as in the other state.
Thus in either state, we discharge the same tiles. Therefore, the wire and clause together successfully discharge specific tiles iff there is a satisfying assignment.
This gadget is closed, so there won't be a flow problem.
The clause-gadget together with the wire gadget are guaranteed to always discharge the same tile-pair values, and thus we can discharge these even if we don't know which way it will tile.
Now all of our gadgets fulfill the criteria.
Formulation
In our final formulation, we create three rows of gadgets, each separated by a horizontal wall.
- On the bottom, we place the forcing-gadgets, which are two tiles tall. We need a forcing gadget for the building block, and for combinations of T and F. We place the forcing gadgets directly next to each-other.
- In the middle row, we place the wire gadgets, horizontally, which are two tiles tall. The wire gadgets should be separated from each-other with a vertical wall.
- In the top row, we place clause gadgets, which are four tiles tall. The clause gadgets should be separated from each-other by a vertical wall.
Illustrations follow, descriptions above each figure. Click images for full resolution. Source code to reproduce/generate the images is listed at the bottom of the page.
Using the formula Φ(x)=(x1,¬x2,x3)∧(x2,¬x3,x4)∧(x1,x2,¬x4) as an example, we have a satisfying solution (¬x1,x2,x3,¬x4) as a witness.
First we start with the horizontal walls separating the rows of gadgets. We show the squares, and the pairs that are forced to tile within the walls.
Next, we show the gadgets. The blue outline represents the borders of the gadgets; dashed blue for the forcing-gadgets, since they will not be surrounded by walls. Note the line in the middle of the clause gadget is not surrounded by a wall; it is there for ease-of-viewing; taking the line away does not allow any more states to occur in the clause, as explained above, but we show the blue line for this demonstration. Note: that we use square-names to give the numbers semantic readability, when applicable. Each name represents a numeric value.
Here we fill in the vertical walls.
Here we fill in the witness solution; i.e this is the tiling solution if using the SAT solution to generate it.
Next we tile the filler-area; the rest of the board, as large as needed, for as large as né necessário para ladrilhar até agora. Assim, descarregamos os pares restantes no conjunto de peças. As linhas tracejadas aqui representam um ladrilho válido, mas não forçado; pode haver outra maneira de ladrilhar estes. Aqui, mostramos o canto inferior esquerdo.
Aqui, preenchemos os quadrados restantes com um ladrilho válido trivial.
Aqui, mostramos o canto inferior direito da grade.
Aqui, mostramos o canto superior direito da grade. Observe como os ladrilhos verticais não se ajustam mais; portanto, ladrilhamos a linha superior horizontalmente, se necessário.
E, finalmente, o canto superior esquerdo.
A geração de todo o tabuleiro de jogo de uma só vez via TeX falha com erros de falta de memória do pdflatex; portanto, se você quiser vê-lo, precisará gerar clipes e juntá-los. Certifique-se de verificar o visualizador de notebook .
Fontes TikZ
Gerador de jogo:
graphtex.py
Converte TeX em svg, usando pdflatex, pdfcairo (poppler) e rsvg-convert (libsvg)
dominosa.py
Contém a lógica de conversão, verificação de solução de jogo e lógica de desenho
dominosa_demo.py
Uma demonstração executável que gera as imagens usadas na resposta acima. Despeja imagens no diretório de trabalho atual.
dominosa_demo.ipynb
Uma demonstração do ipython que gera as imagens usadas na resposta acima.