Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3 如何访问用户理论插件中的理论算术变量?_Z3 - Fatal编程技术网

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

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_上下文。在理论算

在用户理论插件中,假设我有一个客户排序“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_上下文。在理论算术中,我看到:

变量: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的一个理论插件来实现,本文也描述了其中的一些方面。如果你认为这符合你的需要,我很乐意提供更多细节。