【问题标题】:Traversing Z3_ast tree in C/C++在 C/C++ 中遍历 Z3_ast 树
【发布时间】:2012-09-12 03:57:42
【问题描述】:

简而言之,我需要能够遍历 Z3_ast 树并访问与其节点关联的数据。似乎找不到任何关于如何做到这一点的文档/示例。任何指针都会有所帮助。

最后,我需要将 smt2lib 类型的公式解析为 Z3,对常量替换进行一些变量,然后在与另一个不相关的 SMT sovler 兼容的数据结构中重现公式(具体来说,mistral,我不认为关于 misral 的详细信息对这个问题很重要,但有趣的是它没有命令行界面,我可以在其中输入文本公式。它只有一个 C API)。我认为要生成 misral 格式的公式,我需要遍历 Z3_ast 树并以所需格式重建公式。我似乎找不到任何说明如何执行此操作的文档/示例。任何指针都会有所帮助。

【问题讨论】:

    标签: z3


    【解决方案1】:

    考虑使用z3++.h 中定义的C++ 辅助类。 Z3 发行版还包括一个使用这些类的示例。这是一个遍历 Z3 表达式的小代码片段。 如果您的公式不包含量词,那么您甚至不需要处理 is_quantifier()is_var() 分支。

    void visit(expr const & e) {
        if (e.is_app()) {
            unsigned num = e.num_args();
            for (unsigned i = 0; i < num; i++) {
                visit(e.arg(i));
            }
            // do something
            // Example: print the visited expression
            func_decl f = e.decl();
            std::cout << "application of " << f.name() << ": " << e << "\n";
        }
        else if (e.is_quantifier()) {
            visit(e.body());
            // do something
        }
        else { 
            assert(e.is_var());
            // do something
        }
    }
    
    void tst_visit() {
        std::cout << "visit example\n";
        context c;
    
        expr x = c.int_const("x");
        expr y = c.int_const("y");
        expr z = c.int_const("z");
        expr f = x*x - y*y >= 0;
    
        visit(f);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多