没有量词的z3数据类型匹配

时间:2018-01-05 22:10:27

标签: z3

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

(declare-datatypes () ((A (b (bx Int)) (c (cx Int)))))

现在,我可以声明变量t,然后断言tc类型:

(declare-fun t () A)
(assert (exists ((x Int)) (= t (c x))))

然而,这需要一个存在量词。我的问题是:是否可以在没有量词的情况下执行此操作

具体来说,我喜欢is_c t或类似的表达式,相当于(exists ((x Int)) (= t (c x)))

我原本以为这是直截了当的,因为在大多数函数式编程语言中,使用和类型,它们都是消除形式,通常是模式匹配,如match t of b x => false; c x => true。但我还没有在z3文档中找到这种性质的东西。我有什么遗失的吗?

1 个答案:

答案 0 :(得分:3)

您自动获取测试人员,作为每个构造函数return meals[section].food.count 的索引标识符(_ is c)

参见http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf的4.2.3节。相关部分见第61页(第二段):

  

成功执行此命令后,对于a中的每个构造函数c   声明数据类型为δ,求解器也会自动声明一个   具有等级δ布尔的测试器。测试者的名称是索引标识符   (见第3.3节)表格(_是c)。