Il motore di chiusura di congruenza di Z3 è un componente chiave del solutore, responsabile del mantenimento delle classi di equivalenza di termini basate su uguaglianze. Garantisce che se due termini si trovano uguali, sono trattati come equivalenti durante il processo di risoluzione. Ecco come funziona:
1. Inizializzazione e struttura dei dati: il motore utilizza una struttura di dati chiamata nodi elettronici per rappresentare i termini nella formula. Ogni nodo elettronico contiene campi che aiutano nell'implementazione di operazioni sindacali, che sono cruciali per la gestione delle classi di equivalenza. Il motore utilizza una tabella hash, nota come etable, per mappare le applicazioni di funzione alle loro radici di chiusura di congruenza [1] [3].
2. Operazioni sindacali: il motore di chiusura di congruenza esegue le operazioni sindacali in modo efficiente utilizzando la compressione del percorso e l'Unione per rango. Ciò garantisce che l'accesso alla radice di una classe di equivalenza sia veloce e che la fusione di classi più piccole in più grandi sia efficiente [1].
3. Rilevamento dell'equivalenza: quando il risolutore incontra la parità tra i termini, il motore di chiusura della congruenza controlla se questi termini appartengono alla stessa classe di equivalenza. In caso contrario, unisce le loro classi, garantendo che tutti i termini nella classe unita siano trattati come uguali [3] [4].
4. Integrazione con ragionamento booleano: il motore di chiusura di congruenza è strettamente integrato con il nucleo di soddisfazione booleano di Z3. Aiuta a propagare le uguaglianze e rilevare insoddisfabilità garantendo che le pari condizioni siano costantemente trattate attraverso la formula [5].
5. Risoluzione dei conflitti: nel contesto di CDCL (t) (l'apprendimento della clausola basata sui conflitti con le teorie), il motore di chiusura di congruenza svolge un ruolo nella risoluzione dei conflitti assicurando che le uguaglianze siano applicate costantemente durante la ricerca di un incarico soddisfacente o una prova di insoddisfazione [1].
Nel complesso, il motore di chiusura di congruenza di Z3 è essenziale per gestire in modo efficiente le uguaglianze e garantire che il solutore tratta in modo coerente termini equivalenti, il che è fondamentale per risolvere formule complesse che coinvolgono teorie multiple.
Citazioni:[1] https://z3prover.github.io/papers/z3internals.html
[2] https://www.researchgate.net/publication/266654073_z3-str_a_z3-basal_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--s.org/vol-418/paper10.pdf
[6] https://theory.stanford.edu/~nikolaj/programmingz3.html
[7] https://arxiv.org/pdf/2209.03398.pdf
[8] http://algos.inesc.pt/projects/nanotime/ref12.pdf