为了解决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
添加到模型中。这很好用。
我被困在这里。我相信错误很容易解决,但我没有看到解决方案。你们其中一个人吗?谢谢!
答案 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'以便说些什么 关于评估它。