Lo strumento di dimostrazione del teorema z3 impiega molto tempo per risolvere una formula, che ritengo dovrebbe essere in grado di gestire facilmente. Per capire meglio e possibilmente ottimizzare il mio input per z3, volevo vedere i vincoli interni che z3 genera come parte del suo processo di risoluzione. Come si stampa la formula che z3 produce per i suoi risolutori back-end, quando si usa z3 dalla riga di comando?formule di risolutore interno in z3
risposta
Lo strumento da riga di comando Z3 non ha questa opzione. Inoltre, Z3 contiene diversi solutori e fasi di pre-elaborazione. Non è chiaro quale passaggio sarebbe utile per te. Il codice sorgente Z3 è disponibile al numero https://github.com/Z3Prover/z3. Quando Z3 è compilato in modalità di debug, fornisce un'opzione di riga di comando aggiuntiva -tr:<tag>
. Questa opzione può essere utilizzata per scaricare in modo selettivo le informazioni. Ad esempio, il file di origine nlsat_solver.cpp
contiene le seguenti istruzioni:
TRACE("nlsat", tout << "starting search...\n"; display(tout);
tout << "\nvar order:\n";
display_vars(tout););
Il comando opzione della riga di -tr:nlsat
istruirà Z3 per eseguire le istruzioni di cui sopra. tout
è il flusso di output di traccia. Sarà memorizzato nel file .z3-trace
. La sorgente Z3 è piena di questi comandi TRACE
. Poiché il codice è disponibile, possiamo anche aggiungere i nostri comandi di tracciamento nel codice.
Se pubblichi il tuo esempio, posso dirti quali componenti Z3 sono usati per pre-processare e risolvere. Quindi, possiamo selezionare quali "tag" dovremmo abilitare per la traccia.
EDIT (dopo la constraints sono state inviate): Il tuo esempio è nel misto intero & reale aritmetica non lineare. Il nuovo risolutore aritmetico non lineare (nlsat
) in Z3 non supporta to_int
. Pertanto, il risolutore generico Z3 viene utilizzato per risolvere il problema. Sebbene questo risolutore accetti quasi tutto, non è nemmeno completo per l'aritmetica reale non lineare. Il supporto non lineare su questo risolutore si basa su: analisi a intervalli e calcoli di base di Grobner. Questo risolutore è implementato nella cartella src/smt
(nello unstable branch). Il modulo aritmetico è implementato nei file theory_arith*
. Un'opzione da riga di comando buona traccia è -tr:after_reduce
. Visualizzerà l'insieme di vincoli dopo la pre-elaborazione. Il collo di bottiglia è il modulo aritmetico (theory_arith*
).
Osservazioni supplementari:
il problema è in un frammento indecidibile: mixed integer & reale aritmetica lineare. Cioè, è impossibile scrivere un suono e un risolutore completo per questo frammento. Naturalmente, possiamo scrivere un solutore che risolva le situazioni che troviamo in pratica. Credo che sia possibile estendere lo
nlsat
per gestire loto_int
.Se si evita lo
to_int
, sarà possibile utilizzarenlsat
. Il problema sarà nel vero frammento aritmetico reale non lineare. Capisco che questo può essere difficile, dal momento che ilto_int
sembra essere un elemento chiave nella codifica.Il codice nel ramo "unstable" su z3.codeplex.com è molto meglio organizzato rispetto alla versione ufficiale nel ramo "master". Lo fonderò presto con il ramo "master".Puoi recuperare il ramo "unstable" se vuoi giocare con il codice sorgente.
Il ramo "unstable" utilizza un nuovo sistema di generazione. È possibile creare la versione di rilascio con il supporto di traccia. Devi solo usare l'opzione
-t
durante la generazione del Makefile.
script python/mk_make.py -t
- Quando Z3 viene compilato in modalità debug, l'opzione
AUTO_CONFIG=false
per impostazione predefinita. Pertanto, per riprodurre il comportamento della modalità "rilascio", è necessario fornire l'opzione della riga di comandoAUTO_CONFIG=true
.
- 1. Risolutore Prolog solutore di forza Brute-force per formule booleane
- 2. Come funziona la risoluzione incrementale in Z3?
- 3. Supporto quantificatore Z3
- 4. Problemi di trigger in Z3
- 5. Quantificatore in Z3
- 6. Excel Risolutore in Python
- 7. Lettura interp di un array z3 dal modello z3
- 8. Comprensione dell'indicizzazione delle variabili associate in Z3
- 9. Output di controesempio di Z3
- 10. Z3: trovare tutti i modelli soddisfacenti
- 11. Creazione di un risolutore crittografico in C++
- 12. Controlla overflow con Z3
- 13. Interpretazione delle statistiche Z3
- 14. Risolutore QP per Java
- 15. z3 C++ API & ite
- 16. JavaScript Maze Risolutore Algoritmo
- 17. Excel: formule di conservazione ClearContent
- 18. È possibile utilizzare Z3 per ragionare su sottostringhe?
- 19. Creazione di un risolutore di sudoku efficiente
- 20. PHP Excel Calcola formule
- 21. Keg sola formule homebrew
- 22. (get-unsat-core) restituisce vuoto in Z3
- 23. Formule in funzioni definite dall'utente in R
- 24. Risolutore di chiamate di chiamate C++
- 25. Come nascondere variabile con Z3
- 26. Risolutore di sistema lineare veloce per D?
- 27. risolutore di sudoku che utilizza il backtracking
- 28. Formule matematiche su textview in android
- 29. un tipo di dati contiene un set in Z3
- 30. Excel: modifica più formule contemporaneamente?
Grazie per le vostre risposte rapide. – user1779685
Grazie anche per il link al codice sorgente: non sapevo che fosse stato rilasciato. Come suggerirai, proverò a utilizzare tag e trace per scaricare informazioni selettive. Se potessi dare suggerimenti su quali moduli potrebbero essere coinvolti, sarebbe molto utile - mi aiuterebbe anche a regolare i vincoli - credo che potrei non usare z3 nel miglior modo possibile per questo problema. StackOverflow non mi permette di incollare quel codice: probabilmente supera il limite di riga per un post. Proverò a postare di nuovo come nuovo post o distillare parti dei vincoli e delle porzioni di post, pur essendo comprensibili. – user1779685
(sostengono (> = ab)) (affermare (e (< a 128.0) (> = a 1,0))) (sostengono (e (< b 128.0) (> = b 0,5))) (sostengono (e (< c 128.0) (> = c 0,5))) (assert (= da-a-p (to_real (^ 2 23)))) ; Esponente di calcolo di un (assert (= two-to-exp-a (ite (e (> = a 0.5) ( = a 1.0) ( = a 2.0) ( = a 4.0) ( = a 8.0) ( = a 16.0) ( = a 32.0) ( = a 64.0) ( = a 128.0) ( user1779685