来自 z3-4.8.9-x64-ubuntu-16.04 的非终止 Z3Str3
Non-Terminating Z3Str3 from z3-4.8.9-x64-ubuntu-16.04
我在尝试使用 z3-4.8.9-x64-ubuntu-16.04
中的 Z3Str3
时遇到问题,特别是如果我将 com.microsoft.z3.jar 替换为 [=14= 中的 Z3Str3
] 我不再有那个问题。问题是 Z3 进程永远不会返回结果,尽管查询很简单。我注意到当我终止我的程序时它 returns 是有效答案。当我尝试 运行 对可执行文件执行相同的查询时,我没有注意到这种行为,所以我猜想使用 jar 文件可能需要以一种或另一种方式进行调整。
这是我的代码。我正在使用 Ubuntu 16.04 LTS,以及 IntelliJ 终极版 2020.3。
非常感谢!
import com.microsoft.z3.*;
public class Z3String3Processor_reduced {
public static void main(String[] args) {
StringBuilder currentQuery = new StringBuilder("\n" +
"(declare-const string0 String)\n" +
"(assert (= (str.indexof string0 \"a\" 1) 6))\n" +
"(check-sat)\n" +
"(get-model)\n" +
"\n");
Context context1 = new Context();
Solver solver1 = context1.mkSolver();
Params params = context1.mkParams();
params.add("smt.string_solver", "z3str3");
solver1.setParameters(params);
StringBuilder finalQuery = new StringBuilder(currentQuery.toString());
// attempt to parse the query, if successful continue with checking satisfiability
try {
// throws z3 exception if malformed or unknown constant/operation
BoolExpr[] assertions = context1.parseSMTLIB2String(finalQuery.toString(), null, null, null, null);
solver1.add(assertions);
// check sat, if so we can go ahead and get the model....
if (solver1.check() == Status.SATISFIABLE) {
System.out.println("sat");
} else
System.out.println("not sat");
context1.close();
} catch (Z3Exception e) {
System.out.println("Z3 exception: " + e.getMessage());
}
}
}
我不认为这与 Java 有任何关系。让我们提取您的查询并将其放入名为 a.smt2
:
的文件中
$ cat a.smt2
(declare-const string0 String)
(assert (= (str.indexof string0 "a" 1) 6))
(check-sat)
(get-model)
现在,如果我 运行:
$ z3 a.smt2
sat
(
(define-fun string0 () String
"FBCADEaGaa")
)
很好。但是如果我 运行:
$ z3 smt.string_solver=z3str3 a.smt2
... does not terminate ..
所以,最重要的是,您的查询(看起来很简单)给 z3str3
求解器带来了困难。
我看到您已经在 https://github.com/Z3Prover/z3/issues/5673
将此报告为错误
鉴于默认的字符串求解器可以很好地处理查询,为什么不直接使用那个呢?如果您出于某些其他原因必须使用 z3str3,那么您会发现它不能很好地处理此查询的情况;我不确定 z3 人员将如何解决这个问题,因为默认求解器处理的查询相当快。请报告您的发现!
我在尝试使用 z3-4.8.9-x64-ubuntu-16.04
中的 Z3Str3
时遇到问题,特别是如果我将 com.microsoft.z3.jar 替换为 [=14= 中的 Z3Str3
] 我不再有那个问题。问题是 Z3 进程永远不会返回结果,尽管查询很简单。我注意到当我终止我的程序时它 returns 是有效答案。当我尝试 运行 对可执行文件执行相同的查询时,我没有注意到这种行为,所以我猜想使用 jar 文件可能需要以一种或另一种方式进行调整。
这是我的代码。我正在使用 Ubuntu 16.04 LTS,以及 IntelliJ 终极版 2020.3。
非常感谢!
import com.microsoft.z3.*;
public class Z3String3Processor_reduced {
public static void main(String[] args) {
StringBuilder currentQuery = new StringBuilder("\n" +
"(declare-const string0 String)\n" +
"(assert (= (str.indexof string0 \"a\" 1) 6))\n" +
"(check-sat)\n" +
"(get-model)\n" +
"\n");
Context context1 = new Context();
Solver solver1 = context1.mkSolver();
Params params = context1.mkParams();
params.add("smt.string_solver", "z3str3");
solver1.setParameters(params);
StringBuilder finalQuery = new StringBuilder(currentQuery.toString());
// attempt to parse the query, if successful continue with checking satisfiability
try {
// throws z3 exception if malformed or unknown constant/operation
BoolExpr[] assertions = context1.parseSMTLIB2String(finalQuery.toString(), null, null, null, null);
solver1.add(assertions);
// check sat, if so we can go ahead and get the model....
if (solver1.check() == Status.SATISFIABLE) {
System.out.println("sat");
} else
System.out.println("not sat");
context1.close();
} catch (Z3Exception e) {
System.out.println("Z3 exception: " + e.getMessage());
}
}
}
我不认为这与 Java 有任何关系。让我们提取您的查询并将其放入名为 a.smt2
:
$ cat a.smt2
(declare-const string0 String)
(assert (= (str.indexof string0 "a" 1) 6))
(check-sat)
(get-model)
现在,如果我 运行:
$ z3 a.smt2
sat
(
(define-fun string0 () String
"FBCADEaGaa")
)
很好。但是如果我 运行:
$ z3 smt.string_solver=z3str3 a.smt2
... does not terminate ..
所以,最重要的是,您的查询(看起来很简单)给 z3str3
求解器带来了困难。
我看到您已经在 https://github.com/Z3Prover/z3/issues/5673
将此报告为错误鉴于默认的字符串求解器可以很好地处理查询,为什么不直接使用那个呢?如果您出于某些其他原因必须使用 z3str3,那么您会发现它不能很好地处理此查询的情况;我不确定 z3 人员将如何解决这个问题,因为默认求解器处理的查询相当快。请报告您的发现!