Regex z3正则表达式排序无法识别

Regex z3正则表达式排序无法识别,regex,z3,smt,Regex,Z3,Smt,我在以下z3查询中使用了正则表达式(由于其他原因也发布在上),但在定义正则表达式排序时遇到了一些问题: (declare-const dst String) (declare-const src String) ;(declare-const zero Regex) ;(declare-const one Regex) ;(declare-const zero_or_one Regex) ;(declar

我在以下z3查询中使用了正则表达式(由于其他原因也发布在上),但在定义正则表达式排序时遇到了一些问题:

(declare-const dst            String)
(declare-const src            String)
;(declare-const zero           Regex)
;(declare-const one            Regex)
;(declare-const zero_or_one    Regex)
;(declare-const binary_strings Regex)

(assert (= (str.len dst) 25))
(assert (= (str.len src) 50))

;(assert (= zero           (str.to.re "\x00" )))
;(assert (= one            (str.to.re "\x01" )))
;(assert (= zero_or_one    (re.union zero one)))
;(assert (= binary_strings (re.* zero_or_one )))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [0] This doesn't work ...                      ;
;     probably got the Regex sort word wrong ... ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;(assert (str.in.re src binary_strings))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [1] This actually increases running times: ;
;     from 2 sec to 28 sec (!??)             ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;(assert (str.in.re src (re.* (re.union (str.to.re "\x00") (str.to.re "\x01")))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [2] This further increase running times from 2 sec to 57 sec ;
;     though it is semantically equivalent to [1] (?!?)        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (str.in.re src (re.* (re.range "\x00" "\x01"))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [3] original query takes 2 sec for the 25:50 pair ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (< (str.len dst) (str.indexof src "\x00" 0)))

(check-sat)
(get-value (dst src))

您可以编写以下内容:

(define-fun zero () (RegEx String) (str.to.re "\x00"))
请注意,当前没有用于比较正则表达式或将其用作变量的决策过程支持

sat
((dst "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
 (src "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x01\x01\x00\x01\x01\x01\x00\x00"))
(define-fun zero () (RegEx String) (str.to.re "\x00"))