这个Sympy 1.0代码是否应该打印True而不是None?

时间:2016-05-26 04:29:58

标签: sympy

变量xx通过假设变为正数。 因此,exp(xx)> 1和exp(xx)-1必须为正数。 此页面上似乎有类似的示例返回派生结果: http://docs.sympy.org/latest/modules/assumptions/

我理解Sympy 1.0中的关系还不行。 我是否在这里间接遇到了这个问题?

# Should this Sympy 1.0 code print True (or why not?)
# This code prints `None'
from sympy import *
from sympy.assumptions.assume import global_assumptions
xx=symbols('xx')
xxPos= Q.positive(xx)
with assuming(xxPos):
    print(ask(Q.positive(exp(xx)-1)))
## None

1 个答案:

答案 0 :(得分:1)

问题很简单:范围的假设未实施。唯一允许的实数子范围是正,负,非正和非负区间。

您的表达式 exp(xx)-1 是一个 Add 对象,其中包含 exp 对象和 -1 作为加数。要有一个想法,请查看处理添加的正面假设的代码:

https://github.com/sympy/sympy/blob/sympy-1.0/sympy/assumptions/handlers/order.py#L267

从代码中可以清楚地看出积极性添加的评估:

  • 它确保表达式首先是实数(即不是复数)。
  • 如果添加中的任何术语为否定,则返回
  • 否则它会计算添加中非负项的数量:如果它们小于术语数(即有一些正项),则返回 True ,否则无< / em>的

在你的表达式中有一个负数,因此for循环将被中断,将返回默认值 None

注意

这种描述可能看起来缺少所有术语都是否定的情况。在这种情况下,指向函数返回 None ,稍后由SAT求解器处理并确定为 False