En el documento "Codificación eficiente de CNF para seleccionar 1 de N objetos", los autores presentan su técnica de "variable comandante" para codificar la restricción, y luego hablan sobre el problema del casillero.
Dado que mi error puede existir en la comprensión de nivel inferior, permítame declarar lo que creo que sé antes de plantear la pregunta:
Deje que y n es el número de palomas y agujeros. La codificación ingenua utiliza una variable proposicional X i , j que es verdadera cuando la paloma i ′ t h debe colocarse en el agujero j ′ t h . La cláusula E x un c t l y O n e ( X 1 , 1 , X 1 , 2 , . . . , X 1 , n )impone que la paloma 1 debe ocupar exactamente un hoyo; Se añaden cláusulas idénticas para las otras palomas. La cláusula hace cumplir que no más de una paloma ocupa agujero 1; Se añaden cláusulas idénticas para los agujeros restantes.
Cuando hay más palomas que agujeros (m> n), el problema es irresoluble (obvio para los humanos) pero el solucionador SAT no "ve" este hecho. Cuando no puede encontrar una manera de colocar las palomas buscará un intento con las palomas 2 , 1 , 3 , . . . , M . No entiende que el orden de las palomas es irrelevante. El periódico, entre otros, llama a esto simetría.
Instancias donde se utilizan como una prueba extenuante de la capacidad de un solucionador SAT para detectar la insatisfacción.
El documento propone romper la simetría imponiendo el orden a las palomas. La paloma debe colocarse en un hoyo enfrente del hoyo de la paloma i + 1 (es decir, la paloma en el hoyo j debe tener un número menor que la paloma en el hoyo j + 1 ). Luego dice decepcionantemente: "Debido a las limitaciones de espacio, no describimos explícitamente en detalle la codificación de ordenamiento canónico, pero el número de cláusulas generadas es de orden O ( n ∗ l o g ( n ) ) ".
Entonces mi pregunta es: ¿qué hicieron para obtener estos resultados?
Quiero tratar las variables como una cadena de bits que, numéricamente, identifica la elección de qué paloma entró en el hoyo 1, y así sucesivamente. Siga esto con n - 1 comparadores para hacer cumplir la sugerencia del artículo. Sin embargo, mi ingenua construcción de comparación requiere m cláusulas, una para cada bit (de tamaño cada vez más feo). ¡Ayuda! :)