扩展基于LINQ的规范模式以实现包含

时间:2012-12-04 23:12:25

标签: linq boolean-logic boolean-expression linq-expressions specification-pattern

复合规范模式有很多基于LINQ的实现。我还没有看到使用过包装的人。

是否有任何此类示例已被记录(博客等)或作为开源发布?通过让ExpressionVisitor将每个规范转换为规范的逻辑形式(CNF / DNF),我有一个想法和概念证明,它可以如何工作,但我担心这太复杂了。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  

我担心这太复杂了。还有更好的方法吗?

简短的回答是“不,没有” 1

答案很长:“过于复杂”抓住了问题的本质:它是NP难的。这是一个简短的非正式证明,依赖于satisfiability problem is NP-complete

这一事实
  • 假设您有两个布尔公式,AB
  • 您需要针对AB所依赖的变量的所有分配,测试¬A | B是否隐含A,或等效B。换句话说,您需要证明F = ¬A | B重言式
  • 假设可以在多项式时间内执行重言式测试
  • 考虑¬FF的倒数。 F 可以满足当且仅当¬F不是重言式
  • 使用假设多项式算法来测试¬F是否为重言式
  • F可满足”的答案与“¬F重言式”的答案相反。
  • 因此,多项式重言式检查器的存在意味着可满足性问题在P,而P=NP

当然,问题是NP难的事实并不意味着没有实际案例的解决方案:实际上,转换为规范形式的方法可能会在许多现实世界中产生好的结果。然而,缺乏已知的“好”算法通常会阻碍实际解决方案的积极发展 2

<小时/> 1 强制性的“除非P=NP”免责声明。

2 如果您允许“假阴性”,除非“相当不错”的解决方案能够解决您的问题。