【问题标题】:Smart looping over lists using | in Haskell使用 | 智能循环列表在哈斯克尔
【发布时间】:2022-01-04 11:55:18
【问题描述】:

我正在尝试用双循环构建一个逻辑句子(这样 n 个命题中只有 m 个命题可以为真),但被“|”弄糊涂了令牌。我在 Hoogle 上找不到它的确切含义。 select 给出了一个列表列表,一个可以选择的索引列表。有了索引,我想建立一个积极的“选定”命题和消极的“非选定”命题的结合。下面的代码我做错了什么?

genXorM :: Int -> Int -> Form 
genXorM n m = Disj [Conj [Neg $ PrpF $ P x, PrpF $ P y] | z <- select, y <- [0 .. n] \\ z, x <- z]  where
  select = combinations m [0 .. n]

【问题讨论】:

  • 试试[x*x | x &lt;- [1..10]]。你现在了解| 令牌了吗?
  • |,在这种情况下,是 list comprehension 语法的一部分,因此您应该搜索它。在其他情况下,它可以用于 guards,因此您也可以查找相关信息。无论哪种情况,它都应该发音为“这样”。

标签: list haskell combinations


【解决方案1】:
genXorM :: Int -> Int -> Form 
genXorM n m = Disj [Conj [Neg $ PrpF $ P x, PrpF $ P y] | z <- select, y <- [0 .. n] \\ z, x <- z]  where
  select = combinations m [0 .. n]

这里有一个“三重循环”。它说:

  • 对于 m 命题的每个 z 组合:
    • 对于不在 z 中的每个命题 y
      • 对于 z 中的每个命题 x
        • 产生公式 ¬xy

如果我理解正确,您希望将所有选定的命题 x 与所有未选定的命题 y 的否定结合起来,那么可以用 list 编写类似这样的理解:

genXorM :: Int -> Int -> Form 
genXorM n m = Disj
  [ Conj
    ([PrpF (P p) | p <- x]
      ++ [Neg (PrpF (P n)) | n <- y])
  | x <- select
  , let y = [0 .. n] \\ x
  ]
  where
    select = combinations m [0 .. n]

或者没有它们,例如,使用map 和一些辅助函数将问题分解为更小的部分:

genXorM n m = Disj (map conjoin selected)
  where
    selected = combinations m [0 .. n]
    conjoin z = Conj (map positive z ++ map negative (complement z))
    positive = PrpF . P
    negative = Neg . positive
    complement x = [0 .. n] \\ x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多