Alguma linguagem de programação usa variáveis ​​como em matemática?

11

Em matemática, uma variável significa que você pode colocar qualquer número lá e uma equação ainda será verdadeira:

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

Nas linguagens de programação, não é assim: uma var pode mudar. Em Python:

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

gerará uma exceção, pois x na última linha não é o mesmo.

Existem linguagens de programação que usam variáveis ​​imutáveis?


fonte
5
Em matemática, a maioria das equações não são identidades. Por exemplo, x ^ 2 + 5 = 6x é válido se e somente se x = 1 ou x = 5. Equações válidas para todos os valores em algum "universo" (como o conjunto de todos os números reais), por exemplo, sin ( 2x) = 2 sin x cos x, são chamados de identidades .
Andreas Rejbrand 16/10/10
4
variáveis ​​em matemática! = variáveis ​​em linguagens de programação. Eu sempre pensei que eles deveriam ter nomes diferentes também, pois muitas pessoas ficam confusas quando trazem preconceitos sobre variáveis ​​em matemática para a programação.
Lie Ryan
1
Eu acho que o objetivo das variáveis ​​em matemática não é o mesmo que na programação. Em matemática, as variáveis ​​representam um valor desconhecido que você deseja conhecer ou um lugar em uma fórmula na qual você coloca um valor para obter um resultado. Para linguagens de programação comuns, apenas o segundo caso faz sentido. Para o primeiro caso, você precisará de um software como o Mathematica.
Pagotti 17/10/10
Não, eles não. Tente colocar qualquer número em "x = 5".

Respostas:

6

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.

MIA
fonte
24

Linguagens de programação puramente funcionais, como Haskell , reforçam variáveis ​​imutáveis. Eu gosto de chamá-los de identificadores, em vez de variáveis.

Ionuț G. Stan
fonte
3
Em Erlang, que é uma linguagem funcional impura, as variáveis ​​também são imutáveis.
sepp2k
Eu não sei muito Erlang. Esses são os átomos, certo? O Erlang permite algum tipo de armazenamento mutável, do tipo variável?
Ionuț G. Stan
3
@Ionut: Não, os átomos de Erlang são chamados de símbolos em lisp e ruby. Com relação à sua segunda pergunta: ele possui o dicionário de processos, que é um mapa de hash mutável global (bem, por processo). No entanto, isso é usado muito raramente na minha experiência. Fora isso, a única maneira de quebrar a transparência referencial é a passagem de mensagens.
sepp2k
4
Hum, eu deveria aprender um pouco de Erlang :) #
485 Ionuț Stan Stan
Como isso responde à pergunta?
Gnat #
5

O =sinal usado nas linguagens de programação é enganoso. <-, significando "loja" ou mesmo COBOL MOVE, em vez disso, deve ser usado.

Além disso, o Prolog usa variáveis ​​como math: Variáveis ​​não podem ser alteradas, e o mecanismo do Prolog preencherá as variáveis ​​para verificar se as soluções existem.

Além disso, Curry é uma mistura de Haskell e Prolog.

Ming-Tang
fonte
3

C, C ++ e Objective-C podem especificar imutabilidade para argumentos de função (e método), bem como outras variáveis ​​(identificadores), com o qualificador de tipo "const".

Huperniketes
fonte
3

Você também pode simular imutabilidade no Python, não permitindo atualizações nas classes. Como afirmado anteriormente, a maioria das linguagens de programação funcional pura aplica imutabilidade. Clojure é uma adição recente à plataforma JVM (Clojure é um dialeto LISP)

No Scala (também uma linguagem JVM ), um unificador de variáveis ​​de suporte de OO e FP declaradas com valé imutável. A expressividade Scala e o suporte híbrido OO / FP fazem com que pareça semelhante ao Mathematica . ( Akka é uma estrutura que adiciona funcionalidades Erlang OTP e Clojure, como STM .. a Scala e Java.) O LACASA adiciona sistema de tipos e modelo de programação para reforçar a disciplina de capacidade de objetos no Scala e fornecer referências exclusivas a objetos. ( código ) ( fundamentação teórica )

Em Java, uma variável declarada finalé imutável, e bibliotecas Java como o Google Guava incluem bibliotecas imutáveis ​​de coleções. Java Strings também são sempre imutáveis.

oluies
fonte