根据秒。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))
但看起来这些运算符只适用于向量和数组。我找不到任何使用这种复合排序的示例,也找不到有关在教程或语言标准中访问这些元素的任何内容。它是如何完成的?还是我完全误解了这个功能的用途?
我的应用程序:我想对一个时间问题进行编码,并希望以将旧状态转换为新状态的状态转换函数的形式进行编码,因此我可以在试验系统时编写如下内容:
....
(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)