如何解决用Sympy计算有限集的笛卡尔积
似乎下面的sympy代码的最后一行应返回“ True”
a = ProductSet(FiniteSet(1),FiniteSet(2))
b = FiniteSet((1,2))
simplify(Eq(a,b))
但它返回此可怕的错误:
Traceback (most recent call last):
File "<string>",line 1,in <module>
File "/base/data/home/apps/s~sympy-live-hrd/sympy/sympy/simplify/simplify.py",line 557,in simplify
return _eval_simplify(**kwargs)
File "/base/data/home/apps/s~sympy-live-hrd/sympy/sympy/core/relational.py",line 627,in _eval_simplify
e = super(Equality,self)._eval_simplify(**kwargs)
File "/base/data/home/apps/s~sympy-live-hrd/sympy/sympy/core/relational.py",line 290,in _eval_simplify
r = r.func(*[i.simplify(**kwargs) for i in r.args])
AttributeError: 'ProductSet' object has no attribute 'simplify'
有什么方法可以使sympy实际计算有限集的笛卡尔积吗?
解决方法
我不确定您使用的是什么版本的sympy,但是当前的master提供了:
In [1]: a = ProductSet(FiniteSet(1),FiniteSet(2))
...: b = FiniteSet((1,2))
...: simplify(Eq(a,b))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-3a3ef38457b0> in <module>
1 a = ProductSet(FiniteSet(1),FiniteSet(2))
2 b = FiniteSet((1,2))
----> 3 simplify(Eq(a,b))
~/current/sympy/sympy/sympy/simplify/simplify.py in simplify(expr,ratio,measure,rational,inverse,doit,**kwargs)
559 _eval_simplify = getattr(expr,'_eval_simplify',None)
560 if _eval_simplify is not None:
--> 561 return _eval_simplify(**kwargs)
562
563 original_expr = expr = collect_abs(signsimp(expr))
~/current/sympy/sympy/sympy/core/relational.py in _eval_simplify(self,**kwargs)
555 from sympy.solvers.solveset import linear_coeffs
556 # standard simplify
--> 557 e = super()._eval_simplify(**kwargs)
558 if not isinstance(e,Equality):
559 return e
~/current/sympy/sympy/sympy/core/relational.py in _eval_simplify(self,**kwargs)
308 if dif.is_comparable:
309 v = dif.n(2)
--> 310 elif dif.equals(0): # XXX this is expensive
311 v = S.Zero
312 if v is not None:
AttributeError: 'Complement' object has no attribute 'equals'
这是Relational._eval_simplify
中的错误,因为它显然假设lhs
和rhs
均为Expr
,这对LessThan
等适用,但对{ {1}}。
为集实现Equality
并不难,因为Eq
应该等效于Eq(A,B)
。不过,目前只有其中一个给出明确的答案:
A.is_subset(B) and B.is_subset(A)
可以添加处理程序以评估In [6]: a
Out[6]: {1} × {2}
In [7]: b
Out[7]: {(1,2)}
In [8]: print(a.is_subset(b))
None
In [9]: print(b.is_subset(a))
True
,其中a.is_subset(b)
是a
,而ProductSet
是b
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。