vertex x == vertex x * vertex x
vertex x == vertex x * vertex x
pure x == pure x * pure xNote that by applying the axiom in the reverse direction, one can always remove all self-loops resulting in an irreflexive graph. This type class can therefore be also used in the context of irreflexive graphs.
vertex x == vertex x * vertex xThe Show instance produces reflexively closed expressions:
show (1 :: ReflexiveRelation Int) == "edge 1 1" show (1 * 2 :: ReflexiveRelation Int) == "edges [(1,1),(1,2),(2,2)]"
reflexiveClosure empty == empty reflexiveClosure (vertex x) == edge x x reflexiveClosure (edge x x) == edge x x reflexiveClosure (edge x y) == edges [(x,x), (x,y), (y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure
reflexiveClosure empty == empty reflexiveClosure (vertex x) == edge x x reflexiveClosure (edge x x) == edge x x reflexiveClosure (edge x y) == edges [(x,x), (x,y), (y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure
reflexiveClosure empty == empty reflexiveClosure (vertex x) == edge one x x reflexiveClosure (edge e x x) == edge one x x reflexiveClosure (edge e x y) == edges [(one,x,x), (e,x,y), (one,y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure
reflexiveClosure empty == empty reflexiveClosure (vertex x) == edge one x x reflexiveClosure (edge e x x) == edge one x x reflexiveClosure (edge e x y) == edges [(one,x,x), (e,x,y), (one,y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure
reflexiveClosure (vertex x) == edge x x reflexiveClosure (edge x x) == edge x x reflexiveClosure (edge x y) == edges1 [(x,x), (x,y), (y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure
reflexiveClosure empty == empty reflexiveClosure (vertex x) == edge x x reflexiveClosure (edge x x) == edge x x reflexiveClosure (edge x y) == edges [(x,x), (x,y), (y,y)] reflexiveClosure . reflexiveClosure == reflexiveClosure