Для решения SAT-проблемы я решил использовать Z3-решатель от Microsoft и Python 3. Целью является использование длинной модели (до 500 000 функций) и найти все возможные решения. Чтобы найти их, я хочу добавить первое решение S1 в исходное уравнение и исключить S1 и т. Д. Я сделаю это, используя цикл while. Решение SAT-проблемы важно для меня, потому что я хочу анализировать модели функций.Z3-solver throws 'model is not available' exception on python 3
Но у меня возникла проблема с добавлением sth в исходное уравнение. Поделюсь минимальный пример:
# 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
. Это работает отлично.
Я застрял здесь. Я считаю, что ошибку легко решить, но я не вижу решения. Кто-нибудь из вас? Благодаря!
Спасибо за ваш ответ. Вы разобрались в описании проблемы, которую я привел здесь в качестве примера. Спасибо, что объяснил, почему мой пример не может работать. –