我需要确定两个不同的布尔表达式是否相同。例如:
事实上,这两者实际上是一样的。所以我需要检测它们是否相同。我正在使用C#。S1 =a∨b
S2 =(a∧¬b)∨b;
答案 0 :(得分:4)
我不确定我是否按照你的要求...如果这些是使用布尔值的表达式(也就是说,你的例子中的a和b是布尔值),你可以为它们计算真值表,并且如果每个案例都匹配,那么你的表达式是等价的。
还有其他方法,但这似乎很容易实现。只需插入a = true,b = true; a = true,b = false; a =假b =真; a = false,b = false,看看你得到了什么。
答案 1 :(得分:2)
除非你真的,真的聪明,而你的问题包含数百万个参数,我会说使用暴力。
你正在做的事情被称为“形式等价检查”,并且经常使用简化的有序二元决策图完成,此时我将编写维基百科文章,但是因为有人煞费苦心已经,他们在这里。
http://en.wikipedia.org/wiki/Formal_equivalence_checking
http://en.wikipedia.org/wiki/Binary_decision_diagram
......我不知道linq Expressions命名空间是否存在。在这种情况下,也许我会选择伊万所说的。
答案 2 :(得分:1)
没有开箱即用的方法。你得到的最接近的是Expression.Reduce()
方法,它没有你想要的减少。
您需要编写一个表达式解析器来简化,比如布尔表达式,然后编写一些逻辑来验证简化表达式是否相同。
示例类(没有验证,只是获取表达式的框架:
public class ExpressionTest {
public bool AreExpressionsSame<T>(Expression<T>/*<Func<bool,bool,bool>>*/ expr1, Expression<T> expr2) {
var expr1_reduced = expr1.Reduce();
var expr2_reduced = expr2.Reduce();
//at this point expr2_reduced is the same as it went it.
return true;
}
public void AreExpressionSameShouldAcceptLambda() {
ExpressionTest et = new ExpressionTest();
et.AreExpressionsSame<Func<bool,bool,bool>>((a,b) => a || b, (a,b)=>a && b || b);
}
}
答案 3 :(得分:0)
检查a和b是否具有相同的布尔值
private bool Equals(bool a,bool b){ 回来!(a ^ b); }
答案 4 :(得分:0)
如果所有S1
组合S2
为真,则表达式(S1 == S2)
和a, b
是等效的。这种重言式检查可以在C#
中作为真值表枚举实现,如下所示:
static bool S1(bool a, bool b)
{
return a || b;
}
static bool S2(bool a, bool b)
{
return (a && !b) || b;
}
static void Main(string[] args)
{
bool[] tf = { true, false };
bool bSame = true;
foreach(bool a in tf)
foreach(bool b in tf)
{
bSame = bSame && (S1(a, b) == S2(a, b));
}
Console.WriteLine("S1 {0} S2", bSame ? "==" : "!=");
}