复合规范模式有很多基于LINQ的实现.我还没有看到使用过包装的人.
是否有任何此类示例已被记录(博客等)或作为开源发布?通过让ExpressionVisitor将每个规范转换为规范的逻辑形式(CNF / DNF),我有一个想法和概念证明,它可以如何工作,但我担心这太复杂了.有没有更好的办法?
最佳答案
I am concerned that this is overly complicated. Is there a better way?
简短的回答是“不,没有”1
答案很长:“过于复杂”抓住了问题的本质:它是NP难的.这是一个简短的非正式证据,依赖于satisfiability problem is NP-complete的事实:
>假设您有两个布尔公式A和B.
>您需要测试A是否暗示B,或等效¬A| B表示A和B所依赖的变量的所有赋值.换句话说,您需要证明F =¬A| B是重言式.
>假设重言式测试可以在多项式时间内执行
>考虑¬F,F的倒数是可以满足的,当且仅当¬F不是重言式时
>使用假设多项式算法来测试¬F是重言式
>“F可满足”的答案是“是一个同义反复”的答案的倒数
>因此,多项式重言式检验器的存在意味着可满足性问题在P中,并且P = NP.
当然,问题是NP难的这一事实并不意味着没有解决实际案例的方法:实际上,转换为规范形式的方法可能会在许多现实世界中产生好的结果.然而,缺乏已知的“好”算法往往会阻碍实际解决方案的积极发展2.
1强制性的“除非P = NP”免责声明.
2如果您允许“假阴性”,除非“合理的”解决方案可以做到,这可能是您的问题的情况.