私が理解している限り、変数v 1、...、v nのセットVがあり、各変数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)))))
2 つの制約を追加し、モデルの 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)
)
「ゼロまたは個別」の制約を生成するのは面倒な作業なので、おそらく PyZ3 や Scala^Z3 などの Z3 フロントエンドで作業したいと思うでしょう。