以编程方式拆分条件表达式

时间:2017-02-09 12:23:25

标签: java algorithm design-patterns strategy-pattern

我正在寻找一种已知的方法(如果有的话)将长条件表达式拆分成独立的语句。

例如,我有这个长表达式:

*IF ( 
   ( *VALUE K01_PROCESS_COUNTS.Process_Name *EQ 'python' 
     *OR *VALUE K02_PROCESS_COUNTS.Process_Name *EQ 'java' ) 
   *AND 
   ( *VALUE K01_PROCESS_COUNTS.Process_Count *LT 1 
    *OR *VALUE K02_PROCESS_COUNTS.Process_Count *LT 2 )
 )

我想让这个陈述的所有可能组合都成立。手动我可以第一次迭代并得到这个:

*IF (
   ( *VALUE K01_PROCESS_COUNTS.Process_Name *EQ 'python' ) 
   *AND ( *VALUE K01_PROCESS_COUNTS.Process_Count *LT 1 
     *OR *VALUE K02_PROCESS_COUNTS.Process_Count *LT 2) )
*IF ( 
  ( *VALUE K02_PROCESS_COUNTS.Process_Name *EQ 'java' ) 
  *AND ( *VALUE K01_PROCESS_COUNTS.Process_Count *LT 1 
    *OR *VALUE K02_PROCESS_COUNTS.Process_Count *LT 2) )

我将第二次拥有全套组合:

*IF ( ( *VALUE K01_PROCESS_COUNTS.Process_Name *EQ 'python' ) 
   *AND ( *VALUE K01_PROCESS_COUNTS.Process_Count *LT 1 ) )
*IF ( ( *VALUE K01_PROCESS_COUNTS.Process_Name *EQ 'python' ) 
   *AND ( *VALUE K02_PROCESS_COUNTS.Process_Count *LT 2 ) )
*IF ( ( *VALUE K02_PROCESS_COUNTS.Process_Name *EQ 'java' ) 
   *AND ( *VALUE K01_PROCESS_COUNTS.Process_Count *LT 1 ) )
*IF ( ( *VALUE K02_PROCESS_COUNTS.Process_Name *EQ 'java' ) 
   *AND ( *VALUE K02_PROCESS_COUNTS.Process_Count *LT 2 ) )

我正在考虑从头开始这样做,但我想知道,这种类型的操作有没有可用的算法?我一直在寻找,但我无法找到它。我在Java工作,但任何其他语言也都可以。

谢谢!

1 个答案:

答案 0 :(得分:1)

我们需要解析语句,然后应用一个相当简单的递归算法来扩展术语。

to expand L *AND R:
    for l in expand(L):
        for r in expand(R):
            yield l *AND r

to expand L *OR R:
    for l in expand(L):
        yield l
    for r in expand(R):
        yield r

有关Go中的完整实施,请参阅https://github.com/eisenstatdavid/misc/blob/master/2017-02-10/dnf.go。该实现还解析*NOT并使用De Morgan定律简化涉及它的表达式。