代数图-0.7:代数图构造和转换库
版权(c) 安德烈·莫霍夫2016-2022
许可证MIT(请参阅文件LICENSE)
维护人员andrey.mokhov@gmail.com
稳定性实验的
安全哈斯克尔
语言哈斯克尔2010

代数。图表。高级种类。等级

描述

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

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

请参见代数。图表。等级对于核心类型为类不是更高种类的,并且允许更多实例。

简介

核心类型类

MonadPlus系列克=>图表哪里 来源 #

通过引入这个连接符合标准的方法MonadPlus系列类并重用以下内容现有方法:

这个图表类型类的特点是具有以下最小公理集。在方程式中,我们使用+*作为方便快捷方式覆盖连接分别是。

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

    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个表示图中的顶点数,将表示图中的边,以及将表示大小对应的图表表达式。

方法

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

连接两个图形。

实例

实例详细信息
图表 图表 来源 # 
实例详细信息

定义于代数。图表。高级种类。等级

空的::备选方案f=>f a#

的身份<|>

顶点::图表g=>a->g a来源 #

构造包含单个孤立顶点的图。的别名纯净的.

覆盖::图表g=>ga->ga->ga来源 #

叠加两个图形。的别名<|>.

无向图

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

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

  • 连接是可交换的:

    x*y==y*x

自反图

图表g=>反射式来源 #

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

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

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

或者,如果我们记得顶点是的别名纯净的:

纯x==纯x*纯x

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

传递图

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

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

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

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

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

预订单

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

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

基本图构造基元

边缘::图表g=>a->a->ga来源 #

构造包含单个边的图形。

边缘x y==连接(顶点x)(顶点年)顶点计数(边缘1 1)==1顶点计数(边缘1 2)==2

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

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

顶点[]==空的顶点[x]==顶点x个顶点==覆盖层.map(地图)顶点
hasVertex公司x。顶点==元素x个顶点计数.vertices(顶点)==长度.节点
顶点集.vertices==设置。来自列表

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

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

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

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

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

覆盖[]==空的覆盖[x]==x覆盖[x,y]==覆盖x年覆盖层==文件夹 覆盖 空的
栈空.覆盖层==全部的 栈空

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

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

连接[]==空的连接[x]==x连接[x,y]==连接x年连接==文件夹 连接 空的
栈空.连接==全部的 栈空

图上的关系

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

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

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

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

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

图形属性

hasEdge公司:: (等式(g a),图表克,订单a) =>a->a->g a->布尔 来源 #

检查图形是否包含给定边。复杂性:O(s)个时间。

hasEdge x y轴空的==错误hasEdge x y轴(顶点z) ==错误hasEdge x y轴(边缘x y)==真hasEdge x y轴==元素(x,y)。边缘列表

标准图族

路径::图表g=>[a]->g a来源 #

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

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

电路::图表g=>[a]->g a来源 #

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

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

集团::图表g=>[a]->g a来源 #

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

集团[]==空的集团[x]==顶点x个集团[x,y]==边缘x年集团[x,y,z]==边缘[(x,y),(x,z),(y,z)]集团(xs++ys)==连接(集团xs)(集团ys)

二液化::图表g=>[a]->[a]->g a来源 #

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

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

明星::图表g=>a->[a]->g a来源 #

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

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

星星::图表g=>[(a,[a])]->g a来源 #

这个星星通过覆盖列表形成明星s.的逆邻接列表.复杂性:O(L)时间、内存和大小,其中L(左)是的总大小输入。

星星[]==空的星星[(x,[])]==顶点x个星星[(x,[y])]==边缘x年星星[(x,ys)]==明星x年星星==覆盖层.地图(未修剪的 明星)星星。邻接列表==id覆盖(星星xs)(星星ys)==星星(xs++ys)

::图表克=>a->g a来源 #

这个树状图根据给定的数据结构。复杂性: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)]

森林::图表克=>森林a->g a来源 #

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

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

网格::图表g=>[a]->[b]->g(a,b)来源 #

构造一个网格图来自两个顶点列表。复杂性:O(L1*L2)时间、内存和大小,其中第一层L2级给定列表的长度。

网格xs[]==空的网格[]ys==空的网格[x][y]==顶点(x,y)网格xs-ys==(路径X轴)(路径年)网格[1..3]“ab”==边缘[(1,‘a’),(1,'b')),((1,'a'),(2,'a'))(2,‘a’),(3,‘a‘)),(2,’b’)

圆环体::图表g=>[a]->[b]->g(a,b)来源 #

构造一个圆环图来自两个顶点列表。复杂性:O(L1*L2)时间、内存和大小,其中L1级L2级给定列表的长度。

环面xs[]==空的环面[]ys==空的圆环[x][y]==边缘(x,y)(x,y)圆环体xs-ys==(电路X轴)(电路年)圆环[1,2]“ab”==边缘[(1,‘a’),(1,'b')),((1,'a'),(2,'a'))(2,‘a’),(1,‘a')),(2,'a’)

德布鲁因::图表克=>国际->[a]->克[a]来源 #

构造一个De Bruijn图使用符号表示给定的非负维根据给定的字母表。复杂性:O(A^(D+1))时间、内存和大小,其中A类是的大小字母表和D类是图形的维度。

德布鲁因0 xs==边缘[] []n>0==>deBruijn n[]==空的德布鲁因1[0,1]==边缘[ ([0],[0]), ([0],[1]), ([1],[0]), ([1],[1]) ]deBruijn 2“0”==边缘"00" "00"deBruijn 2“01”==边缘[ ("00","00"), ("00","01"), ("01","10"), ("01","11"), ("10","00"), ("10","01"), ("11","10"), ("11","11") ]转置(deBruijn n xs)==功能性维修计划 颠倒$deBruijn n xs(美元)顶点计数(deBruijn n xs)==(长度$节点xs)^nn>0==>边缘计数(deBruijn n xs)==(长度$节点xs)^(n+1)

图形转换

移除顶点:: (等式a、,图表g) =>a->ga->ga来源 #

从给定图形中删除顶点。复杂性:O(s)个时间、内存和大小。

移除顶点x(顶点x)==空的删除顶点1(顶点2)       ==顶点2移除顶点x(边缘x x)==空的删除顶点1(边缘1 2)       ==顶点2删除顶点x。移除顶点x==移除顶点x

替换顶点:: (等式a、,图表g) =>a->a->ga->ga来源 #

功能替换顶点x年替换顶点x个带顶点在一个鉴于图表.如果已经存在,x个将合并。复杂性:O(s)个时间、内存和大小。

替换顶点x x==id替换顶点x y(顶点x)==顶点替换顶点x y==合并顶点(==x)y

合并顶点::图表g=>(a->布尔)->a->ga->ga来源 #

将满足给定谓词的顶点合并为给定顶点。复杂性:O(s)个时间、内存和大小,假设谓词恒定时间。

合并顶点(常数假)x==id合并顶点(==x)y==替换顶点x年合并顶点即使1 (0 * 2)     == 1 * 1合并顶点古怪的1 (3 + 4 * 5) == 4 * 1

splitVertex(分割顶点):: (等式a、,图表g) =>a->[a]->ga->ga来源 #

将顶点拆分为具有相同连接性的顶点列表。复杂性:O(s+k*L)时间、内存和大小,其中k个是的数字表达式中顶点的出现次数和L(左)是的长度给定列表。

splitVertex x[]==移除顶点x个拆分顶点x[x]==id拆分顶点x[y]==替换顶点x年拆分顶点1[0,1]$1*(2+3)==(0+1)*(2/3)

诱导::图表g=>(a->布尔)->ga->ga来源 #

构造诱导子图通过移除不满足给定谓词的顶点。复杂性:O(s)个时间、内存和大小,假设谓词恒定时间。

诱导(常数真)x==x诱导(常数假)x==空的诱导(/=x)==移除顶点x个诱导p。诱导q==诱导(\x->px&&qx)是SubgraphOf(诱导px)x==真