Sympy能否简化含FiniteSet的Contains逻辑表达式?如何实现?
Sympy中FiniteSet包含表达式的逻辑简化问题
我在使用Sympy 1.12版本(已切换到主分支修复了阻止Contains被简化的近期bug)处理FiniteSet的包含逻辑表达式时,发现simplify_logic无法按照业务需求简化表达式,具体示例如下:
单符号场景
from sympy import Symbol, FiniteSet, simplify_logic, Contains a = Symbol("a") x = FiniteSet("1", "2") y = FiniteSet("2", "3") z = FiniteSet("3", "4")
- 交集无重叠:
>>> simplify_logic(Contains(a, x) & Contains(a, z)) 返回:Contains(a, {1, 2}) & Contains(a, {3, 4}) 预期:False - 交集有重叠:
>>> simplify_logic(Contains(a, x) & Contains(a, y)) 返回:Contains(a, {1, 2}) & Contains(a, {2, 3}) 预期:Contains(a, {2}) - 并集有重叠:
>>> simplify_logic(Contains(a, x) | Contains(a, y)) 返回:Contains(a, {1, 2}) | Contains(a, {2, 3}) 预期:Contains(a, {1, 2, 3}) - 并集无重叠:
>>> simplify_logic(Contains(a, x) | Contains(a, z)) 返回:Contains(a, {1, 2}) | Contains(a, {3, 4}) 预期:Contains(a, {1, 2, 3, 4})
多符号场景(新增符号b)
b = Symbol("b")
- 不同符号同集合的交集:
>>> simplify_logic(Contains(a, x) & Contains(b, x)) 返回/预期:Contains(a, {1, 2}) & Contains(b, {1, 2}) - 不同符号同集合的并集:
>>> simplify_logic(Contains(a, x) | Contains(b, x)) 返回/预期:Contains(a, {1, 2}) | Contains(b, {1, 2})
目前Sympy暂不支持这类针对FiniteSet的包含表达式简化,而上述场景已覆盖我的全部业务需求。我想知道:
- Sympy是否支持直接实现上述简化?
- 如果不支持,能否通过扩展
FiniteSet类来实现? - 上述简化逻辑是否存在未考虑的边缘情况?
内容的提问来源于stack exchange,提问作者Noxx
相关产品推荐
相关产品推荐

