优化大量基于二进制谓词的规则的计算
Optimize calculation of a large set of binary predicate based rules
我有一组已知且有限的二元谓词:A, B, C, ...
还有一大组规则,包含带有 OR, AND, NOT
运算符的谓词。即
R1 = A AND B
R2 = NOT(C) OR B
R3 = ((A OR B) AND C) OR NOT(C)
在获取所有谓词的二元赋值时,我想优化规则的计算。
为此,我可以随心所欲地修改规则定义,只要逻辑不变(相同的谓词赋值将在每个规则上给出相同的计算结果)。
我正在考虑创建某种联合决策树,但看不出如何判断什么是优化安排。
注意:我不关心构建计算算法的复杂度,只关心计算复杂度。
对于少量的谓词,您可以预先计算所有结果以创建缓存。请注意,您的缓存中将有 2 ^(谓词的数量)条目。
对于大量谓词,您不能这样做。我会说这听起来像动态规划,因为规则可能有重叠的组件。要增加这种重叠,您可以重写所有规则以使用单一类型的操作,例如与非门。然后您可以创建一个图形,其中谓词是输入,规则是输出。
因此您的规则如下所示:
R1 = (A NAND B) NAND (A NAND B)
R2 = (B NAND B) NAND C
R3 = (A NAND A) NAND (B NAND B) NAND C
您已经可以看到一些重叠。这将随着规则的数量而增加。您的图表将如下所示:
获得二进制赋值后,您可以从左到右计算图形。或者在动态编程风格中,您从 R1 开始并缓存所有中间结果以备后用,然后对 R2 和 R3 执行相同的操作。
我有一组已知且有限的二元谓词:A, B, C, ...
还有一大组规则,包含带有 OR, AND, NOT
运算符的谓词。即
R1 = A AND B
R2 = NOT(C) OR B
R3 = ((A OR B) AND C) OR NOT(C)
在获取所有谓词的二元赋值时,我想优化规则的计算。
为此,我可以随心所欲地修改规则定义,只要逻辑不变(相同的谓词赋值将在每个规则上给出相同的计算结果)。
我正在考虑创建某种联合决策树,但看不出如何判断什么是优化安排。
注意:我不关心构建计算算法的复杂度,只关心计算复杂度。
对于少量的谓词,您可以预先计算所有结果以创建缓存。请注意,您的缓存中将有 2 ^(谓词的数量)条目。
对于大量谓词,您不能这样做。我会说这听起来像动态规划,因为规则可能有重叠的组件。要增加这种重叠,您可以重写所有规则以使用单一类型的操作,例如与非门。然后您可以创建一个图形,其中谓词是输入,规则是输出。
因此您的规则如下所示:
R1 = (A NAND B) NAND (A NAND B)
R2 = (B NAND B) NAND C
R3 = (A NAND A) NAND (B NAND B) NAND C
您已经可以看到一些重叠。这将随着规则的数量而增加。您的图表将如下所示:
获得二进制赋值后,您可以从左到右计算图形。或者在动态编程风格中,您从 R1 开始并缓存所有中间结果以备后用,然后对 R2 和 R3 执行相同的操作。