Z3: s kongruensstängningsmotor är en nyckelkomponent i lösaren, ansvarig för att upprätthålla ekvivalensklasser av termer baserade på jämlikheter. Det säkerställer att om två termer visar sig vara lika, behandlas de som likvärdiga under hela lösningsprocessen. Så här fungerar det:
1. Initialisering och datastruktur: Motorn använder en datastruktur som kallas E-NODES för att representera termer i formeln. Varje E-nod innehåller fält som hjälper till att imponera fackföreningsoperationer, som är avgörande för att hantera ekvivalensklasser. Motorn använder en hash -tabell, känd som en etable, för att kartlägga funktionstillämpningar på deras kongruensstängningsrötter [1] [3].
2. Union-Find Operations: The Congruence Closure Engine utför Union-Find Operations effektivt genom att använda bankomprimering och union efter rang. Detta säkerställer att åtkomst till roten till en ekvivalensklass är snabb och att sammanslagning av mindre klasser till större är effektivt [1].
3. Ekvivalensdetektering: När lösaren möter jämlikheter mellan termer kontrollerar kongruensstängningsmotorn om dessa termer tillhör samma ekvivalensklass. Om inte, smälter det samman sina klasser och säkerställer att alla termer i den sammanslagna klassen behandlas som lika [3] [4].
4. Integration med booleska resonemang: Kongruensstängningsmotorn är tätt integrerad med den booleska tillfredsställelsekärnan i Z3. Det hjälper till att sprida jämlikheter och upptäcka otillfredsställande genom att säkerställa att lika villkor konsekvent behandlas över formeln [5].
5. Konfliktupplösning: I samband med CDCL (T) (konfliktdriven klausulinlärning med teorier) spelar kongruensstängningsmotorn en roll i konfliktlösning genom att säkerställa att jämlikheter konsekvent tillämpas under sökningen efter en tillfredsställande uppdrag eller ett bevis av otillfredsställande [1].
Sammantaget är Z3: s kongruensstängningsmotor avgörande för att effektivt hantera jämlikheter och säkerställa att lösaren behandlar motsvarande termer konsekvent, vilket är avgörande för att lösa komplexa formler som involverar flera teorier.
Citeringar:[1] https://z3prover.github.io/papers/z3internals.html
]
[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.html
[7] https://arxiv.org/pdf/2209.03398.pdf
[8] http://algos.inesc.pt/projects/nanotime/ref12.pdf