Z3は、サブタイプ(サブソート)関係を直接サポートしていません。Z3でそれらをモデル化する2つの方法を見ることができます。
たとえば、Animal
すべての動物を含む列挙型ソートを作成できます。is-mammal
次に、: 、などの述語を定義しますis-reptile
。
このアプローチを使用するスクリプトは次のとおりです。
(set-option :produce-models true)
(declare-datatypes () ((Animal Eagle Snake Scorpion Cat Rat Man)))
(define-fun is-mammal ((x Animal)) Bool
(or (= x Cat) (= x Rat) (= x Man)))
(declare-const a1 Animal)
(declare-const a2 Animal)
(declare-const a3 Animal)
(declare-const a4 Animal)
(assert (distinct a1 a2 a3 a4))
(check-sat)
; sat
(get-model)
; now, we constraint a1, a2, a3 and a4 to be mammals.
(assert (is-mammal a1))
(assert (is-mammal a2))
(assert (is-mammal a3))
(assert (is-mammal a4))
(check-sat)
; unsat
別のソリューションでは、データ型を使用して列挙型の並べ替えと共用体の並べ替えを定義します。つまり、動物クラスごとに1つのデータ型(、、など)を宣言しMammalType
ますReptileType
。それぞれが列挙型です。次に、union
データ型を宣言しますAnimalType
。このデータ型には、各動物クラスのコンストラクターが含まれます: Mammal
、など。Z3は、各コンストラクターReptile
の述語is-[constructor-name]
(認識機能)を自動的に作成します: is-Mammal
、、is-Reptile
など。アクセサーの名前は「Animal2Class」:、などです。データ型の詳細については、次を参照してくださいAnimal2Mammal
。http://rise4fun.com/z3/tutorial/guide。このエンコーディングを使用するスクリプトは次のとおりです。Animal2Reptile
(set-option :produce-models true)
(declare-datatypes () ((AveType Eagle Sparrow)))
(declare-datatypes () ((ReptileType Snake)))
(declare-datatypes () ((ArachnidType Scorpion Spider)))
(declare-datatypes () ((MammalType Cat Rat Man)))
(declare-datatypes () ((AnimalType
(Ave (Animal2Ave AveType))
(Reptile (Animal2Reptile ReptileType))
(Arachnid (Animal2Arachnid ArachnidType))
(Mammal (Animal2Mammal MammalType)))))
(declare-const a1 AnimalType)
(declare-const a2 AnimalType)
(declare-const a3 AnimalType)
(declare-const a4 AnimalType)
(assert (distinct a1 a2 a3 a4))
(check-sat)
; sat
(get-model)
; now, we constraint a1, a2, a3 and a4 to be mammals.
(assert (is-Mammal a1))
(assert (is-Mammal a2))
(assert (is-Mammal a3))
(assert (is-Mammal a4))
(check-sat)
; unsat