我正在寻找一种已知的方法(如果有的话)将长条件表达式拆分成独立的语句。
例如,我有这个长表达式:
*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工作,但任何其他语言也都可以。
谢谢!
答案 0 :(得分: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定律简化涉及它的表达式。