Использует ли какой-либо язык программирования переменные в математике?


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
Я думаю, что цель переменных в математике не такая, как в программировании. В математике переменные представляют собой неизвестное значение, которое вы хотите знать, или место в формуле, в которое вы помещаете значение для получения результата. Для распространенных языков программирования имеет смысл только второй случай. Для первого случая вам понадобится программное обеспечение, такое как Mathematica.
— Паготти

Нет, они не Попробуйте поставить любое число на «х = 5».

Ответы:


6

Чтобы ответить на ваш заглавный вопрос «Использует ли какой-либо язык программирования переменные в математике?»: C, C #, Java, C ++ и любой другой язык стиля C используют переменные так же, как они используются в математике.

Вам просто нужно использовать == вместо =.

Если я возьму ваш оригинал

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

Затем я могу перевести это на C # напрямую, без каких-либо изменений, кроме как для синтаксиса. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Это будет иметь значение true для любого значения x, если x в квадрате меньше максимального значения для типа данных, который вы используете. (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) = корень (x ^ 2)

Что, конечно, неверно для значений, отличных от 0. Неизменность только спасает вас от ошибки изменения значения x, когда вы добавляете дополнительные шаги между оценкой левой и правой сторон исходного уравнения. Это на самом деле не меняет, как вы оцениваете выражение.


24

Чисто функциональные языки программирования, такие как Haskell , поддерживают неизменяемые переменные. Мне нравится называть их идентификаторами, а не переменными.


3
В Erlang, который является нечистым функциональным языком, переменные тоже неизменны.
— sepp2k

Я не слишком много знаю, Эрланг. Это атомы, верно? Разрешает ли Erlang какое-либо изменяемое хранилище, похожее на переменное?
— Ionuț G. Stan

3
@Ionut: Нет, атомы Эрланга - это так называемые символы в lisp и ruby. Относительно вашего второго вопроса: у него есть словарь процессов, который является глобальной (ну, для процесса), изменяемой хэш-картой. Однако это используется очень редко в моем опыте. Кроме этого, единственный способ нарушить ссылочную прозрачность - это передача сообщений.
— sepp2k

4
Хм, я должен изучить себя немного Erlang :)
— Ionuț G. Stan

как это отвечает на заданный вопрос?
— комнат

5

=Знак используется в языках программирования вводит в заблуждение. вместо этого следует использовать <-значение «store» или даже COBOL MOVE.

Кроме того, Prolog использует переменную, например, math: переменные не могут изменяться, и механизм Prolog заполняет переменные, чтобы посмотреть, существуют ли решения.

Кроме того, карри представляет собой смесь Haskell и Prolog.


3

C, C ++ и Objective-C могут указывать неизменность для аргументов функции (и метода), а также других переменных (идентификаторов) с помощью квалификатора типа «const».


3

Вы также можете симулировать неизменность в Python, не допуская обновления классов. Как указывалось ранее, самые чистые функциональные языки программирования обеспечивают неизменность. Clojure - это недавнее дополнение к платформе JVM (Clojure - это диалект LISP)

В Scala (также языке JVM ) объединитель переменных поддержки OO и FP, объявленных с помощью, valявляется неизменным. Выразительность Scala и гибридная поддержка OO / FP делают его похожим на Mathematica . ( Akka - это инфраструктура, которая добавляет функции Erlang OTP и Clojure, такие как STM .., в Scala и Java.) LACASA добавляет систему типов и модель программирования для обеспечения дисциплины возможностей объекта в Scala и для предоставления уникальных ссылок на объекты. ( код ) ( теоретическое обоснование )

В Java объявленная переменная finalявляется неизменной, а библиотеки Java, такие как Google Guava, включают в себя неизменяемые библиотеки коллекций. Java Stringтакже всегда неизменны.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.