以编程方式拆分条件表达式
Split a conditional expression programmatically
我正在寻找一种已知的方法(如果有的话)将长条件表达式拆分为独立的语句。
例如,我有这个长表达式:
*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 工作,但任何其他语言也可以。
谢谢!
我们需要解析语句,然后应用一个相当简单的递归算法来扩展项。
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 定律简化涉及它的表达式。
我正在寻找一种已知的方法(如果有的话)将长条件表达式拆分为独立的语句。
例如,我有这个长表达式:
*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 工作,但任何其他语言也可以。
谢谢!
我们需要解析语句,然后应用一个相当简单的递归算法来扩展项。
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 定律简化涉及它的表达式。