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

C# 如何确定两个布尔表达式是否相同,c#,boolean,boolean-logic,C#,Boolean,Boolean Logic,我需要确定两个不同的布尔表达式是否相同。例如: S1=a∨ b S2=(a)∧ (b)∨ b 这两个事实上是相同的。所以我需要检测它们是否相同。我用的是C#。我不确定我是否遵循了你的要求。。。如果这些表达式使用布尔值(即,示例中的a和b是布尔值),您可以为它们计算出真值表,如果每种情况都匹配,则您的表达式是等效的 还有其他方法,但这似乎是相当直接的实施。只需插入a=true,b=true;a=真,b=假;a=假b=真;a=false,b=false,看看你得到了什么。我不确定我是否遵循了你的要求

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

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


这两个事实上是相同的。所以我需要检测它们是否相同。我用的是C#。

我不确定我是否遵循了你的要求。。。如果这些表达式使用布尔值(即,示例中的a和b是布尔值),您可以为它们计算出真值表,如果每种情况都匹配,则您的表达式是等效的


还有其他方法,但这似乎是相当直接的实施。只需插入a=true,b=true;a=真,b=假;a=假b=真;a=false,b=false,看看你得到了什么。

我不确定我是否遵循了你的要求。。。如果这些表达式使用布尔值(即,示例中的a和b是布尔值),您可以为它们计算出真值表,如果每种情况都匹配,则您的表达式是等效的

还有其他方法,但这似乎是相当直接的实施。只需插入a=true,b=true;a=真,b=假;a=假b=真;a=false,b=false,看看你得到了什么。

除非你真的非常聪明,而且你的问题包含数百万个参数,否则我会说使用暴力

你所做的就是所谓的“形式等价性检查”,通常是用一个简化有序的二元决策图来完成的,在这一点上,我会在维基百科上写文章,但既然有人已经费心去做了,他们就来了

。。。我不知道linq表达式名称空间的存在。在这种情况下,也许我会同意伊万所说的。

除非你真的非常聪明,而且你的问题包含数百万个参数,我会说使用暴力

你所做的就是所谓的“形式等价性检查”,通常是用一个简化有序的二元决策图来完成的,在这一点上,我会在维基百科上写文章,但既然有人已经费心去做了,他们就来了


。。。我不知道linq表达式名称空间的存在。在这种情况下,也许我会同意伊万所说的。

没有现成的方法可以做到这一点。您得到的最接近的方法是method,它不能实现您想要的缩减

您需要编写一个表达式解析器来简化(比如布尔表达式),然后编写一些逻辑来验证简化的表达式是否相同

示例类(没有验证,只是获取表达式的框架:

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);
    }
}
公共类ExpressionTest{
公共布尔表达式相同(表达式/**/expr1,表达式expr2){
var expr1_reduced=expr1.Reduce();
var expr2_reduced=expr2.Reduce();
//在这一点上,expr2_reduced与过去一样。
返回true;
}
公共无效AreExpressionSameShouldAcceptLambda(){
ExpressionTest et=新的ExpressionTest();
等表示相同((a,b)=>a | | b,(a,b)=>a和b | b);
}
}

没有现成的方法可以做到这一点。最接近的方法是方法,它不能实现您想要的减少

您需要编写一个表达式解析器来简化(比如布尔表达式),然后编写一些逻辑来验证简化的表达式是否相同

示例类(没有验证,只是获取表达式的框架:

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);
    }
}
公共类ExpressionTest{
公共布尔表达式相同(表达式/**/expr1,表达式expr2){
var expr1_reduced=expr1.Reduce();
var expr2_reduced=expr2.Reduce();
//在这一点上,expr2_reduced与过去一样。
返回true;
}
公共无效AreExpressionSameShouldAcceptLambda(){
ExpressionTest et=新的ExpressionTest();
等表示相同((a,b)=>a | | b,(a,b)=>a和b | b);
}
}

检查a和b是否具有相同的布尔值

私有布尔等于(布尔a,布尔b){ 返回!(a^b);
}检查a和b是否具有相同的布尔值

私有布尔等于(布尔a,布尔b){ 返回!(a^b);
}表达式
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 ? "==" : "!=");
}

表达式
S1
S2
是等价的,如果
(S1==S2)
对所有
a、b
组合都为真值,则表达式
S1
S2
是等价的。这种重言式检查可以在
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 ? "==" : "!=");
}

“为什么”这个词突然出现在我的脑海里?告诉你使用你试图解决的实际问题……你的意思是,两个表达式得到相同的结果吗?这看起来不像C。你的意思是
S1=a | b
S2=a&!b | b
,其中
a
b
是布尔型的吗?从那以后我就用布尔代数符号编辑了你的问题您的符号有点混乱:∨" 为了或,”∧“为了和,还有”"当然不是。不过,我并不是想踩你的脚,所以如果这让人困惑,请继续并撤消我的编辑。@MitchWheat我目前正试图解决完全相同的问题。我正在构建一个自定义报告工具,允许用户指定数据过滤器来生成图表。然后可以对该图表进行注释。我需要将这些注释应用于t无论过滤器是如何应用的,都显示相同的图表。因此,名称为“Sam”且(Team=1或Team=2)的记录量与(Team=1或Team=2)的记录量相同和Name='Sam'。这是一个非常基本的例子。我认为解决方案中会涉及某种排序系统。“为什么”一词突然出现在脑海中?告诉你使用你试图解决的实际问题…你的意思是,两个表达式得到相同的结果吗?这看起来不像C。你的意思是
S1=a|b
S2=a&!b
,其中
a
b
ar