Verwendet eine Programmiersprache Variablen wie in Mathematik?

11

In der Mathematik bedeutet eine Variable, dass Sie dort eine beliebige Zahl eingeben können, und eine Gleichung bleibt weiterhin wahr:

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

In Programmiersprachen ist dies nicht der Fall: Eine Variable kann sich ändern. In Python:

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

löst eine Ausnahme aus, da x in der letzten Zeile nicht dasselbe ist.

Gibt es Programmiersprachen, die unveränderliche Variablen verwenden?


quelle
5
In der Mathematik sind die meisten Gleichungen keine Identitäten. Zum Beispiel ist x ^ 2 + 5 = 6x genau dann gültig, wenn x = 1 oder x = 5. Gleichungen, die für alle Werte in einem "Universum" gültig sind (wie die Menge aller reellen Zahlen), z. B. sin ( 2x) = 2 sin x cos x werden Identitäten genannt .
Andreas Rejbrand
4
Variablen in Mathe! = Variablen in Programmiersprachen. Ich habe immer gedacht, dass sie auch unterschiedliche Namen haben sollten, da so viele Leute verwirrt sind, wenn sie Vorurteile über Variablen in der Mathematik in die Programmierung einbringen.
Lie Ryan
1
Ich denke, dass das Ziel von Variablen in der Mathematik nicht dasselbe ist wie in der Programmierung. In der Mathematik stellen Variablen einen unbekannten Wert dar, den Sie kennen möchten, oder eine Stelle in einer Formel, an der Sie einen Wert eingeben, um ein Ergebnis zu erhalten. Für gängige Programmiersprachen ist nur der zweite Fall sinnvoll. Für den ersten Fall benötigen Sie eine Software wie Mathematica.
Pagotti
Nein, tun sie nicht. Versuchen Sie, eine beliebige Zahl auf "x = 5" zu setzen.

Antworten:

6

Um Ihre Titelfrage zu beantworten: "Verwendet eine Programmiersprache Variablen wie in Mathematik?": C, C #, Java, C ++ und jede andere Sprache im C-Stil verwenden Variablen so, wie sie in Mathematik verwendet werden.

Sie müssen nur == anstelle von = verwenden.

Wenn ich dein Original nehme

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

Dann kann ich das direkt in C # übersetzen, ohne andere Änderungen als für die Syntax vorzunehmen. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Dies wird für jeden Wert von x als wahr ausgewertet, solange x im Quadrat kleiner als das Maximum für den von Ihnen verwendeten Datentyp ist. (Java wird sehr ähnlich sein, aber ich glaube, der Math-Namespace ist etwas anders)

Dieses nächste Bit kann in C # nicht kompiliert werden, da der Compiler klug genug ist, um zu wissen, dass ich die Rückgabe einer Operation keiner anderen Operation zuweisen kann.

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

Unveränderlichkeit hat damit nichts zu tun. Sie müssen den Wert weiterhin in einer unveränderlichen Sprache zuweisen, und es ist durchaus möglich, dass eine bestimmte Sprache dies mit = als Operator auswählt.

Diese Schleife wird weiter ausgeführt, bis Sie die zulässigen Werte von x erschöpft haben und eine Überlaufausnahme erhalten:

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

Aus diesem Grund hassen Mathematiker die Verwendung von = für die Zuweisung. Es verwirrt sie. Ich denke, das hat dich dazu gebracht, dich selbst zu verwirren. Nehmen Sie Ihr Beispiel

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

Wenn ich daraus Algebra mache, bekomme ich folgendes:

abs (2x) = Wurzel (x ^ 2)

Was natürlich nicht für andere Werte als 0 gilt. Die Unveränderlichkeit erspart Ihnen nur den Fehler, den Wert von x zu ändern, wenn Sie zusätzliche Schritte zwischen der Bewertung der linken und rechten Seite der ursprünglichen Gleichung hinzufügen. Es ändert nichts daran, wie Sie den Ausdruck bewerten.

MIA
quelle
24

Rein funktionierende Programmiersprachen wie Haskell erzwingen unveränderliche Variablen. Ich nenne sie aber gerne Bezeichner anstelle von Variablen.

Ionuț G. Stan
quelle
3
Auch in Erlang, einer unreinen Funktionssprache, sind Variablen unveränderlich.
sepp2k
Ich weiß nicht zu viel Erlang. Das sind doch die Atome, oder? Erlaubt Erlang jede Art von veränderlichem variablenähnlichem Speicher?
Ionuț G. Stan
3
@Ionut: Nein, Erlang-Atome sind sogenannte Symbole in Lisp und Ruby. Zu Ihrer zweiten Frage: Es enthält das Prozesswörterbuch, eine globale (pro Prozess) veränderbare Hash-Map. Dies wird jedoch meiner Erfahrung nach sehr selten verwendet. Abgesehen davon ist die einzige Möglichkeit, die referenzielle Transparenz zu brechen, die Nachrichtenübermittlung.
sepp2k
4
Hm, ich sollte mir etwas Erlang lernen :)
Ionuț G. Stan
Wie beantwortet dies die gestellte Frage?
Mücke
5

Das =in Programmiersprachen verwendete Zeichen ist irreführend. <-, was "speichern" bedeutet, oder sogar COBOL MOVEsollte stattdessen verwendet werden.

Zusätzlich verwendet Prolog Variablen wie math: Variablen können nicht geändert werden, und die Prolog-Engine füllt die Variablen aus, um festzustellen, ob die Lösungen vorhanden sind.

Curry ist auch eine Mischung aus Haskell und Prolog.

Ming-Tang
quelle
3

C, C ++ und Objective-C können die Unveränderlichkeit für Funktions- (und Methoden-) Argumente sowie andere Variablen (Bezeichner) mit dem Qualifizierer vom Typ "const" angeben.

Huperniketes
quelle
3

Sie können die Unveränderlichkeit auch in Python simulieren, indem Sie keine Aktualisierungen von Klassen zulassen. Wie bereits erwähnt, erzwingen die meisten reinen funktionalen Programmiersprachen die Unveränderlichkeit. Clojure wurde kürzlich zur JVM- Plattform hinzugefügt (Clojure ist ein LISP-Dialekt).

In Scala (ebenfalls eine JVM- Sprache) ist eine Vereinheitlichung der mit deklarierten OO- und FP-Unterstützungsvariablen valunveränderlich. Die Ausdruckskraft von Scala und die Unterstützung von OO / FP-Hybriden lassen Mathematica ähnlich aussehen . ( Akka ist ein Framework, das Scala und Java Erlang OTP- und Clojure-Funktionen wie STM .. hinzufügt .) LACASA fügt ein Typsystem und ein Programmiermodell hinzu, um die Objektfähigkeitsdisziplin in Scala durchzusetzen und eindeutige Objektreferenzen bereitzustellen. ( Code ) ( theoretischer Hintergrund )

In Java ist eine deklarierte Variable finalunveränderlich, und Java-Bibliotheken wie Google Guava enthalten unveränderliche Sammlungsbibliotheken. Java Strings sind auch immer unveränderlich.

oluies
quelle