如何在用户理论插件中理论算术中访问变量?

时间:2012-07-09 17:48:03

标签: z3

在用户理论插件中,假设我有一个客户排序“T”,我在T上定义了一个带有“Z3_func_decl”的函数“f”,它接受了排序T的参数并返回排序Int (由“Z3_mk_int_sort”排序)。我对返回的Int值也有其他约束。

在搜索中,我想在一些回调中捕获Int返回值的具体值(例如new_assignmentnew_eq回调),以便我可以进行额外的断言来解决参数值排序T.但问题是那些回调不会在搜索中被调用。

我看了一下SAT解决方案的Z3_context。在理论算术中,我看到:

  

vars:v0#24 lo:-oo,up:4,value:0,   occs:0,atoms:1,int,non-base,shared:0,activity:0,   unassigned:0,rel:1,def:#24

“#24”是我的功能,“up”中显示的“4”是我的功能返回值的SAT解决方案。

我的问题是如何在搜索中获得值“4”。我试图在final_check的回调中在#24的等价类中找到它但在那里没有运气。

谢谢!

1 个答案:

答案 0 :(得分:2)

不幸的是,你不能在Z3中这样做。理论无法访问其他理论中使用的内部数据结构。这些理论只知道共同的术语是否相等(不平等)。 这一设计决策使我们能够在不影响其他理论的情况下改变理论的实施。 算术理论就是一个很好的例子。我们将用更有效的实施替换当前的实施。新实现将使用不同的数据结构。 在上面的示例中,loup是术语#24的已知下限和上限。 Z3选择4(上限)作为#24的解释只是巧合。

此外,在当前版本的Z3中,在Z3确定问题可以满足之后开始模型构建。因此,理论算法赋予的实际解释不能真正用于帮助其他理论。