我即将在析取范式中使用基于集合的公式表示。而且我发现,由于连词是可交换的,因此关联和(a∧a)等同于它很方便 用一组文字 litOf ( bc )代表一个基本的联合 bc 。
我正在考虑代表一个析取的正规形式公式 a :
bc1 v。 。 。 v bcn
由集合:
dnfToSet(a) = {litOf(bc1), . . . , litOf(bcn)}
我们将调用dns设置。
我应该如何编写 litOf 和 dnfToSet 函数的F#声明?
答案 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)"