Z3:实现“使用SMT和列表理论进行模型检查”

Z3:实现“使用SMT和列表理论进行模型检查”,z3,z3py,Z3,Z3py,我试图实现本文中的一些代码:证明关于一台简单机器的事实。我使用Python Z3 API编写了以下代码,与论文中描述的代码类似:为了更好地显示问题,特意简化了代码和问题: from z3 import * MachineIntSort = BitVecSort(16) MachineInt = lambda x: BitVec(x, 16) def DeclareLinkedList(sort): LinkedList = Datatype(f'{sort.name()}_Linke

我试图实现本文中的一些代码:证明关于一台简单机器的事实。我使用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的目的很重要: FORALL子句中的{check tr lst}。这条公理说明了一切 名单。然而,SMT求解器不可能试图证明 该声明确实适用于所有可能的列表。相反,通常的做法是 提供一个实例化模式,基本上说明axiom应该在哪些情况下使用 被实例化,因此由解算器强制执行。是的,所以我没有实施


我现在的目标是不要有漂亮的代码我知道星导入是丑陋的。。。但是要有工作代码。

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

您可能需要阅读本手册第13.2节


要查看如何在z3py绑定中添加模式的示例,请查看此页面:当页面出现时搜索模式。

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

您可能需要阅读本手册第13.2节


要查看如何在z3py绑定中添加模式的示例,查看此页面:当页面出现时搜索模式。

当您实际添加模式时,您是否得到满意的解决方案?@alias这就是问题所在:我不知道模式是什么或如何添加。当您实际添加模式时,您是否得到满意的解决方案?@alias这就是问题所在:我不知道模式是什么或如何添加虽然这个答案确实有点帮助,但还不完全清楚在Z3Python绑定中如何做到这一点。您能详细说明一下吗?添加了一个链接,显示如何在z3py中添加图案。希望有帮助!虽然这个答案确实有点帮助,但还不完全清楚在z3python绑定中如何做到这一点。您能详细说明一下吗?添加了一个链接,显示如何在z3py中添加图案。希望有帮助!