2 つの異なるブール式が同じかどうかを判断する必要があります。例えば:
S1 = a ∨ b
S2 = (a ∧ ¬b) ∨ b;
これら2つは実際には同じです。したがって、それらが同じかどうかを検出する必要があります。私はC#を使用しています。
2 つの異なるブール式が同じかどうかを判断する必要があります。例えば:
S1 = a ∨ b
S2 = (a ∧ ¬b) ∨ b;
これら2つは実際には同じです。したがって、それらが同じかどうかを検出する必要があります。私はC#を使用しています。
あなたが求めていることに従うかどうかわかりません...これらがブール値を使用した式である場合(つまり、例の a と b がブール値である場合)、それらの真理値表を作成できます。一致する場合、式は同等です。
他の方法もありますが、実装するのはかなり簡単です。a=true, b=true; を差し込むだけです。a=真、b=偽; a=偽 b=真; a=false、b=false で、何が得られるかを確認してください。
あなたが非常に頭が良く、問題に何百万ものパラメータが含まれていない限り、私は総当たりを使用することをお勧めします。
あなたがやっていることは「正式な等価性検査」と呼ばれ、縮小された順序付き二分決定図で行われることが多く、この時点で私はウィキペディアの記事を書いていますが、誰かがすでにそれを行うのに苦労しているので、ここで彼らです。
http://en.wikipedia.org/wiki/Formal_equivalence_checking
http://en.wikipedia.org/wiki/Binary_decision_diagram
...そして、linq Expressions 名前空間が存在することを知りませんでした。その場合、私はイヴァンの言うことに従うかもしれません。
それを行うためのすぐに使える方法はありません。あなたが得る最も近いのは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);
}
}
a と b のブール値が同じかどうかを確認する
プライベート bool Equals(bool a, bool b) { return !(a ^ b); }