는 제가 질문을 이해 모르겠지만, 여기에 내가 생각 해낸 것입니다 :
이
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