Щоб відповісти на ваше заголовкове запитання "Чи використовує будь-яка мова програмування змінні, як вони є в математиці?": C, C #, Java, C ++ та будь-яка інша мова стилю C використовують змінні таким чином, як вони використовуються в математиці.
Вам просто потрібно використовувати == замість =.
Якщо я візьму ваш оригінал
root(square(x)) = abs(x)
Тоді я можу перевести це безпосередньо на C # без будь-яких змін, крім синтаксису.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(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, коли ви додаєте додаткові кроки між оцінкою лівої та правої частини вихідного рівняння. Це насправді не змінює те, як ви оцінюєте вираз.