我推断一个函数(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))
我的问题是:有没有更好的方法可以约束函数的搜索空间?类似于设置此函数的上限/下限的东西?
我的直觉是:因为我对这个函数有很多其他约束,我觉得如果我可以自然地限制函数的搜索空间,解算器可能会自动避免许多不可能的赋值,以及花费的时间推断可能会减少。我不确定这是否合理。
答案 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))