2017-02-09 26 views
2

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

例如,我有这样的长期表现:

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

谢谢!

+2

我不知道你是否正在寻找设计模式而不是算法。也许属于战略模式类别的状态机设计模式可能会有所帮助。 https://en.wikipedia.org/wiki/State_pattern 另外,当你使用Java时,如果你更喜欢if else结构,你可以尝试嵌套的switch语句。 http://www.java-examples.com/nested-switch-statements-example –

+0

是的:任何布尔表达式可以表示为产品(AND)的总和(OR)。基本上,需要将A和(B或C)形式的每个子表达式重写为(A和B)或(A和C)。 –

+0

即,要将公式转换为https://en.wikipedia.org/wiki/Disjunctive_normal_form。 –

回答

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

+0

谢谢大卫!我会尝试你的方法。 – MiguelFC