Para responder a la pregunta del título "¿Algún lenguaje de programación usa variables como están en matemáticas?": C, C #, Java, C ++ y cualquier otro lenguaje de estilo C usan variables en la forma en que se usan en matemáticas.
Solo necesita usar == en lugar de =.
Si tomo tu original
root(square(x)) = abs(x)
Entonces puedo traducir eso a C # directamente sin ningún cambio que no sea para la sintaxis.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Esto se evaluará como verdadero para cualquier valor de x siempre que x al cuadrado sea menor que el máximo para el tipo de datos que está utilizando.
(Java será muy similar, pero creo que el espacio de nombres matemático es un poco diferente)
El siguiente bit no se compilará en C # porque el compilador es lo suficientemente inteligente como para saber que no puedo asignar el retorno de una operación a otra.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
La inmutabilidad no tiene nada que ver con esto. Todavía necesita asignar el valor en un idioma inmutable y es completamente posible que un idioma determinado elija hacer esto usando = como operador.
Para demostrar aún más el punto, este ciclo se ejecutará hasta que agote los valores legales de x y obtenga una excepción de desbordamiento:
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
Es por esto que los matemáticos odian el uso de = para la asignación. Les confunde. Creo que esto te ha llevado a confundirte. Toma tu ejemplo
y = (x**2)**.5
x *= 2
assert y == abs(x)
Cuando convierto esto en álgebra, obtengo esto:
abs (2x) = raíz (x ^ 2)
Lo cual, por supuesto, no es cierto para valores distintos de 0. La inmutabilidad solo lo salva del error de cambiar el valor de x cuando agrega pasos adicionales entre la evaluación del lado izquierdo y el lado derecho de la ecuación original. En realidad, no cambia la forma en que evalúa la expresión.