Sto cercando di utilizzare Z3 per ragionare sulle sottostringhe e ho riscontrato un comportamento non intuitivo. Z3 restituisce 'sat' quando viene richiesto di determinare se 'xy' appare all'interno di 'xy', ma restituisce 'unknown' quando viene chiesto se 'x' è in 'x' o 'x' è in 'xy'.È possibile utilizzare Z3 per ragionare su sottostringhe?
Ho commentato il seguente codice per illustrare questo comportamento:
(set-logic AUFLIA)
(declare-sort Char 0)
;characters to build strings are _x_ and _y_
(declare-fun _x_() Char)
(declare-fun _y_() Char)
(assert (distinct _x_ _y_))
;string literals
(declare-fun findMeX() (Array Int Char))
(declare-fun findMeXY() (Array Int Char))
(declare-fun x() (Array Int Char))
(declare-fun xy() (Array Int Char))
(declare-fun length ((Array Int Char)) Int)
;set findMeX = 'x'
(assert (= (select findMeX 0) _x_))
(assert (= (length findMeX) 1))
;set findMeXY = 'xy'
(assert (= (select findMeXY 0) _x_))
(assert (= (select findMeXY 1) _y_))
(assert (= (length findMeXY) 2))
;set x = 'x'
(assert (= (select x 0) _x_))
(assert (= (length x) 1))
;set xy = 'xy'
(assert (= (select xy 0) _x_))
(assert (= (select xy 1) _y_))
(assert (= (length xy) 2))
Ora che il problema è impostato, cerchiamo di trovare le stringhe:
;search for findMeX='x' in x='x'
(push 1)
(assert
(exists
((offset Int))
(and
(<= offset (- (length x) (length findMeX)))
(>= offset 0)
(forall
((index Int))
(=>
(and
(< index (length findMeX))
(>= index 0))
(=
(select x (+ index offset))
(select findMeX index)))))))
(check-sat) ;'sat' expected, 'unknown' returned
(pop 1)
Se noi invece cerchiamo findMeXY
in xy
, il risolutore restituisce 'sat', come previsto. Sembrerebbe che dal momento che il risolutore può gestire questa query per 'xy', dovrebbe essere in grado di gestirlo per 'x'. Inoltre, se si cerca findMeX='x'
in 'xy='xy'
, viene restituito "sconosciuto".
Qualcuno può suggerire una spiegazione, o forse un modello alternativo per esprimere questo problema all'interno di un risolutore SMT?
ho cercato di riprodurre il problema che hai descritto senza successo. Quale versione di Z3 stai usando? Ho provato a utilizzare Z3 2.19 (Windows e Linux) e Z3 3.0 (disponibile nel sito Web SMT-COMP) e tutti loro sono tornati per la query sopra. Grazie, Leo. –
Grazie per il commento, Leo, e mi hai fatto capire che ho lasciato qualcosa fuori questione. Sembra che il comportamento che stavo vivendo si verifica solo quando compare l'asserzione finale e il check-sab tra i comandi 'push' e' pop', che avevo usato per provare vari esperimenti all'interno dello stesso insieme di asserzioni. Ho modificato la domanda di conseguenza, anche se ora sembra che il problema riguardi lo scoping. Se 'push' e' pop' vengono lasciati fuori, allora hai ragione, 'sat' viene restituito in tutti i casi. – Katie
Potrebbe essere la ricerca di questo: https://www.cs.purdue.edu/homes/zheng16/str/ – user