In Non-linear arithmetic and uninterpreted functions, Leonardo de Moura afferma che la tattica qfnra-nlsat
non è stata ancora completamente integrata con il resto di Z3. Ho pensato che la situazione sia cambiata in due anni, ma a quanto pare l'integrazione non è ancora molto completa.Utilizzo tattica Z3 QFNRA con tipi di dati: interazione o interlining
Nell'esempio seguente, utilizzo i tipi di dati esclusivamente per scopi di "ingegneria del software": per organizzare i miei dati in record. Anche se non ci sono funzioni non interpretati, Z3 non riesce ancora a darmi una soluzione:
(declare-datatypes() (
(Point (point (point-x Real) (point-y Real)))
(Line (line (line-a Real) (line-b Real) (line-c Real)))))
(define-fun point-line-subst ((p Point) (l Line)) Real
(+ (* (line-a l) (point-x p)) (* (line-b l) (point-y p)) (line-c l)))
(declare-const p Point)
(declare-const l Line)
(assert (> (point-y p) 20.0))
(assert (= 0.0 (point-line-subst p l)))
(check-sat-using qfnra-nlsat)
(get-model)
> unknown
(model
)
Tuttavia, se manualmente in linea tutte le funzioni, Z3 trova un modello immediatamente:
(declare-const x Real)
(declare-const y Real)
(declare-const a Real)
(declare-const b Real)
(declare-const c Real)
(assert (> y 20.0))
(assert (= 0.0 (+ (* a x) (* b y) c)))
(check-sat-using qfnra-nlsat)
(get-model)
> sat
(model
(define-fun y() Real
21.0)
(define-fun a() Real
0.0)
(define-fun x() Real
0.0)
(define-fun b() Real
0.0)
(define-fun c() Real
0.0)
)
la mia domanda è: esiste un modo per pe rform un allineamento di questo tipo automaticamente? Io sto bene con uno di questi flussi di lavoro:.
- lancio Z3 con una tattica che dice "in linea prima, quindi applicare
qfnra-nlsat
non ho trovato un modo per farlo, ma forse non ero alla ricerca abbastanza bene. - lancio Z3 utilizzando una qualche versione di
simplify
per fare la messa in linea. Avviare Z3 la seconda volta sul risultato della prima invocazione (la versione inline).
In altre parole, come fare qfnra-nlsat
lavoro con le tuple?
Grazie!
Grazie! * (sigh) * Ora ho solo bisogno di decidere cosa è più difficile: implementare un'esecuzione simbolica inlining/full nella mia app, o preparare un PR con una semplificazione dei dati migliorata per Z3. – Skiminok
Ci scusiamo per questo, ma al momento queste sono le uniche opzioni :(Sembra che questo tipo di inlining potrebbe essere utile anche per altri utenti, quindi saremmo felici di un PR se decidessi di implementarlo! –