Logic Z3 SMT求解器中常数的相等性

Logic Z3 SMT求解器中常数的相等性,logic,z3,solver,smt,Logic,Z3,Solver,Smt,我正在使用微软的Z3 SMT解算器,我正在尝试定义自定义排序的常量。似乎这些常数在默认情况下并不是不相等的。假设您有以下程序: (declare-sort S 0) (declare-const x S) (declare-const y S) (assert (= x y)) (check-sat) 这将给出“sat”,因为同一种类的两个常数当然完全可能相等。因为我要建立一个模型,其中常数必须彼此不同,这意味着我需要添加一个形式公理 (assert (not (= x y))) 对于相

我正在使用微软的Z3 SMT解算器,我正在尝试定义自定义排序的常量。似乎这些常数在默认情况下并不是不相等的。假设您有以下程序:

(declare-sort S 0)

(declare-const x S)
(declare-const y S)

(assert (= x y))
(check-sat)
这将给出“sat”,因为同一种类的两个常数当然完全可能相等。因为我要建立一个模型,其中常数必须彼此不同,这意味着我需要添加一个形式公理

(assert (not (= x y)))

对于相同类型的每对常量。我想知道是否有某种方法可以做到这一点,这样排序的每个常量在默认情况下都是唯一的。

您可以使用数据类型对许多编程语言中的枚举类型进行编码。在下面的示例中,sort
S
有三个元素,它们彼此不同

(declare-datatypes () ((S a b c)))
下面是一个完整的示例:

另一种可能是使用
distinct

(assert (distinct a b c d e))

谢谢你的快速回答。我决定采用第一种解决方案,它看起来有点优雅。我真的很喜欢你在特伦托2012年SAT/SMT暑期学校的演讲!谢谢我很高兴听到你喜欢它。
(assert (distinct a b c d e))