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

代数。图表。贴标签于。相邻地图

描述

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

本模块定义了相邻地图边缘标记图形的数据类型,如以及相关的操作和算法。相邻地图是一个实例图表类型类,可用于多态图构造和操作。

简介

数据结构

数据 相邻地图电子商务来源 #

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

实例

实例详细信息
(等式a、,等式e) =>等式(相邻地图e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于。相邻地图

(等式e、,二元体e、,号码a、,订单a) =>号码(相邻地图e a) 来源 #

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

实例详细信息

定义于代数。图表。贴标签于。相邻地图

(订单e、,单体e、,订单a) =>订单(相邻地图e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于。相邻地图

(订单a、,显示a、,订单e、,显示e) =>显示(相邻地图e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于。相邻地图

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

定义于代数。图表。贴标签于。相邻地图

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

定义于代数。图表。贴标签于。相邻地图

关联的类型

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

(订单a、,等式e、,单体e) =>半群(相邻地图e a) 来源 #

通过定义覆盖.

实例详细信息

定义于代数。图表。贴标签于。相邻地图

(订单a、,等式e、,单体e) =>单体(相邻地图e a) 来源 #

通过定义覆盖空的.

实例详细信息

定义于代数。图表。贴标签于。相邻地图

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

定义于代数。图表。贴标签于。相邻地图

方法

径向基函数::相邻地图e a->()#

(等式e、,单体e、,订单a) =>ToGraph(ToGraph)(相邻地图e a) 来源 #

通过定义骨架ToGraph(ToGraph)的实例相邻地图.

实例详细信息

定义于代数。图表。贴标签于。相邻地图

关联的类型

类型 ToVertex(顶点)(相邻地图e a)来源 #

方法

toGraph(目标图表)::相邻地图e a->图表(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->相邻Map0(ToVertex(顶点)(相邻地图e a))来源 #

到相邻地图转换::相邻地图e a->相邻Map0(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)=第1页('元数据“AdjacencyMap”“Algebra.Graph.Labelled.AdjacenceMap”《代数图-0.7-DxCmXygYU3a8wvsz565Q5f》“”真的) (C1类('MetaCons公司“上午”前缀I'真的) (S1(第一阶段)('MetaSel(元选择)('只是“邻接地图”)'无源未打包'无源严格性'决定懒惰) (0级可采收水平(地图一个(地图a e))
类型 ToVertex(顶点)(相邻地图e a) 来源 # 
实例详细信息

定义于代数。图表。贴标签于。相邻地图

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

定义于代数。图表。等级

类型 顶点(相邻地图e a)=a

相邻地图::相邻地图e a->地图一个(地图a e)来源 #

这个邻接图边标记图的:每个顶点是与从其直接继承者到相应的边缘标签。

基本图构造基元

空的::相邻地图电子商务来源 #

构造空图形.

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

顶点::a->相邻地图电子商务来源 #

构建包含以下内容的图形单个孤立顶点.

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

边缘:: (等式e、,单体e、,订单a) =>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)

(>-):: (等式e、,单体e、,订单a) =>(a,e)->a->相邻地图电子商务中缀5 来源 #

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

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

覆盖:: (等式e、,单体e、,订单a) =>相邻地图e a->相邻地图e a->相邻地图电子商务来源 #

覆盖两张图。这是一个交换的、结合的和幂等的具有标识的操作空的.复杂性:O((n+m)*log(n))时间和O(n+m)内存。

栈空(覆盖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->相邻地图e a->相邻地图电子商务来源 #

连接两个由给定标签标记边的图。应用于时相同的标签,这是一个与标识关联的操作空的,分布在覆盖并遵循分解公理。复杂性:O((n+m)*log(n))时间和O(n+m)内存。请注意结果图中的边数与参数的顶点数: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

顶点::订单a=>【a】->相邻地图电子商务来源 #

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

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

边缘:: (等式e、,单体e、,订单a) =>[(e,a,a)]->相邻地图电子商务来源 #

从边列表构造图形。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

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

覆盖层:: (等式e、,单体e、,订单a) =>[相邻地图e a]->相邻地图电子商务来源 #

覆盖给定的图形列表。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

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

从相邻地图:: (等式e、,单体e、,订单a) =>[(a,地图a e)]->相邻地图电子商务来源 #

从邻接集列表构造一个图。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

来自相邻地图[]==空的从相邻地图[(x,地图。空的)]                    ==顶点x个从相邻地图[(x,地图。单子y e)]==如果e==然后顶点[x,y]其他边缘e x y(e x y)覆盖(from AdjacencyMaps xs)(from相邻地图ys)==来自相邻地图(xs++年)

图上的关系

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

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

是SubgraphOf空的x==正确是SubgraphOf(顶点x)空的==错误是x y的子图==>x<=y

图形属性

栈空::相邻地图e a->布尔 来源 #

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

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

hasVertex公司::订单a=>a->相邻地图e a->布尔 来源 #

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

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

hasEdge公司::订单a=>a->a->相邻地图e a->布尔 来源 #

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

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)。边缘列表

边缘标签:: (单体e、,订单a) =>a->a->相邻地图e a->e来源 #

提取图形中指定边的标签。复杂性:O(对数(n))时间。

边缘标签x y空的==边缘标签x y(顶点z)==边缘标签x y(边缘e x y)==e边缘标签(覆盖x y)==边缘标签s t x+边缘标签

顶点计数::相邻地图e a->国际 来源 #

图中的顶点数。复杂性:O(1)时间。

顶点计数空的==  0顶点计数(顶点x) ==1顶点计数==长度.顶点列表顶点计数x<顶点计数y==>x<y

边缘计数::相邻地图e a->国际 来源 #

(非-)图中的边。复杂性:O(n)时间。

边缘计数空的== 0边缘计数(顶点x) ==0边缘计数(边缘e x y)==如果e==然后0其他1边缘计数==长度.边缘列表

顶点列表::相邻地图e a->[a]来源 #

给定图的顶点排序列表。复杂性:O(n)时间和记忆。

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

边缘列表::相邻地图e a->[(e,a,a)]来源 #

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

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

顶点集::相邻地图e a->设置来源 #

给定图的顶点集。复杂性:O(n)时间和记忆。

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

边缘设置:: (等式a、,等式e) =>相邻地图e a->设置(e、a、a)来源 #

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

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

预设::订单a=>a->相邻地图e a->设置来源 #

这个预设元素的x个是它的集合吗直接前辈.复杂性:O(n*log(n))时间和O(n)内存。

预设置x空的==设置。空的预设置x(顶点x) ==设置。空的预设置1(边缘e 12)==设置。空的预设置y(边缘e x y)==如果e==然后选择Set。空的else设置。来自列表【x】

postSet(postSet)::订单a=>a->相邻地图e a->设置来源 #

这个后置顶点的集合直接继承人.复杂性:O(对数(n))时间和O(1)内存。

后置集x空的==设置。空的postSet x(顶点x) ==设置。空的postSet x(边缘e x y)==如果e==然后选择Set。空的else设置。来自列表[年]postSet 2(边缘e 1 2)==设置。空的

骨架::订单a=>相邻地图e a->相邻地图来源 #

将图形转换为相应的未标记图形相邻地图通过忘记所有非-边缘。复杂性:O((n+m)*log(n))时间和记忆。

hasEdge公司x年==hasEdge公司x年。骨架

图形转换

移除顶点::订单a=>a->相邻地图e a->相邻地图电子商务来源 #

从给定图形中删除顶点。复杂性:O(n*log(n))时间。

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

删除边缘::订单a=>a->a->相邻地图e a->相邻地图电子商务来源 #

从给定图形中删除边。复杂性:O(对数(n))时间。

删除边缘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

替换顶点:: (等式e、,单体e、,订单a) =>a->a->相邻地图e a->相邻地图电子商务来源 #

功能替换顶点x年替换顶点x个带顶点在一个鉴于相邻地图.如果已经存在,x个将合并。复杂性:O((n+m)*log(n))时间。

替换顶点x x==id替换顶点x y(顶点x)==顶点替换顶点x y==gmap(gmap)(\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(e x y)边缘标签x y(replaceEdge e x y z)==e

转置:: (单体e、,订单a) =>相邻地图e a->相邻地图电子商务来源 #

转换给定图形。复杂性:O(m*log(n))时间,O(n+m)内存。

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

gmap(gmap):: (等式e、,单体e、,订单a、,订单b) =>(a->b)->相邻地图e a->相邻地图电子商务来源 #

通过对图形的每个顶点应用函数来变换图形。这是类似Functor(仿真器)功能性维修计划但可以与非完全参数一起使用相邻地图.复杂性:O((n+m)*log(n))时间。

gmap f空的==空的gmap f(顶点x)==顶点(f x)gmap f(边缘e x y)==边缘e(f x)(f y)gmap(gmap)身份证件==身份证件gmap文件。gmap g==gmap(f.g)

电子邮箱:: (等式f、,单体f) =>(e->f)->相邻地图e a->相邻地图财务报表来源 #

通过应用函数变换图形小时每个边缘标签。复杂性:O((n+m)*log(n))时间。

功能小时必须是同态关于标签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)(电子邮件地址)emap小时(连接e x y)==连接(电子邮件)(电子邮件)电子邮箱身份证件==身份证件电子邮件。emap h==emap(g.h)

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

构造诱导子图通过移除不满足给定谓词的顶点。复杂性:O(n+m)时间,假设谓词采用常量时间。

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

诱导Just::订单a=>相邻地图e(电子)(也许 吧a) ->相邻地图电子商务来源 #

构造诱导子图通过删除顶点来确定给定图形的那是没有什么.复杂性:O(n+m)时间。

诱因只是(顶点 没有什么)                               ==空的诱因只是(边缘(只是x)没有什么)                        ==顶点x个诱导Just。gmap(gmap) 只是==身份证件诱导Just。gmap公司(\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、,等式e、,单体e) =>相邻地图e a->布尔 来源 #

检查内部图形表示是否一致,即边是指现有的顶点,并且没有-标记的边缘。应该不可能创建不一致的邻接图,我们使用这个测试中的功能。