Я использую инструмент scala^Z3 для небольшой библиотеки, которая (среди прочего) печатает ограничения Z3Context
в латексном формате. Хотя можно пройтись по Z3AST
и преобразовать выражения в латекс путем сравнения строк, было бы гораздо удобнее использовать объектную структуру пакета z3.scala.dsl
. Есть ли способ получить z3.scala.dsl.Tree
из Z3AST
?
Обход Z3Context с помощью API z3.scala.dsl
Ответы (2)
Это правда, что DSL в настоящее время «только для записи», в том смысле, что вы можете использовать его для создания деревьев и отправки их в Z3, но не для их обратного чтения.
Стандартный способ чтения деревьев Z3 — использовать getASTKind
и getDeclKind
от Z3Context
. Классы, представляющие результаты: Z3ASTKind
< /a> и Z3DeclKind
соответственно. (Поскольку большинство деревьев являются приложениями, в последнем содержится большая часть информации).
Z3Context
, используя getASTKind
и getDeclKind
.
- person Byron Hawkins; 11.06.2012
Похоже, способ сделать это — создать исходные ограничения с помощью z3.scala.dsl
, а затем добавить каждое ограничение с помощью Z3Context.assertCnstr (tree: Tree[BoolSort])
. Таким образом, у меня есть целое дерево DSL для легкого преобразования в латекс. По какой-то причине примеры на сайте scala^Z3 собирают AST вообще без использования DSL, так что этот вариант не был очевиден.