在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的一个(可能是无意的)限制?
答案 0 :(得分:0)
这不是限制,它是一个完全有意的设计选择。有些函数可以返回任意Expr,有些函数更专业,只返回ArithExpr(源自Expr),有些甚至更专业并返回IntExpr。如果我们知道对mkITE
等函数有什么期望(如在您的示例中)那么我们可以将输出转换为所需类型,这是首选范例。
在内部,从API(Expr.create
)检查Z3出来的Expr,因此Java知道每个Expr的类型层次结构以及它们可以转换为什么。