秒によると。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))
しかし、これらの演算子はベクトルと配列でしか機能しないようです。このような複合ソートを使用する例は見つかりませんし、チュートリアルや言語標準でそれらの要素へのアクセスについて何も見つけることができません。それはどのように行われますか?それとも、この機能の目的を完全に誤解していましたか?
私のアプリケーション: 一時的な問題をエンコードし、古い状態を新しい状態に変換する状態遷移関数の形式でそれを実行したいので、システムで実験するときに次のようなものを書くことができます:
....
(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)