Haskell生成具有QuickCheck属性的图

Haskell生成具有QuickCheck属性的图,haskell,graph,generator,directed-acyclic-graphs,quickcheck,Haskell,Graph,Generator,Directed Acyclic Graphs,Quickcheck,图形具有以下属性: 类型“Edge”表示两个节点之间的边 data Edge v = Edge {source :: v, target :: v} deriving (Show,Eq,Ord) “Graph”类型表示有向图 data Graph v = Graph {nodes :: Set v, edges :: Set (Edge v)} deriving Show 函数“isDAG”测试一个图是否是非循环的 isDAG :: Ord v =&

图形具有以下属性:

类型“Edge”表示两个节点之间的边

data Edge v = Edge {source :: v, target :: v}
          deriving (Show,Eq,Ord)
“Graph”类型表示有向图

data Graph v = Graph {nodes :: Set v, edges :: Set (Edge v)}
           deriving Show
函数“isDAG”测试一个图是否是非循环的

isDAG :: Ord v => Graph v -> Bool
isDAG g = isValid g && all nocycle (nodes g)
where nocycle v = all (\a -> v `notMember` reachable g a) $ Set.map target (adj g v)
函数“isForest”测试有效的DAG是否为林(一组树)

森林发电机

dag :: (Ord v, Arbitrary v) => Gen (DAG v)
dag = arbitrary `suchThat` isDAG
forest :: (Ord v, Arbitrary v) => Gen (Forest v)
forest = arbitrary `suchThat` isForest
我想改进生成器Dag和FREST,因此它们是根据它们的属性定义的,而不是使用“suchThat”。我怎么做


提前谢谢。

我认为核心问题是如何生成DAG和森林

什么是森林?森林是树木的集合。什么是树?树是一个图,其中除根节点外的每个节点都只有一个父节点。我们如何把它变成一个算法?生成节点列表。对于列表中从左侧开始的每个节点,随机选择其右侧的一个元素作为其父元素,并为其创建一条边


什么是DAG?DAG是一个有向无环图。我们能用DAG做什么?我们可以对它们进行拓扑排序。这是什么意思?这意味着我们可以把它们放在一个序列中,每个边从左到右。我们如何把它变成一个算法?生成节点列表。对于列表中从左侧开始的每个节点,随机选择其右侧的元素子集,并为它们创建一条边。

我认为核心问题是如何生成DAG和林

什么是森林?森林是树木的集合。什么是树?树是一个图,其中除根节点外的每个节点都只有一个父节点。我们如何把它变成一个算法?生成节点列表。对于列表中从左侧开始的每个节点,随机选择其右侧的一个元素作为其父元素,并为其创建一条边


什么是DAG?DAG是一个有向无环图。我们能用DAG做什么?我们可以对它们进行拓扑排序。这是什么意思?这意味着我们可以把它们放在一个序列中,每个边从左到右。我们如何把它变成一个算法?生成节点列表。对于列表中从左侧开始的每个节点,随机选择其右侧的元素子集,并为其创建一条边。

可能重复的元素不是我选中的,也没有回答我的问题。我想要改进的是那些生成器,而不是实例。你能帮忙吗?我不知道你说的“改进”发电机是什么意思。就目前情况而言,这个问题所问的只是重复问题——这两个问题都是关于编写“不太偏颇”的生成器。正如您所看到的,它们是用“suchThat”编写的,而不是根据它们的属性编写的。如何使用QuickCheck属性组合符编写它们?问题是重复的。问题是上次它没有得到好的答案。但是再问一次同样的问题并不能解决这个问题。可能是重复的,我没有检查过,也没有回答我的问题。我想要改进的是那些生成器,而不是实例。你能帮忙吗?我不知道你说的“改进”发电机是什么意思。就目前情况而言,这个问题所问的只是重复问题——这两个问题都是关于编写“不太偏颇”的生成器。正如您所看到的,它们是用“suchThat”编写的,而不是根据它们的属性编写的。如何使用QuickCheck属性组合符编写它们?问题是重复的。问题是上次它没有得到好的答案。但是再次问同样的问题并不能解决这个问题。谢谢你的回答。但是你知道我应该怎么做才能生成满足DAG属性的图吗?而不是像这样?提前谢谢。我回答的第二部分回答了这个问题。谢谢你的回答。但是你知道我应该怎么做才能生成满足DAG属性的图吗?而不是像这样?我的回答的第二部分回答了这个问题。
forest :: (Ord v, Arbitrary v) => Gen (Forest v)
forest = arbitrary `suchThat` isForest