2017-01-26 10 views
0

Когда я создаю определенный набор ограничений с использованием API Z3 C++, я получаю «неизвестный» в ответ. Однако, если я сериализую объект z3::solver с использованием оператора < <() и передаю выход в двоичный файл z3, он дает «unsat», как ожидалось. Интересно, если я использую z3::solver::to_smt2() вместо оператора < <(), двоичные выходы Z3 «неизвестен».Z3 C++ API дает «неизвестный», тогда как двоичный код с последовательным выходом дает «unsat»

Почему это происходит? Как я могу получить Z3 с помощью API C++, чтобы «видеть» то, что «отдельная бинарная» видит?

Я загрузил сериализованные ограничений файлы Pastebin в том случае, помогает

Использование оператора < <(): http://pastebin.com/uRfP90W5

Использование to_smt2(): http://pastebin.com/6qQ6WsHN

ответ

0

В примере используется нелинейное арифметика, поэтому заканчивается использованием неполного решателя, несмотря на то, что это нелинейная арифметика над действиями. Вы можете запросить, почему z3 возвращает неизвестные с помощью команды

(получить-инфо: причина-неизвестно)

после (Check-сат) вызова. Затем он сказал:

(: причина неизвестного «смт тактика не удалось показать цели сидеться/unsat (неполная (теория арифметика))»)

копания в формулу мы видим пару умножений между функциональных приложений. В Z3 нет полного интегрирования нелинейных рассуждений о действиях и формулах с использованием свободных функций.

+0

Получил это, но почему одно представление (вывод оператора <<()) разрешимо, а другое (выход to_smt2()) - нет? –

 Смежные вопросы

  • Нет связанных вопросов^_^