-----------------------------------------------------------------------------
-- |
--模块:代数。图表。关系。反射式
--版权所有:(c)Andrey Mokhov 2016-2022
--许可证:MIT(请参阅文件License)
--维护人员:andrey.mokhov@gmail.com
--稳定性:实验性
--
--自反二进制关系的抽象实现。使用
--用于多态构造和操作的“代数.图形.类”。
-----------------------------------------------------------------------------
模块 代数。图表。关系。反射式 (
    --*数据结构
    自反关系, 来自关系, 到关系
    ) 哪里

进口 代数。图表。关系
进口 控制。DeepSeq(深度序列)
进口 数据。字符串

进口 有资格的 代数。图表。等级 作为 C类

{-|“ReflexiveRelation”数据类型表示/自反二进制关系/在一组元素上。自反关系满足“Reflexive”类型类,尤其是/selowoop/axiom:@'vertex'x=='vertex'x*'vertex'x@“Show”实例生成反射式闭合表达式:@显示(1::ReflexiveRelation Int)==“边缘1 1”显示(1*2::ReflexiveRelation Int)==“边[(1,1),(1,2),(2,2)]”@-}
新类型 自反关系  = 自反关系 { ReflexiveRelation a->关系来自Reflexive :: 关系  }
    推导 (字符串->ReflexiveRelation(字符串->ReflexiveRelation a)->IsString(ReflexiverRelation a)对于所有a.IsString a=>String->ReflexiveRelation对于所有a.(String->a)->IsString afromString::String->ReflexiveRelation反射关系$cfromString::for all a.IsString a=>String->ReflexiveRelation自反关系IsString(IsString), ReflexiveRelation a->()(ReflexiveRelation a->())->NFData(Reflexive关系a)对于所有a.NFData a=>ReflexiveRelation a->()对于所有a.(a->())->NFDatarnf::ReflexiveRelation a->()$crnf::对于所有a.NFData a=>ReflexiveRelation a->()NFData公司, Integer->ReflexiveRelation自反关系ReflexiveRelation a->ReflexiverRelation反射关系ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系(反射关系a->反射关系a->反射关系a)->(ReflexiveRelation反射关系->ReflexiveRelation a->反射关系a)->(ReflexiveRelation反射关系->ReflexiveRelation a->反射关系a)->(ReflexiveRelation a->ReflexiverRelation a)->(ReflexiveRelation a->ReflexiverRelation a)->(ReflexiveRelation a->ReflexiverRelation a)->(整数->ReflexiveRelation a)->数字(ReflexiveRelation a)对于所有a.(Ord a,Num a)=>Integer->ReflexiveRelation整数->自反关系对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation反射关系对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系对于所有a。(a->a->a)->(a->a->a)->(a->a->a)->(a->a)->(a->a)->(a->a)->(整数->a)->数字afromInteger::Integer->ReflexiveRelation自反关系$cfromInteger::对于所有a.(Ord a,Num a)=>Integer->ReflexiveRelation整数->自反关系signum::ReflexiveRelation a->ReflexiverRelation反射关系$csignum::对于所有a。(序号a,序号a)=>ReflexiveRelation a->ReflexiverRelation反射关系abs::ReflexiveRelation a->ReflexiverRelation反射关系$出租车::对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation反射关系否定::ReflexiveRelation a->ReflexiverRelation$cnegate::对于所有a。(序号a,序号a)=>ReflexiveRelation a->ReflexiverRelation反射关系*::ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系$c*::对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系-::ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系$c-::对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系+::ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系$c+::对于所有a。(序号a,数字a)=>ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation反射关系号码)

实例 订单  => 等式 (反射关系 ) 哪里
    ReflexiveRelation反射关系x个 ==::ReflexiveRelation a->ReflexiverRelation a->Bool== ReflexiveRelation反射关系 = ReflexiveRelation a->关系对于所有a.Ord a=>ReflexiveRelation a->Relation关系到关系 ReflexiveRelation反射关系x个 关系a->关系a->布尔对于所有a.等式a=>a->a->Bool== ReflexiveRelation a->关系对于所有a.Ord a=>ReflexiveRelation a->Relation关系到关系 ReflexiveRelation反射关系

实例 订单  => 订单 (自反关系 ) 哪里
    compare::ReflexiveRelation a->ReflexiverRelation a->排序比较 反射关系ax个 ReflexiveRelation反射关系 = 关系a->关系a->排序对于所有a.订单a=>a->a->订单比较 (ReflexiveRelation a->关系对于所有a.Ord a=>ReflexiveRelation a->Relation关系到关系 ReflexiveRelation反射关系x个) (反射关系a->关系a对于所有a.Ord a=>ReflexiveRelation a->Relation关系到关系 ReflexiveRelation反射关系)

实例 (订单 , 显示 ) => 显示 (自反关系 ) 哪里
    show::ReflexiveRelation a->字符串显示 = 关系a->字符串for all a.显示a=>a->String显示 (关系a->字符串)->(ReflexiveRelation a->关系a)->ReflexiveRelation反射关系->字符串对于所有的b c a。(b->c)->(a->b)->a->c. ReflexiveRelation a->关系对于所有a.或a=>反射关系a->关系a到关系

实例 订单  => C.图表 (自反关系 ) 哪里
    类型 顶点 (自反关系 ) = 
    empty::ReflexiveRelation反射关系空的       = 关系a->ReflexiveRelation对于所有a.关系a->ReflexiveRelation自反关系 关系a对于所有a.关系a空的
    顶点::顶点(ReflexiveRelation a)->ReflexiverRelation顶点      = 关系a->ReflexiveRelation对于所有a.关系a->ReflexiveRelation自反关系 (关系a->反射关系a)->(a->关系a)->a->ReflexiveRelation反射关系对于所有的b c a。(b->c)->(a->b)->a->c. a->关系a对于所有a.a->关系a顶点
    overlay::ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation覆盖::ReflexiveRelation一个->ReflexeveRelations一个覆盖 ReflexiveRelation反射关系x个 反射关系a = 关系a->ReflexiveRelation对于所有a.关系a->ReflexiveRelation自反关系 (关系a->ReflexiveRelation a)->关系a->ReflexiveRelation对于所有a b(a->b)->a->b$ ReflexiveRelation a->关系对于所有a.ReflexiveRelation a->Relation关系来自Reflexive ReflexiveRelation反射关系x个 Relation a->关系a->关系对于所有a.订单a=>关系a->关系a->Relation a`覆盖` ReflexiveRelation a->关系对于所有a.反射关系a->关系a来自Reflexive ReflexiveRelation反射关系
    connect::ReflexiveRelation a->ReflexiverRelation a->ReflexivRelation连接连接 ReflexiveRelation反射关系x个 ReflexiveRelation反射关系 = 关系a->ReflexiveRelation对于所有a.关系a->ReflexiveRelation自反关系 (关系a->ReflexiveRelation a)->关系a->ReflexiveRelation对于所有a b(a->b)->a->b$ ReflexiveRelation a->关系对于所有a.ReflexiveRelation a->Relation关系来自Reflexive ReflexiveRelation反射关系x个 Relation a->关系a->关系对于所有a.或a=>关系a->关系a->关系a->关系a`连接` ReflexiveRelation a->关系对于所有a.ReflexiveRelation a->Relation关系来自Reflexive ReflexiveRelation反射关系

实例 订单  => C.反射 (自反关系 )

--|从“关系”构造反身关系。
--复杂性:/O(1)/时间。
来自关系 :: 关系  -> 自反关系 
fromRelation::Relation a->ReflexiveRelation自反关系来自关系 = 关系a->ReflexiveRelation对于所有a.关系a->ReflexiveRelation自反关系

--|提取底层关系。
--复杂性:/O(n*log(m))/时间。
到关系 :: 订单  => 自反关系  -> 关系 
toRelation::ReflexiveRelation a->关系to关系 = 关系a->关系a对于所有a.订单a=>关系a->关系a反射闭合 (关系a->关系a)->(ReflexiveRelation a->关系a)->ReflexiveRelation反射关系->关系a对于所有的b c a。(b->c)->(a->b)->a->c. ReflexiveRelation a->关系对于所有a.ReflexiveRelation a->Relation关系来自Reflexive