Types 在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中看到两种建模方法 例如,可以有一

在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在大多数情况下可能更好。我将使用编码一,并使用整数或位向量编码枚举类型。