在Haskell中是否有一个二十面体图的集合生成器表示法?(我找到了其他柏拉图图的)

gorkyyrv  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

这可能是一个奇怪的练习,因为我谈论的是要指定的有限数量的边,这就引出了一个问题:为什么不直接把它们写下来呢?然而,我被要求使用一个集合构建器符号来描述柏拉图立体-在我的例子中,我使用顶点或节点来表示它们的面,以及它们的边-我只做对了其中的四个:

tetrahedron = [(j,i) | i <- [1..4], j <- [1..i], i/=j]
cube = [(j,i) | i <- [1..6], j <- [1..i], i/=j, i+j/=7]
octahedron = [(j,i) | i <- [1..8], j <- [1..i], k <- [3,7,9,11,15], i/=j, i+j==k]
dodecahedron = [(j,i) | i <- [1..12], j <- [1..i], k <- [3,4,5,8,12,13,15,16,17,20], i/=j, i+j==k, i-j/=6]

字符串
四面体和4个顶点的完全图是一样的,立方体的构造产生了比必要的更多的边,那些顶点加起来是7的,这样我就可以排除它们,而八面体是一种情况,它们必须加起来是指定的奇数。十二面体很难,但我想我必须创建一个例外,这是顶点数之间的差6。
有没有可能以同样的方式创建一个二十面体图?有没有数学说,这是不可能的,否则?

oxiaedzo

oxiaedzo1#

可以在generalized LCF notation中指定Hamilton图。你绕着一个Hamilton圈走,从0开始依次给顶点编号。每个节点显然与一个高一个低一个的节点相邻; GLCF表示法将“丢失”的边缘作为偏移量,以及应该复制这些偏移量的次数。GLCF的示例是[(-4,-3,4),(-2,2,3)]6.这意味着第一个顶点在循环中被连接到它后面的4个顶点,后面的3个顶点,前面的4个顶点;第二个顶点在循环中被连接到它后面的2个顶点,前面的2个顶点,前面的3个顶点;然后我们重复六次,所以第三个顶点再次被连接到后面的4个顶点,后面的3个顶点,前面的4个顶点;第四个是2后面,2前面,3前面;等等,直到第十二个和最后一个节点。
我们可以使用列表解析语法将GLCF表示法转换为邻接列表:

glcf :: [[Int]] -> Int -> [(Int, Int)]
glcf offsets repetitions =
    [ (k, k')
    | i <- [0..repetitions-1]
    , (j, os) <- zip [0..] offsets
    , let k = i*n+j
    , o <- -1:1:os
    , let k' = (k+o)`mod`(n*repetitions)
    , k<k'
    ]
    where
    n = length offsets

字符串
在许多情况下,每个节点都有一条缺失的边。然后习惯上从GLCF的元组中删除括号,这种缩写形式称为LCF符号。我们可以在Haskell中进行类似的区分:

lcf :: [Int] -> Int -> [(Int, Int)]
lcf = glcf . map return


MathWorld为大多数柏拉图图提供了GLCF符号;查看this page以获得对每个柏拉图图的描述链接。奇怪的是,它没有列出八面体图的版本。我不知道为什么,因为很容易从它的各种图形渲染中看出它应该是什么。我们可以直接导入其他图形:

tetrahedron = lcf [-2] 4
cube = lcf [3,-3] 4
octahedron = glcf [[2,-2]] 8
icosahedron = glcf [[-4,-3,4],[-2,2,3]] 6
dodecahedron = lcf [-10,-4,7,-7,4,-10,7,4,-4,-7] 2

相关问题