J'utilise l'API z3 C++ et j'ai quelques problèmes concernant l'arithmétique des entiers non linéaires où z3 semble traiter différemment le pouvoir et la multiplication.z3 traite la puissance différente de la multiplication pour les problèmes entiers non linéaires
E.g. x*x*x > y*y
est sat
, mais x^3 > y^2
est unknown
:
#include <z3++.h>
#include <iostream>
using namespace std;
int main() {
z3::context c;
auto x = c.int_const("x");
auto y = c.int_const("y");
z3::solver sol(c);
sol.add(x*x*x > y*y);
cout << sol << " : " << sol.check() << endl;
sol.reset();
sol.add(z3::pw(x,3) > z3::pw(y,2));
cout << sol << " : " << sol.check() << endl;
}
Je l'ai déjà lu sur certains problèmes de python (Z3 python treats x**2 different than x*x?), mais j'utilise la version 4.4.0 de z3 où cela devrait être fixé.
J'ai rencontré ce problème en essayant de résoudre x^51> y^17. Je sais que l'arithmétique des entiers non linéaires est indécidable en général, mais j'étais un peu surpris que z3 n'ait trouvé aucune solution pour cela (même si elle était réécrite en tant que multiplication). Donc, je voudrais savoir si ce qui précède est un bug, ou s'il y a un moyen d'obtenir de meilleurs résultats de z3 en C++ pour ces exemples.
Merci pour votre réponse. Je n'étais pas au courant des détails de la tactique utilisée. Donc je suppose que je vais essayer comment ça marche pour moi quand j'utilise la multiplication au lieu des exposants pour mon projet, au moins pour les carrés/cubiques;) – swad