z3不带量词的数据类型匹配

z3不带量词的数据类型匹配,z3,Z3,假设我在z3中创建一个数据类型a: (declare-datatypes () ((A (b (bx Int)) (c (cx Int))))) 现在,我可以声明一个变量t,然后断言t是c类型: (declare-fun t () A) (assert (exists ((x Int)) (= t (c x)))) 然而,这需要一个存在量词。我的问题是:在没有量词的情况下有可能做到这一点吗 具体地说,我想要一个表达式,比如is_c t或类似的东西,它等价于(exists((x Int))(=

假设我在z3中创建一个数据类型
a

(declare-datatypes () ((A (b (bx Int)) (c (cx Int)))))
现在,我可以声明一个变量
t
,然后断言
t
c
类型:

(declare-fun t () A)
(assert (exists ((x Int)) (= t (c x))))
然而,这需要一个存在量词。我的问题是:在没有量词的情况下有可能做到这一点吗

具体地说,我想要一个表达式,比如
is_c t
或类似的东西,它等价于
(exists((x Int))(=t(c x))


我原以为这很简单,因为在大多数具有和类型的函数式编程语言中,它们都有一种消除形式,通常是模式匹配,比如
match t of bx=>false;Cx=>true
。但是我在z3文档中找不到任何这种性质的东西。有什么我遗漏的吗?

您会自动获得一个测试仪,作为索引标识符:
(\uu是c)
用于每个构造函数
c

见本规范第4.2.3节。相关部分见第61页(第二段):

成功执行此命令后,对于 声明数据类型δ时,解算器还将自动声明 秩为δBool的测试仪。测试人员的名称是一个索引标识符 (见第3.3节)的表格(u为c)


谢谢顺便说一句,这看起来直到Z34.6才起作用。(另外,我还以为语法是
(t是c)
,但实际上是
((u是c)t)
.Heh。)Z34.6实现了数据类型的SMT2.6语法。在此之前,它将依赖于自动生成的自定义标识符,以构造函数命名,但前缀为“is-”或“is\”。鉴于SMT2.6的文档中已经描述了语法,只需遵循其中使用的约定即可。