代数图-0.0.4:代数图构造和转换库

版权(c) 安德烈·莫霍夫2016-2017
许可证MIT(请参阅文件LICENSE)
维护人员andrey.mokhov@gmail.com
稳定性实验的
安全哈斯克尔
语言哈斯克尔2010

代数。图表。等级

目录

说明

阿尔加是用于图的代数构造和操作的库在哈斯克尔。请参见这篇论文对于图书馆背后的动机、基础理论和实施细节。

此模块定义核心类型类图表,一些图形子类,以及基本多态图构造基元。不能完全多态地实现,并且需要使用中间数据类型不包括在内。例如,要计算图表需要使用具体数据类型的表达式,例如代数。图表。折叠.其他有用的图表实例定义于代数。图表,代数。图表。相邻地图代数。图表。关系.

请参见代数。图表。高级种类。等级对于更高类型的核心图类型类。

简介

核心类型类

图表哪里 来源 #

构造代数图的核心类型类,其特征是遵循最小公理集。在方程式中,我们使用+*尽可能方便的快捷方式覆盖连接分别是。

  • 覆盖是可交换和关联的:

    x+y==y+xx+(y+z)==(x+y)+z
  • 连接是关联的,并且具有空的作为身份:

    x*空==x空*x==xx*(y*z)==(x*y)*z
  • 连接分布在覆盖:

    x*(y+z)==x*y+x*z(x+y)*z==x*z+y*z
  • 连接可以分解为:

    x*y*z==x*y+x*z+y*z

从上述公理集可以证明以下有用的定理。

  • 覆盖空的作为恒等式,并且是幂等的:

    x+空==x空+x==xx+x==x
  • 吸收和饱和连接:

    x*y+x+y==x*yx*x*x==x*x

核心类型类图表对应于未标记的有向图。无方向性,反射式,可传递的预订单可以获得图形通过扩展最小公理集。

在指定图形算法的时间和内存复杂性时,n个表示图中的顶点数,将表示图中的边,以及将表示大小对应的图表表达式。

最小完整定义

空的,顶点,覆盖,连接

关联的类型

类型 顶点来源 #

图形顶点的类型。

方法

空的::克来源 #

构造空图。

顶点::顶点g->g来源 #

用一个顶点构造图形。

覆盖::g->g->g来源 #

叠加两个图形。

连接::g->g->g来源 #

连接两个图形。

实例

图表() 来源 # 

关联的类型

类型 顶点() ::* 来源 #

方法

空的:: ()来源 #

顶点::顶点() -> ()来源 #

覆盖:: () -> () -> ()来源 #

连接:: () -> () -> ()来源 #

图表 IntAdjacencyMap(内部相邻地图) 来源 # 
图表g=>图表(也许 吧g) 来源 # 
订单a=>图表(关系a) 来源 # 
订单a=>图表(预订单关系a) 来源 # 
订单a=>图表(传递关系a) 来源 # 
订单a=>图表(对称关系a) 来源 # 
订单a=>图表(反射关系a) 来源 # 
订单a=>图表(相邻地图a) 来源 # 
图表(折叠a) 来源 # 
图表(图表a) 来源 # 
图表克=>图表(a->g) 来源 # 

关联的类型

类型 顶点(a->g):* 来源 #

方法

空的::a->g来源 #

顶点::顶点(a->g)->a->g来源 #

覆盖::(a->g)->(a->g)->a->g来源 #

连接::(a->g)->(a->g)->a->g来源 #

(图表克,图表h) =>图表(g,h) 来源 # 

关联的类型

类型 顶点(克,小时):* 来源 #

方法

空的::(克,小时)来源 #

顶点::顶点(克,小时)->(克,h)来源 #

覆盖::(克,小时)->(克,h)->(g,h)来源 #

连接::(g,h)->(g,h)->(g,h)来源 #

(图表克,图表小时,图表i) =>图表(g,h,i) 来源 # 

关联的类型

类型 顶点(g,h,i):* 来源 #

方法

空的::(g,h,i)来源 #

顶点::顶点(g,h,i)->(g,h,i)来源 #

覆盖::(g,h,i)->(g,h,i)->(g,小时,i)来源 #

连接::(g,h,i)->(g,h,i)->(g,小时,i)来源 #

无向图

图表克=>无方向性来源 #

The class of无向图满足以下附加公理。

  • 连接是可交换的:

    x*y==y*x

自反图形

图表克=>反射式来源 #

The class of自反图满足以下附加公理。

  • 每个顶点都有一个自循环:

    顶点x==顶点x*顶点x

注意,通过反向应用公理,可以始终删除导致非自反图。此类型类可以因此也适用于非自反图的上下文。

实例

传递图

图表克=>可传递的来源 #

The class of传递图满足以下附加公理。

  • 这个关闭公理:具有相等传递闭包的图是相等的。

    y/=空==>x*y+x*z+y*z==x*y+y*z

通过反复应用这个公理,人们可以把任何图变成它的传递图闭包或传递性约简。

预订单

(反射式克,可传递的g) =>预订单来源 #

The class of预序图既有反射性又有传递性。

实例

预订单() 来源 # 
预订单克=>预订单(也许 吧g) 来源 # 
订单a=>预订单(预订单关系a) 来源 # 
预订单克=>预订单(a->g) 来源 # 
(预订单克,预订单h) =>预订单(克,小时) 来源 # 
(预订单克,预订单小时,预订单i) =>预订单(g、h、i) 来源 # 

基本图构造原语

边缘::图表克=>顶点g->顶点g->g来源 #

构建包含单个边的图形。复杂性:O(1)时间、内存和大小。

边缘x y==连接(顶点x)(顶点年)

顶点::图表克=>[顶点g] ->克来源 #

构造包含给定孤立顶点列表的图。复杂性:O(左)时间、内存和大小,其中L(左)是的长度给定列表。

顶点[]==空的顶点[x]==顶点x个

覆盖层::图表g=>【g】->g来源 #

覆盖给定的图形列表。复杂性:O(左)时间和记忆,以及O(S)型大小,其中L(左)是长度给定列表的S公司是列表中图形的大小之和。

覆盖[]==空的覆盖[x]==x覆盖[x,y]==覆盖x年

连接::图表g=>【g】->g来源 #

连接给定的图表列表。复杂性:O(左)时间和记忆,以及O(S)型大小,其中L(左)是长度给定列表的S公司是列表中图形的大小之和。

连接[]==空的连接[x]==x连接[x,y]==连接x年

边缘::图表克=>[(顶点克,顶点g) ]->克来源 #

从边列表构造图形。复杂性:O(左)时间、内存和大小,其中L(左)是的长度给定列表。

边[]==空的边[(x,y)]==边缘x年

图表::图表克=>[顶点g] ->[(顶点克,顶点g) ]->克来源 #

从给定的顶点列表构造图形V(V)和边缘E类.结果图包含顶点V(V)以及所有顶点边缘所指E类.复杂性:O(|V|+|E|)时间、内存和大小。

图形[][]==空的图形[x][]==顶点x个图形[][(x,y)]==边缘x年图表与es==覆盖(顶点vs)(边缘e)

图上的关系

是SubgraphOf:: (图表克,等式g) =>克->克->布尔 来源 #

这个是SubgraphOf函数接受两个图形并返回真的如果第一个图形是子图第二个。以下是当前的实现:

是x y的子图=覆盖x y==y

因此,复杂性取决于特定的图形实例。

是SubgraphOf空的x==正确是SubgraphOf(顶点x)空的==错误是x的子图(覆盖x y)==真是SubgraphOf(覆盖x年)(连接x y)==真是SubgraphOf(路径X轴)(电路xs)==正确

标准图族

路径::图表克=>[顶点g] ->克来源 #

这个路径在顶点列表上。复杂性:O(左)时间、内存和大小,其中L(左)是的长度给定列表。

路径[]==空的路径[x]==顶点x个路径[x,y]==边缘x年

电路::图表克=>[顶点g] ->克来源 #

这个电路在顶点列表上。复杂性:O(左)时间、内存和大小,其中L(左)是的长度给定列表。

电路[]==空的电路[x]==边缘x x x电路[x,y]==边缘[(x,y),(y,x)]

集团::图表克=>[顶点g] ->克来源 #

这个集团在顶点列表上。复杂性:O(左)时间、内存和大小,其中L(左)给定列表。

集团[]==空的集团[x]==顶点x个集团[x,y]==边缘x年集团[x,y,z]==边缘[(x,y),(x,z),(y,z)]

二氯二苯醚::图表克=>[顶点g] ->[顶点g] ->克来源 #

这个二液化在顶点列表上。复杂性:O(L1+L2)时间、内存和大小,其中第一层L2级给定列表的长度。

双液[][]==空的双液[x][]==顶点x个双液[][y]==顶点双液[x1,x2][y1,y2]==边缘[(x1,y1),(x1、y2),(x2、y1)、(x2,y2)]双液xs-ys==连接(顶点X轴)(顶点年)

明星::图表克=>顶点g->[顶点g] ->克来源 #

这个明星由中心顶点和叶子列表组成。复杂性:O(L)时间、内存和大小,其中L(左)是的长度给定列表。

星x[]==顶点x个星x[y]==边缘x年星x[y,z]==边缘[(x,y),(x,z)]

::图表克=>(顶点g) ->克来源 #

这个树状图根据给定的数据结构。复杂性:O(T)时间、内存和大小,其中T型是的大小给定树(即树中的顶点数)。

树(节点x[])==顶点x个树(节点x[节点y[节点z[]]])==路径[x,y,z]树(节点x[节点y[],节点z[]])==明星x(y,z)树(节点1[节点2[],节点3[节点4[],结点5[]])==边缘[(1,2), (1,3), (3,4), (3,5)]

森林::图表克=>森林(顶点g) ->克来源 #

这个森林图根据给定的森林数据结构。复杂性:O(F)型时间、内存和大小,其中F类是的大小给定森林(即森林中的顶点数)。

林[]==空的森林[x]==x个森林[节点1[节点2[],节点3[]],节点4[节点5[]]]==边缘[(1,2), (1,3), (4,5)]森林==覆盖层地图

图形数据类型之间的转换

ToGraph(ToGraph)t吨哪里 来源 #

这个ToGraph(ToGraph)type类捕获可以转换为的数据类型多态图表达式。转换方法toGraph(目标图表)语义上在图形数据结构上充当标识,但允许转换图形在不同的数据表示之间。

图表(g::图表a):图表a==克显示(至图表(1*2::图表利息):关系Int)==“边缘1 2”

最小完整定义

toGraph(目标图表)

关联的类型

类型 ToVertex(顶点)t吨来源 #

实例