如何确定两个布尔表达式是否相同

时间:2010-08-02 03:38:03

标签: c# boolean boolean-logic

我需要确定两个不同的布尔表达式是否相同。例如:

  

S1 =a∨b
  S2 =(a∧¬b)∨b;

事实上,这两者实际上是一样的。所以我需要检测它们是否相同。我正在使用C#。

5 个答案:

答案 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 ? "==" : "!=");
}