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

代数。图表。贴标签于

描述

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

本模块提供了代数的最小实验实现带有边标签的图。该API将在下一版本中进行扩展。

简介

边标记图的代数数据类型

数据 图表电子商务来源 #

边标记图,其中类型变量e(电子)代表边缘标签。例如,图表 布尔 与中定义的未标记图同构顶级模块代数。图表。图表,其中False(错误)真的表示无标记边的缺失和存在。

建造师

清空 
顶点 
连接e(电子)(图表e a)(图表e a) 

实例

实例详细信息
双函子 图表 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

双地图::(a->b)->(c->d)->图表a c->图表b天#

第一::(a->b)->图表a c->图表b c类#

第二::(b->c)->图表a b->图表一个c#

Functor函数(图表e) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

功能性维修计划::(a->b)->图表e a->图表电子商务#

(<$)::a->图表e b->图表电子商务#

(等式e、,单体e、,订单a) =>等式(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

(==)::图表e a->图表e a->布尔 #

(/=)::图表e a->图表e a->布尔 #

(订单a、,号码a、,二元体e) =>号码(图表e a) 来源 #

注:这不满足通常的环定律;看见图表了解更多详细信息。

实例详细信息

定义于代数。图表。贴标签于

方法

(+)::图表e a->图表e a->图表电子商务#

(-)::图表e a->图表e a->图表电子商务#

(*)::图表e a->图表e a->图表电子商务#

否定::图表e a->图表电子商务#

防抱死制动系统::图表e a->图表电子商务#

符号::图表e a->图表电子商务#

from整数::整数->图表电子商务#

(等式e、,单体e、,订单a、,订单e) =>订单(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

比较::图表e a->图表e a->订购 #

(<)::图表e a->图表e a->布尔 #

(<=)::图表e a->图表e a->布尔 #

(>)::图表e a->图表e a->布尔 #

(>=)::图表e a->图表e a->布尔 #

最大值::图表e a->图表e a->图表电子商务#

最小值::图表e a->图表e a->图表电子商务#

(显示a、,显示e) =>显示(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

IsString(IsString)a=>IsString(IsString)(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

来自字符串::字符串->图表电子商务#

通用(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

关联的类型

类型 代表(图表e a):类型->类型 #

方法

::图表e a->代表(图表e a)x#

::代表(图表e a)x->图表e a公司#

单体e=>半群(图表e a) 来源 #

通过定义覆盖.

实例详细信息

定义于代数。图表。贴标签于

方法

(<>)::图表e a->图表e a->图表电子商务#

烤饼::非空(图表e a)->图表电子商务#

斯提姆::完整的b=>b->图表e a->图表电子商务#

单体e=>单体(图表e a) 来源 #

通过定义覆盖空的.

实例详细信息

定义于代数。图表。贴标签于

方法

记忆::图表电子商务#

地图挂起::图表e a->图表e a->图表电子商务#

麦康卡特:: [图表e a]->图表电子商务#

(NFData公司e、,NFData公司a) =>NFData公司(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

方法

径向基函数::图表e a->()#

(方程式e、,单体e、,订单a) =>ToGraph(ToGraph)(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

关联的类型

类型 ToVertex(顶点)(图表e a)来源 #

方法

toGraph(目标图表)::图表e a->图0(ToVertex(顶点)(图表e a))来源 #

折叠::r->(ToVertex(顶点)(图表e a)->r)->(r->r->r)->(r->r->r)->图表e a->r来源 #

栈空::图表e a->布尔 来源 #

hasVertex公司::ToVertex(顶点)(图表e a)->图表e a->布尔 来源 #

hasEdge公司::ToVertex(顶点)(图表e a)->ToVertex(顶点)(图表e a)->图表e a->布尔 来源 #

顶点计数::图表e a->国际 来源 #

边缘计数::图表e a->国际 来源 #

顶点列表::图表e a->[ToVertex(顶点)(图表e a)]来源 #

边缘列表::图表e a->[(ToVertex(顶点)(图表e a),ToVertex(顶点)(图表e a))]来源 #

顶点集::图表e a->设置(ToVertex(顶点)(图表e a))来源 #

顶点IntSet::图表e a->IntSet(IntSet) 来源 #

边缘设置::图表e a->设置(ToVertex(顶点)(图表e a),ToVertex(顶点)(图表e a))来源 #

预设::ToVertex(顶点)(图表e a)->图表e a->设置(ToVertex(顶点)(图表e a))来源 #

预IntSet::国际->图表e a->IntSet(IntSet) 来源 #

postSet(postSet)::ToVertex(顶点)(图表e a)->图表e a->设置(ToVertex(顶点)(图表e a))来源 #

后IntSet::国际->图表e a->IntSet(IntSet) 来源 #

邻接列表::图表e a->[(ToVertex(顶点)(图表e a)[ToVertex(顶点)(图表e a)])]来源 #

dfs森林::图表e a->森林(ToVertex(顶点)(图表e a))来源 #

dfs预测自::图表e a->[ToVertex(顶点)(图表e a)]->森林(ToVertex(顶点)(图表e a))来源 #

数据流服务::图表e a->[ToVertex(顶点)(图表e a)]->[ToVertex(顶点)(图表e a)]来源 #

可达成的::图表e a->ToVertex(顶点)(图表e a)->[ToVertex(顶点)(图表e a)]来源 #

top排序::图表e a->要么(循环(ToVertex(顶点)(图表e a))[ToVertex(顶点)(图表e a)]来源 #

是非循环的::图表e a->布尔 来源 #

到相邻地图::图表e a->相邻地图(ToVertex(顶点)(图表e a))来源 #

到相邻地图转换::图表e a->相邻地图(ToVertex(顶点)(图表e a))来源 #

到相邻IntMap::图表e a->相邻IntMap 来源 #

到相邻IntMapTranspose::图表e a->相邻IntMap 来源 #

是DfsForestOf::森林(ToVertex(顶点)(图表e a))->图表e a->布尔 来源 #

排名靠前:: [ToVertex(顶点)(图表e a)]->图表e a->布尔 来源 #

二元体e=>图表(图表e a) 来源 # 
实例详细信息

定义于代数。图表。等级

关联的类型

类型 顶点(图表e a)来源 #

方法

空的::图表电子商务来源 #

顶点::顶点(图表e a)->图表电子商务来源 #

覆盖::图表e a->图表e a->图表电子商务来源 #

连接::图表e a->图表e a->图表电子商务来源 #

类型 代表(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

类型 ToVertex(顶点)(图表e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

类型 顶点(图表e a) 来源 # 
实例详细信息

定义于代数。图表。等级

类型 顶点(图表e a)=a

空的::图表电子商务来源 #

构造空图形.构造函数的别名清空.

栈空空==真hasVertex公司x空==假顶点计数空==0边缘计数空==0

顶点::a->图表电子商务来源 #

构建包含以下内容的图形单个孤立顶点。的别名建造师顶点.

栈空(顶点x)==假hasVertex公司x(顶点y)==(x==y)顶点计数(顶点x)==1边缘计数(顶点x)==0

边缘::e->a->a->图表电子商务来源 #

构建包含以下内容的图形单个标签边.

边缘e x y==连接e(电子)(顶点x)(顶点年)边缘x年==顶点[x,y]hasEdge公司x y(边缘e x y)==(e/=)边缘标签x y(边缘e x y)==e边缘计数(边缘e x y)==如果e==然后0其他1顶点计数(边缘e 1 1)==1顶点计数(边缘e 12)==2

(-<)::a->e->(a,e)中缀5 来源 #

方便的ternary-ish运算符的左侧部分x-<e>-y对于创建带标签的边。

x-<e>-y==边缘e x y(e x y)

(>-)::(a,e)->a->图表电子商务中缀5 来源 #

方便的ternary-ish运算符的右侧部分x-<e>-y对于创建标记的边。

x-<e>-y==边缘e x y(e x y)

覆盖::单体e=>图表e a->图表e a->图表电子商务来源 #

覆盖两张图。的别名连接 .复杂性:O(1)时间和记忆,O(s1+s2)大小。

栈空(覆盖x y)==栈空x个&&栈空hasVertex公司z(覆盖x y)==hasVertex公司z x轴||hasVertex公司z y(z y)顶点计数(覆盖x y)>=顶点计数x个顶点计数(覆盖x y)<=顶点计数x个+顶点计数边缘计数(覆盖x y)>=边缘计数x个边缘计数(覆盖x y)<=边缘计数x个+边缘计数顶点计数(叠加12)==2边缘计数(覆盖12)==0

注:覆盖使用操作符平行合成边<+>具有充当身份:

边缘标签x y$覆盖(边缘e x y)(边缘 x y)==e边缘标签x y$覆盖(边缘e x y)(边缘f x y)==e<+>(f)

此外当应用于传递图时,覆盖在中合成边使用运算符排序<.>具有充当身份:

边缘标签x z轴$传递闭包(覆盖(边缘e x y)(边缘 y z)==e边缘标签x z轴$过渡闭合(覆盖(边缘e x y)(边缘f y z))==e<.>(f)

连接::e->图表e a->图表e a->图表电子商务来源 #

连接两个由给定标签标记边的图。的别名连接.复杂性:O(1)时间和记忆,O(s1+s2)大小。请注意结果图中边的数量与参数的顶点:m=O(m1+m2+n1*n2).

栈空(连接e x y)==栈空x个&&栈空hasVertex公司z(连接e x y)==hasVertex公司z x轴||hasVertex公司z y(z y)顶点计数(连接e x y)>=顶点计数x个顶点计数(连接e x y)<=顶点计数x+顶点计数边缘计数(连接e x y)<=顶点计数x个*顶点计数年+边缘计数x个+边缘计数顶点计数(连接e 1 2)==2边缘计数(连接e 1 2)==如果e==然后0其他1

顶点::单体e=>【a】->图表电子商务来源 #

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

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

边缘::单体e=>[(e,a,a)]->图表电子商务来源 #

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

边[]==空的边[(e,x,y)]==边缘e x y(e x y)边缘==覆盖层.地图(\(e,x,y)->边缘e x y)

覆盖层::单体e=>[图表e a]->图表电子商务来源 #

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

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

图形折叠

折叠::b->(a->b)->(e->b->b->b)->图表e a->b来源 #

概括图表折叠:递归折叠图表通过应用为表达式的叶和内部节点提供的函数。参数的顺序是:空、顶点和连接。复杂性:O(s)个给定函数的应用。例如复杂性大小O(s)个,自常数+成本不变。

折叠空的     顶点        连接==身份证件折叠空的     顶点(功能性维修计划 轻弹 连接) ==转置折叠1(常数1)     (常数(+))         ==大小foldg正确(常数错误)(常数(&&))        ==栈空折叠错误(==x)(常数(||))        ==hasVertex公司x个foldg集合。空的设置。单子(常数设置。联盟)   ==顶点集

建筑物:: (对于所有人r.r->(a->r)->(e->r->r->r)->r)图表电子商务来源 #

构建一个图,给出三种图结构的解释基本体空的,顶点连接,按此顺序。请参见以下示例进一步澄清。

建筑物f==f空的 顶点 连接建筑(\e _ _->e)==空的建筑物(v _->v x)==顶点x个建筑(\e v c->c l(折叠e v c x)(折叠e v c y))==连接长x长建筑(\e v c->文件夹(c))电子(地图v x))==顶点X轴建筑(\e v c->折叠电子伏(轻弹.c)克)==转置折叠e v c(建筑f)==f e v c

图上的关系

是SubgraphOf:: (等式e、,单体e、,订单a) =>图表e a->图表e a->布尔 来源 #

这个是的子图函数接受两个图形并返回真的如果第一个图形是子图第二个。复杂性:O(s+m*log(m))时间。请注意,边的数量图形可以是表达式大小的二次曲线.

是SubgraphOf空的x==正确是SubgraphOf(顶点x)空的==错误是x的子图(覆盖x y)==真是SubgraphOf(覆盖x年)(连接x y)==真是x y的子图==>x<=y

图形属性

栈空::图表e a->布尔 来源 #

检查图形是否为空。复杂性:O(s)个时间。

栈空空的==正确是空的(覆盖 空的 空的)==正确isEmpty(为空)(顶点x) ==错误是空的(移除顶点x个$顶点x) ==正确是空的(删除边缘x年$边缘e x y)==错误

大小::图表e a->国际 来源 #

这个大小图的叶数,即表达式的叶数包括空的树叶。复杂性:O(s)个时间。

大小空的== 1尺寸(顶点x) ==1尺寸(覆盖x y)==尺寸x+尺寸y尺寸(连接x y)==尺寸x+尺寸y尺寸x>=1尺寸x>=顶点计数x个

hasVertex公司::等式a=>a->图表e a->布尔 来源 #

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

hasVertex x(具有顶点x)空的==错误hasVertex x(具有顶点x)(顶点y) ==(x==y)hasVertex x。移除顶点x个==常数False(错误)

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

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

hasEdge x y轴空的==错误hasEdge x y轴(顶点z) ==错误hasEdge x y轴(边缘e x y)==(e/=)hasEdge x y。删除边缘x年==常数False(错误)hasEdge x y轴==.无效的.滤波器(\(_,ex,ey)->ex==x&&ey==y)。边缘列表

边缘标签:: (等式a、,单体e) =>a->a->图表e a->e来源 #

从图形中提取指定边的标签。

顶点列表::订单a=>图表e a->[a]来源 #

给定图的顶点排序列表。复杂性:O(s*log(n))时间和O(n)内存。

顶点列表空的== []顶点列表(顶点x) ==[x]顶点列表。顶点==节点.分类

边缘列表:: (等式e、,单体e、,订单a) =>图表e a->[(e,a,a)]来源 #

图的边列表,根据成对连接的顶点(即边标签在排序时被忽略)。复杂性:O(n+m)时间和O(米)内存。

边缘列表空的== []边缘列表(顶点x) ==[]边缘列表(边缘e x y)==如果e==然后是[]其他[(e,x,y)]

顶点集::订单a=>图表e a->设置来源 #

给定图的顶点集。复杂性:O(s*log(n))时间和O(n)内存。

顶点集空的==设置。空的顶点集。顶点==设置。单子顶点集。顶点==设置。来自列表

边缘设置:: (等式e、,单体e、,订单a) =>图表e a->设置(e、a、a)来源 #

给定图的边集。复杂性:O(n+m)时间和O(米)内存。

边缘设置空的==设置。空的边缘设置(顶点x) ==设置。空的边缘设置(边缘e x y)==如果e==然后选择Set。空的else设置。单子(e,x,y)

图形转换

移除顶点::等式a=>a->图表e a->图表电子商务来源 #

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

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

删除边缘:: (等式a、,等式e、,单体e) =>a->a->图表e a->图表电子商务来源 #

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

删除边缘x y(边缘e x y)==顶点[x,y]移除边缘x y。removeEdge x y==删除边缘x y移除边缘x y。移除顶点x个==移除顶点x个removeEdge 1 1(1*1*2*2)==1*2*2removeEdge 1 2(1*1*2*2)==1*1+2*2

替换顶点::等式a=>a->a->图表e a->图表电子商务来源 #

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

替换顶点x x==id替换顶点x y(顶点x)==顶点替换顶点x y==功能性维修计划(\v->如果v==x,则y为v)

replaceEdge(替换边缘):: (等式e、,单体e、,订单a) =>e->a->a->图表e a->图表电子商务来源 #

替换给定图形中的边。如果它不存在,就会被创建。复杂性:O(对数(n))时间。

replaceEdge e x y z==覆盖(移除边缘x y z)(边缘e x y)replaceEdge e x y(边缘f x y)==边缘e x y公司边缘标签x y(replaceEdge e x y z)==e

转置::图表e a->图表电子商务来源 #

转换给定图形。复杂性:O(s)个时间、内存和大小。

转置空的==空的转置(顶点x)==顶点x个转置(边缘e x y)==边缘e y x(e y x)转置。转置==id

电子邮箱::(e->f)->图表e a->图表财务报表来源 #

通过对每个边标签应用函数来变换图形。复杂性:O(s)个时间、内存和大小。

功能小时必须是同态关于标签e(电子).至少它必须保存<+>:

小时==高x<+>h y==h(x<+>年)

如果e(电子)也是半环,那么小时还必须保留乘法结构:

小时==高x<.>h y==h(x<.>年)

如果上述要求成立,那么实现将提供以下保证。

emap小时空的==空的emap小时(顶点x)==顶点x个emap小时(边缘e x y)==边缘(h e)x yemap小时(覆盖x年)==覆盖(电子邮件地址x)(电子邮件地址)电子地图h(连接e x y)==连接(电子邮件)(电子邮件)电子邮箱身份证件==身份证件电子邮件。emap h==emap(g.h)

诱导::(a->布尔) ->图表e a->图表电子商务来源 #

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

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

诱导Just::图表e(电子)(也许 吧a) ->图表电子商务来源 #

构造诱导子图通过删除顶点来确定给定图形的那是没有什么.复杂性:O(s)个时间、内存和大小。

诱因只是(顶点 没有什么)                               ==空的诱导Just(边缘(只是x)没有什么)                        ==顶点x个诱导Just。功能性维修计划 只是==身份证件诱导Just。功能性维修计划(\x->如果p x那么只是x其他没有什么) ==诱导第页

关系操作

关闭:: (等式e、,订单a、,StarSemiring公司e) =>图表e a->图表电子商务来源 #

计算自反传递闭包使用Warshall-Floyd-Kleene算法的基本星半环。

关闭空的==空的闭合(顶点x)==边缘 x x x闭合(边缘e x x)==边缘 x x x闭合(边缘e x y)==边缘[(,x,x),(e,x,y)(,y,y)]闭合==反射闭包.传递闭包闭合==传递闭包.反射闭合关闭。闭合==闭合postSet(postSet)x(闭包y)==集。来自列表(可达成的y x)

反射闭合:: (订单a、,半环e) =>图表e a->图表电子商务来源 #

计算自反闭合下半环上的图的增加一个自循环重量到每个顶点。复杂性:O(n*log(n))时间。

反射闭合空的==空的反射闭合(顶点x)==边缘 x x x反射闭包(边缘e x x)==边缘 x x x反射闭合(边缘e x y)==边缘[(,x,x),(e,x,y)(,y,y)]反射性闭合。reflectiveClosure==reflective闭包

对称闭合::单体e=>图表e a->图表e a公司来源 #

计算对称闭包用自己的图覆盖它转置。复杂性:O((n+m)*log(n))时间。

对称闭合空的==空的对称闭合(顶点x)==顶点x个对称闭合(边缘e x y)==边缘[(e,x,y),(e,y,x)]对称闭合x==覆盖x个(转置x)对称闭合。symmetricClosure==对称闭合

传递闭包:: (等式e、,订单a、,StarSemiring公司e) =>图表e a->图表电子商务来源 #

计算传递闭包下面恒星上的图形使用Warshall-Floyd-Kleene算法的修改版本的半环,其省略了自反性步骤。

传递闭包空的==空的传递闭包(顶点x)==顶点x个传递闭包(边缘e x y)==边缘e x y(e x y)传递闭包。transitiveClosure==传递闭包

边标记图的类型

类型 未标记的图形一个=图表 任何来源 #

的类型同义词无标记图.

类型 自动装置a秒=图表(正则表达式a) 秒来源 #

的类型同义词自动机标记过渡系统.

类型 网络电子商务=图表(距离e) 一个来源 #

A类网络是一个边用距离标记的图。

上下文

数据 上下文电子商务来源 #

这个上下文子图的输入输出,即所有连接到子图顶点的顶点(以及相应的边缘标签)。请注意,输入和输出可以属于子图本身。通常,顶点的顺序没有保证在里面输入输出; 此外,可能会有重复。

建造师

上下文 

领域

实例

实例详细信息
(方程式e、,等式a) =>等式(上下文e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

(显示e、,显示a) =>显示(上下文e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于

上下文:: (等式e、,单体e) =>(a->布尔) ->图表e a->也许 吧(上下文e a)来源 #

提取上下文由给定谓词指定的子图的。退换商品没有什么如果指定的子图为空。

上下文(常数假)x==无上下文(==1)(边缘e 12)==如果e==然后就这样(上下文[][])其他只是(上下文[][(e,2)])上下文(==2)(边缘e 12)==如果e==然后就这样(上下文[][])其他只是(上下文[(e,1)][])上下文(常数正确)(边缘e 12)==如果e==然后就这样(上下文[][])其他只是(上下文[(e,1)](e,2))上下文(==4)(3*1*4*1*5)==仅(上下文[(,3), (,1)] [(,1), (,5)])