¿Algún lenguaje de programación utiliza variables ya que están en matemáticas?

11

En matemáticas, una variable significa que puedes poner cualquier número allí, y una ecuación seguirá siendo cierta:

root(square(x)) = abs(x)

En lenguajes de programación, esto no es así: una var puede cambiar. En Python:

y = (x**2)**.5
x *= 2
assert y == abs(x)

generará una excepción, ya que x en la última línea no es la misma.

¿Hay lenguajes de programación que usan variables inmutables?


fuente
55
En matemáticas, la mayoría de las ecuaciones no son identidades. Por ejemplo, x ^ 2 + 5 = 6x es válido si y solo si x = 1 o x = 5. Ecuaciones que son válidas para todos los valores en algún "universo" (como el conjunto de todos los números reales), por ejemplo, sin ( 2x) = 2 sen x cos x, se llaman identidades .
Andreas Rejbrand
44
variables in math! = variables en lenguajes de programación. Siempre he pensado que también deberían tener nombres diferentes, ya que muchas personas se confunden cuando aportan ideas preconcebidas sobre las variables en matemáticas a la programación.
Lie Ryan
1
Creo que el objetivo de las variables en matemáticas no es el mismo que en programación. En matemáticas, las variables representan un valor desconocido que desea conocer o un lugar en una fórmula en la que pone un valor para obtener un resultado. Para lenguajes de programación comunes, solo el segundo caso tiene sentido. Para el primer caso, necesitará un software como Mathematica.
Pagotti
No, no lo hacen. Intenta poner cualquier número en "x = 5".

Respuestas:

6

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.

desaparecido en combate
fuente
24

Lenguajes de programación puramente funcionales, como Haskell , imponen variables inmutables. Sin embargo, me gusta llamarlos identificadores, en lugar de variables.

Ionuț G. Stan
fuente
3
En Erlang, que es un lenguaje funcional impuro, las variables también son inmutables.
sepp2k
No sé mucho Erlang. Esos son los átomos, ¿verdad? ¿Erlang permite algún tipo de almacenamiento variable de tipo mutable?
Ionuț G. Stan
3
@Ionut: No, los átomos de Erlang son lo que se llaman símbolos en lisp y ruby. Con respecto a su segunda pregunta: tiene el diccionario de proceso, que es un mapa de hash mutable global (bueno, por proceso). Sin embargo, eso se usa muy raramente en mi experiencia. Aparte de eso, la única forma de romper la transparencia referencial es la transmisión de mensajes.
sepp2k
44
Hm, debería aprender algo de Erlang :)
Ionuț G. Stan
¿Cómo responde esto a la pregunta que se hace?
mosquito
5

El =signo utilizado en los lenguajes de programación es engañoso. <-, que significa "almacenar", o incluso COBOL MOVEdebería usarse en su lugar.

Además, Prolog usa variables como las matemáticas: las variables no pueden cambiar, y el motor de Prolog completará las variables para ver si existen las soluciones.

Además, Curry es una mezcla de Haskell y Prolog.

Ming-Tang
fuente
3

C, C ++ y Objective-C pueden especificar la inmutabilidad para argumentos de función (y método), así como otras variables (identificadores), con el calificador de tipo "const".

Huperniketes
fuente
3

También puede simular la inmutabilidad en Python al no permitir actualizaciones a las clases. Como se indicó anteriormente, la mayoría de los lenguajes de programación funcionales puros imponen la inmutabilidad. Clojure es una adición reciente a la plataforma JVM (Clojure es un dialecto LISP)

En Scala (también un lenguaje JVM ), un unificador de variables de soporte OO y FP declaradas con valson inmutables. La expresividad de Scala y el soporte híbrido OO / FP hacen que se parezca a Mathematica . ( Akka es un marco que agrega la funcionalidad Erlang OTP y Clojure como STM .. a Scala y Java.) LACASA agrega un sistema de tipos y un modelo de programación para imponer la disciplina de capacidad de objetos en Scala y proporcionar referencias de objetos únicas. ( código ) ( antecedentes teóricos )

En Java, una variable declarada finales inmutable, y las bibliotecas de Java, como Google Guava, incluyen bibliotecas inmutables de colecciones. Los Java Strings también son siempre inmutables.

oluies
fuente