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

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, когда вы добавляете дополнительные шаги между оценкой левой и правой сторон исходного уравнения. Это на самом деле не меняет, как вы оцениваете выражение.

MIA
источник
24

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

Ionuț G. Stan
источник
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.

Мин-Tang
источник
3

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

Huperniketes
источник
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также всегда неизменны.

oluies
источник