【问题标题】:Z3: implementing "Model Checking Using SMT and Theory of Lists" solver hangingZ3:实现“Model Checking Using SMT and Theory of Lists”求解器挂起
【发布时间】:2020-03-09 20:51:22
【问题描述】:

我正在尝试实现本文中的一些代码:Model Checking Using SMT and Theory of Lists 以证明有关简单机器的事实。我使用 Python Z3 API 编写了以下代码,镜像了论文中描述的代码:为了更好地展示问题,有意简化了代码和问题:

from z3 import *

MachineIntSort = BitVecSort(16)
MachineInt = lambda x: BitVec(x, 16)

def DeclareLinkedList(sort):
    LinkedList = Datatype(f'{sort.name()}_LinkedList')
    LinkedList.declare('nil')
    LinkedList.declare('cons', ('car', sort), ('cdr', LinkedList))
    return LinkedList.create()


State = Datatype('State')
State.declare('state',
    ('A', MachineIntSort),
    ('B', MachineIntSort),
    ('C', MachineIntSort),
    ('D', MachineIntSort))
State = State.create()

StateList = DeclareLinkedList(State)


def transition_condition(initial, next):
    return State.A(next) == State.A(initial) + 1

def final_condition(lst):
    return State.A(StateList.car(lst)) == 2

solver = Solver()
check_execution_trace = Function('check_execution_trace', StateList, BoolSort())
execution_list = Const('execution_list', StateList)


solver.add(ForAll(execution_list, check_execution_trace(execution_list) ==
    If(And(execution_list != StateList.nil, StateList.cdr(execution_list) != StateList.nil),
        And(
            transition_condition(StateList.car(execution_list), StateList.car(StateList.cdr(execution_list))),
            check_execution_trace(StateList.cdr(execution_list)),
            If(final_condition(StateList.cdr(execution_list)),
                StateList.nil == StateList.cdr(StateList.cdr(execution_list)),
                StateList.nil != StateList.cdr(StateList.cdr(execution_list))
            )
        ),
    True), # If False, unsat but incorrect. If True, it hangs
))

states = Const('states', StateList)

# Execution trace cannot be empty
solver.add(StateList.nil != states)

# Initial condition
solver.add(State.A(StateList.car(states)) == 0)

# Transition axiom
solver.add(check_execution_trace(states))

print(solver.check())
print(solver.model())

问题是模型步骤挂起而不是给出(微不足道的)解决方案。我想我可能没有实现论文描述的所有内容:我不明白“最后,强调实例化模式的目的很重要(PAT: {check tr (lst)} ) 在 FORALL 子句中。这个公理说明了一切 列表。然而,SMT 求解器不可能试图证明 声明确实适用于所有可能的列表。相反,常见的方法是 提供一个实例化模式,基本上说明在哪些情况下公理应该 被实例化并因此由求解器强制执行。”的意思是,所以我没有实现它。

我现在的目标不是拥有漂亮的代码(我知道星形导入很难看,...),而是拥有可以工作的代码。

【问题讨论】:

  • 当您实际添加模式时,您是否得到了令人满意的解决方案?
  • @alias 这就是问题所在:我不知道模式是什么或如何添加它。

标签: z3 z3py


【解决方案1】:

SMT 求解器很难处理量化公式,因为它们使逻辑具有半可判定性。 SMT 求解器通常依靠“启发式”来处理此类问题。在处理量词时,模式是“帮助”这些启发式更快收敛的一种方法。

您可能想阅读http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.225.8231&rep=rep1&type=pdf 的第 13.2 节

要查看如何在 z3py 绑定中添加模式的示例,请查看此页面:https://ericpony.github.io/z3py-tutorial/advanced-examples.htm(页面出现时搜索“模式”。)

【讨论】:

  • 虽然这个答案确实有点帮助,但尚不清楚如何在 Z3 Python 绑定中完成此操作。你能详细说明一下吗?
  • 添加了一个链接,显示如何在 z3py 中添加模式。希望对您有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2014-10-23
  • 2012-10-04
  • 2022-01-11
  • 2015-08-08
  • 2014-08-21
相关资源
最近更新 更多