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)