代数图
藻类是Haskell中用于图的代数构造和操作的库。请参阅哈斯克尔研讨会论文和相应的谈话为了动机在图书馆的背后,有着底层的理论和实现细节。还有一个Haskell交换话题,和a辅导的作者:Alexandre Moine。
主要想法
考虑在顶级模块中定义的以下数据类型代数。图表库的:
数据图a=空|顶点a|覆盖(图a)
我们可以根据对为构造函数提供以下语义(V、E)图形的顶点和边缘:
清空
构造空图(∅, ∅).
顶点x
构造包含单个顶点的图,即。({x},∅).
覆盖x y
覆盖图(Vx,Ex)和(Vy,Ey)建造(VxáVy,ExáEy).
连接x y
连接图形(Vx,Ex)和(Vy,Ey)建造(VxкVy,ExкEyкVx×Vy).
或者,我们可以通过定义以下内容为上述图构造原语提供代数语义类型类并为其实例指定一组规则(参见模块代数。图表。等级):
类图g,其中类型顶点g空::g顶点::顶点g->g覆盖::g->g->g连接::g->g->g
类型类的定律与半环,所以我们使用+
和*
作为方便快捷方式覆盖
和连接
,分别为:
- (
+
,空的
)是幂等交换幺半群。
- (
*
,空的
)是一个幺半群。
*
分布在+
,即:x*(y+z)==x*y+x*z
和(x+y)*z==x*z+y*z
.
*
可以分解为:x*y*z==x*y+x*z+y*z
.
这个代数结构对应于无标记有向图:每个表达式表示一个图形,每个图形可以用表达式表示。可以通过修改上述法律。代数图为使用Haskell中的图提供了方便、安全和强大的界面,并允许应用等式推理来证明图形算法的正确性。
代表非空图,我们可以放弃清空
构造函数——参见模块代数。图表。非空.
代表边标记图,我们可以切换到以下数据类型,如在我的Haskell eXchange 2018谈话:
数据图e a=空|顶点a|连接e(图ea)
在这里电子
是边缘标签的类型。如果电子
是幺半群(<+>,零)
然后可以恢复图形覆盖作为连接零
、和<+>
对应于平行合成边缘标签的数量。
图书馆有多快?
Alga可以在几秒钟内处理由数百万个顶点和数十亿条边组成的图形,速度很快对于许多应用程序来说足够了。我们相信有很大的潜力可以提高库的性能,并且这是我们的首要任务之一。如果您在使用库时遇到性能问题,请告诉我们。
可以找到一些初步基准在这里.
博客帖子
图书馆的发展已记录在一系列博客帖子中:
其他语言的代数图
请参阅中的实现草案阿格达和斯卡拉.