Каждый раз, когда я запускаю свой проект, формулы Z3 генерируются в другом порядке. Несмотря на то, что формула точно такая же, она переупорядочивается в разных прогонах, и в результате ответы, полученные от Z3, разные в каждом прогоне. Это вызывает проблемы, поскольку мне нужен оптимальный набор, который должен быть одинаковым при каждом запуске.
Например,
- первый прогон:
(declare-const l1 (_ BitVec 1))
(declare-const l2 (_ BitVec 1))
(declare-const l3 (_ BitVec 1))
(declare-const l4 (_ BitVec 1))
(declare-const l5 (_ BitVec 1))
(declare-const l6 (_ BitVec 1))
(declare-const l7 (_ BitVec 1))
(declare-const l8 (_ BitVec 1))
(declare-const l9 (_ BitVec 1))
(declare-const l10 (_ BitVec 1))
(minimize (bvadd l1 l2 l3 l4 l5 l6 l7 l8 l9 l10))
(maximize
(bvand
(bvor (bvand l3 l4 l1 l2) (bvand l4 l2) (bvand l4 l1 l2) (bvand l2 l3 l4))
(bvor (bvand l4 l2) (bvand l2 l3 l4))
(bvor (bvand l5 l7 l8 l10 l6) (bvand l5 l7 l8 l6) (bvand l5 l7 l8 l9 l6) (bvand l5 l7 l8 l9 l10 l6) (bvand l5 l7 l6) (bvand l5 l7 l9 l10 l6) (bvand l5 l7 l10 l6))
)
)
(check-sat)
(get-model)
который дает решение: l7
, l5
, l2
, l4
, l6
, l8
. * В данном случае верно 1021 * 6.
второй прогон:
(declare-const l1 (_ BitVec 1))
(declare-const l2 (_ BitVec 1))
(declare-const l3 (_ BitVec 1))
(declare-const l4 (_ BitVec 1))
(declare-const l5 (_ BitVec 1))
(declare-const l6 (_ BitVec 1))
(declare-const l7 (_ BitVec 1))
(declare-const l8 (_ BitVec 1))
(declare-const l9 (_ BitVec 1))
(declare-const l10 (_ BitVec 1))
(minimize (bvadd l1 l2 l3 l4 l5 l6 l7 l8 l9 l10))
(maximize
(bvand
(bvor (bvand l2 l3 l4) (bvand l2 l4) (bvand l1 l2 l4) (bvand l2 l3 l4 l1))
(bvor (bvand l2 l3 l4) (bvand l2 l4))
(bvor (bvand l10 l6 l5 l7 l9) (bvand l10 l6 l5 l7) (bvand l10 l6 l5 l7 l8 l9) (bvand l10 l6 l5 l7 l8) (bvand l7 l6 l5) (bvand l7 l8 l9 l6 l5) (bvand l7 l8 l6 l5))
)
)
(check-sat)
(get-model)
, что дает решение: l7
, l9
, l5
, l2
, l4
, l6
, * В данном случае верны 1034 *, l3
.
8.
Для моего проекта мне нужен оптимальный минимизированный набор. Мне нужно, чтобы наименьшее возможное количество переменных было истинным, исходя из условий, описанных ранее. Для обоих этих прогонов правильный и оптимальный ответ должен быть: l2
, l4
, l5
, l6
, l7
(5 истинных). По сути, мне нужно минимизировать стоимость и удовлетворить условия внутри условия maximize
.
Однако вместо того, чтобы когда-либо давать оптимальное решение с 5 истинными переменными, я получаю 6, 8, 10 истинных значений.
Что-то, что я также пробовал, было (assert (= (bvand ...) #b1) )
вместо (maximize (bvand ...) )
, но безрезультатно.
Как я могу получить минимальное, оптимальное количество истинных переменных, которое также удовлетворяет условию и дает то же самое результат каждый раз, даже при переупорядочении?
примечание: я не могу использовать Int или Bool, так как мои программы, вероятно, будут огромными, а int / bool не сможет с этим справиться.