我正在使用Microsoft的Z3 SMT解算器,我正在尝试定义自定义排序的常量。看起来这样的常量默认不是不相等的。假设您有以下程序:
(declare-sort S 0)
(declare-const x S)
(declare-const y S)
(assert (= x y))
(check-sat)
这将给出" sat",因为当然完全有可能两个相同类型的常数相等。由于我正在建立常量必须彼此不同的模型,这意味着我需要添加形式的公理
(assert (not (= x y)))
对于每一对相同的常量。我想知道是否有某种方法可以执行此泛型,因此默认情况下,排序的每个常量都是唯一的。
答案 0 :(得分:3)
您可以使用数据类型对许多编程语言中的枚举类型进行编码。在以下示例中,排序S
有三个元素,它们彼此不同。
(declare-datatypes () ((S a b c)))
以下是一个完整的示例:http://rise4fun.com/Z3/ncPc
(declare-datatypes () ((S a b c)))
(echo "a and b are different")
(simplify (= a b))
; x must be equal to a, b or c
(declare-const x S)
; since x != a, then it must be b or c
(assert (not (= x a)))
(check-sat)
(get-model)
; in the next check-sat x must be c
(assert (not (= x b)))
(check-sat)
(get-model)
另一种可能性是使用distinct
。
(assert (distinct a b c d e))