簡體   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