Come potrebbe essere implementato un risolutore SMT il più semplice possibile?
-
04-11-2019 - |
Domanda
Sto cercando di capire come funziona un risolutore SMT il più semplice possibile. Supponiamo che abbiamo un semplice programma di input con valori simbolici x
e y
. Per esempio
if (x+y < 20) {
if (x > 10) {
if (y > 10) {
assume(false);
}
}
}
Qui abbiamo percorsi diversi, a seconda delle condizioni. Raggiungere assume(false)
Ogni condizione deve essere vera, quindi la nostra formula in uscita è:
$ x+y <20 , , , , , Wedge , , , , , x> 10 , , , , , Wedge , , , , , y> 10 $
Fin qui tutto bene. Cosa succede dopo, passo dopo passo?
Vorrei implementare, il più semplice possibile, un risolutore che ottiene come input qualcosa come la formula sopra e offre un output specifico per raggiungere la fine del percorso - qui assume(false)
, cioè x = 2147483647, y = 2147483647
(JFI: x+y
sarebbe -2
) - per il rilevamento di overflow o simile.
So che ci sono molti risolutori SMT su Internet, ma non sono riuscito a trovarne uno semplice che spiega. In attesa di un suggerimento.
Nessuna soluzione corretta