繁体   English   中英

使用 | 智能循环列表在 Haskell

[英]Smart looping over lists using | in Haskell

我正在尝试用双循环构建一个逻辑句子(这样 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]
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结合起来,那么可以用这样的列表推导式编写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM