2011-01-19 9 views
6

グループ、モノイド、リングのような代数構造を使って、コードの再利用性をどのように向上させることができますか? (あるいは、どのように私はプログラミングでこれらの種類の構造を利用することができますか、少なくとも私は高校の何の理論も学んでいませんでした)。代数構造とプログラミング

私はこれが可能だと聞きましたが、プログラミングでそれらを適用し、プログラムでハードコアの数学をジェネラリに適用する方法を理解できません。

+2

これらの孤独な同形はどうですか? – Blender

+1

[monads]​​(http://ja.wikipedia.org/wiki/Monad_(functional_programming))を考えている人(そして「待って、誰が私にそれを提案していますか?それの後ろにあるもの - 私はそれが「モナド」と正当に呼ばれているかどうかは分かりません」)。 – delnan

答えて

1

実際に数学的思考のように役立つ数学的なものではありません。抽象化はプログラミングの鍵です。実生活の概念を数や関係に変えることは、私たちが毎日やっていることです。代数はすべての母であり、代数は正しさを定義する規則の集合であり、抽象の最高レベルなので、代数の理解は、より明確で、より速く、より効率的に考えることができるということを意味します。セット理論からカテゴリー理論、ドメイン理論などに至るまで、すべては実用的な課題、抽象化、一般化の要件から来ています。 AIエージェント、プログラミング言語、基本的な概念、ツールなどの開発を考えているのであれば、それらを実際に知る必要はありません。

0

私はこのようなものは、コンピュータサイエンスの世界に存在しない考えを持っていたとして、この答えを無視してください。)


私は2つのフィールドが(しゃれが意図していない)任意の重複を持ってないと思います。リング/フィールド/グループは数学のオブジェクトを扱います。

Fのすべての要素について、Fにはa +(-a)= 0となる要素が存在します。同様に、Fの任意のa (a +(-b)とa・b^-1はa-bとa/b-1と表記されている) b)である。換言すれば、減算および除算演算が存在する。

これはプログラミングの意味ですか?私は確実にPythonのlistオブジェクトの逆数を返すことはできません(オブジェクトを破壊することはできますが、それはの逆数のようになります。逆です。私はあなたがどこかでPython-Ringを定義しようとするかもしれないと思います。最後にはうまくいかないでしょう)。でもは、コードの可読性についてはlists ...

を分割についてを考えてはいけない、私はこれも適用することができますどのように絶対にないアイデアを持っていないため、このアプリケーションは無関係です。

これは私の解釈ですが、数学の専攻となっているために、さまざまな分野の他の用語がわからなくなることがあります。

+0

"What heck ... programming?":代数構造定義は、特定の型の関数です。モノイドの場合、 '()|'の関数です。 G * G→G 'となる。恒等要素または乗算を返す関数これはバイナリツリー形式で式を評価する関数と非常に似ていますか?実際、バイナリツリーやモノイドも同様の概念です。このため、関数型プログラミングでは代数的データ型*という用語が使われています。 –

+0

Heh、それは私のバッグの中に多くのコンピュータサイエンスがないことを示しています。私は二分木とそのモノイドのものをもっと見なければならないでしょう。情報をありがとう! – Blender

0

関数プログラミングでは、 Haskellでは、状態をモナドに変換するプログラムを構築するのが一般的です。そうすることで、非常に異なるプログラムのモナドに汎用アルゴリズムを再利用できるということです。

C++の標準テンプレートライブラリには、monoidという概念があります。この考え方は、一般アルゴリズムは、その正確さのためにモノイドの公理を満たす操作を必要とするかもしれないということである。

たとえば、操作中に閉じられている(数値、文字列など)で操作しているTを証明できる場合は、特定のエラーを確認する必要はありません。私たちはいつも有効なTを返します。操作が連想(x * (y * z) = (x * y) * z)であることが証明できれば、fork-joinアーキテクチャを再利用できます。さまざまなライブラリで実装されているシンプルな並列プログラミング方法です。

0

最近、コンピュータ科学ではcategory theoryから多くの人工知能が得られているようです。抽象的な数学の抽象化を利用して、コードの再利用性を向上させるために使用されている数学的エンティティの全仲間である、モナド、モノイド、ファンクタを取得します。

0

リストは1世代のフリー・モノイドであり、バイナリー・ツリーはグループです。有限または無限のいずれかの変形があります。

開始ポイント:

あなたは圏論を勉強したいこと、そして道のカテゴリ理論は、代数的構造に近づく:それは正確な方法です関数型プログラミング言語は、少なくとも形状的にはデータ構造にアプローチする。

例:タイプAツリーは、グループ構造と同じである同型(*)の存在として読み出し

Tree A =() | Tree A | Tree A * Tree A 

(IはG = Tree Aセット)

1 + G + G x G -> G 

ある

phi : 1 + G + G x G -> G 
() € 1   -> e 
x € G   -> x^(-1) 
(x, y) € G x G -> x * y 

実際、バイナリツリーは式を表すことができ、代数構造を形成しますure。 Gの要素は、同一性、要素の逆数、または2つの要素の積として読み取られます。バイナリツリーは、リーフ、単一ツリー、または1対のツリーのいずれかです。類似の形状に注意してください。

(*)と普遍的な財産ですが、それらは2つ(有限木または無限の怠惰な木)ですので、詳細には入りません。

+0

ただし、ツリーは結合的ではありませんか? (残念なことに、私は実際にカテゴリ理論を知らないので、これらのことをどのように見ているか分かりません...) – comingstorm

+0

@comingstorm:良い発言。グループの場合、 'phi'アプリケーションがどのように連合性に関して動作するかを記述する*可換ダイアグラム*があります。これを木に変換したい場合は、2つの木が等しいときに*述語*を書きます。ツリーは式(すなわち構文)を表し、ツリーに*セマンティクス*を与えると、グループ法の連想が働きます。 –

関連する問題