Z3解算器抛出';型号不可用';Python3上的异常

Z3解算器抛出';型号不可用';Python3上的异常,z3,python-3.5,z3py,sat,Z3,Python 3.5,Z3py,Sat,为了解决SAT问题,我决定使用Microsoft和Python3提供的Z3解算器。目标是采用长模型(最多500000个功能)并找到所有可能的解决方案。为了找到它们,我想把第一个解S1加到初始方程中,然后把它排除在外,依此类推。我将使用while循环来完成它。 解决SAT问题对我来说很重要,因为我想分析特征模型 但我面临一个问题,在初始方程中加入了一些东西。我将分享一个简单的例子: # Import statements import sys sys.path.insert(0,'/.../z3

为了解决SAT问题,我决定使用Microsoft和Python3提供的Z3解算器。目标是采用长模型(最多500000个功能)并找到所有可能的解决方案。为了找到它们,我想把第一个解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.z3异常:模型不可用
错误。因此,我尝试了上面的一行,简单地将
false
添加到模型中。那很好用


我在这里被绊住了。我相信这个错误很容易解决,但我看不到解决办法。你们当中有人吗?谢谢

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

假设你想说:

s.add(Or(fd['_r'] != bool(s.model()[fd.get('_r')])))
这意味着在满足约束的模型中 具有这样的属性:如果模型下的'\r'为true,则 fd[“r”]!=如果模型下的'\r'为false,则 fd[“r”]!=错。这等于说 fd[''r']!='_r’。因此,实际上没有必要访问该值 在任何模型中,为了表达某件事,都可以计算“\r”
关于它的评估。

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

假设你想说:

s.add(Or(fd['_r'] != bool(s.model()[fd.get('_r')])))
这意味着在满足约束的模型中 具有这样的属性:如果模型下的'\r'为true,则 fd[“r”]!=如果模型下的'\r'为false,则 fd[“r”]!=错。这等于说 fd[''r']!='_r’。因此,实际上没有必要访问该值 在任何模型中,为了表达某件事,都可以计算“\r”
关于它的评估。

谢谢你的回答。你把我在这里举的问题的描述作为一个例子,让我头脑清醒了。谢谢你解释为什么我的例子不可行。谢谢你的回答。你把我在这里举的问题的描述作为一个例子,让我头脑清醒了。谢谢你解释为什么我的例子不可行。