在python 3上,Z3-solver抛出“模型不可用”异常

时间:2016-09-14 22:43:37

标签: z3 python-3.5 z3py sat

为了解决SAT问题,我决定使用微软和Python 3的Z3求解器。目的是采用一个长模型(最多500,000个特征)并找到所有可能的解决方案。为了找到它们,我想将第一个解决方案S1添加到初始方程中,并将S1排除在外等等。我将使用while循环来完成它。 解决SAT问题对我来说很重要,因为我想分析特征模型。

但是我在初始等式中添加某个问题时遇到了问题。我将分享一个最小的例子:

# Import statements
import sys 
sys.path.insert(0,'/.../z3/bin')
from z3 import *        # https://github.com/Z3Prover/z3/wiki

def main():

    '''
    Solves after transformation a given boolean equation by using the Z3-Solver from Microsoft.
    '''

    fd = dict()
    fd['_r'] = Bool('_r')
    fd['_r_1'] = Bool('_r_1')

    equation = '''And(fd.get("_r"),Or(Not(fd.get("_r")),fd.get("_r_1")))'''

    # Solve the equation
    s = Solver()
    exec('s.add(' + equation + ')')
    s.check()
    print(s.model())

    ###################################
    # Successfull until here.
    ###################################

    s.add(Or(fd['_r'] != bool(s.model()[fd.get('_r')])))
    # s.add(Or(fd['_r'] != False))

    s.check()
    print(s.model())


if __name__=='__main__':
    main()

# Successfull...之后的第一个编码行引发z3types.Z3Exception: model is not available错误。所以我尝试了上面的一行,只是简单地将false添加到模型中。这很好用。

我被困在这里。我相信错误很容易解决,但我没有看到解决方案。你们其中一个人吗?谢谢!

1 个答案:

答案 0 :(得分:2)

只有在s.check()返回'sat'之后,模型才可用。 该模型将布尔命题映射到{True,False}和 通常将常量和函数映射到固定值。 要求是模型提供解释 满足添加到求解器'的公式。 我们不知道解算器状态之前是否可以满足 我们叫's.check()'。

假设你想说:

s.add(Or(fd['_r'] != bool(s.model()[fd.get('_r')])))

意味着在满足约束的模型中应该 如果'_r'在模型下是真的那么具有属性 fd ['_ r']!= True,如果'_r'在模型下为假,那么 fd ['_ r']!=错误。这相当于说 fd ['_ r']!='_ r'。所以没有必要访问该值 任何模型中的'_r'都可以评价'_r'以便说些什么 关于评估它。