将复杂的过滤规则减少为可比较的形式

时间:2017-01-31 19:25:38

标签: arrays algorithm sorting reduce

我想确定一个整数输入数组是否匹配"一套规则。

匹配者

Matcher是由一组辅助方法构建的,用于描述输入数据的规则。这些规则本质上是整数数组的逻辑门:

AND(1, 2) // Requires both 1 AND 2 be present in the input array.
OR(3, 4, 5) // Requires that 3 OR 4 OR 5 be present in the input array.
NOR(6, 7) // Requires that neither 6 NOR 7 be present in the input array.
XOR(8, 9) // Requires that either 8 (X)OR 9 be present in the input array, but not both.

因此,我可以说,给定输入数组:

[0, 1, 2, 3]

我可以建立Matcher之类的:

AND(OR(0, 1), AND(1, 2) NOR(4))

哪个匹配输入,因为输入满足:

OR(0, 1) // 0 or 1 is present
AND(1, 2) // Both 1 and 2 are present
NOR(4) // 4 is not present

每个人都累积地满足了总体AND规则。

问题

我需要将匹配器简化为仍然描述规则的最简单和最基本的形式。例如,给定上述匹配器,样本减少可以是:

rules = {
  or: [1, 2],
  xor: [], // No XORs
  nor: [4]
}

每个rule都有三个子规则数组,由整数或rule组成。

请注意,OR是空的,因为无论如何都需要1,这意味着OR(0, 1) => [0, 1]是多余的,因为它必须得到满足。

由于Matcher需要具有可比性(我需要能够确定基础规则之间的等价性),所以当我到达时会变得有点复杂:

input = [1, 2, 5, 9, 11, 12, 13, 14, 17]

XOR(OR(AND(1, 2), NOR(3, 4), XOR(3 11), AND(11, 14)), AND(1, 5, 17))

现在,大量的内容是多余的和/或矛盾的,所以我想我能做的就是首先将它放入树状结构中,然后递归并减少不必要的条目。有没有更好的方法来做到这一点?

我特意寻找确定性的东西(任何一组输入规则意味着相同的东西产生相同的最终简化形式)。如果有更好的方式来表达这个问题,我感兴趣,如果规则是矛盾的,那么减速器就可以打破并抛出异常。这是为了偶尔在程序中使用,因此性能不是问题。

1 个答案:

答案 0 :(得分:1)

你在这里实际处理的是propositional logic。考虑整数你的命题是假的还是真的,这取决于它们是否存在于输入数组中。

你的约束(XOR,AND等)然后形成一个可满足或不满足的逻辑公式。事实上很难弄清楚任何给定的公式是否可以满足。但是,初看起来这不应该关注你,因为你只需要检查给定的输入是否满足公式。

不幸的是,你实际上问的是如何确定两个命题公式是否相等。事实证明这同样困难:https://math.stackexchange.com/questions/1050127/how-to-efficiently-determine-if-any-two-propositional-formulas-are-equivalent