定义变量后更改排序

时间:2018-03-09 16:49:08

标签: z3 z3py

在语句中定义并使用变量后,是否可以更改变量的域?实施例

s = Solver()
x = Real('x')
s.add(x < 1)

现在我想将x的域更改为Int或Bool。

谢谢!

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的。

但你为什么要这样做呢? SMTLib基于多排序的一阶逻辑,变量只能有一种。所以,即使你可以改变域名,也没有意义。 (基本上是类型错误。)

话虽如此,没有什么可以阻止你说:

x = Int ('x')

在该脚本的末尾。但是新的x将完全独立于旧x;即,具有不同排序的不同名称,您将无法访问第一个。显然,这既不有用也不可取。即:

from z3 import *

s = Solver ()
x = Real ('x')
s.add (x < 1)

x = Bool ('x')
s.add (x)

print s.sexpr()
print s.check()
print s.model()

打印:

(declare-fun x () Real)
(declare-fun x () Bool)
(assert (< x 1.0))
(assert x)

sat
[x = True, x = 0]

这是非常令人困惑的阅读,直到你意识到这两个x完全相互独立。 (而且我会说s.sexpr()方法相当错误,因为它没有打印出有效的smt2-lib,因为打印的内容会被兼容的SMT解算器拒绝,但这是一个不同的问题。)< / p>

我怀疑,也许,你正试图要求别的东西。如果你详细描述你想要做的事情,你可能会得到更好的答案!