5

ブール式の比較に問題があります(ORは+、ANDは*)。より正確に言うと、ここに例があります。

「A+B + C」という表現があり、「B + A+C」と比較したい。文字列のように比較することは解決策ではありません-式が一致しないことがわかりますが、これはもちろん誤りです。それらの表現を比較する方法について何かアイデアはありますか?

この問題にどのように取り組むことができるかについてのアイデアはありますか?私はあらゆる種類の提案を受け入れますが、(注として)私のアプリケーションの最終的なコードはC ++で記述されます(もちろんCも受け入れられます)。

通常の式には、括弧を含めることもできます。

(A * B * C)+DまたはA+ B *(C + D)+ X * Y

前もって感謝します、

イウリアン

4

2 に答える 2

9

真理値表を徹底的に(そしておそらくは徹底的に)作成するための競合するアプローチは、すべての式を標準形に縮小し、それらを比較することだと思います。たとえば、記号の順序(たとえば、用語内のアルファベット順)と用語(たとえば、用語の最初の記号によるアルファベット順)に関する規則を使用して、すべてを連言標準形に書き直します。もちろん、これには、ある式の記号Aが別の式の記号Aと同じである必要があります。

式をCNFに書き換えるためのCまたはC++関数を書く(またはネットから取得する)のはどれほど簡単かはわかりません。ただし、CおよびC ++では多くのAI作業が行われているため、Googleで何かを見つけることができるでしょう。

また、このアプローチと真理値表アプローチの計算の複雑さの比較についても少しわかりません。同じだと強く思います。

真理値表を使用する場合でも、正規表現を使用する場合でも、もちろん、入力フォームを、含まれているさまざまな記号の数に基づいてグループに分割することで、実行する作業を抑えることができます。

編集:他の回答、特にすべての真理値表を生成して比較するという提案を読んだとき、@Iulianは可能な真理値表の数を大幅に過小評価していると思います。

式を記述するためにRPNを決定するとします。これにより、角かっこを処理する必要がなくなり、10個の記号、つまり9個の(二項)演算子があります。10個あります!記号の異なる順序、および演算子の2^9の異なる順序。したがって、10個になります。x 2 ^9==この式の真理値表の1,857,945,600行。これにはいくつかの重複が含まれます。たとえば、「and」と「or」のみを含む式は、記号の順序に関係なく同じになります。しかし、私はこれをさらに理解できるかどうかわかりません...

それとも私は大きな間違いを犯していますか?

于 2010-06-03T12:08:18.017 に答える
8

考えられるすべての入力について各式の真理値表を計算してから、真理値表を比較できます。

于 2010-06-03T11:43:22.357 に答える