Разбор SMTLIB с помощью Z3 C API без потери команд push, pop и check-sat

я используюZ3_parse_smtlib2_stringфункция из Z3 C API (через Haskell Z3 lib) для анализа файла SMTLIB и применения некоторых тактик для упрощения его содержимого, однако я заметил, что любойpush,popиcheck-satкоманды поглощаются этой функцией и не отображаются в результирующем AST.

Могу ли я в любом случае разобрать это, не теряя этих команд (а затем применить требуемую тактику, снова не теряя их)?

1 ответ

Я не думаю, что это возможно сделать сZ3_parse_smtlib2_string. Как вы можете видеть в документации, «он возвращает формулу, состоящую из объединения утверждений в области (до push/pop) в конце строки». См. https://z3prover.github.io/api/html/group__capi.html#ga7905ebec9289b9fe5debcad965f6267e .

Обратите внимание, что причина этого не просто «не реализована» или «глючит». Посмотрите на тип возвращаемого значения функции, которую вы используете. Он возвращаетZ3_ast_vector, иZ3_astфиксирует только «выражения» на языке SMTLib. Ноpush/popи т. д. Z3 не считает выражениями, а скорее командами; т. е. они внутренне представлены по-разному. (Я не уверен, был ли это сознательный выбор или исторический.)

Я не думаю, что есть функция, которая делает то, что вы просите; т.е. может возвращать как выражения, так и команды. Вы можете задать вопрос на https://github.com/Z3Prover/z3/discussions , чтобы узнать, могут ли разработчики предоставить альтернативный API или у них уже есть что-то, доступное пользователям для достижения этой цели.

Другие вопросы по тегам