Z3 如何访问用户理论插件中的理论算术变量?
在用户理论插件中,假设我有一个客户排序“T”,并且我定义了一个函数“f”,在T上带有“Z3 如何访问用户理论插件中的理论算术变量?,z3,Z3,在用户理论插件中,假设我有一个客户排序“T”,并且我定义了一个函数“f”,在T上带有“Z3\u func\u decl”,它接受sort T参数并返回sort Int(排序由“Z3\u mk\u Int\u sort”)。我还对返回的Int值有其他限制 在搜索中,我想捕获一些回调(例如new\u assignment或new\u eq回调)中Int返回值的具体值,以便我可以做出额外的断言来解决sort T的参数值。但问题是这些回调在搜索中不会被调用 我查看了SAT解决方案的Z3_上下文。在理论算
Z3\u func\u decl
”,它接受sort T参数并返回sort Int(排序由“Z3\u mk\u Int\u sort
”)。我还对返回的Int值有其他限制
在搜索中,我想捕获一些回调(例如new\u assignment
或new\u eq
回调)中Int返回值的具体值,以便我可以做出额外的断言来解决sort T的参数值。但问题是这些回调在搜索中不会被调用
我查看了SAT解决方案的Z3_上下文。在理论算术中,我看到:
变量:v0#24 lo:-oo,向上:4,值:0,
occs:0,原子数:1,整数,非基数,共享数:0,活动数:0,
未分配:0,相关:1,定义:24
“#24”是我的函数,“up”中显示的“4”是我函数返回值的SAT解
我的问题是如何在搜索中获得值“4”。我试图在final\u check
的回调中的#24的等价类中找到它,但没有成功
谢谢 不幸的是,在Z3中不能这样做。一个理论无法访问其他理论中使用的内部数据结构。这些理论只知道共享项是否相等(不相等)。
这个设计决策允许我们在不影响其他人的情况下改变理论的实现。
算术理论就是一个很好的例子。我们将以更有效的方式取代目前的实施方式。新的实现将使用不同的数据结构。
在上面的例子中,lo
和up
是术语#24
的已知下限和上限。
Z3选择4
(上限)作为#24
的解释,这只是巧合
此外,在Z3的当前版本中,模型构造是在Z3确定问题是可满足的之后开始的。因此,理论算术指定的实际解释不能真正用于帮助其他理论。非常感谢您的回答!这是否意味着,如果我想对排序Int进行推理,我必须在我的理论中实现排序Int的约束求解?或者,在我的理论中,有什么方法可以利用现有的Z3int解算器?谢谢。你能提供更多关于你的程序的细节吗?您希望如何在过程中使用整数约束?例如,T
是一种集合f
是返回集合大小的函数。假设给定关于集合大小的约束,我想求解集合。或者,对于Int的大小,至少我可以对集合有一些提示。谢谢。目前的理论插件只允许用户实现“不相交”的理论。因此,为了支持具有大小函数的集合,我看到了两种选择:实现组合理论(这是一项大量的工作);实现一个插件来处理集合理论而不使用大小函数,然后在Z3之上实现一个包装器来实现组合理论。包装器实质上实现了“按需引理”方法,您可以在该方法中检查Z3生成的模型是否有效。如果不是的话,你可以添加新的公理来删减模型。这是对答案的后期补充,但你可能有兴趣看一下我们的论文“满足性模理论中带基数约束的集合”,其中我们描述的组合与你提到的非常相似。我们将该算法作为Z3的一个理论插件来实现,本文也描述了其中的一些方面。如果你认为这符合你的需要,我很乐意提供更多细节。