プログラミング言語は、数学のように変数を使用しますか?


11

数学では、変数は任意の数をそこに置くことができることを意味し、方程式は依然として真です

root(square(x)) = abs(x)

プログラミング言語では、そうではありません。変数は変更できます。Pythonの場合:

y = (x**2)**.5
x *= 2
assert y == abs(x)

最後の行のxは同じではないため、例外が発生します。

不変変数を使用するプログラミング言語はありますか?


5
数学では、ほとんどの方程式は恒等式ではありません。たとえば、x ^ 2 + 5 = 6xは、x = 1またはx = 5の場合にのみ有効です。たとえば、sin( 2x)= 2 sin x cos xは、アイデンティティと呼ばれます。
アンドレアスレイブランド

4
数学の変数!=プログラミング言語の変数。数学の変数についての先入観をプログラミングに持ち込むと非常に多くの人が混乱するので、私は常に異なる名前も持つべきだと考えてきました。
ライライアン

1
数学の変数の目標は、プログラミングの目標と同じではないと思います。数学では、変数は、知りたい未知の値、または結果を得るために値を入れる式の場所を表します。一般的なプログラミング言語では、2番目のケースのみが理にかなっています。最初のケースでは、Mathematicaのようなソフトウェアが必要です。
パゴッティ

いいえ、そうではありません。「x = 5」に任意の数字を入れてみてください。

回答:


6

「プログラミング言語は数学で変数を使用しますか?」というタイトルの質問に答えるために:C、C#、Java、C ++、およびその他のCスタイル言語は、数学で使用される方法で変数を使用します。

=の代わりに==を使用するだけです。

あなたのオリジナルを

root(square(x)) = abs(x)

次に、構文を変更することなく、それを直接C#に変換できます。 Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

これは、xの2乗が使用しているデータ型の最大値よりも小さい限り、xの値に対してtrueと評価されます。 (Javaはかなり似ていますが、Math名前空間は少し違うと思います)

この次のビットは、C#でのコンパイルに失敗します。これは、ある操作の戻り値を別の操作に割り当てることができないことをコンパイラが十分に理解しているためです。

Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)

不変性はこれとは関係ありません。不変の言語で値を割り当てる必要がありますが、=を演算子として使用して特定の言語がこれを行うことを選択する可能性は完全にあります。

ポイントをさらに証明すると、xの正当な値を使い果たしてオーバーフロー例外が発生するまで、このループが実行されます。

 while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
        {
            ++x;
            System.Console.WriteLine(x);
        }

これが、数学者が割り当てに=を使用することを嫌う理由です。それらを混乱させます。これはあなたを混乱させたと思います。例を挙げてください

y = (x**2)**.5
x *= 2
assert y == abs(x)

これを代数にすると、次のようになります。

abs(2x)= root(x ^ 2)

もちろん、これは0以外の値には当てはまりません。不変性は、元の方程式の左辺と右辺の評価の間に余分なステップを追加するときにxの値を変更するエラーからあなたを救います。実際に式を評価する方法は変わりません。


24

Haskellなどの純粋に機能的なプログラミング言語は、不変の変数を強制します。ただし、変数ではなく識別子と呼びます。


3
不純な関数型言語であるErlangでは、変数も不変です。
sepp2k

私はあまりアーランを知りません。それらは原子ですよね?Erlangでは、あらゆる種類の可変変数のようなストレージを使用できますか?
イオヌG.スタン

3
@Ionut:いいえ、ErlangアトムはLispおよびRubyでシンボルと呼ばれるものです。2番目の質問について:プロセス辞書があります。これはグローバルな(プロセスごとの)可変ハッシュマップです。しかし、これは私の経験ではめったに使用されません。それ以外は、参照の透過性を破る唯一の方法はメッセージの受け渡しです。
sepp2k

4
うーん、私はいくつかのアーランを学ぶ必要があります:)
Ionuț G. Stan

これは質問にどう答えますか?
gnat

5

=プログラミング言語で使用される記号が誤解されています。 <-、「ストア」、またはCOBOL MOVEを意味する代わりに使用する必要があります。

さらに、Prologは数学のような変数を使用します。変数は変更できません。Prologエンジンは変数を入力して、ソリューションが存在するかどうかを確認します。

また、カレーはHaskellとPrologのミックスです。


3

C、C ++、およびObjective-Cは、「const」型修飾子を使用して、関数(およびメソッド)引数、および他の変数(識別子)の不変性を指定できます。


3

クラスの更新許可しないことによりPythonで不変性をシミュレートすることもできます。前述のように、ほとんどの純粋な関数型プログラミング言語は不変性を強制します。ClojureJVMプラットフォームに最近追加されたものです(ClojureはLISPの方言です)

ではScalaの(また、JVMの言語)OOとFPサポート変数の単一化で宣言されたval不変です。Scalaの表現力とOO / FPハイブリッドサポートにより、ScalaはMathematicaに似た外観になります。(Akkaは、Erlang OTPとSTMなどのClojure機能をScalaやJavaに追加するフレームワークです。)LACASAは、Scalaでオブジェクト機能の規律を実施し、一意のオブジェクト参照を提供するために、型システムとプログラミングモデルを追加します。(コード)(理論的背景

Javaでは、宣言された変数finalは不変であり、Google GuavaなどのJava ライブラリにはコレクションの不変ライブラリが含まれています。Java Stringも常に不変です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.