2017-02-09 28 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