复合规范模式有很多基于LINQ的实现。我还没有看到使用过包装的人。
是否有任何此类示例已被记录(博客等)或作为开源发布?通过让ExpressionVisitor将每个规范转换为规范的逻辑形式(CNF / DNF),我有一个想法和概念证明,它可以如何工作,但我担心这太复杂了。还有更好的方法吗?
答案 0 :(得分:2)
我担心这太复杂了。还有更好的方法吗?
简短的回答是“不,没有” 1
答案很长:“过于复杂”抓住了问题的本质:它是NP难的。这是一个简短的非正式证明,依赖于satisfiability problem is NP-complete:
这一事实A
和B
A
和B
所依赖的变量的所有分配,测试¬A | B
是否隐含A
,或等效B
。换句话说,您需要证明F = ¬A | B
是重言式。¬F
,F
的倒数。 F
可以满足当且仅当¬F
不是重言式 ¬F
是否为重言式F
可满足”的答案与“¬F
重言式”的答案相反。P
,而P=NP
。当然,问题是NP难的事实并不意味着没有实际案例的解决方案:实际上,转换为规范形式的方法可能会在许多现实世界中产生好的结果。然而,缺乏已知的“好”算法通常会阻碍实际解决方案的积极发展 2 。
<小时/> 1 强制性的“除非
P=NP
”免责声明。
2 如果您允许“假阴性”,除非“相当不错”的解决方案能够解决您的问题。