2014-11-05 87 views
0

即將使用以析取正態形式表示公式的基於集合的表達式。而且我發現,由於結合是可交換的,關聯和(a∧a)是相當於可以很方便地通過 其設定文字的litOf(公元前)表示基本相合BC析取正態表達式公式

林想着表示析取範式式一個

BC1訴。 。 v BCN

由集:

dnfToSet(a) = {litOf(bc1), . . . , litOf(bcn)} 

,我們將調用DNS設置的。

我應該怎麼寫的職能litOfdnfToSet F#的聲明?

+0

如果我的答案完全忽略了一點,或許你可以在你的問題中增加一些關於litOf和dnfToSet產生輸出的例子,給出一些示例輸入。 – Wally 2014-11-06 12:55:54

回答

1

我不知道我理解的問題,但這裏是我想出了:

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)"