Разбор 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 или у них уже есть что-то, доступное пользователям для достижения этой цели.