在Z3 Java API中过于严格的输入?

时间:2016-12-07 23:00:17

标签: java z3

在Java API for z3中,只能使用ArithExpr s来添加和其他类似的运算符:

ArithExpr x = ctx.mkInt(0);
ArithExpr y = ctx.mkInt(1);
// Compiles:
ctx.mkAdd(x, y);
// Does not compile:
ctx.mkAdd((Expr) x, (Expr) y);

ArithExpr作为Java类不包含所有可能的表达式。例如,mkITE返回Expr,但即使if-then-else的结果是整数,Java API也不允许对其进行操作,因为它不是正确的Java类。 (这是我在我的代码中运行的问题。)

我是否遗漏了某些内容,或者这是Java API的一个(可能是无意的)限制?

1 个答案:

答案 0 :(得分:0)

这不是限制,它是一个完全有意的设计选择。有些函数可以返回任意Expr,有些函数更专业,只返回ArithExpr(源自Expr),有些甚至更专业并返回IntExpr。如果我们知道对mkITE等函数有什么期望(如在您的示例中)那么我们可以将输出转换为所需类型,这是首选范例。

在内部,从API(Expr.create)检查Z3出来的Expr,因此Java知道每个Expr的类型层次结构以及它们可以转换为什么。