【发布时间】:2020-06-11 20:59:41
【问题描述】:
目标是通过查找变量之间的值依赖关系来优化大条件表达式,以减少逻辑 OR 语句。
假设我们有以下条件:
if((A == 0 && B == 0) || (A == 0 && B == 1) || (A == 0 && B == 2) ...
一定次数... 有没有办法通过自动满足以下条件来减少这种示例:
if(A == 0 && (B >= 0 && B <= 2))
第一个条件中涉及的数字仅在条件之前已知,不能手动输入。条件中还可能涉及数百个逻辑 OR 运算符。值之间可能存在差距(可能需要使用 % 运算符),但总有一种模式。
任何可以找到变量之间依赖关系的库或现有算法?
让我们再举一个例子:
if((A == 0 && B == 0) || (A == 0 && B == 2) || (A == 0 && B == 4)
可以翻译为:
if((A == 0 && B%2 == 0)
还有一个:
if((A == 0 && B == 0 && C == 0) || (A == 0 && B == 2 && C == 0) || (A == 0 && B == 4 && C == 0) || (A == 0 && B == 0 && C == 1) || (A == 0 && B == 2 && C == 1) || (A == 0 && B == 4 && C == 1))
会变成:
if(A==0 && B%2==0 && C>=0 && C<=1)
对于涉及的变量,我有每个术语的所有值。
我有类似[[0,0,0],[0,2,0],[0,4,0],[0,0,1],[0,2,1],[0,4,1]] 的东西(例如最后一个例子)
感谢您的时间和回答!
【问题讨论】:
-
离散数学可以帮助您(如果您是大学生,您可能已经知道,否则请查看en.wikipedia.org/wiki/Sequent)。但是,这只会帮助您简化条件,而不是像“%”这样的东西
-
你能有“混合”或更复杂的模式吗,
[[0, 2],[0, 4],[1,3],[1, 5]](B%2=A) 或(B+A) % 3 == 1。从您的示例中,您似乎可以通过单个变量进行推理,因此可以测试一些预定义的模式(常数、范围、gcd 取模,...) -
@Jarod42 可以有复杂的模式,但不能与 2 个变量混合(
B%2=A不可能发生),它总是链接到一个常量 -
@Berto99 去看看
标签: c++ if-statement optimization