Le moteur de fermeture de congruence de Z3 est un élément clé du solveur, chargé de maintenir des classes d'équivalence de termes basés sur les égalités. Il garantit que si deux termes se révèlent égaux, ils sont traités comme équivalents tout au long du processus de résolution. Voici comment cela fonctionne:
1. Initialisation et structure de données: le moteur utilise une structure de données appelée e-nodes pour représenter des termes dans la formule. Chaque nœud électronique contient des domaines qui aident à mettre en œuvre des opérations de recherche d'union, qui sont cruciaux pour gérer les cours d'équivalence. Le moteur utilise une table de hachage, connue sous le nom de Etable, pour cartographier les applications de fonction à leurs racines de fermeture de congruence [1] [3].
2. Cela garantit que l'accès à la racine d'une classe d'équivalence est rapide et que la fusion de petites classes en plus grandes est efficace [1].
3. Détection de l'équivalence: Lorsque le solveur rencontre des égalités entre les termes, le moteur de fermeture de congruence vérifie si ces termes appartiennent à la même classe d'équivalence. Sinon, il fusionne leurs classes, en s'assurant que tous les termes de la classe fusionnée sont traités comme égaux [3] [4].
4. Intégration avec le raisonnement booléen: le moteur de fermeture de congruence est étroitement intégré au noyau de satisfabilité booléen de Z3. Il aide à propager les égalités et à détecter une insatisfaction en veillant à ce que les termes égaux soient traités de manière cohérente à travers la formule [5].
5. Résolution des conflits: Dans le contexte du CDCL (T) (apprentissage par les clauses axée sur les conflits avec les théories), le moteur de fermeture de congruence joue un rôle dans la résolution des conflits en veillant à ce que les égalités soient appliquées de manière cohérente lors de la recherche d'une affectation satisfaisante ou d'une preuve de insatisfaction [1].
Dans l'ensemble, le moteur de fermeture de congruence de Z3 est essentiel pour gérer efficacement les égalités et s'assurer que le solveur traite de manière cohérente des termes équivalents, ce qui est essentiel pour résoudre des formules complexes impliquant plusieurs théories.
Citations:[1] https://z3prover.github.io/papers/z3internals.html
[2] https://www.researchgate.net/publication/266654073_z3-str_a_z3-basase_string_solver_for_web_application_analysis
[3] https://www.cs.purdue.edu/homes/xyzhang/comp/fse13.pdf
[4] https://www.csl.sri.com/~tiwari/papers/thesis.pdf
[5] https://ceur-ws.org/vol-418/paper10.pdf
[6] https://theory.stanford.edu/~nikolaj/programmingz3
[7] https://arxiv.org/pdf/2209.03398.pdf
[8] http://algos.inesc.pt/projects/nanotime/ref12.pdf