Z3中的值不同

时间:2013-02-19 10:42:34

标签: z3

我想问一个关于在Z3中分配不同值的问题。

假设我有6个变量A,B,C,D,E,F。 现在,我想为其中一些分配不同的值,其中一些将为零。有多少变量是不同的,有多少变量为零是未知的。这取决于某些其他条件。

通常我会写的所有变量

(assert (distinct A B C D E F))

然而,写A, B, D之类的约束是否为零,而其他约束是不同的?再次记住,A,B, D只是示例变量。它们可以根据约束动态变化。

谢谢!

1 个答案:

答案 0 :(得分:2)

据我所知,你有一组 V 变量 v 1 ,...,v n < / em>,其中每个变量 v i 为零或与所有其他变量 v j 不同,j≠i

例如,请V = {a, b, c, d}

(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(declare-const d Int)

您可以将约束编码为

(assert (or (= a 0) (not (or (= a b) (= a c) (= a d)))))
(assert (or (= b 0) (not (or (= b a) (= b c) (= b d)))))
(assert (or (= c 0) (not (or (= c a) (= c b) (= c d)))))
(assert (or (= d 0) (not (or (= d a) (= d b) (= d c)))))

添加两个约束并为模型查询Z3

(assert (= a 0))
(assert (not (= b 0)))

(check-sat)
(get-model)

然后产生

sat
(model 
  (define-fun b () Int
    (- 2))
  (define-fun c () Int
    (- 1))
  (define-fun d () Int
    0)
  (define-fun a () Int
    0)
)

自生成&#34;零或不同&#34;约束是一项繁琐的任务,您可能希望使用Z3前端,如PyZ3或Scala ^ Z3。