如何获取Z3javaAPI中的上限和下限?

How to get the upper bounds and lower bounds in Z3 java API?

使用z3优化求解器时,需要模型的边界,尤其是约束比较复杂。我可以在 Z3 python api 中找到 upper 和 lower 函数,但在 Java api 中找不到。您能否举一些例子来说明如何在 Z3 java api?

中获取模型边界

您应该使用 Handle 对象来访问边界。相关函数在这里:

https://github.com/Z3Prover/z3/blob/master/src/api/java/Optimize.java#L92-L103

Z3 带有一个 java 优化示例,它访问优化 class 中的 Handle。参见:

https://github.com/Z3Prover/z3/blob/master/examples/java/JavaExample.java#L2216-L2237

只需按照该示例并进一步调用 getLowergetUpper,例如:

Optimize.Handle mx = opt.MkMaximize(xExp);

mx.getLower()
mx.getUpper()

请注意,优化中的 min/max 值并不总是可靠的,它们也不意味着任何大于最小值和小于最大值的值都可以满足您的约束。它们只是求解器在限制变量时跟踪的内容,可能不是您的想法。最好展示你尝试了什么,以及在提问 stack-overflow 问题时得到了什么。