跳到内容

雪豹/藻类

主人
交换分支/标签

名称已在使用中

具有提供的分支名称的标记已存在。许多Git命令同时接受标记和分支名称,因此创建此分支可能会导致意外行为。是否确实要创建此分支?
代码

最新提交

 

Git统计

文件夹

永磁
未能加载最新提交信息。
类型
姓名
最新提交消息
提交时间
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

代数图

黑客版本 生成状态

藻类是Haskell中用于代数构造和图形操作的库。看到了吗Haskell研讨会论文以及相应的谈话为了动机在图书馆的背后,隐藏着理论和实现的细节。还有一个哈斯克尔交流会,还有一个辅导的亚历山大梅因。

主旨

考虑下面的数据类型,它是在顶级模块中定义的代数。图图书馆:

数据 图形  = 空的|顶点 |覆盖(图形 ) (图形 ) |连接(图形 ) (图形 )

我们可以根据对给构造器以下语义(五、五)图形的顶点边缘:

  • 空的构造空图形(∅, ∅).
  • 顶点x构造一个包含单个顶点的图,即。({x},∅).
  • 覆盖x y覆盖图(Vx,Ex)(维伊,伊)建造(Vx)维伊,前女友安永).
  • 连接x y连接图(Vx,Ex)(维伊,伊)建造(Vx)维伊,前女友安永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中处理图形提供了一个方便、安全和强大的接口,并允许应用等式推理来证明图算法的正确性。

代表非空图,我们可以把空的构造函数——请参见模块代数.图.非空.

代表边标记图,我们可以切换到以下数据类型,如在我的哈斯凯尔交易所2018年讲座:

数据 图形 e  = 空的|顶点 |连接 e(图形 e ) (图形 e )

在这里e是边缘标签的类型。如果e是幺半群(<+>,零)然后可以恢复图形覆盖作为接零,和<+>对应于平行构图边缘标签。

图书馆有多快?

Alga可以在几秒钟内处理包含数百万个顶点和数十亿条边的图形,这是很快的足够多的应用。我们相信有很大的潜力可以提高图书馆的绩效,并且这是我们的首要任务之一。如果您在使用库时遇到性能问题,请告诉我们。

可以找到一些初步的基准在这里.

博客文章

图书馆的发展已经在一系列博客文章中得到了记录:

其他语言中的代数图

代数图是用其他一些语言实现的,包括阿格达,F#,斯卡拉打字稿.