访问SMT-LIBv2中的复合排序(数据类型)的成员

时间:2014-12-22 16:47:46

标签: smt model-checking cvc4

根据秒。 The SMT-LIBv2 Language and Tools: A Tutorial的3.9.3可以在SMT-LIBv2中声明这样的复合排序:

(set-logic QF_UF)
(declare-sort Triple 3)
(declare-fun state () (Triple Bool Bool Bool))

我正在使用CVC4,它似乎接受这种语法。但是我如何访问元素?我尝试了下面的内容(以及我在网上找到的其他内容):

(assert (_ state 1))
(assert (select 1 state))

但看起来这些运算符只适用于向量和数组。我找不到任何使用此类复合排序的示例,并且无法找到有关在教程或语言标准中访问这些元素的任何内容。怎么做?或者我是否完全误解了这个功能的用途?

我的应用程序:我想编码一个临时问题,并希望以状态转换函数的形式进行编码,将旧状态转换为新状态,因此在试验系统时我可以编写如下内容:< / p>

....
(declare-fun initial_state () MyStateSort)
(declare-fun state_after_step_1 () MyStateSort)
(declare-fun state_after_step_2 () MyStateSort)
(assert (= (MyTransitionFunc initial_state) state_after_step_1)
(assert (= (MyTransitionFunc state_after_step_1) state_after_step_2)

1 个答案:

答案 0 :(得分:0)

这是我自己的问题的答案。如果有人可以使用arity&gt;发布用户定义排序用例的示例; 0,我很乐意接受这个答案。

在仔细阅读SMT-LIBv2标准后,我现在正在考虑使用arity&gt;进行排序声明。 0只在理论定义中有一个应用程序(用于声明类似Array的排序),而不是用户提供的代码。 David Cok的教程中的示例似乎具有误导性,因为它表明这可以用于声明复合排序。我还没有发现任何其他地方的迹象。这包括完整的SMT-LIB基准测试,其中不包含arity&gt;的单个排序声明。 0

应该使用未解释的函数来创建等效的复杂数据结构,而不是“复合排序”。例如:

(set-logic QF_UF)
(declare-sort CONTAINER_SORT 0)
(declare-fun CONTAINER_MEMBER_1 (CONTAINER_SORT) Bool)
(declare-fun CONTAINER_MEMBER_2 (CONTAINER_SORT) Bool)
(declare-fun INSTANCE_1 () CONTAINER_SORT)
(declare-fun INSTANCE_2 () CONTAINER_SORT)

这将有效地声明以下4个独立的Bool表达式。

(CONTAINER_MEMBER_1 INSTANCE_1)
(CONTAINER_MEMBER_2 INSTANCE_1)

(CONTAINER_MEMBER_1 INSTANCE_2)
(CONTAINER_MEMBER_2 INSTANCE_2)