Haskell中的最大Clique查找器 - 解析错误

时间:2016-03-20 15:24:05

标签: haskell graph

我正在尝试使用Bron-Kerbosch算法来查找最大派系的数量(最大C​​lique是图表的一个子集,其中每两个顶点都连接在一起,并且没有更大的派系包含它)

https://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm

不幸的是,我收到一个错误:“输入'res'解析错误” 而我似乎无法解决它。我试图用普通的空间改变自来水空间,但它似乎不起作用。我也没有看到任何错误?有什么想法吗?

    type Clique = [Vertex]
swarming::Clique->[Vertex]->[Vertex]->[Clique]
swarming R P X =
    if null P && null X then [R]
                        else loop R X
                    where
                        loop::[Vertex]->[Vertex]->[Clique]
                        loop[] _    =[]
                        loop(v:R') X=
                            swarming (v:R)(P 'res' v)(X 'res' v)
                            loop P (v:X)

type Vertex = Int
class Graph g where
    size            ::g->Int
    verticies       ::g->[Vertex]
    connected       ::g->Vertex->Vertex->Bool

bron::Graph g=>g->[Clique]
bron g = swarming[] (verticies g) []
    where
        swarming R P X =
                if null P && null X then [R]
                        else loop R X
                    where
                        loop::[Vertex]->[Vertex]->[Clique]
                        loop[] _    =[]
                        loop(v:R) X=
                            swarming (v:R)(P 'res' v)(X 'res' v)
                            loop P (v:X)
                       res::[Vertex]->Vertex->[Vertex]
                       res  vs v = filter(connected g v) vs

1 个答案:

答案 0 :(得分:1)

正如我所看到的,您的代码存在的问题多于您得到的错误:

  • 首先,评论已经说明'是为单个字符Char保留的,您要查找的语法是`res`

  • 其次我看到你正在使用标签,ghc编译器的新版本会警告你,通常现在人们使用空格(这主要是品味问题,这取决于你)

我稍微重新排序了您的代码并以编译方式对其进行了修改。 undefined会引发运行时错误,但此状态优于非编译错误。

type Clique = [Vertex]
type Vertex = Int

class Graph g where
  size      :: g -> Int
  vertices  :: g -> [Vertex]
  connected :: g -> Vertex -> Vertex -> Bool

我通常以type / data / class声明位于我的文件顶部并且其余部分位于其下方的方式组织我的代码。

语法明智的下一个错误是使用大写字母表示变量名 - 这在haskell中是不允许的。类型以大写变量开头,小写。

bron是一个棘手的功能,老实说,我不知道你想做什么,有两件事让人难以理解。

  1. 你有变量'蜂拥和循环中rr - 它们似乎不一样,而p应始终相同。 名称阴影不是语法问题,而是逻辑问题,如果两个不同的东西名称不同,它就会变得更容易。

  2. 我看到了

    loop ... = swarming
               loop
    

    这是无效的haskell语法 - 你将如何处理群集它不会在代码的以下部分中使用,使用let … in将这两行拼接在一起

  3. 这是代码的其余部分bron,其中包含编译但不完整的实现

    bron :: Graph g => g -> [Clique]
    bron g = swarming [] (vertices g) []
      where res :: [Vertex] -> Vertex -> [Vertex]
            res vs v = filter (connected g v) vs
    
            swarming :: Clique -> [Vertex] -> [Vertex] -> [Clique]
            swarming r [] [] = [r]
            swarming r p x   = loop r x
              where loop :: [Vertex] -> [Vertex] -> [Clique]
                    loop [] _    = []
                    loop (v:r) x = undefined
                                -- let sw = swarming (v:x) (p `res` v) (x `res` v)
                                -- in loop ??