No artigo "Codificação eficiente de CNF para selecionar 1 de N objetos", os autores apresentam sua técnica de "variável de comando" para codificar a restrição e depois falam sobre o problema do buraco de pombo.
Como meu erro pode existir no entendimento de nível inferior, deixe-me declarar o que acho que sei antes de fazer a pergunta:
Seja e n o número de pombos e buracos. A codificação ingénuo utiliza uma variável proposicional X i , j que é verdadeiro quando o i ' t h pombo é para ser colocado na j ' t h furo. A cláusula E x um c t l y ó n e ( X 1 , 1 , X 1 , 2 , . . . , X 1 , n )reforça que o pombo 1 deve ocupar exatamente um buraco; cláusulas idênticas são adicionadas para os outros pombos. A cláusula Impõe que não mais do que um pombo ocupa um orifício; cláusulas idênticas são adicionadas para os orifícios restantes.
Quando há mais pombos do que buracos (m> n), o problema é insolúvel (óbvio para os seres humanos), mas o solucionador SAT não "vê" esse fato. Quando ele não pode encontrar uma maneira de colocar pombos ele irá procurar uma tentativa com pombos 2 , 1 , 3 , . . . , M . Não entende que a ordem dos pombos é irrelevante. O artigo, entre outros, chama isso de simetria.
Instâncias em que são usadas como um teste extenuante da capacidade de um solucionador SAT de detectar insatisfação.
O artigo propõe quebrar a simetria impondo ordem aos pombos. O pombo deve ser colocado em um buraco na frente do buraco do pombo i + 1 (ou seja, o pombo no buraco j deve ter um número menor que o do pombo no buraco j + 1 ). Em seguida, ele diz decepcionantemente: "Devido a limitações de espaço, não descrevemos explicitamente em detalhes a codificação de ordem canônica, mas o número de cláusulas geradas é da ordem O ( n ∗ l o g ( n ) ) ".
Então, minha pergunta é: o que eles fizeram para obter esses resultados?
Quero tratar as variáveis como uma sequência de bits que, numericamente, identifica a escolha de qual pombo entrou no buraco 1 e assim por diante. Siga isso com n - 1 comparadores para reforçar a sugestão do artigo. Minha construção ingênua de comparador, no entanto, exige cláusulas m, uma para cada bit (de tamanho cada vez mais feio). Socorro! :)