析取范式公式

时间:2014-11-05 11:14:47

标签: f# set formula declaration

我即将在析取范式中使用基于集合的公式表示。而且我发现,由于连词是可交换的,因此关联和(a∧a)等同于它很方便 用一组文字 litOf bc )代表一个基本的联合 bc

我正在考虑代表一个析取的正规形式公式 a

bc1 v。 。 。 v bcn

由集合:

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

我们将调用dns设置。

我应该如何编写 litOf dnfToSet 函数的F#声明?

1 个答案:

答案 0 :(得分: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)"