Z3 Java API 中输入过于严格?
Overly strict typing in Z3 Java API?
在 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 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 的类型层次结构以及它们可以转换的内容到.
在 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 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 的类型层次结构以及它们可以转换的内容到.