Pour répondre à votre question de titre "Est-ce qu'un langage de programmation utilise des variables comme en mathématiques?": C, C #, Java, C ++ et tout autre langage de style C utilisent des variables dans la façon dont ils sont utilisés en mathématiques.
Vous avez juste besoin d'utiliser == au lieu de =.
Si je prends ton original
root(square(x)) = abs(x)
Ensuite, je peux traduire cela en C # directement sans aucun changement autre que pour la syntaxe.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Cela sera évalué à vrai pour toute valeur de x tant que x au carré est inférieur au maximum pour le type de données que vous utilisez.
(Java sera très similaire, mais je pense que l'espace de noms Math est un peu différent)
Ce bit suivant ne parviendra pas à se compiler en C # car le compilateur est suffisamment intelligent pour savoir que je ne peux pas affecter le retour d'une opération à une autre opération.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
L'immuabilité n'a rien à voir avec cela. Vous devez toujours affecter la valeur dans une langue immuable et il est tout à fait possible qu'une langue donnée puisse choisir de le faire en utilisant = comme opérateur.
Preuve supplémentaire du point, cette boucle s'exécutera jusqu'à ce que vous épuisiez les valeurs légales de x et obteniez une exception de dépassement de capacité:
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
C'est pourquoi les mathématiciens détestent l'utilisation de = pour l'affectation. Cela les confond. Je pense que cela vous a amené à vous confondre. Prenez votre exemple
y = (x**2)**.5
x *= 2
assert y == abs(x)
Lorsque je transforme cela en algèbre, j'obtiens ceci:
abs (2x) = racine (x ^ 2)
Ce qui bien sûr n'est pas vrai pour les valeurs autres que 0. L'immutabilité ne vous évite que l'erreur de modifier la valeur de x lorsque vous ajoutez des étapes supplémentaires entre l'évaluation du côté gauche et du côté droit de l'équation d'origine. Cela ne change pas réellement la façon dont vous évaluez l'expression.