z3 正则表达式排序无法识别
z3 Regex sort unrecognized
我在以下 z3 查询中使用了正则表达式(出于其他原因也在 post 上编辑了 GitHub/z3/issues)并且在定义正则表达式排序时遇到了一些问题:
(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))
我在这里做错了什么?谢谢!
编辑:
(所以机器人不允许我编辑,因为这个 post 主要是代码,
所以我最好添加一些这样的文本行。也许还有这样一行)
不管怎样,方法是这样的:
(declare-const dst String)
(declare-const src String)
(define-fun one () (RegEx String) (str.to.re "\x01"))
(define-fun zero () (RegEx String) (str.to.re "\x00"))
(define-fun zero_or_one () (RegEx String) (re.union zero one))
(define-fun binary_strings () (RegEx String) (re.* zero_or_one ))
(assert (= (str.len dst) 25))
(assert (= (str.len src) 50))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [0] This does work ... ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (str.in.re src binary_strings))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [1] this query takes 25 sec ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (< (str.len dst) (str.indexof src "\x00" 0)))
(check-sat)
(get-value (dst src))
正确答案是:
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"))
请注意,当前不支持比较正则表达式或将它们用作变量的决策过程。
我在以下 z3 查询中使用了正则表达式(出于其他原因也在 post 上编辑了 GitHub/z3/issues)并且在定义正则表达式排序时遇到了一些问题:
(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))
我在这里做错了什么?谢谢!
编辑: (所以机器人不允许我编辑,因为这个 post 主要是代码, 所以我最好添加一些这样的文本行。也许还有这样一行) 不管怎样,方法是这样的:
(declare-const dst String)
(declare-const src String)
(define-fun one () (RegEx String) (str.to.re "\x01"))
(define-fun zero () (RegEx String) (str.to.re "\x00"))
(define-fun zero_or_one () (RegEx String) (re.union zero one))
(define-fun binary_strings () (RegEx String) (re.* zero_or_one ))
(assert (= (str.len dst) 25))
(assert (= (str.len src) 50))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [0] This does work ... ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (str.in.re src binary_strings))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [1] this query takes 25 sec ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(assert (< (str.len dst) (str.indexof src "\x00" 0)))
(check-sat)
(get-value (dst src))
正确答案是:
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"))
请注意,当前不支持比较正则表达式或将它们用作变量的决策过程。