Z3输入格式是SMT-LIB 2.0标准定义的格式的扩展。输入表达式需要以前缀形式编写。例如rise4fun,
x +(y * 2)= 20 需要以“ (=(+ x(* 2 y))20))的形式输入”。
Z3支持JAVA API。例如,让我们考虑以下代码,该代码评估并检查可满足性表达式: x + y = 500 和 x +(y * 2)= 20 。
final Context ctx = new Context();
final Solver solver = ctx.mkSimpleSolver();
IntExpr x = ctx.mkIntConst("x");
IntExpr y = ctx.mkIntConst("y");
IntExpr th = ctx.mkInt(500);
IntExpr th1 = ctx.mkInt(2);
IntExpr th2 = ctx.mkInt(20);
BoolExpr t1 = ctx.mkEq(ctx.mkAdd(x,y), th);
BoolExpr t2 = ctx.mkEq(ctx.mkAdd(x,ctx.mkMul(th1, y)), th2);
solver.add(t1);
solver.add(t2);
solver.check()
问题是,如果外部用户希望向求解器提供输入,则他不能以“ x + y = 500,x +(y * 2)= 20”的通用形式给出输入。 输入需要进行解析,然后使用前缀形式的JAVA API手动编写(请注意上面代码中的 BoolExpr t2 ),以将最终表达式提供给Solver。
是否有任何解析器/库/ API(最好是JAVA或任何其他语言)可以使用算术运算符(+,-,<,>,=),命题逻辑连接器(And,OR),量词来解析通用表达式(ForAll,存在),然后将输入提供给Z3解算器?
请提出建议和帮助。
答案 0 :(得分:3)
这正是人们构建SMT求解器高级界面的原因。 z3在这里有很多选择:
z3的官方Python接口:https://ericpony.github.io/z3py-tutorial/guide-examples.htm这是Microsoft直接支持的,并且可能是最易于使用的。
PySMT,旨在覆盖尽可能多的SMT求解器:https://github.com/pysmt/pysmt
Haskell SBV:http://hackage.haskell.org/package/sbv
Racket,Go和Lisp的许多成熟度各不相同。您可以在github上找到很多。
这些“包装器”的目标是将最终用户从复杂的绑定的所有细节中准确地保存下来,并提供易于使用且错误较少的东西。另一方面,它们要求您学习另一个库。以我的经验,如果您选择的宿主语言具有这样的实现,那么使用它会很不错。如果没有,您应该建造一个!