我不知道我理解的問題,但這裏是我想出了:
let litOf = Set.ofSeq
let dnfToSet a =
let isNotSuperset bci = a |> Set.forall(fun bcj -> (bci = bcj) || not(Set.isSuperset bci bcj))
a |> Set.filter isNotSuperset
下面舉例說明:
type bc = A | B | C | D
let bc1 = litOf [A; B; C]
let bc2 = litOf [B; C; B]
let bc3 = litOf [C; B; A]
let bc4 = litOf [D]
let a = litOf [ bc1; bc2; bc3; bc4 ]
let dnf = dnfToSet a
把所有到FSI產量:
type bc =
| A
| B
| C
| D
val bc1 : Set<bc> = set [A; B; C]
val bc2 : Set<bc> = set [B; C]
val bc3 : Set<bc> = set [A; B; C]
val bc4 : Set<bc> = set [D]
val a : Set<Set<bc>> = set [set [A; B; C]; set [B; C]; set [D]]
val dnf : Set<Set<bc>> = set [set [B; C]; set [D]]
((B ∧ C) V (D))
最後,爲了記錄,這裏是我用來打印公式的函數:
let sprintlit lit =
System.String.Join(" ∧ ", lit |> Seq.map(sprintf "%A") |> Seq.toArray)
|> sprintf "(%s)"
let sprintdnf set =
System.String.Join(" V ", set |> Seq.map sprintlit |> Seq.toArray)
|> sprintf "(%s)"
如果我的答案完全忽略了一點,或許你可以在你的問題中增加一些關於litOf和dnfToSet產生輸出的例子,給出一些示例輸入。 – Wally 2014-11-06 12:55:54