折叠设置为新的设置

时间:2016-11-22 18:36:47

标签: f#

假设我有一个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 没有被模式覆盖。“,我也不知道在这种情况下实际意味着什么。

有关我如何处理的任何提示?

1 个答案:

答案 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"]