【发布时间】:2018-03-09 05:07:33
【问题描述】:
我在以下 z3 查询中使用正则表达式(出于其他原因也在 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))
我在这里做错了什么?谢谢!
编辑: (所以机器人不允许我编辑,因为这篇文章主要是代码, 所以我最好添加一些这样的文本行。也许还有这样一行) 无论如何,这是这样做的方法:
(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"))
【问题讨论】: