Je ai les questions suivantes:
A. Si je ai une variable x que Je déclare (cas 1) à être Bool (cas 2) à être Int et affirmer x=0 ou x=1 (cas 3) à être Int et affirmer 0<=x<=1. Que se passe-t-il dans Z3, ou plus généralement dans SMT, dans chacun des cas? Est-ce que (cas 1) désiré puisque les choses se produisent au niveau SAT et non SMT? Avez-vous une référence papier ici?
B. J'ai l'énoncé suivant en Python (pour utiliser l'API Python Z3)
tmp.append(sum([self.a[i * self.nrVM + k] * componentsRequirements[i][1] for i
in range(self.nrComp)]) <= self.MemProv[k])
où a est déclaré comme une variable Z3 Int (0 ou 1), componentsRequirements est une variable Python qui doit être considérée comme un flottant, self.MemProv est déclarée comme une variable Z3 Real.
La chose étrange est que pour des valeurs flottantes pour componentsRequirements, par exemple 0.5, la contrainte construite par le solveur le considère comme 0 et non 0.5. Par exemple dans:
(assert (<= (to_real (+ 0 (* 0 C1_VM2)
(* 0 C2_VM2)
(* 2 C3_VM2)
(* 2 C4_VM2)
(* 3 C5_VM2)
(* 1 C6_VM2)
(* 0 C7_VM2)
(* 2 C8_VM2)
(* 1 C9_VM2)
(* 2 C10_VM2)))
StorageProv2))
le 0 ci-dessus devrait en réalité être 0.5. En changeant a en une valeur Réel alors les flottants sont considérés, mais cela est admis par nous à cause de la sémantique de a. J'ai essayé d'utiliser la commutativité entre a et componentsRequirements mais sans succès.
C. Si je veux utiliser x comme type Bool et le multiplier par un Int, je obtiens, bien sûr, une erreur (Bool*Real/Int non autorisé), dans Z3. Y a-t-il un moyen de surmonter ce problème en gardant les types des deux multiplicateurs? Un exemple en ce sens est le ci-dessus (a - Bool, componentsRequirements - Real/Int): a[i * self.nrVM + k] * componentsRequirements[i][1]
Merci