Per rispondere alla domanda del titolo "Qualche linguaggio di programmazione usa le variabili come sono in matematica?": C, C #, Java, C ++ e qualsiasi altro linguaggio in stile C usano le variabili nel modo in cui sono usate in matematica.
Devi solo usare == invece di =.
Se prendo il tuo originale
root(square(x)) = abs(x)
Quindi posso tradurlo in C # direttamente senza alcuna modifica se non per la sintassi.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Ciò valuterà vero per qualsiasi valore di x purché x al quadrato sia inferiore al massimo per il tipo di dati che si sta utilizzando.
(Java sarà molto simile, ma credo che lo spazio dei nomi di Math sia un po 'diverso)
Il 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 una lingua immutabile ed è del tutto possibile che una determinata lingua possa scegliere di farlo usando = come operatore.
A ulteriore dimostrazione del punto, questo ciclo verrà eseguito fino a quando non esaurirete i valori legali di x e otterrete 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 il compito. 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 lo trasformo in algebra, ottengo questo:
abs (2x) = radice (x ^ 2)
Il che ovviamente non è vero per valori diversi da 0. L'immutabilità ti salva solo dall'errore di cambiare il valore di x quando aggiungi ulteriori passaggi tra la valutazione del lato sinistro e del lato destro dell'equazione originale. In realtà non cambia il modo in cui valuti l'espressione.