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

Z3如何处理非线性整数运算?,z3,Z3,我知道带乘法的整数理论一般是不可判定的。然而,在某些情况下,Z3确实返回一个模型。我很想知道这是怎么做到的。它是否与实数上非线性算术的新决策过程有关?Z3返回乘法查询模型的具体实例(如:有限模下的整数等)有哪些?非常感谢您的帮助。是的,非线性整数算法的决策问题是不可判定的。 我们可以用非线性整数算法对图灵机的停止问题进行编码。 我强烈推荐这本漂亮的书给任何对这个问题感兴趣的人 请注意,如果公式有解,我们总是可以用蛮力找到它。也就是说,我们不断枚举所有可能的赋值,并测试它们是否满足公式。这与试图通

我知道带乘法的整数理论一般是不可判定的。然而,在某些情况下,Z3确实返回一个模型。我很想知道这是怎么做到的。它是否与实数上非线性算术的新决策过程有关?Z3返回乘法查询模型的具体实例(如:有限模下的整数等)有哪些?非常感谢您的帮助。

是的,非线性整数算法的决策问题是不可判定的。 我们可以用非线性整数算法对图灵机的停止问题进行编码。 我强烈推荐这本漂亮的书给任何对这个问题感兴趣的人

请注意,如果公式有解,我们总是可以用蛮力找到它。也就是说,我们不断枚举所有可能的赋值,并测试它们是否满足公式。这与试图通过运行程序并检查程序是否在给定的步骤数后终止来解决停止问题没有多大区别

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

此外,只有当存在一个非常小的解决方案(一个需要编码少量位的解决方案)时,简化为命题逻辑才有效。我在以下帖子中对此进行了讨论:

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

最后,非线性实数算法(NLSat)解算器默认情况下不用于非线性整数问题。它通常对整数问题非常无效。 尽管如此,我们可以强制Z3使用NLSat,即使是整数问题。我们只需更换:

(check-sat)


使用此命令时,Z3将作为实际问题解决问题。如果没有找到实解,我们就知道不存在整数解。如果找到一个解决方案,Z3将检查该解决方案是否真的将整数值分配给整变量。如果不是这样,它将返回
unknown
,表示无法解决问题。

这是一个有效的问题。请不要投票否决它,或投票关闭它。谢谢
(check-sat-using qfnra-nlsat)