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?


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.


24

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


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.


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”.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.