Python3中的计算范畴理论:么半群、群和前序

2020-05-03 21:10:51

从一个角度来看,范畴只是另一种代数结构,就像群、么半群和环一样。它们是这些抽象的东西,它们有一些抽象的方程公理和运算。它们是我们宏伟品类之旅的下一站。

么半群是与单位有结合运算的东西。加法和0使数字成为么半群。乘法和1是数字的单独么半群。串联和空列表使列表成为么半群。并集和空集使集成为么半群。我们可以用Python对其进行编码,如下所示:

这与类别有什么关系?如果某件事是一个范畴,那么它遵循定义它是一个范畴意味着什么的公理。它有态射和客体。如果对象上的头部与尾部相遇,则构成态射。单位态射总是存在的。

具有1个对象的范畴中的态射自动服从么半群公理。在这种情况下,范畴公理暗示了么半群公理。万物之所以构成,是因为只有一个物体。这是一种退化的情况,我们没有使用复合运算符的偏好性。因为单位态射是一个单位,所以自动有一个合成单位。组合已要求是关联的。砰。这个东西是一个么半群。

继续前面文章中的表示,我们为每个类别创建一个python类。此类的实例是此类别中的态射。如果您询问任何态射的域或余域,您总是会得到(),因为它是一个单一的对象类别。将这些类与上面的类进行比较。

如果有自然逆运算,某些么半群也是群。整数是加法下的一个群,其中负数给你倒数。不过,有些人不是。自然数(0,1,2…)。不是一个被加入的团体。

类似地,群可以被认为是一个只有一个对象的范畴,附加的要求是每个态射都是可逆的,并且总是存在这样的范畴。

Sympy在其中有组。我们可以对该功能进行包装,使其看起来像一个分类界面。为了与我们使用Python类表示类别的模式相匹配,可以方便地做一些稍微不常见的事情,即使类定义生成器函数fp_group_cat。每次调用此函数时,它都会创建不同的类和不同的类别。我在这里只包装了有限呈现的群功能,但也有自由的群、排列……。

我们可以在不同的方向上简化一个类别的力量。我们将不再只有一个物体,而是有很少的箭头。

具有多个对象但它们之间至多有一个态射的范畴服从前序公理。在分类术语中,这有时被称为细类别任何实际订单(如数字上的LIKE)也是预订单,但预订单的要求稍弱一些。下面是整数排序的分类表示(尽管实际上相同的实现也适用于实现<;=和==的任何python类型)。

偏序的一个例子是子集关系,我们可以使用python集来表示它。这是一个重要但可能令人困惑的例子。我们不是已经定义了FinSet吗?是的,但是这些是不同的类别。在FinSet中,态射是函数。在SubSetCat中,态射是子集关系(其中可以有一个,也可以没有一个)。它们显然不是一回事,尽管两者都有套装。情况变得更加扑朔迷离..。

预序与有向无环图(DAG)相关,有向无环图是指没有环的有向图。如果您给我一个DAG,有一个由该DAG生成的预订单。给读者的练习(又名我很懒):你能把Networkx DAG变成一个类别吗?

这很好,只是用一些可能更熟悉的概念来解释类别。我觉得有点乏味。我们并没有从这篇文章的分类概念中获得任何真正的好处。然而,当提出一个新的范畴概念时,您总是应该考虑幺半群、群和预序的例子,因为在这种情况下,它可能会简化为更熟悉的东西。此外,到这些简单对象的映射/从这些简单对象到更多对象的映射.。

计算群论的方法很耐人寻味。它们中的一些似乎应该延伸到范畴论。参见RFC Walters的这本书,例如https://www.cambridge.org/core/books/categories-and-computer-science/203EBBEE29BEADB035C9DD80191E67B1,这是一本在其他方面也非常有趣的书。(感谢埃文·帕特森的提示)。

下次我想我们会讨论有限范畴和有限Yoneda引理。