#z3 #smt #cvc4
#z3 #smt #cvc4
Вопрос:
Стандарт SMT2 гласит, что вызов get-value разрешен только после вызова check-sat и только тогда, когда check-sat возвращает «sat» или «неизвестно».
Вот простой пример нерешенной проблемы:
(set-option :produce-models true)
(set-logic QF_BV)
(set-info :smt-lib-version 2.0)
(declare-fun a ()(_ BitVec 4))
(declare-fun b ()(_ BitVec 4))
(declare-fun c ()(_ BitVec 4))
(declare-fun z ()(_ BitVec 4))
(assert (= #b1111 z))
(assert (= a b))
(assert (= (bvxor a z) c))
(assert (= b c))
(check-sat)
(get-value ( a ))
(get-value ( b ))
(get-value ( c ))
Поскольку проблема не решена, команды get-value являются незаконными. Удалите любое утверждение, и оно станет sat, а команды get-value станут законными. Итак, мой вопрос в том, как вы пишете скрипт SMT2, который проверяет возвращаемое значение check-sat и вызывает get-value только в том случае, если он вернул sat?
Незаконный вызов get-value является проблемой для меня, поскольку я запускаю разные решатели smt в потоке и проверяю возвращаемое значение программы, а затем анализирую их вывод. CVC4 переводит возвращаемое значение в состояние ошибки, если get-value вызывается незаконно.
Ответ №1:
Я не думаю, что есть хороший способ, если вы хотите иметь один файл «SMT» для управления всей транзакцией.
Эта проблема часто возникает при взаимодействии с SMT-решателями с других языков. Решение, которое я принял, заключается в том, что я сохраняю открытый канал с решателем и передаю ему строки скрипта, читаю ответы и решаю, что отправлять дальше, на основе полученных ответов. По сути, запрограммированное взаимодействие. (Например, это то, что делает библиотека SBV Haskell.)
Тем не менее, я согласен, что это боль; и было бы неплохо, если бы существовал санкционированный SMT2-lib способ обработки такого общего взаимодействия.
Комментарии:
1. Это предполагаемая модель взаимодействия, к лучшему или к худшему. Однако не совсем ясно, что следует добавить в SMT. Циклы явно выходят за рамки предполагаемой области языка, но как насчет «(check-sat :print-model-if-sat)»? Я уверен, что Кларк и Чезаре были бы признательны за предложения по добавлению простых функций удобства использования, если они могут аккуратно вписаться в рамки.
Ответ №2:
Для CVC4, запускаемого из командной строки, добавьте флаг
--dump-models output models after every SAT/INVALID/UNKNOWN
response [*]
Это не так конкретно, как get-value . Эта опция является нестандартной, и CVC4 в настоящее время не поддерживает установку этого флага в анализаторе SMT2. (Дайте нам знать, если вы хотите, чтобы это поддерживалось.)
Комментарии:
1. Спасибо, Тим. Это решает мою проблему, хотя первоначальный вопрос все еще остается в силе. Я полагаю, что у каждого решателя будет свое собственное решение. Следует отметить одну вещь, которая
--dump-models
требует, чтобы параметр produce-models также был установлен из командной строки, а не из синтаксического анализатора, т.Е.-m --dump-models
Требуется. Это ошибка? Несмотря на это, для меня это не проблема, но мне потребовалось немного времени, чтобы понять, почему--dump-models
сначала не работало. Также:CVC4 -h
абсолютно ничего не говорит об этой--dump-models
опции. Может быть, стоит добавить его?2. Неважно,
CVC4 -h
содержит сообщение о--dump-models
, я просто пропустил его изначально.3. Да, у каждого решателя будет свое собственное решение. Вы всегда можете реализовать предложение Левента для текстового взаимодействия. На данный момент это предполагаемая модель использования.