假设我在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 b x => false; c x => true
。但我还没有在z3文档中找到这种性质的东西。我有什么遗失的吗?
答案 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)。