Para responder à pergunta do título "Alguma linguagem de programação usa variáveis como em matemática?": C, C #, Java, C ++ e qualquer outra linguagem de estilo C usam variáveis da maneira que são usadas em matemática.
Você só precisa usar == em vez de =.
Se eu pegar o seu original
root(square(x)) = abs(x)
Então eu posso traduzir isso para o C # diretamente, sem nenhuma alteração além da sintaxe.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Isso será avaliado como verdadeiro para qualquer valor de x contanto que x ao quadrado seja menor que o máximo para o tipo de dados que você está usando.
(Java será muito semelhante, mas acredito que o espaço para nome Math seja um pouco diferente)
O próximo bit falhará ao compilar em C # porque o compilador é inteligente o suficiente para saber que não posso atribuir o retorno de uma operação a outra operação.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
A imutabilidade não tem nada a ver com isso. Você ainda precisa atribuir o valor em um idioma imutável e é perfeitamente possível que um determinado idioma opte por fazer isso usando = como operador.
Além disso, esse loop será executado até você esgotar os valores legais de x e obter uma exceção de estouro:
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
É por isso que os matemáticos odeiam o uso de = para atribuição. Isso os confunde. Eu acho que isso levou você a se confundir. Veja o seu exemplo
y = (x**2)**.5
x *= 2
assert y == abs(x)
Quando eu transformo isso em álgebra, recebo o seguinte:
abs (2x) = raiz (x ^ 2)
O que, obviamente, não é verdadeiro para valores diferentes de 0. A imutabilidade evita o erro de alterar o valor de x quando você adiciona etapas extras entre a avaliação do lado esquerdo e do lado direito da equação original. Na verdade, não muda a maneira como você avalia a expressão.