在语句中定义并使用变量后,是否可以更改变量的域?实施例
s = Solver()
x = Real('x')
s.add(x < 1)
现在我想将x的域更改为Int或Bool。
谢谢!
答案 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>
我怀疑,也许,你正试图要求别的东西。如果你详细描述你想要做的事情,你可能会得到更好的答案!