2017-02-09 9 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)로 표현할 수 있습니다. 기본적으로 A AND (B OR C) 형식의 각 하위 식을 (A AND B) 또는 (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