[英]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]
你在這里有一個“三重循環”。 它說:
如果我理解正確,您希望將所有選定的命題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.