Types 在Z3中表示枚举类型之间的子类型关系
在Z3中,表达枚举类型之间的子类型关系的最佳方式是什么 具体来说,我想做如下工作:Types 在Z3中表示枚举类型之间的子类型关系,types,z3,smt,Types,Z3,Smt,在Z3中,表达枚举类型之间的子类型关系的最佳方式是什么 具体来说,我想做如下工作: (declare-datatypes () ((Animal Eagle Snake Scorpion))) 然后创建一个新的子类型: (declare-datatypes () ((Mammal Cat Rat Bat))) 因此,有4个动物类型的不同常数的断言是SAT,但有4个哺乳动物类型的不同常数的断言是UNSAT。Z3对亚类型(亚部分)关系没有直接支持。 我可以在Z3中看到两种建模方法 例如,可以有一
(declare-datatypes () ((Animal Eagle Snake Scorpion)))
然后创建一个新的子类型:
(declare-datatypes () ((Mammal Cat Rat Bat)))
因此,有4个动物类型的不同常数的断言是SAT,但有4个哺乳动物类型的不同常数的断言是UNSAT。Z3对亚类型(亚部分)关系没有直接支持。 我可以在Z3中看到两种建模方法 例如,可以有一个包含所有动物的枚举排序
Animal
。然后,定义谓词,例如:是哺乳动物
,是爬行动物
,等等
以下是使用此方法的脚本:
(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
另一个解决方案使用数据类型定义枚举排序和联合排序。
也就是说,我们为每个动物类声明一个数据类型:哺乳动物类型
,爬行动物类型
,等等。
它们都是枚举类型。然后,我们声明一个联合
数据类型:AnimalType
。
此数据类型包含每个动物类的构造函数:哺乳动物
,爬行动物
,等等。
Z3自动为每个构造器创建一个谓词is-[constructor name]
(识别器):是哺乳动物
,是爬行动物
,等等。
我们将访问器命名为“animal2类”:Animal2Mammal
,animal2rectile
,等等。您可以在中找到有关数据类型的更多信息。
以下是使用此编码的脚本:
(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
利奥,你有预感两种编码中哪一种会表现得更好吗?在Z3的当前版本中,编码1在大多数情况下可能更好。我将使用编码一,并使用整数或位向量编码枚举类型。