假设我有一个Prop
类型的命题:
type Prop =
| P of string
| Disjunction of Prop * Prop
| Conjunction of Prop * Prop
| Negation of Prop
其中:
• A "p" representing the atom P,
• Disjunction(A "P", A "q") representing the proposition P ∨ q.
• Conjunction(A "P", A "q") representing the proposition P ∧ q.
• Negation(A "P") representing the proposition ¬P.
我应该在析取范式中使用基于集合的公式表示。由于连词是可交换的,因此关联和(a∧a)相当于通过其文字集合litOf(bc)来表示基本合取bc是方便的。
bc定义为:文字是原子或原子的否定,基本的连词是文字的连接
这引导我进入litOf
:
let litOf bc =
Set.fold (fun acc (Con(x, y)) -> Set.add (x, y) acc) Set.empty bc
我很确定我的litOf
错了,我在(Con(x,y))
部分收到错误说:“不完整模式m
关于这个表达的见解。例如,值'Dis(_,_)'可以表示cas
没有被模式覆盖。“,我也不知道在这种情况下实际意味着什么。
有关我如何处理的任何提示?
答案 0 :(得分:3)
我假设您的示例类型Prop
在从键盘到此处的路上发生了变化,并且看起来像这样:
type Prop =
| P of string
| Dis of Prop * Prop
| Con of Prop * Prop
| Neg of Prop
有几件事让你失望:
Set.fold对作为集合的输入进行操作,并对集合中的每个元素执行某些操作。在您的情况下,输入是一个布尔子句,输出是一个集。
您没有完全定义文字的构成。对于连词,文字集是左侧和右侧文字的并集。但是脱离怎么办?编译器错误消息的确意味着。
以下是我认为您的目标:
let rec literals = function
| P s -> Set.singleton s
| Dis (x, y) -> Set.union (literals x) (literals y)
| Con (x, y) -> Set.union (literals x) (literals y)
| Neg x -> literals x
有了这个,你就会得到
> literals (Dis (P "A", Neg (Con (P "B", Con (P "A", P "C")))))
val it : Set<string> = set ["A"; "B"; "C"]