SAT求解器SAGE

时间:2014-08-12 12:31:21

标签: python sage

我试图理解为什么求解器在此代码中找不到解决方案

R.<x,y,z,w> = BooleanPolynomialRing()
S = PolynomialSequence([x*y+z,x+y])
sol = S.solve(); sol
[]

对我来说,解决方案是x = 1; y = 1且z = 1,或者我错了?

1 个答案:

答案 0 :(得分:1)

通过仔细阅读我们正在使用的solve方法的文档,可以找到这个返回值的解释(以及如何获得更令人满意的),但我同意你的看法,这个返回值令人费解

要访问该方法的文档,请键入S.solve?,要访问源代码,请键入S.solve??。这还将显示定义此方法的文件,然后您可以在系统上或在Sage source code at GitHub上在线阅读此文件。

作为参考,我使用Sage 6.3。删除不起作用的w,并通过编写Sequence并且不给解决方案命名略微简化,您的示例变为:

sage: R.<x,y,z> = BooleanPolynomialRing()
sage: S = Sequence([x * y + z, x + y])
sage: S.solve()
[]

我们确实感到惊讶,因为(0,0,0)和(1,1,1)是两个明显的解决方案。

sage: obvious_0 = {x: 0, y: 0, z: 0}
sage: obvious_1 = {x: 1, y: 1, z: 1}
sage: S.subs(obvious_0)
[0, 0]
sage: S.subs(obvious_1)
[0, 0]

这是因为此solve方法具有可选参数eliminate_linear_variables,默认情况下设置为True,这会将变量的所有线性匹配项移除到方程式中。在我们的例子中,这只是删除了所有方程式。

这个solve方法的另一个可能令人惊讶的特征是,如果多项式序列为空,则返回一个空列表:

sage: S = S[0:]
sage: S.solve()

(而有人可能会争辩说任何东西都是一个空方程列表的解决方案)。

获得多项式序列的解:

sage: S.solve(eliminate_linear_variables=False)
[{z: 0, y: 0, x: 0}]

这里我们只得到一个解决方案。这是因为solve方法的另一个可选参数n表示最多返回n个解决方案,默认设置为1。将其设置为Infinity以获取所有解决方案。

sage: S.solve(n=Infinity,eliminate_linear_variables=False)
[{z: 0, y: 0, x: 0}, {z: 1, y: 1, x: 1}]