だから、私は本当に次のようなものを書きたいC ++でこの種のものに数回遭遇しました
case (a,b,c,d) of
(true, true, _, _ ) => expr
| (false, true, _, false) => expr
| ...
しかし、C++ では、必ず次のような結果になります。
bool c11 = color1.count(e.first)>0;
bool c21 = color2.count(e.first)>0;
bool c12 = color1.count(e.second)>0;
bool c22 = color2.count(e.second)>0;
// no vertex in this edge is colored
// requeue
if( !(c11||c21||c12||c22) )
{
edges.push(e);
}
// endpoints already same color
// failure condition
else if( (c11&&c12)||(c21&&c22) )
{
results.push_back("NOT BICOLORABLE.");
return true;
}
// nothing to do: nodes are already
// colored and different from one another
else if( (c11&&c22)||(c21&&c12) )
{
}
// first is c1, second is not set
else if( c11 && !(c12||c22) )
{
color2.insert( e.second );
}
// first is c2, second is not set
else if( c21 && !(c12||c22) )
{
color1.insert( e.second );
}
// first is not set, second is c1
else if( !(c11||c21) && c12 )
{
color2.insert( e.first );
}
// first is not set, second is c2
else if( !(c11||c21) && c22 )
{
color1.insert( e.first );
}
else
{
std::cout << "Something went wrong.\n";
}
特にエラーが発生しやすいように思われるため、これらすべての if と else をクリーンアップする方法があるかどうか疑問に思っています。case 式 (または C++ のステートメント) が網羅的でない場合に、SML が行うように、コンパイラに文句を言わせることができれば、さらに良いでしょう。この質問は少し漠然としています。要するに、C++ で任意の数の変数を含む網羅的な真理値表をどのように表すのでしょうか? 前もって感謝します。