Per rispondere alla domanda del titolo "Qualunque linguaggio di programmazione usa le variabili come sono in matematica?":
C, C #, Java, C ++ e qualsiasi altro linguaggio in stile C utilizzano le variabili nel modo in cui vengono utilizzate in matematica.
Devi solo usare == invece di =.
Se prendo il tuo originale
root(square(x)) = abs(x)
Quindi posso tradurlo direttamente in C # senza alcuna modifica se non per la sintassi.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Verrà valutato true per qualsiasi valore di x, a condizione che x al quadrato sia inferiore al massimo per il tipo di dati che si sta utilizzando.
(Java sarà grossolanamente simile, ma credo che lo spazio dei nomi di Math sia un po 'diverso)
Questo prossimo bit non riuscirà a compilare in C # perché il compilatore è abbastanza intelligente da sapere che non posso assegnare il ritorno di un'operazione a un'altra operazione.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
L'immutabilità non ha nulla a che fare con questo. Devi ancora assegnare il valore in un linguaggio immutabile ed è del tutto possibile che una determinata lingua possa scegliere di farlo usando = come operatore.
Dimostrando ulteriormente il punto, questo ciclo funzionerà finché non esaurirai i valori legali di x e otterrai un'eccezione di overflow:
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
Questo è il motivo per cui i matematici odiano l'uso di = per l'assegnazione. Li confonde. Penso che questo ti abbia portato a confonderti. Prendi il tuo esempio
y = (x**2)**.5
x *= 2
assert y == abs(x)
Quando trasformo questo in algebra, ottengo questo:
abs (2x) = root (x ^ 2)
Che ovviamente non è vero per valori diversi da 0. Immutabilità ti salva solo dall'errore di cambiare il valore di x quando aggiungi passaggi aggiuntivi tra la valutazione del lato sinistro e il lato destro dell'equazione originale. In realtà non cambia come valuti l'espressione.