2017-02-09 17 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)) 
*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)) 

:私は組み合わせのフルセットを持っています

*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)) 

そして二度目に:手動で私が最初に時間を反復処理し、これを取得することができますこのタイプの操作に利用できるアルゴリズムはありますか?私はしばらく検索してきましたが、私はそれを見つけることができません。私はJavaで作業していますが、他の言語でも動作します。

ありがとうございます!

+2

アルゴリズムではなくデザインパターンを探しているのではないかと思います。おそらく、戦略パターンのカテゴリに入るステートマシンの設計パターンが役立つかもしれません。 https://en.wikipedia.org/wiki/State_pattern また、Javaを使用している場合は、if else構造からネストしたswitch文を使用することもできます。 http://www.java-examples.com/nested-switch-statements-example –

+0

はい:ブール式は、積の和(OR)として表現できます(AND)。基本的には、A AND(B OR C)形式の各部分式を(A AND B)OR(A AND 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

ありがとうDavid!私はあなたのアプローチを試みます。 – MiguelFC