使用 | 智能循环列表在 Haskell
Smart looping over lists using | in Haskell
我正在尝试使用双循环构建一个逻辑句子(使得 n 个命题中只有 m 个命题为真),但被“|”弄糊涂了令牌。我在 Hoogle 上找不到它的确切含义。 select 给出了一个列表列表,一个可以 selected 的索引列表。我想用索引建立一个积极的“selected”命题和消极的“非selected”命题的结合。以下代码我做错了什么?
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:
- 对于每个命题 y 不在 z 中:
- 对于 z 中的每个命题 x:
- 产生公式 ¬x ∧ y
如果我理解正确,你想要所有选定命题 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
我正在尝试使用双循环构建一个逻辑句子(使得 n 个命题中只有 m 个命题为真),但被“|”弄糊涂了令牌。我在 Hoogle 上找不到它的确切含义。 select 给出了一个列表列表,一个可以 selected 的索引列表。我想用索引建立一个积极的“selected”命题和消极的“非selected”命题的结合。以下代码我做错了什么?
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:
- 对于每个命题 y 不在 z 中:
- 对于 z 中的每个命题 x:
- 产生公式 ¬x ∧ y
- 对于 z 中的每个命题 x:
- 对于每个命题 y 不在 z 中:
如果我理解正确,你想要所有选定命题 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