当我使用Z3 C ++ API建立一组约束时,我得到“未知”作为回应。但是,如果我使用运算符<<()序列化z3::solver
对象并将输出传递给z3二进制文件,则会按预期产生“不良”。有趣的是,如果我使用z3::solver::to_smt2()
而不是运算符<<(),则Z3二进制输出“ unknown ”。
为什么会这样?如何使用C ++ API获取Z3以“看到”独立二进制文件“看到”的内容?
我已经将序列化的约束文件上传到了pastebin,以防
使用运算符<<():http://pastebin.com/uRfP90W5
使用to_smt2():http://pastebin.com/6qQ6WsHN
答案 0 :(得分:0)
该示例使用非线性算法,因此最终使用不完整的求解器,尽管它是对实数的非线性算术。您可以使用命令
查询z3返回未知的原因(get-info:reason-unknown)
在(check-sat)电话之后。然后会说:
(:原因未知" smt战术未能显示目标为坐/不饱(不完整(理论算术))")
深入研究公式,我们看到函数应用程序之间的几次乘法。在使用自由函数的实数和公式的非线性推理的Z3中没有完全集成。