Chaque fois que je lance mon projet, un ordre différent des formules Z3 est généré. Même si la formule est exactement la même, elle est réorganisée dans les différentes exécutions et, par conséquent, les réponses obtenues de Z3 sont différentes à chaque exécution. Cela pose des problèmes car j'ai besoin d'un ensemble optimal qui devrait être exactement le même à chaque exécution.
Par exemple,
-
la première manche est :
(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)
ce qui donne la solution : l7
, l5
, l2
, l4
, l6
, l8
.
6 sont vraies dans ce cas.
-
la deuxième course est :
(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)
ce qui donne la solution : l7
, l9
, l5
, l2
, l4
, l6
, l8
, l3
.
8 sont vraies dans ce cas.
Pour mon projet, j'ai besoin d'un ensemble optimal et minimisé. J'ai besoin que le plus petit nombre possible de variables soit vrai, en fonction des conditions expliquées précédemment. Pour ces deux séries, la réponse correcte et optimale devrait être : l2
, l4
, l5
, l6
, l7
(5 vrais). En fait, j'ai besoin de minimiser le coût et de satisfaire les conditions à l'intérieur de l'objet de l'analyse. maximize
condition.
Cependant, au lieu de toujours donner la solution optimale avec 5 variables vraies, j'obtiens soit 6, 8, 10 valeurs vraies.
J'ai aussi essayé (assert (= (bvand ...) #b1) )
à la place de (maximize (bvand ...) )
en vain.
Comment puis-je obtenir le nombre minimum, optimal, de variables vraies qui satisfasse également la condition et donne le même résultat à chaque fois, même en cas de réorganisation ?
note : Je ne peux pas utiliser Int ou Bool car mes programmes vont probablement être énormes et int/bool ne pourrait pas les gérer.