Z3 Java API 中输入过于严格?

Overly strict typing in Z3 Java API?

在 Java API for z3 中,加法和其他类似的运算符只能用 ArithExprs:

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 class 并不包含所有可能的表达式。例如,mkITE returns 和 Expr,但即使 if-then-else 的结果是整数,Java API 也不允许对其进行操作,因为它不是正确的 Java class。 (这是我 运行 在我的代码中遇到的问题。)

我是不是遗漏了什么,或者这是 Java API 的(可能是无意的)限制?

这不是限制,而是完全有意设计的选择。有些函数可以 return 任意 Expr,有些更专业,只有 return ArithExpr(派生自 Expr),有些甚至更专业,return IntExpr。如果我们知道 mkITE 之类的函数有什么期望(如您的示例所示),那么我们可以将输出转换为所需的类型,这就是首选范例。

在内部,从 Z3 出来的所有 Expr 都会在 API (Expr.create) 中进行检查,因此 Java 知道每个 Expr 的类型层次结构以及它们可以转换的内容到.