z3,z3py:是否有可能本质上减少函数的搜索空间?

时间:2015-09-02 15:52:06

标签: z3 smt z3py

我推断一个函数(var1),当0< = var1< = 10时我只关心这个函数的值,我知道,当0< = var< = 10,0< =函数(var1)< = 10。

一种常见的方式(我猜)限制函数的搜索空间就像声明约束一样(在z3py中):

for i in range(11):
  solver.add(And(Function(i)>=0,Function(i)<=10))

我的问题是:有没有更好的方法可以约束函数的搜索空间?类似于设置此函数的上限/下限的东西?

我的直觉是:因为我对这个函数有很多其他约束,我觉得如果我可以自然地限制函数的搜索空间,解算器可能会自动避免许多不可能的赋值,以及花费的时间推断可能会减少。我不确定这是否合理。

2 个答案:

答案 0 :(得分:3)

Z3仅支持简单类型。您基本上使用属性约束您的函数。您可以使用量化断言对此进行编码。那是, 断言

   ForAll([x], Implies(And(0 <= x, x <= 10), And(0 <= F(x), F(x) <= 10)))

量化器会在每次出现F时进行实例化,而不是每次出现 F域中的值。如果您的域很大并且出现次数很少,这会有很大帮助。另一方面,如果F在许多地方使用(也是在搜索期间实例化其他量词的结果),那么预先说明边界将更便宜。

答案 1 :(得分:0)

我想到的一种方式是,我们可以通过替换&#34; IntSort&#34;来限制域的功能范围。作为输入和输出的排序,使用&#34; BitVecSort&#34;。

假设我知道域为[0,8]且范围为[0,127]。然后我们可以将函数定义为

F = Function('F',BitVecSort(3),BitVecSort(7))