我試圖用雙回圈構建一個邏輯句子(這樣 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]
uj5u.com熱心網友回復:
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]
你在這里有一個“三重回圈”。它說:
- 對于每一個組合?的米命題:
- 對于不在z 中的每個命題y:
- 對于每一個命題X在?:
- 產生公式 ? x ∧ y
- 對于每一個命題X在?:
- 對于不在z 中的每個命題y:
如果我理解正確的話,你希望所有的選擇命題的結合X的所有非選定的否定?,可與串列理解這樣寫:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368803.html
