Z3如何处理非线性整数运算?

时间:2012-12-16 02:46:31

标签: z3

我知道乘法的整数理论通常是不可判定的。然而,在某些情况下,Z3确实返回了一个模型。我很想知道这是怎么做到的。它是否与用于实数的非线性算术的新决策程序有关?已经识别出哪些特定实例(例如:有限模数下的整数等),Z3为其返回乘法查询的模型?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:29)

是的,非线性整数算术的决策问题是不可判定的。 我们可以用非线性整数算法对图灵机的Halting问题进行编码。 对于任何对这个问题感兴趣的人,我强烈推荐这本精美的书Hilbert's tenth problem

请注意,如果公式有解决方案,我们总能通过蛮力找到它。也就是说,我们会一直列举所有可能的任务,并测试它们是否满足公式。这与试图解决Halting问题没有什么不同,只需运行程序并检查它是否在给定步数后终止。

Z3不执行天真的枚举。给定一个数字k,它使用k位对每个整数变量进行编码,并将所有内容简化为命题逻辑。然后,使用SAT求解器来找到解。如果找到解决方案,它会将其转换回原始公式的整数解。如果没有针对Propositional formal的解决方案,那么它会尝试增加k,或者切换到不同的策略。这种对命题逻辑的简化本质上是一种模型/解决方案发现过程。它无法表明问题没有解决方案。实际上,对于每个整数变量都有下限和上限的问题,它可以做到。因此,Z3必须使用其他策略来显示没有解决方案。

此外,只有存在一个非常小的解决方案(需要少量位编码的解决方案),才能减少命题逻辑。我在下面的帖子中讨论过:

Z3对非线性整数算法没有很好的支持。上述方法非常简单。在我看来,Mathematica似乎拥有最全面的技术组合:

http://reference.wolfram.com/legacy/v5_2/functions/AdvancedDocumentationDiophantinePolynomialSystems

最后,非线性实数算术(NLSat)求解器默认不用于非线性整数问题。它通常对整数问题非常无效。 尽管如此,我们可以强制Z3使用NLSat甚至是整数问题。我们只需要替换:

(check-sat)

使用

(check-sat-using qfnra-nlsat)

使用此命令时,Z3会将问题解决为实际问题。如果没有找到真正的解决方案,我们知道没有整数解决方案。如果找到解决方案,Z3将检查解决方案是否确实将整数值分配给整数变量。如果不是这样,它将返回unknown以表明它未能解决问题。