如何使用cpp将z3表达式转换为字符串?

时间:2019-06-06 12:50:43

标签: c++ z3 smt

我正在尝试创建一个映射,该映射与具有随机整数值的表达式变量和表达式常量相对应。
这是表达式:((x || !z) && (y || !z)),其中x y和z是bool_const表达式。

我创建了一个递归函数,它能够遍历表达式中的每个元素。但是在映射函数中,我必须提供一个INTEGER和一个STRING作为输入。

map<int,string> symbols; 
void walk(expr e)
{     

    if(e.is_const())
    {   
        std::cout <<"ARGUMENT: " << e<< endl;
        int ran_num = (rand() % 10) + 1;
        symbols.insert(pair<int,string>(ran_num,e.to_string)); 
    }
    else
    {
        cout <<"APP: " << e.decl().name() << endl;
        for(int i = 0; i < e.num_args(); i++)
        {    int ran_num = (rand() % 10) + 1;
             symbols.insert(pair<int,string>(ran_num,e.decl().name())); 
             walk(e.arg(i));
        }
    }
}

问题出在

symbols.insert(pair<int,string>(ran_num,e.to_string)

其中e.to_string不能解释为字符串

symbols.insert(pair<int,string>(ran_num,e.decl().name()))

也无法将e.decl().name()部分解释为STRING。

如何将它们转换为字符串以满足我的映射功能?

1 个答案:

答案 0 :(得分:0)

编译器告诉您,name不是string,而是symbol,在这里定义:https://z3prover.github.io/api/html/classz3_1_1symbol.html

如果要将其转换为字符串,则确实提供了str方法;因此您应该说类似e.decl().name().str()之类的话。

但是在进入细节之前,您应该真正查看代表Z3表达式的类层次结构。从这里开始:https://z3prover.github.io/api/html/classz3_1_1expr.html