首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >国际贸易组织的Z3 RegEx *

国际贸易组织的Z3 RegEx *
EN

Stack Overflow用户
提问于 2019-08-12 03:06:05
回答 1查看 143关注 0票数 3

我试图写一个断言,即某个整数的序列至少包含两个整数(例如8)。以下是我所写的:

代码语言:javascript
复制
(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))))))

当我试图运行它时,我会得到以下错误:

代码语言:javascript
复制
(error "line 11 column 11: Sort of function 're.++' does not match the declared type. Given domain: (RegEx (Seq Int)) (RegEx String) ")

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 04:59:54

SMTLib类型系统很弱,当它看到re.all不能区分字符串regexp和regexp时,它会感到困惑。因此你得到了一个类型错误。

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

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

代码语言:javascript
复制
(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语法作为显式输入的一种方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57455242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档