优化大量基于二元谓词的规则的计算

时间:2017-12-05 08:57:47

标签: algorithm graph-theory decision-tree predicate boolean-logic

我有一组已知且有限的二元谓词:A, B, C, ...

一大堆规则,包含带OR, AND, NOT运算符的谓词。即

R1 = A AND B
R2 = NOT(C) OR B
R3 = ((A OR B) AND C) OR NOT(C)

获取所有谓词的二进制赋值时,我想优化规则的计算。

为此,我可以修改规则定义但是我希望,只要逻辑不会改变(相同的谓词赋值将在每个规则上给出相同的计算结果)。

我在考虑创建某种联合决策树,但看不出我怎么知道优化的安排是什么。

注意:我不关心构建计算算法的复杂性,只关心计算的复杂性。

1 个答案:

答案 0 :(得分:2)

对于少量谓词,您可以提前计算所有结果以创建缓存。请注意,缓存中将包含2 ^(谓词数)条目。

对于大量谓词,您无法执行此操作。我说这听起来像动态编程,因为规则可能有重叠的组件。要增加此重叠,您可以重写所有规则以使用单一类型的操作,例如NAND。然后,您可以创建一个图形,其中谓词是输入,规则是输出。

所以你的规则看起来像是:

R1 = (A NAND B) NAND (A NAND B)
R2 = (B NAND B) NAND C
R3 = (A NAND A) NAND (B NAND B) NAND C

您已经可以看到一些重叠。这将随着规则的数量而增加。你的图表看起来像这样:

computation graph

获得二进制赋值后,您可以从左到右计算图形。或者在动态编程风格中,从R1开始并缓存所有中间结果供以后使用,然后对R2和R3执行相同操作。