Ограничения решателей SMT

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

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

Каковы наиболее важные практические примеры проблем, которые могут быть решены в логике первого порядка, но все еще не могут быть решены с помощью SMT? В частности, какие проблемы возникают, которые не могут быть решены с помощью SMT в области проверки программного обеспечения?


person rwallace    schedule 21.07.2012    source источник
comment
см. также Информатика или даже Теоретическая информатика   -  person vzn    schedule 25.09.2014


Ответы (1)


Решатели SMT не более мощные, чем решатели SAT. Они по-прежнему будут выполняться в экспоненциальном порядке или будут неполными для тех же задач в SAT. Преимущество SMT заключается в том, что многие вещи, которые очевидны в SMT, могут занять много времени, прежде чем эквивалентный спутниковый решатель заново откроет для себя.

Таким образом, с проверкой программного обеспечения в качестве примера, если вы используете решатель SMT QF BV (бескванторная теория битовых векторов), решатель SMT будет знать, что (a + b = b + a) вместо этого на уровне слова, в то время как решателю SAT может потребоваться очень много времени, чтобы доказать это, используя отдельные логические значения.

Таким образом, что касается проверки программного обеспечения, вы можете легко создавать проблемы при проверке программного обеспечения, которые были бы сложны для любого SMT или SAT-решателя.

Во-первых, в QF BV необходимо развернуть циклы, а это означает, что практически вы должны ограничить то, что проверяет решатель. Если бы квантификаторы были разрешены, проблема стала бы PSPACE-полной, а не только NP-полной.

Во-вторых, проблемы, которые в целом считаются сложными, легко кодируются в QF BV. Например, вы можете написать программу следующим образом:

void run(int64_t a,int64_t b)
{
  a * b == <some large semiprime>;

  assert (false);
}

Теперь, конечно, решатель SMT легко докажет, что произойдет утверждение (ложь), но ему нужно будет предоставить контрпример, который даст вам входные данные a,b. Если вы установите <some large number> в полупростое число RSA, то вы просто перевернете умножение... иначе известное как целочисленная факторизация! Таким образом, это, вероятно, будет сложно для любого решателя SMT и демонстрирует, что проверка программного обеспечения в целом является сложной проблемой (если только P = NP или, по крайней мере, целочисленная факторизация не станет легкой). Такие решатели SMT — это просто шаг вперед по сравнению с решателями SAT, поскольку они облечены в более легкий для написания и понятный язык.

Решатели SMT, которые решают более сложные теории, обязательно неполны или даже медленнее, чем решатели SAT, потому что они пытаются решить более сложные проблемы.

Смотрите также:

  • Интересно, что решатель Beaver SMT преобразует QF BV в CNF и может использовать решатель SAT в качестве задний конец.
  • Klee, который может принять программу, скомпилированную в LLVM IR (промежуточное представление), и проверяет наличие ошибок, и находит примеры, противоречащие утверждениям, и т. д. Если он находит ошибку, он может привести контрпример к правильности (он даст вам входные данные, которые воспроизведут ошибку).
person Realz Slaw    schedule 16.09.2012
comment
Не могли бы вы подробнее рассказать о том, почему данный пример QF BV будет сложным для решателей SMT? Если возможно, можете ли вы также показать интуицию таких проблем в целом. Любые ссылки по этому вопросу также высоко ценятся. Спасибо. - person is7s; 18.06.2013
comment
@is7s Мы можем обсудить это в чате. - person Realz Slaw; 18.06.2013
comment
В run(), я думаю, вы могли бы иметь в виду assert(a*b != <some large number>); или if (a*b == <some large number>) assert(false);. a*b не является l-значением; его нельзя назначить. Если это то, что вы имели в виду, решатель SMT не может легко доказать, что assert(false); произойдет: сначала он должен продемонстрировать, что большое число является составным. В любом случае, вы можете отредактировать ответ, чтобы исправить определение run(). - person D.W.; 30.08.2014
comment
Привет @D.W., давно. Да, это псевдокод, но, если предположить, что это си-подобный язык, вы правы. В языках SMT вы просто делаете логические операторы, поэтому в то время то, как я это написал, имело больше смысла. - person Realz Slaw; 31.08.2014