【问题标题】:z3 Regex sort unrecognizedz3 正则表达式排序无法识别
【发布时间】: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"))

【问题讨论】:

    标签: regex z3 smt


    【解决方案1】:

    你可以这样写:

    (define-fun zero () (RegEx String) (str.to.re "\x00"))
    

    请注意,当前不支持比较正则表达式或将它们用作变量的决策过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多