algorithm - 将多个交集重构为相交并集组

标签 algorithm math union lookup intersection

给定一组规则,这些规则是一些已知值(组、类型、属性)的逻辑交集,这些规则组合起来给出一些值,如下所示:

group1 AND type1 AND property1 = value1
group1 AND type1 AND property2 = value2
group1 AND type1 AND property3 = value3
group1 AND type2 AND property1 = value1
group1 AND type2 AND property4 = value1
group2 AND type1 AND property2 = value2

并且以下内容成立:

  • 组/类型/属性的集合是有限且已知的
  • 组/类型/属性组合的唯一给定规则
  • 许多规则可以引用一个值

我如何找到最佳解决方案以将这些规则“折叠”成一种格式,在该格式中组契约(Contract)一组的多个值(如下),同时保持对原始查找的相同逻辑解释?

(group1) AND (type1 OR type2) AND (property1) = value1
(group1 OR group2) AND (type1) AND (property2) = value2
(group1) AND (type1) AND (property3) = value3
(group1) AND (type2) AND (property4) = value1

目标:包含与原始查找相同的逻辑信息的规则数量最少。

一种方法可以是采用原始查找“键”,按第一个值分组,然后按两个键分组,并折叠剩余键的不同实例,可以为键的每个组合重复。结果朝着正确的方向前进,但不能保证多步方法是最佳的。

如果这实际上是一个普遍的问题,我们将不胜感激任何关于更好方法的想法,或阅读指南。

如果需要,很乐意提供任何说明。

*为笨拙的标题道歉 - 希望描述了一般问题

编辑: 我认为这个问题(没有具体答案)表达了寻找 Union of all intersecting sets 的问题。 .

编辑 2: 我应该说,目标形式实际上是一个要求,而不是来自@timrau 的逻辑最佳解决方案。形式是 (groups) AND (types) A​​ND (properties) => value,其中 groups/types/properties 仅用 OR 表示。

最佳答案

对于每个可能的值,以积和形式形成一个 bool 公式。 (为了简单起见,我用g1代表group1t1代表type1p1 代表property1v1 代表value1)

v1 = g1 t1 p1 + g1 t2 p1 + g1 t2 p4
v2 = g1 t1 p2 + g2 t1 p2
v3 = g1 t1 p3

然后,您可以应用任何逻辑最小化算法/系统,例如 Quine-McCluskey , Espresso , ABC , Logic Friday甚至 Karnaugh map如果您真的打算手动最小化它们。

最小化后,我们得到

v1 = g1 (t1+t2) p1 + g1 t2 p4
v2 = (g1+g2) t1 p2
v3 = g1 t1 p3

然后可以将它们转换回您的原始逻辑公式。

关于algorithm - 将多个交集重构为相交并集组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247498/

相关文章:

java - 使用纬度经度计算两点之间的距离?

android - SQLite 联合列

postgresql - 进行 Postgres 数据库表的所有对所有联合的最简单方法?

javascript - Node.js 加密 PBKDF2 函数在 v8 和 v10 上返回不同的值

javascript - Math.pow(64, 1/3) 返回不精确的 4

algorithm - 最优选择选举算法

algorithm - 从样本中恢复订单

php - 我可以计算每个 MySQL Select/Union 有多少结果吗

algorithm - 在估计算法的最坏情况执行时间 T(x,y) 时,我应该计算 if 语句吗?

c - 如何实现具有惰性传播的线段树?