Выгодно ли включать неявные ограничения при вычислении логической выполнимости?

Допустим, у вас есть логическая функция, которая принимает два числа (в двоичном формате) и возвращает значение true, если они равны шестнадцати:

01000 + 01000 = 10000
  8   +   8   =  16    -> true


00110 + 01000 = 01110
  6   +   8   =  14    -> false

В этом примере функция принимает десять входных данных, назовем их abcde + fghij.

Под капотом он напрямую моделируется логикой вентиля и использует два сумматора и несколько вентилей xnor для проверки эквивалентности двоичной строке 10000.

Затем мы передаем эту бинарную функцию логическому алгоритму выполнимости, чтобы найти набор входных данных, который дает истинный результат (например, первый пример выше).

Мой вопрос таков: найдет ли алгоритм SAT решение быстрее, если мы будем явно указывать наблюдаемые ограничения?

Что я имею в виду под «наблюдаемыми ограничениями»? Что ж, одним из наблюдаемых ограничений может быть «если какое-либо число больше 16, то не утруждайте себя выполнением сложения и возвращайте false».

Вы можете включить это ограничение следующим образом:

(a ^ ¬b ^ ¬c ^ ¬d ^ ¬e) ^ (f ^ ¬g ^ ¬h ^ ¬i ^ ¬j) ^ (функция, которая у вас была раньше)

Другим ограничением может быть «если одно число четное, а другое нечетное, то вернуть false».

((e ^ ¬j) v (¬e ^ j)) ^ (функция, которая у вас была раньше)

Эти логические функции эквивалентны по корректности, но в логике вентилей последняя была бы (вероятно) более эффективной. Является ли моделирование проблемы единственной заботой при переходе к SAT, или это помогает включить эти наблюдаемые ограничения?

Я понимаю, что это не лучший пример, но, надеюсь, он объясняет, о чем я спрашиваю.

заранее спасибо


person Chris    schedule 26.05.2013    source источник
comment
Я немного смущен; Я действительно не понимаю, о чем вы спрашиваете, и я не уверен, что это спрашивает что-то о проблеме SAT?   -  person G. Bach    schedule 27.05.2013


Ответы (1)


Ваша примерная функция возвращает значение true в 17 из 2^10 = 1024 возможных входных комбинаций.

Это может быть реализовано в виде многоуровневой логической схемы, например: введите здесь описание изображения

Основной областью решателей SAT являются задачи, для которых невозможно перечислить все входные комбинации. 10 входов — это довольно скромный размер. Решателям SAT обычно приходится справляться с сотнями, тысячами или даже миллионами входных переменных. Довольно легко оценить несколько 100 000 комбинаций ввода (~ 20 вводов) на ПК. Но это становится непрактичным, если не невозможным, за пределами миллиардов комбинаций.

Обычный способ — сначала закодировать проблему в конъюнктивной нормальной форме (CNF), а затем Решатель SAT находит одно решение или находит проблему неразрешимой. Большинство решателей SAT редко находят все решения.

Если у вас есть логическое выражение для вашей задачи, вам сначала нужно перевести эту формулу в CNF или в формат, который может обрабатывать решатель. Подходящие инструменты включают bc2cnf. Более общие решатели, такие как Z3, поддерживают SMT 2.0 и другие форматы, помимо CNF (он же DIMACS).

Помимо перечисления достоверности или запроса решателя SAT, такого как Cryptominisat 2, вы можете использовать решатели, основанные на ограничениях. Другие термины, которые можно задать Google, включают «программирование набора ответов".

person Axel Kemper    schedule 26.05.2013