Z3结果的随机性

2024-06-16 11:13:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用z3python接口作为我正在编写的一个研究工具的一部分,当我在同一个查询上重复运行Z3解算器时,我注意到了一些相当奇怪的行为:尤其是,我似乎每次都没有得到相同的结果,即使我在运行之前显式地重置了解算器。作为参考,我的代码是:

import z3

with open("query.smt", "r") as smt_reader:
    query_lines = "".join(smt_reader.readlines())
    for i in xrange(3):
        solver = z3.Solver()
        solver.reset()

        queryExpr = z3.parse_smt2_string(query_lines)
        equivalences = queryExpr.children()[:-1]
        for equivalence in equivalences:
            solver.add(equivalence)

        # Obtain the Boolean variables associated with the constraints.
        constraintVars = [equivalence.children()[0] for equivalence
                          in equivalences]
        # Check the satisfiability of the query.
        querySatResult = solver.check(*constraintVars)

        print solver.model().sexpr()
        print solver.statistics()
        print ""

上面的代码三次重新创建Z3解算器,并检查同一查询的可满足性。查询是located here。在

虽然上面的代码部分并不完全是我将如何使用z3python接口,但问题源于这样一个认识:Z3解算器在同一个查询的不同代码点调用两次时,返回了不同的结果。我想知道这是否是故意的,是否有任何方法可以使其失效或确保确定性。在


Tags: the代码inforwithquery算器print
1条回答
网友
1楼 · 发布于 2024-06-16 11:13:21

我想你说的不同是指不同的型号。 如果结果从sat更改为unsat,那么它就是一个bug。在

也就是说,如果我们在同一个执行路径中解决同一个问题两次,那么Z3可以生成不同的模型。Z3为表达式分配内部唯一的id。在Z3使用的一些启发式算法中,内部id用于断开连接。请注意,程序中的循环正在创建/删除表达式。因此,在每次迭代中,表示约束的表达式可能具有不同的内部ID,因此解算器可能会生成不同的解。在

参见以下相关问题:

相关问题 更多 >