Czy jakiś język programowania używa zmiennych, ponieważ są one matematyczne?

11

W matematyce zmienna oznacza, że ​​możesz wstawić tam dowolną liczbę, a równanie nadal będzie prawdziwe:

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

W językach programowania tak nie jest: var może się zmienić. W Pythonie:

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

zgłosi wyjątek, ponieważ x w ostatnim wierszu nie jest taki sam.

Czy istnieją języki programowania, które używają niezmiennych zmiennych?


źródło
5
W matematyce większość równań nie jest tożsamościami. Na przykład x ^ 2 + 5 = 6x jest poprawna tylko wtedy, gdy x = 1 lub x = 5. Równania, które są poprawne dla wszystkich wartości w pewnym „wszechświecie” (takim jak zbiór wszystkich liczb rzeczywistych), np. Sin ( 2x) = 2 sin x cos x, nazywane są tożsamościami .
Andreas Rejbrand
4
zmienne matematyczne! = zmienne w językach programowania. Zawsze uważałem, że powinny mieć również inne nazwy, ponieważ tak wielu ludzi jest zdezorientowanych, kiedy wprowadzają do programowania wstępne założenia dotyczące zmiennych matematycznych.
Lie Ryan
1
Myślę, że cel zmiennych w matematyce nie jest taki sam jak w programowaniu. W matematyce zmienne reprezentują nieznaną wartość, którą chcesz poznać, lub miejsce w formule, którą umieszczasz w celu uzyskania wyniku. W przypadku popularnych języków programowania sensowny jest tylko drugi przypadek. W pierwszym przypadku potrzebujesz oprogramowania takiego jak Mathematica.
Pagotti
Nie, nie robią tego. Spróbuj wpisać dowolną liczbę na „x = 5”.

Odpowiedzi:

6

Aby odpowiedzieć na pytanie tytułowe „Czy jakikolwiek język programowania używa zmiennych w matematyce?”: C, C #, Java, C ++ i inne języki C używają zmiennych w sposób, w jaki są używane w matematyce.

Musisz tylko użyć == zamiast =.

Jeśli wezmę twój oryginał

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

Następnie mogę przetłumaczyć to na C # bezpośrednio, bez żadnych zmian innych niż dla składni. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Spowoduje to ocenę wartości true dla dowolnej wartości x, o ile x podniesiony do kwadratu jest mniejszy niż maksimum dla używanego typu danych. (Java będzie rażąco podobna, ale uważam, że przestrzeń nazw Math jest nieco inna)

Następnego bitu nie uda się skompilować w języku C #, ponieważ kompilator jest wystarczająco inteligentny, aby wiedzieć, że nie mogę przypisać powrotu jednej operacji do innej.

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

Niezmienność nie ma z tym nic wspólnego. Nadal musisz przypisać wartość w niezmiennym języku i jest całkiem możliwe, że dany język zdecyduje się to zrobić, używając = jako operatora.

Co więcej, ta pętla będzie działać do wyczerpania dopuszczalnych wartości x i uzyskania wyjątku dotyczącego przepełnienia:

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

Dlatego matematycy nienawidzą używania = do przypisania. To ich myli. Myślę, że to doprowadziło cię do pomieszania się. Weź swój przykład

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

Kiedy zamieniam to w algebrę, otrzymuję to:

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

Co oczywiście nie jest prawdą dla wartości innych niż 0. Niezmienność pozwala jedynie uniknąć błędu zmiany wartości x, gdy dodasz dodatkowe kroki między oceną lewej i prawej strony pierwotnego równania. To tak naprawdę nie zmienia sposobu oceny wyrażenia.

MIA
źródło
24

Czysto funkcjonalne języki programowania, takie jak Haskell , wymuszają niezmienne zmienne. Lubię jednak nazywać je identyfikatorami, a nie zmiennymi.

Ionuț G. Stan
źródło
3
W Erlang, który jest nieczystym językiem funkcjonalnym, zmienne również są niezmienne.
sepp2k 16.10.10
Nie znam za dużo Erlanga. To są atomy, prawda? Czy Erlang zezwala na dowolne zmienne przechowywanie podobne do zmiennych?
Ionuț G. Stan
3
@Ionut: Nie, atomy Erlanga to tak zwane seplenienie i ruby. Odnośnie twojego drugiego pytania: ma słownik procesów, który jest globalną (dobrze dla każdego procesu), zmienną mapą skrótu. Jednak z mojego doświadczenia korzysta to bardzo rzadko. Poza tym jedynym sposobem na przełamanie przejrzystości referencyjnej jest przekazywanie wiadomości.
sepp2k 16.10.10
4
Hm, powinienem nauczyć się trochę Erlangu :)
Ionuț G. Stan
Jak to odpowiada na zadane pytanie?
komara
5

=Oznaczenie używane w językach programowania jest mylące. <-, co oznacza „zapisz”, a nawet COBOL MOVE.

Jako dodatek, Prolog używa zmiennych takich jak matematyka: Zmienne nie mogą się zmieniać, a silnik Prolog wypełni zmienne, aby sprawdzić, czy istnieją rozwiązania.

Curry to także mieszanka Haskell i Prolog.

Ming-Tang
źródło
3

C, C ++ i Objective-C mogą określać niezmienność argumentów funkcji (i metody), a także innych zmiennych (identyfikatorów) za pomocą kwalifikatora typu „const”.

Huperniketes
źródło
3

Można również symulować niezmienność w Pythonie, nie zezwalając na aktualizacje klas. Jak stwierdzono wcześniej, najbardziej czyste funkcjonalne języki programowania wymuszają niezmienność. Clojure to najnowszy dodatek do platformy JVM (Clojure to dialekt LISP)

W Scali (także języku JVM ) unifikator zadeklarowanych zmiennych pomocniczych OO i FP valjest niezmienny. Ekspresja Scali i obsługa hybryd OO / FP sprawia, że ​​wygląda podobnie do Mathematica . ( Akka to framework, który dodaje funkcjonalność Erlang OTP i Clojure, taką jak STM .. do Scala i Java.) LACASA dodaje system typów i model programowania w celu wymuszenia dyscypliny zdolności obiektowych w Scali oraz zapewnienia unikalnych odniesień do obiektów. ( kod ) ( podstawy teoretyczne )

W Javie zadeklarowana zmienna finaljest niezmienna, a biblioteki Java, takie jak Google Guava, zawierają niezmienne biblioteki zbiorów. Java Stringsą również zawsze niezmienne.

oliwki
źródło