regex - Z3 RegEx for Int*

标签 regex z3

我正在尝试编写一个断言,即某个整数序列至少包含 2 次出现的某个整数(比如 8)。这是我写的:

(declare-const s (Seq Int))
(assert (seq.in.re s
    (re.++
        re.all
        (re.++
            (seq.to.re (seq.unit 8))
            (re.++
                re.all
                (re.++
                    (seq.to.re (seq.unit 8))
                    re.all))))))

当我尝试运行它时,出现以下错误:

(error "line 11 column 11: Sort of function 're.++' does not match the declared type. Given domain: (RegEx (Seq Int)) (RegEx String) ")

所以我猜 re.all 只是为字符串定义的?有没有办法为所有整数创建一个正则表达式

最佳答案

SMTLib 类型系统相当薄弱,当它看到 re.all 时会感到困惑,因为它无法区分字符串正则表达式和其他序列的正则表达式。因此你会遇到类型错误。

这实际上是在 SMTLib 标准中预期的,请参阅 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf 的第 3.6.4 节

解决方案(如标准中所述)是使用 as 子句来提供显式类型,如下所示:

(define-fun allInt () (RegEx (Seq Int)) (as re.all (RegEx (Seq Int))))

(declare-const s (Seq Int))
(assert (seq.in.re s
    (re.++
        allInt
        (re.++
            (seq.to.re (seq.unit 8))
            (re.++
                allInt
                (re.++
                    (seq.to.re (seq.unit 8))
                    allInt))))))

对于希望系统从上下文中找出实际类型应该是什么的人来说,这是一个常见的问题。但是为了保持系统简单,设计者选择了一个非常简单的类型系统:每个术语都应该可以独立输入,没有任何上下文信息。在极少数情况下这是不可能的(例如您的用例),他们提供了 as 语法作为明确输入的一种方式。

关于regex - Z3 RegEx for Int*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57455242/

相关文章:

z3 - 定义自定义量词

Z3:将 Z3py 表达式转换为 SMT-LIB2?

javascript - Sublime Text 方括号上的缩进(Javascript)

javascript - 正则表达式中的括号单位返回额外的匹配项

MySQL REGEXP 字边界 [[ :<:]] [[:>:]] and double quotes

sql - 如何使用 SQL 替换字符串末尾的子字符串?

python - 在 Python 中使用函数作为 re.sub 的参数?

z3 - 定制简化器

c++ - Z3 c++ api 替换数组

z3 - 使用 Z3 获取符号值