質問
PHPでCAS(Computer Algebra System)を作成していますが、今は行き詰まっています。
今、私はトークナイザーを書きました。次のような方程式を変換します: ジェネラコディセタグプレ
これへ: ジェネラコディセタグプレ
(ここで、groupは別のトークンのセットです)。この方程式を単純化するにはどうすればよいですか?ええ、私はあなたが何ができるか知っています:X変数を追加します、しかしそれらはサブグループにあります。これらのトークンを処理するために使用できる最善の方法は何ですか?
解決
本当に便利な次のステップは、解析ツリーを構築することです。
中置パーサーを作成して、これらの1つを作成します。これを行うには、単純な再帰下降パーサーを作成するか、大きな銃とパーサジェネレータの使用。いずれの場合も、正式な文法を作成するのに役立ちます。 ジェネラコディセタグプレ
この文法は2x
構文を処理しませんが、簡単に追加できるはずです。
文法規則での再帰の巧妙な使用に注意してください。 primary
は、変数、数値、および括弧で囲まれた式のみをキャプチャし、演算子に遭遇すると停止します。 multiplicative
は、primary
記号で区切られた1つ以上の*
式を解析しますが、+
または-
記号に遭遇すると停止します。 additive
は、multiplicative
と+
で区切られた1つ以上の-
式を解析しますが、)
に遭遇すると停止します。したがって、再帰スキームによって演算子の優先順位が決まります。
予測パーサーを実装することはそれほど難しくありません。以下で行ったように( ideone.comで完全な例を参照): ジェネラコディセタグプレ
さて、これで、この素敵な解析ツリーと、それに合う美しい画像ができました。それで? (今のところ)あなたの目標は、単に用語を組み合わせてフォームの結果を取得することかもしれません: ジェネラコディセタグプレ
その部分はあなたにお任せします。解析ツリーがあると、物事がはるかに簡単になるはずです。
他のヒント
PHPは、文字列、数値、配列が得意です。しかし、それは、本当にツリーが必要な「シンボリック式」を処理するためのネイティブの機構がないため、シンボリック式の操作を実装するには不十分な言語です。はい、そのすべての機械を実装できます。難しいのは、代数的操作を行うことです。やや洗練されたものを作りたいのなら、それはかなり多くの仕事です。理想的には、変換を直接かつ簡単に作成するのに役立つ機械が必要です。
たとえば、任意の代数ルールをどのように実装しますか?結合性と可換性? 「距離を置いてマッチングする」という用語?例: ジェネラコディセタグプレ
シンプルなCASを実装する方法を
本 コンピューター代数とシンボリック計算:ジョエルS.コーエンによる数学的方法 代数式を自動的に単純化するためのアルゴリズムについて説明します。
このアルゴリズムは、C#の Symbolism 数式処理ライブラリで使用されます。あなたの例では、次のC#プログラム: ジェネラコディセタグプレ
コンソールに以下を表示します: ジェネラコディセタグプレ