Согласно разд. 3.9.3 из Язык и инструменты SMT-LIBv2: учебное пособие возможно чтобы объявить составную сортировку, подобную этой, в 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)