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

Split a conditional expression programmatically

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

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

*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 工作,但任何其他语言也可以。

谢谢!

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

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 定律简化涉及它的表达式。