python类方程

python-category-equations的Python项目详细描述


#python类别方程

类别是通过汇来表示和生成有向网络的方法, 源和从源到汇的连接使用这里提供的工具,您可以 为给定的连接器运算符创建和简化类范畴方程。 在方程组中,“+”和“-”运算是基本的集合运算 调用union和discard,乘法运算符'*'将源连接到汇。 方程组也有一个恒等式i项和类零终止项o。 有关更多详细信息,请转到https://en.wikipedia.org/wiki/Category_(mathematics定义

用法

这里我们的连接器操作是名为“debug”的打印函数 打印两个对象之间的箭头:

>>> debug('a', 'b')
a -> b
>>> debug('b', 'a')
b -> a
>>> debug('a', 'a')
a -> a

获取I和O单例和类C,它们使用以前定义的调试函数。

>>> I, O, C = from_operator(debug)
>>> I == I
True
>>> O == I
False
>>> C(1)
C(1)

这些物品有不同的水槽和来源:

>>> I.sinks
{I}
>>> I.sources
{I}
>>> O.sinks
set()
>>> O.sources
set()
>>> C(1).sinks
{1}
>>> C(1).sources
{1}

你也可以用这个符号写加法

>>> C(1,2) == C(1) + C(2)
True

乘法将源连接到汇,如下所示:

>>> (C(1,2) * C(3,4)).evaluate()
1 -> 3
1 -> 4
2 -> 3
2 -> 4
>>> (C(3,4) * C(1,2)).sinks
{3, 4}
>>> (C(3,4) * C(1,2)).sources
{1, 2}

>>> C(1) * C(2, I) == C(1) + C(1) * C(2)
True
>>> (C(1) * C(2, I)).evaluate()
1 -> 2
>>> (C(1) * C(2, I)).sinks
{1}
>>> (C(1) * C(2, I)).sources
{1, 2}

而写c(1,2)而不是c(1)+c(2)也可以与乘法一起工作:

>>> C(1,2) * C(3,4) == (C(1) + C(2)) * (C(3) + C(4))
True

C(…)中的顺序无关紧要:

>>> (C(1,2) * C(3,4)) == (C(2,1) * C(4,3))
True

另一方面,您不能交换如下条款:

>>> (C(1,2) * C(3,4)) == (C(3,4) * C(1,2))
False

因为:

>>> (C(3,4) * C(1,2)).evaluate()
3 -> 1
3 -> 2
4 -> 1
4 -> 2

丢弃操作的工作方式如下:

>>> (C(3,4) * C(1,2) - C(4) * C(1)).evaluate()
3 -> 1
3 -> 2
4 -> 2

但是

>>> (C(3,4) * C(1,2) - C(4) * C(1)) == C(3) * C(1,2) + C(4) * C(2)
False

因为汇和源不同:

>>> (C(3,4) * C(1,2) - C(4) * C(1)).sinks
{3}
>>> (C(3) * C(1,2) + C(4) * C(2)).sinks
{3, 4}

正确的形式应该是:

>>> (C(3,4) * C(1,2) - C(4) * C(1)) == C(3) * C(1,2) + C(4) * C(2) - C(4) * O - O * C(1)
True

身份i和零o像往常一样一起工作:

>>> I * I == I
True
>>> O * I * O == O
True

恒等式“I”是简化方程的工具。 例如:

>>> C(1,2) * C(3,4) * C(5) + C(1,2) * C(5) == C(1,2) * ( C(3,4) + I ) * C(5)
True

因为:

>>> (C(1,2) * C(3,4) * C(5) + C(1,2) * C(5)).evaluate()
1 -> 3
1 -> 4
1 -> 5
2 -> 3
2 -> 4
2 -> 5
3 -> 5
4 -> 5

以及

>>> (C(1,2) * ( C(3,4) + I ) * C(5)).evaluate()
1 -> 3
1 -> 4
1 -> 5
2 -> 3
2 -> 4
2 -> 5
3 -> 5
4 -> 5

如果两个项有相同的中间部分,你可以简化方程 通过使用O终止松散的汇或源: 例如:

>>> (C(1) * C(2) * C(4) + C(3) * C(4)).evaluate()
1 -> 2
2 -> 4
3 -> 4
>>> (C(1) * C(2) * C(4) + O * C(3) * C(4)).evaluate()
1 -> 2
2 -> 4
3 -> 4
>>> (C(1) * ( C(2) + O * C(3) ) * C(4)).evaluate()
1 -> 2
2 -> 4
3 -> 4
>>> C(1) * C(2) * C(4) + O * C(3) * C(4) == C(1) * ( C(2) + O * C(3) ) * C(4)
True

请注意,如果没有o项,比较就不起作用,因为汇不同:

>>> C(1) * C(2) * C(4) +  C(3) * C(4) == C(1) * ( C(2) + O * C(3) ) * C(4)
False

##方程求解和最小化

该模块还包含(相当不充分的)简化方法,可用于表达式最小化:

>>> I, O, C = from_operator(debug)
>>> m = EquationMap(I, O, C)
>>> a = C(1) + C(2)
>>> simplify(a, 300, m)
(C(1, 2), [C(1) + C(2), C(1, 2)])
>>> b = C(1) * C(3) + C(2) * C(3)
>>> simplified, path = simplify(b, 100, m)
>>> simplified
C(1, 2) * C(3)
>>> for p in path:
...    print(p)
C(1) * C(3) + C(2) * C(3)
(C(1) * I + C(2) * I) * C(3)
(C(1) + C(2) * I) * C(3)
(C(1) + C(2)) * C(3)
C(1, 2) * C(3)

如需证明,请使用“获取”路径:

>>> I, O, C = from_operator(debug)
>>> m = EquationMap(I, O, C)
>>> a = C(1) * C(3) + C(2) * C(3)
>>> b = C(1, 2) * C(3)
>>> shortest, path = get_route(a,b, 100, m)
>>> for p in path:
...    print(p)
C(1) * C(3) + C(2) * C(3)
C(1) * C(3) + C(2) * I * C(3)
(C(1) * I + C(2) * I) * C(3)
(C(1) + C(2) * I) * C(3)
(C(1) + C(2)) * C(3)
C(1, 2) * C(3)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用jaxb整理集合?   java改装添加带有令牌和id的标头   Java Webstart在启动应用程序之前停止   mysql将请求主体作为JSON存储到Java数据库中   春天3。从Java 7更新到Java 8后x应用程序不工作   java如何为我的mock实例化unirest HttpResponse<JsonNode>?   java两个servlet在同一场战争中与两场独立战争中的利弊?   java Mockito验证未失败   GWT中的java文件读取器   java避免代码重复   java谁将设置saml cookie,其中包含凭证信息   java如何修改jar包代码,然后重新导出更新的jar包?   BST数据结构中的java递归差异   java如何从文本文件中读取存储的哈希表?   带有quercus的java php comet   java从SeleniumWebDriver写入json变量   javascript如何在同一个action类中对方法调用action?