Python SAT solver SAGE
我试图理解为什么解算器在这段代码中找不到解决方案Python SAT solver SAGE,python,sage,Python,Sage,我试图理解为什么解算器在这段代码中找不到解决方案 R.<x,y,z,w> = BooleanPolynomialRing() S = PolynomialSequence([x*y+z,x+y]) sol = S.solve(); sol [] R.=布尔多项式环() S=多项式序列([x*y+z,x+y]) sol=S.solve();溶胶 [] 对我来说,解是x=1;y=1和z=1,或者我错了?通过仔细阅读我们正在使用的solve方法的文档,可以找到这个返回值的解释(以及如何
R.<x,y,z,w> = BooleanPolynomialRing()
S = PolynomialSequence([x*y+z,x+y])
sol = S.solve(); sol
[]
R.=布尔多项式环()
S=多项式序列([x*y+z,x+y])
sol=S.solve();溶胶
[]
对我来说,解是x=1;y=1和z=1,或者我错了?通过仔细阅读我们正在使用的
solve
方法的文档,可以找到这个返回值的解释(以及如何获得更令人满意的返回值),但我同意你的说法,这个返回值令人费解
要访问该方法的文档,请键入S.solve?
;要访问源代码,请键入S.solve???
。这还将显示定义此方法的文件,然后您可以在系统上或在上联机读取此文件
作为参考,我使用Sage 6.3。删除不起作用的w
,通过编写Sequence
稍微简化,并且不给解决方案命名,您的示例变成:
sage: R.<x,y,z> = BooleanPolynomialRing()
sage: S = Sequence([x * y + z, x + y])
sage: S.solve()
[]
这是因为此solve
方法有一个可选参数remove_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: 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]
sage: S.solve(n=Infinity,eliminate_linear_variables=False)
[{z: 0, y: 0, x: 0}, {z: 1, y: 1, x: 1}]