【发布时间】:2020-08-12 07:40:17
【问题描述】:
在给定一些约束的情况下,我想找到变量可以具有的有效值范围。例如,
x = Int('x')
s = Solver()
s.add(x >= 1)
s.add(x < 5+2)
有什么方法可以让 z3 为这个变量打印 1..6 吗?
我尝试使用以下方法,但 range() 仅适用于声明。
print("x.range():", x.range()) # this does not work
注意: 1.这个question好像问的一样,但是我没看懂它的答案,正在找python的答案。
- 回复@Malte:我不是在寻找所有答案,我只是想将多个约束简化到一个有效范围内。如果变量两侧的约束不能合并,那么至少只有一侧的约束,如上述问题中所述。
【问题讨论】:
-
我不明白让 Z3 打印
[1,6]的潜在值范围x与让 Z3 打印所有有效模型有何不同。请说清楚。请注意,您链接到的问题似乎与您的不同,因为您希望找到所有模型的简单表示,而在链接的问题中,需要初始约束集的简化表示。 -
范围是否很大很重要。例如,如果范围恰好是 [1,10000],我不想枚举所有 10k 答案来确定其范围。
-
在链接的答案中,它简化了一侧的所有约束,即 >= 一侧。但是我要求的是范围,这相当于简化了双方的约束。
-
正如我的回答中提到的,Z3 不直接支持您的要求。列举所有可能的答案是您唯一的选择。连同提交功能请求 (github.com/Z3Prover/z3/issues),当然 :-)
-
感谢您的确认。顺便说一句,提到的问题有一个非 python 的答案,是否有对应的 python 等效项?