Я використовую розв'язувач SAT для кодування проблеми, і як частина примірника SAT, у мене є булеві змінні де передбачається, що саме одна з них повинна бути правдою, а решта повинна бути помилковим. (Я іноді бачив, як це описано як "гаряче" кодування.)
Я хочу кодувати обмеження "рівно один з повинен бути істинним" в SAT. Який найкращий спосіб кодувати це обмеження, щоб змусити SAT вирішувач працювати максимально ефективно?
Я бачу багато способів кодування цього обмеження:
Парні обмеження. Я можу додати парні обмеження для всіх i , j, щоб переконатися, що щонайменше один x i є істинним, а потім додати x 1 ∨ x 2 ∨ ⋯ ∨ x n, щоб переконатися, що принаймні одна правда.
Це додає пунктів і ніяких зайвих бульових змінних.
Бінарне кодування. Я міг би ввести нових булевих змінних i 1 , i 2 , … , i lg n, щоб представляти (у двійковій) ціле число i таке, що 1 ≤ i ≤ n (додавання декількох булевих обмежень для того, щоб я знаходився в бажаному діапазоні ). Тоді я можу додати обмеження, що підтверджують, що x i - дерево, а всі інші x j - хибні. Іншими словами, для кожного j ми додаємо пропозиції, що підтверджують, що i = j .
Це додає пропозицій, і я не знаю, скільки зайвих булевих змінних.
Порахуйте кількість справжніх значень. Я міг би реалізувати дерево булевих схем суматорів і вимагати, щоб , розглядаючи кожне x i як 0 або 1 замість помилкового або істинного, і використовувати перетворення Цеїтіна для перетворення схеми в SAT пункти. Дерева напівсубарів достатньо: обмежте вихідний показник кожної половини додавача на 0 і обмежте кінцевий вихід остаточного додавача в дереві рівним 1. Дерево може бути обрано будь-якої форми ( збалансоване бінарне дерево, або незбалансоване, або будь-що інше).
Це може бути зроблено в ворота і , таким чином , додає thetas ; ( п ) положення і Θ ( п ) нові логічні змінні.
Особливим випадком такого підходу є введення булевих змінних з ідеєю, що y i має містити значення x 1 ∨ x 2 ∨ ⋯ ∨ x i . Цей намір можна реалізувати, додавши пункти y i ∨ ¬ x i , y i ∨ ¬ y i - 1 , і ¬ y i ∨ x i ∨ y i - (де ми розглядаємо y 0 як синонім помилкового) дляi=1,…,n. Далі ми можемо додати обмеження¬ y i ∨¬ x i + 1 дляi=1,2,…,n-1. Це в основному еквівалент трансформації Цеїтіна дерева, що наполовину додає, де дерево має максимально незбалансовану форму.
Метелик мережа Я міг би побудувати мережу метеликів на бітах, обмежити n- бітовий вхід на 000 ⋯ 01 , обмежити n- бітний вихід на x 1 x 2 ⋯ x n і розглянути кожне 2-бітове затвор метелика як незалежний затвор що або поміняє місцями, або не поміняє своєю інформацією на рішення, що робити на основі нової нової булевої змінної, яка не обмежується. Тоді я можу застосувати перетворення Цеїтіна для перетворення схеми на пропозиції SAT.
Для цього потрібні ворота і, таким чином, додаються Θ ( n lg n ) пропозиції та Θ ( n lg n ) нові булеві змінні.
Чи є якісь інші методи, яких я не помітив? Який я повинен використовувати? Хтось тестував це, чи пробував їх експериментально, чи хтось із цим має досвід? Чи кількість пропозицій та / або кількість нових булевих змінних є хорошим показником для оцінки впливу цього на продуктивність вирішувача SAT, чи ні, який би ви використовували?
Я щойно помітив, що у цій відповіді є деякі посилання на забезпечення обмежень кардинальності для SAT, тобто на виконання обмеження, що саме з n змінних є істинним. Отже, моє запитання зводиться до особливого випадку, коли k = 1 . Можливо, література про обмеження кардинальності допоможе пролити світло на моє запитання.