1

この質問は奇妙に聞こえるかもしれませんが、実際には一連の vairables と、それらが有効な状態を生成するいくつかの条件があります。もちろん、私の理解に基づいてそれらをテストするコードを書きますが、すべての適切な最適化で有効なコードを生成するシステム/コードジェネレーターはありますか?

  $a   $b   Output
 ---------------
  0     0    1
  0     1    0
  1     0    1
  1     1    0

したがって、このシステムは php コードを生成する必要があります。

 if($b==0) {}

このため:

  $a   $b   Output
 ---------------
  0     0    0
  0     1    1
  1     0    1
  1     1    0

出力する必要があります:

 if(($a!=1 && $b!=1) && ($a!=0 && $b!=0)) {}
 // any better way?

もちろん、ここの 0 と 1 は説明用です。比較する必要がある実際の文字列/値があるため、巧妙な乗算手法は機能しません。

4

4 に答える 4

2

あなたのシステムはブール論理の拡張です(値間の&&、||、および特定の値の周りの ! を除き、複数の真理値がありますが、1つの真理値のみに基づいた結果も使用します)。そのため、通常のアプローチではうまくいきません。K-Map を見てきましたが、ここではうまくいかないと思います。

すべての A、B、C、... をすべての可能な組み合わせで結合し、可能なすべてのサブセットに新しい値を導入して ((A || B) && C を処理する)、可能な演算子のすべての組み合わせを試すことができます。これらすべてのサブセットについて、演算子の組み合わせの 1 つがすべての組み合わせに当てはまるかどうかを確認し、最後に規則を推測します値であり、プログラミングが面倒になります。(これらのルールを見つけるには、O(n^3) をはるかに超えることになります)

より速く/より簡単に/より高速ですが、より多くのメモリを消費するソリューションは、ハッシュテーブル/辞書/配列に真のすべての可能な組み合わせ (または、どちらのリストが短いかによって偽のすべて) を格納することです。

于 2011-04-06T13:09:10.837 に答える
1

真理値表のKマップを分析し、式を記述する ことで、最適化されたソリューションを生成できるはずです。

于 2011-04-06T13:03:02.353 に答える
0

これを手作業で行う方法については、多くの文献があります。Karnaugh マップを参照してください。これらの手法の 1 つを自動化できます。

しかし、本質的には、真理値表を表す素朴なブール方程式を作成し、その方程式にシンボリック ブール単純化器 (または最小化器) を適用することです (ハードウェア言語シンセサイザーは、コード生成プロセスの一部としてこれを行います)。

単純な方程式の作成は簡単です。真を生成する真理値表の各行の論理積を作成し、すべての論理積の論理和を取ります。最初のテーブルは単純な方程式を生成します。

 (~a & ~b)  |  (a & ~b) 

これにブール単純化を適用すると、次のようになります。

  ((~a | a) & ~b)  // combine terms
  (TRUE & ~b )    // consequence of ~a | a
  ~b  // the answer

2 番目のテーブルは単純な方程式を生成します。

 (~a & b) | (a & ~b )

これはさらに単純化されません。

これを実現するために、プログラム変換システムを使用できます。このようなシステムでは通常、入力言語 (この場合は真理値表) のパーサーを定義し、入力言語から出力言語への変換を定義し、さらに出力言語でさらに変換を定義できます。入力から出力への変換は、真理値表の表記をブール方程式の表記にマップします。ブール方程式の変換は、単純化を実行します。

単純化された式を取得したら、さらに別の変換セットを適用して、純粋なブール代数から最終的なコンピューター言語 (この場合は PHP) にマップします。

私たちは、DMS Software Reengineering Toolkitを使用して、この種のことをかなり頻繁に行ってきました。DMS はこの問題を解決するのに役立ちます: 連想代数と可換代数の書き直しを理解するため、複雑な数式に直面した場合でも単純化方程式をより簡単かつ堅牢に作成できます。

多くのケースで、文字どおり数十万のリテラル (A または ~A の形式の項) を持つ代数ブール式に DMS を適用しました。1 つの例は、センサー (工場の状態を読み取る) とアクチュエータ (工場の状態を変更するもの) の観点から工場を (文字通り) 制御する方法の記述を受け入れ、方程式を生成し、単純化してから翻訳するコード ジェネレーターです。それらを、PLC と呼ばれる産業用コントローラ用の複数の異なるターゲット コンピュータ言語に変換します。

ブール単純化ではなく、DMS を使用した実際の代数的単純化の例を見ることができます。ブール単純化は書きやすいです:-}

于 2011-04-07T16:08:07.617 に答える
0

CKen ( http://cken.sourceforge.net/ )だと思います (あなたにとっては良いことです)。

CKen は「大文字」と「小文字」の両方をサポートしているため、58 (= 2x29) 個の単一変数をサポートしています!

そして、最も重要な複数式を (区切り文字で) 使用できます。

例:a,b,c,d,e;(a+b)*c;d*e#a;

その反面、めちゃめちゃ速い!


変数 (変数) を式で使用する前に、変数を定義する必要があります。

于 2015-04-06T09:49:48.547 に答える