2010-08-02 41 views
1

我需要確定兩個不同的布爾表達式是否相同。例如:如何確定兩個布爾表達式是否相同

S1 =一個∨ b
S2 =(一個∧ ¬ B)∨ B;

這兩個實際上是一樣的。所以我需要檢測它們是否相同。我正在使用C#。

+3

「爲什麼」這個詞會引起人們的注意?告訴使用你正在試圖解決的實際問題... – 2010-08-02 03:39:16

+0

你的意思是,做兩個表達式獲得相同的結果? – 2010-08-02 03:46:26

+2

這看起來不像C#。你的意思是'S1 = a | b','S2 = a&!b | b',其中'a'和'b'是布爾值? – 2010-08-02 03:52:01

回答

4

我不知道我是否按照你所問的問題......如果這些是使用布爾值表達式(即,在你的例子中的a和b是布爾值),你可以爲他們制定真值表,如果每個案例都匹配,那麼你的表達就是相同的。

還有其他的方法,但看起來相當直接的實施。只需插入a = true,b = true; a = true,b = false; a =假b =真; a = false,b = false,看看你得到了什麼。

2

除非你真的,真的聰明,你的問題包含數百萬的參數,我會說使用暴力。

你在做什麼叫做「形式等價性檢查」,並且經常用一個簡化的二元決策圖來完成,在這一點上我會寫維基百科的文章,但是因爲有人去做了麻煩已經,在這裏他們是。

http://en.wikipedia.org/wiki/Formal_equivalence_checking

http://en.wikipedia.org/wiki/Binary_decision_diagram

...而且我沒想到的是,LINQ表達式命名空間存在。在這種情況下,也許我會跟伊萬說的一樣。

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); 
    } 
} 
0

檢查如果A和B具有相同的布爾值

私人布爾的Equals(布爾一個,布爾b)中{! 回報(一^ b)條; }

0

表達S1S2是等價的,如果(S1 == S2)是所有a, b combinati真附件。這種重言式檢查可以在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 ? "==" : "!="); 
}