【问题标题】:building a graph from boolean expression in c++从 C++ 中的布尔表达式构建图形
【发布时间】:2013-09-09 05:16:12
【问题描述】:

我正在尝试将(A+(B*C)) 转换为图形结构,其中+ 表示并联,* 表示串联。如果n1n2n3是图中的三个节点,那么:

n1 拥有edge(A),edge(B)

n2 拥有edge(B),edge(C)

n3 拥有edge(A),edge(C)

我知道布尔表达式中的变量将是边缘,但我不明白如何 从为图的顶点给出的表达式中找到节点。

【问题讨论】:

  • 将其视为解析问题。并显示您尝试过的代码。

标签: c++ graph boolean


【解决方案1】:

您可以使用expression templates 来生成表达式的语法树:

class Boolean
{
public:
    Boolean(bool b) : _b( b ) {}

private:
    bool _b;
};

template<typename LHS , typename RHS>
struct parallel
{
    LHS& left;
    RHS& right;  

    parallel(const LHS& _left , const RHS& _right) : left( _left ) , right( _right ) {}
};

template<typename LHS , typename RHS>
struct serie
{
    LHS& first;
    RHS& second;  

    serie(const LHS& _left , const RHS& _right) : first( _left ) , second( _right ) {}
};


/* Boolean vs Boolean parallel expression */
parallel<Boolean,Boolean> operator+(const Boolean& lhs , const Boolean& rhs)
{
    return parallel<Boolean,Boolean>( lhs , rhs );
}

/* Boolean vs Boolean serie expression */
serie<Boolean,Boolean> operator*(const Boolean& lhs , const Boolean& rhs)
{
    return serie<Boolean,Boolean>( lhs , rhs );
}


/* Boolean vs internal node parallel expressions */

template<typename LHS , typename RHS>
parallel<parallel<LHS,RHS>,Boolean> operator+(const parallel<LHS,RHS>& lhs , const Boolean& rhs)
{
    return parallel<parallel<LHS,RHS>,Boolean>( lhs , rhs );
}

template<typename LHS , typename RHS>
parallel<Boolean,parallel<LHS,RHS>> operator+(const Boolean& lhs , const parallel<LHS,RHS>& rhs)
{
    return parallel<Boolean,parallel<LHS,RHS>>( lhs , rhs );
}

template<typename LHS , typename RHS>
parallel<serie<LHS,RHS>,Boolean> operator+(const serie<LHS,RHS>& lhs , const Boolean& rhs)
{
    return parallel<serie<LHS,RHS>,Boolean>( lhs , rhs );
}

template<typename LHS , typename RHS>
parallel<Boolean,serie<LHS,RHS>> operator+(const Boolean& lhs , const serie<LHS,RHS>& rhs)
{
    return parallel<Boolean,serie<LHS,RHS>>( lhs , rhs );
}


/* Boolean vs internal node serie expresssions */

template<typename LHS , typename RHS>
serie<parallel<LHS,RHS>,Boolean> operator*(const parallel<LHS,RHS>& lhs , const Boolean& rhs)
{
    return serie<parallel<LHS,RHS>,Boolean>( lhs , rhs );
}

template<typename LHS , typename RHS>
serie<Boolean,parallel<LHS,RHS>> operator*(const Boolean& lhs , const parallel<LHS,RHS>& rhs)
{
    return serie<Boolean,parallel<LHS,RHS>>( lhs , rhs );
}

template<typename LHS , typename RHS>
serie<serie<LHS,RHS>,Boolean> operator*(const serie<LHS,RHS>& lhs , const Boolean& rhs)
{
    return serie<serie<LHS,RHS>,Boolean>( lhs , rhs );
}

template<typename LHS , typename RHS>
serie<Boolean,serie<LHS,RHS>> operator*(const Boolean& lhs , const serie<LHS,RHS>& rhs)
{
    return serie<Boolean,serie<LHS,RHS>>( lhs , rhs );
}


/* internal node vs internal node parallel expressions */

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
parallel<parallel<LHS1,RHS1>,parallel<LHS2,RHS2>> operator+(const parallel<LHS1,RHS1>& lhs , const parallel<LHS2,RHS2>& rhs)
{
    return parallel<parallel<LHS1,RHS1>,parallel<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
parallel<serie<LHS1,RHS1>,serie<LHS2,RHS2>> operator+(const serie<LHS1,RHS1>& lhs , const serie<LHS2,RHS2>& rhs)
{
    return parallel<serie<LHS1,RHS1>,serie<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
parallel<parallel<LHS1,RHS1>,serie<LHS2,RHS2>> operator+(const parallel<LHS1,RHS1>& lhs , const serie<LHS2,RHS2>& rhs)
{
    return parallel<parallel<LHS1,RHS1>,serie<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
parallel<serie<LHS1,RHS1>,parallel<LHS2,RHS2>> operator+(const serie<LHS1,RHS1>& lhs , const parallel<LHS2,RHS2>& rhs)
{
    return parallel<serie<LHS1,RHS1>,parallel<LHS2,RHS2>>( lhs , rhs );
}


/* internal node vs internal node serie expressions */

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
serie<parallel<LHS1,RHS1>,parallel<LHS2,RHS2>> operator*(const parallel<LHS1,RHS1>& lhs , const parallel<LHS2,RHS2>& rhs)
{
    return serie<parallel<LHS1,RHS1>,parallel<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
serie<serie<LHS1,RHS1>,serie<LHS2,RHS2>> operator*(const serie<LHS1,RHS1>& lhs , const serie<LHS2,RHS2>& rhs)
{
    return serie<serie<LHS1,RHS1>,serie<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
serie<parallel<LHS1,RHS1>,serie<LHS2,RHS2>> operator*(const parallel<LHS1,RHS1>& lhs , const serie<LHS2,RHS2>& rhs)
{
    return serie<parallel<LHS1,RHS1>,serie<LHS2,RHS2>>( lhs , rhs );
}

template<typename LHS1 , typename RHS1 , typename LHS2 , typename RHS2>
serie<serie<LHS1,RHS1>,parallel<LHS2,RHS2>> operator*(const serie<LHS1,RHS1>& lhs , const parallel<LHS2,RHS2>& rhs)
{
    return serie<serie<LHS1,RHS1>,parallel<LHS2,RHS2>>( lhs , rhs );
}

其用法示例如下:

int main()
{
    Boolean a(true) , b(false) , c(true);
    auto result = (a+b)*(a+c); //serie(parallel(a,b),parallel(a,c))
}

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2022-06-27
    • 2012-05-17
    • 2017-12-26
    • 2017-02-05
    相关资源
    最近更新 更多