我想在Idris中实现有限的有向图。另外,我想使用从顶点集到其他类型/集的顶点映射f : V -> X
。哪个是最自然的方法?
一种选择是始终为顶点集选择Fin n
。这样,图表可以直接实现为其邻接矩阵,即Graph n = Vect n (Vect n Bool)
,任何顶点映射都可以作为Vect n a
类型的向量。
另一方面,我喜欢定义Graph a = SortedMap (a, a) Bool
的想法。这样,一些结构似乎更直接,例如,类型为Graph a -> Graph b -> Graph (a, b)
的图表产品。
但是有可能构建男性图形实例,例如, (x, y)
是g
的关键,但(y, x)
不是。另外,如果我想编写一个带有图形和兼容顶点图的函数,我不知道如何指定两个对象的域必须重合。可能f : (g : Graph a) -> (m : SortedMap a b) -> {auto p : vertexList g = keys m} -> ...
必须首先编写函数vertexList
和keys
?
第三个定义是Graph a = (a, a) -> Bool
,其中a
应该是某种有限类型,如Fin n
或(Fin m, Fin n)
。然后顶点地图只是a -> b
类型。