在 z3 SMT 和 python 中不同
Distinct in z3 SMT and python
我的问题是 "Distinct" 是否适用于 z3 python?。我比较了以下代码,但似乎没有给出相同的结果:
(declare-const x Int)
(declare-const y Int)
(assert (distinct x y))
(check-sat)
(get-model)
结果是:
sat
(model
(define-fun y () Int
0)
(define-fun x () Int
1)
)
我添加了否定断言只是为了测试,结果不满意,这是正确的:
(assert (= x y))
unsat
Z3(6, 10): ERROR: model is not available
但是当我在 python 中使用 z3 时,它给我的坐姿总是如下:
x = Int('x')
y = Int('y')
Distinct(x, y)
s = Solver
s = Solver()
s.check()
当我添加以下断言时它应该给我 unsat 但它 returns sat:
s.add(x == y)
[y = 0, x = 0]
这是否意味着我使用了错误的语法?
'Distinct' 函数只创建一个项,它不会将自己添加到求解器中。这是一个对我有用的例子:
x = Int('x')
y = Int('y')
d = Distinct(x, y)
s = Solver()
s.add(d) # SAT without this one, UNSAT with
s.add(x == y)
print s
print s.check()
我的问题是 "Distinct" 是否适用于 z3 python?。我比较了以下代码,但似乎没有给出相同的结果:
(declare-const x Int)
(declare-const y Int)
(assert (distinct x y))
(check-sat)
(get-model)
结果是:
sat
(model
(define-fun y () Int
0)
(define-fun x () Int
1)
)
我添加了否定断言只是为了测试,结果不满意,这是正确的:
(assert (= x y))
unsat
Z3(6, 10): ERROR: model is not available
但是当我在 python 中使用 z3 时,它给我的坐姿总是如下:
x = Int('x')
y = Int('y')
Distinct(x, y)
s = Solver
s = Solver()
s.check()
当我添加以下断言时它应该给我 unsat 但它 returns sat:
s.add(x == y)
[y = 0, x = 0]
这是否意味着我使用了错误的语法?
'Distinct' 函数只创建一个项,它不会将自己添加到求解器中。这是一个对我有用的例子:
x = Int('x')
y = Int('y')
d = Distinct(x, y)
s = Solver()
s.add(d) # SAT without this one, UNSAT with
s.add(x == y)
print s
print s.check()