2012-03-23 16 views
2

非標準形式(NSF)ブール関数を標準形式(SF)に変換するJavaパーサーを作成したいと考えています。 NSFの非標準形式から標準形式をJavaで解析する

例:

A * B + D (A + B) C + A * B (A * B '+ A + B) D 

SFにNSFを取得するには、ブラケットを掛ける必要があります。上記の関数からのSFは次のようになります:A*B + D*A*C + D*B*C + A*B*A*B'*D + A*B*A*D + A*B*B*D

私はこれをどのように実装できますか?

1)「標準」(あなたの用語に関係のない)構文解析技術を使用して式を解析し、ブール式になるものを生成:

は、あなたがあなたの目的を達成するための4つのステップを行う必要があり

+0

これらがブール変数の場合、A * B * B * DをA * B * Dに簡略化してはいけませんか? 何を試しましたか?あなたは現在の式を読み込むパーサーを持っていますか、あるいはすでに解析されていますか? – Jim

+1

明らかに、それを解析し、表現を取得し、その表現を変換し、結果を事前に印刷します。もっと具体的なものは何ですか?何を試しましたか?あなたはすでに何を管理しましたか? – delnan

+0

あなたはどんな単純化をすべきですか? *があなたのAND記号で、+があなたのOR記号であるとすると、A * B *(A * B + A + B)はA * Bに減少することに注意してください。 *と+の両方が可換であるため、標準フォームを正規の順序で印刷することができます。 B 'はBとは異なる変数ですか? これは宿題ですか? – Jim

答えて

2

ありがとう(構文解析された)式を表すツリー。

2)ブール代数ルールを式ツリーに適用して、望ましくない表現からそれに変換します。あなたの "標準形式"は結合標準形(CNF)であるように見えるので、総和(例えばa *(b + c))の積を「乗算」して「かっこを取り除く」ために分布法則の代数ルールが必要です

3)a * b + a * b + c ==> a * b [a * b * c]のように、余分な用語を取り除くためにいくつかの簡略化規則を適用する必要がありますa * b * a '+ b * c ==> b * c [a * ..a'は取り消されます]。これはちょうど代数ルールです。

4)結果の代数項を人間が読める形式でPrettyPrintします。

あなたはこれをA)アドホック・ハンド・コード再帰的下降解析とアドホック・ルール・アプリケーションとprettyprintingで書くことができます。B)構文解析を行うパーサー・ジェネレータ(ANTLRはいいです)を得ることができます。アドホックな方法による操作、文字列テンプレートのような助けを借りたプレタイピング、またはC)構文解析、ツリーの構築、定義した代数ルールの適用、プリテイストプリントの組み込みが可能です。

DMS Software Reengineering ToolkitケースCをうまくやってください。 example of applying standard algebra rules that is a direct analog to your problemが表示されます。

本当に難しい問題の1つは、A * B * A 'が「false」であることを知っているなど、代数と代数性を扱うことです。代数則X * X' = > falseですが、代数ルールのパターンを直接確認することはできません。あなたは、可換性を説明する代数ルールを適用する必要があります。連想のための同じ議論。適切な演算子がそれらのプロパティを持つことを宣言すると、DMSがうまく処理することの1つが、あなたのためにそれを処理します。この例ではこれを見ることができます。

悲しいかな、Javaでコード化されていません。

関連する問題