你能限制两个边界之间的实变量吗?

Can you limit a real variable between two bounds?

你能限制两个边界之间的实变量吗?

    s = Solver()
    input = Reals('input')
    s.add(input >= -2, input <= 2)

这个例子 return unsat 对我来说。

在这种情况下,Solver class 的 sexpr 方法就是你的朋友!

你犯错是因为 z3py 绑定的类型极其弱。调用 Reals returns 多个结果,您将其分配给单个元素。也就是说,您的 input 变量现在是一个包含一个变量的列表。这反过来又使整个程序变得毫无意义,正如您自己观察到的那样:

from z3 import *
s = Solver()
input = Reals('input')
s.add(input >= -2, input <= 2)
print s.sexpr()

这会打印:

(assert true)
(assert false)

为什么?因为你的变量 input 是一个列表,而类型提升的奇异规则决定了一个列表大于或等于 -2 但小于 2。 (这完全没有意义,只是绑定的工作方式。没有押韵或理由应该是这样的。可以说它应该做更多的类型检查并给你一个正确的错误。但我离题了。)

要解决,只需将 Reals 的调用更改为 Real:

from z3 import *
s = Solver()
input = Real('input')
s.add(input >= -2, input <= 2)
print s.sexpr()
print s.check()
print s.model()

这会打印:

(declare-fun input () Real)
(assert (>= input (- 2.0)))
(assert (<= input 2.0))

sat
[input = 0]

这正是你想说的。