【问题标题】:Split a conditional expression programmatically以编程方式拆分条件表达式
【发布时间】:2017-02-09 12:23:24
【问题描述】:

我正在寻找一种已知的方法(如果有的话)将长条件表达式拆分为独立的语句。

例如,我有这么长的表达式:

*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,但任何其他语言也可以。

谢谢!

【问题讨论】:

  • 我想知道您是否可能不是在寻找设计模式而不是算法。也许属于策略模式类别的状态机设计模式可能会有所帮助。 en.wikipedia.org/wiki/State_pattern 此外,当您使用 Java 时,如果您更喜欢 if else 结构,您可以尝试嵌套 switch 语句。 java-examples.com/nested-switch-statements-example
  • 是的:任何布尔表达式都可以表示为乘积 (AND) 的总和 (OR)。基本上,需要将 A AND (B OR C) 形式的每个子表达式重写为 (A AND B) OR (A AND C)。
  • 即,您要将公式转换为 en.wikipedia.org/wiki/Disjunctive_normal_form 。
  • 是的@DavidEisenstat,这就是我要找的。我创建了一个简单的函数,涵盖了我的大部分案例here,但我正在寻找更通用的函数(如果有的话)。

标签: java algorithm design-patterns strategy-pattern


【解决方案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

请参阅 https://github.com/eisenstatdavid/misc/blob/master/2017-02-10/dnf.go 以了解 Go 中的完整实现。该实现还解析*NOT 并使用德摩根定律简化涉及它的表达式。

【讨论】:

  • 谢谢大卫!我会试试你的方法。
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多