Компиляторы, переводящие алгоритмы проверки в задачи SAT

Доказательство того, что SAT является NP-полным, является конструктивным доказательством, поэтому его можно реализовать в виде программы. Кто-нибудь сделал это?

Я ищу программу (компилятор), которая принимает на вход программу (которая возвращает true или false) и выводит формулу SAT.

Так, например, компилятор может взять на вход следующую программу (покажите в синтаксисе pythonic, но меня устраивает любой язык) и вывести формулу SAT. Подача формулы SAT в решатель SAT даст решение для параметра «сертификат». В этом случае решением будет [False, True, True, True, False], что указывает на то, что {-3, -2, 5} является решением.

def verify(certificate):
  problem = [-7, -3, -2, 5, 8]
  sum = 0
  for (x, b) in zip(problem, certificate):
    if b:
      sum += x
  return sum == 0

Очевидно, что выходная формула SAT будет иметь другие вспомогательные переменные, поэтому компилятору придется указать, какие переменные соответствуют сертификату.

Такие компиляторы уже существуют? Есть ли среди них открытый исходный код?


person user82928    schedule 12.12.2011    source источник


Ответы (1)


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

person Kyle Jones    schedule 26.01.2012