É fácil ficar confuso sobre o que significa "representar" ou "implementar" um número real. De fato, estamos testemunhando uma discussão nos comentários em que a representação é controversa. Então, deixe-me abordar isso primeiro.
Como sabemos que uma implementação está correta?
A teoria que explica como representar as coisas em um computador é realizável . A idéia básica é que, dado um conjunto , escolhemos um tipo de dados τ e para cada x ∈ X um conjunto de valores do tipo τ que o realizam . Nós escrevemos v ⊢ x ∈ X quando v é um valor que percebe x . Por exemplo (eu usarei Haskell sem uma boa razão), uma implementação sensata de N pode ser o tipo de dados avaliado para o numeral ¯ k (portanto, em particularXτx ∈ Xτv ⊢ x ∈ XvxNInteger
que quando vv ⊢ k ∈ Nvk¯¯¯-42
, não representa um número natural e nem um programa divergente). Mas algum palhaço podia andar por e sugerem que usamos Bool
para representar números naturais com e F um l s e ⊢ n ∈ N para n ≠ 42 . Por que isso está incorreto? Nós precisamos de um critério .True⊢42∈NFalse⊢n∈Nn≠42
No caso dos "números coringa", a observação fácil é que a adição não pode ser implementada. Suponha que eu lhe diga que tenho dois números, ambos representados por . Você pode dar um valorizador à soma? Bem, isso depende se a soma é 42, mas você não pode dizer. Como a adição é uma "parte essencial do que são os números naturais", isso é inaceitável. Em outras palavras, a implementação não é sobre conjuntos, mas sobre estruturas , ou seja, temos que representar conjuntos de forma que seja possível implementar também a estrutura relevante. Deixe-me enfatizar isso:False
Implementamos estruturas, não conjuntos vazios. Portanto, precisamos ser capazes de implementar toda a estrutura, juntamente com as operações e todos os axiomas, para que a implementação seja correta.
Se você não respeitar esse princípio, deverá sugerir um critério matemático alternativo de correção. Eu não conheço um.
Exemplo: representação de números naturais
Para números naturais, a estrutura relevante é descrita pelos axiomas de Peano, e o axioma crucial que deve ser implementado é a indução (mas também , sucessor, + e × ). Podemos calcular, usando realizabilidade, o que a implementação da indução faz. Ele acaba sendo um mapa (onde é o tipo de dados ainda desconhecido que representa números naturais)0+×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
satisfatório induction x f zero = x
e induction x f (succ n) = f n (induction x f n)
. Tudo isso resulta da realização. Temos um critério: uma implementação de números naturais é correta quando permite a implementação de axiomas Peano. Um resultado semelhante seria obtido se usássemos a caracterização de números como a álgebra inicial para o functor .X↦1+X
Implementação correta de números reais
Vamos voltar a atenção para os números reais e a pergunta em questão. A primeira pergunta a fazer é "qual é a estrutura relevante dos números reais?" A resposta é: o campo ordenado completo de Archimedean Cauchy . Este é o significado estabelecido de "números reais". Você não pode alterá-lo, isso foi corrigido por outros para você (no nosso caso, os reais Dedekind alternativos acabam sendo isomórficos aos reais Cauchy, que estamos considerando aqui.) Você não pode tirar nenhuma parte dele, você não tem permissão para dizer "Eu não ligo para implementar a adição" ou "Eu não ligo para o pedido". Se você fizer isso, não deve chamá-lo de "números reais", mas algo como "números reais, onde esquecemos a ordem linear".
Não vou detalhar todos os detalhes, mas deixe-me explicar como as várias partes da estrutura oferecem várias operações em reais:
- a axioma arquimediano trata da computação de aproximações racionais de reais
- a estrutura do campo fornece as operações aritméticas usuais
- a ordem linear nos fornece um procedimento semidecidável para testar x<y
- a completude de Cauchy nos dá uma função
lim : (nat -> real) -> real
que pega uma ( rápida representação) de uma sequência Cauchy e retorna seu limite. (Uma sequência é rápida se | x n - x m | ≤ 2 min ( n , m ) para todos os m , n(xn)n|xn−xm|≤2min(n,m)m,n .)
O que não obtemos é uma função de teste para a igualdade. Não há nada nos axiomas de reais que pede que ser decidível. (Por outro lado, os axiomas Peano implicam que os números naturais são decidíveis, e você pode provar isso implementando usando apenas como um exercício divertido).=eq : nat -> nat -> Bool
induction
É fato que a representação decimal usual dos reais que a humanidade usa é ruim, porque com ela não podemos sequer implementar adição. O ponto flutuante com mantissa infinita também falha (exercício: por quê?). O que funciona, no entanto, é a representação de dígitos assinados , ou seja, aquela na qual permitimos dígitos negativos e positivos. Ou poderíamos usar sequências de razões que satisfazem o teste rápido de Cauchy, como afirmado acima.
A representação Tsuyoshi também implementa algo, mas não R
Vamos considerar a seguinte representação de reais: um real é representado por um par ( q , b ) onde ( q n ) n é uma sequência rápida de Cauchy convergindo para x e b é um booleano indicando se x é um número inteiro. Para que isso seja uma representação dos reais, teríamos que implementar adição, mas, como se vê, não podemos calcular os sinalizadores booleanos. Portanto, isso não é uma representação dos reais. Mas ainda representa algo, a saber, o subconjunto dos reais Z ∪ ( R ∖ Zx(q,b)(qn)nxbxZ∪(R∖Z). Na verdade, de acordo com a interpretação que capacidade de realização de uma união é implementado com um sinalizador que indica que parte da união que nos encontramos. A propósito, é um não igual a RZ∪(R∖Z)R , a menos que você acreditar em meio excluído, o que não pode ser implementado e, portanto, é bastante irrelevante para esta discussão. Somos forçados pelos computadores a fazer as coisas intuicionisticamente.
Não podemos testar se um real é um número inteiro
Finalmente, deixe-me responder à pergunta que foi feita. Agora sabemos que uma representação aceitável dos reais é uma das rápidas sequências de razões de Cauchy. (Um teorema importante afirma que quaisquer duas representações de reais aceitáveis são na verdade isomórficas).
Teorema: Testar se um real é um número inteiro não é decidível.
Prova. Suponha que possamos testar se um real é um número inteiro (é claro, o real é realizado por uma sequência rápida de Cauchy). A idéia, que permitirá provar um teorema muito mais geral, se você quiser, é construir uma sequência Cauchy rápida de não-números inteiros que converge para um número inteiro. Isso é fácil, basta pegar x n = 2 - n . Em seguida, resolva o problema da parada da seguinte maneira. Dada uma máquina de Turing T , defina uma nova sequência ( y n ) n por
y n = { x n se T(xn)nxn=2−nT(yn)n
Ou seja, a nova sequência se parece com a sequência(xn)nenquantoTexecutar, mas ficará "presa" emxmseTpára no passom. Muito importante, a nova sequência também é uma sequência rápida de Cauchy (e podemos provar isso sem saber seTpára). Portanto, podemos calcular seu limitez=limnyn
yn={xnxmif T has not stopped within n stepsif T stopped in step m and m≤n
(xn)nTxmTmTz=limnyn, porque nossa representação de reais está correta. Teste se
é um número inteiro. Se for, então deve ser
0 e isso só acontece se
T for executado para sempre. Caso contrário,
z não é um número inteiro, portanto
T deve ter parado. QED.
z0TzT
Exercício: adapte a prova acima para mostrar que não podemos testar números racionais. Em seguida, adapte-o para mostrar que não podemos testar algo não trivial (isso é um pouco mais difícil).
Às vezes, as pessoas ficam confusas com todo esse negócio de testes. Eles acham que provamos que nunca podemos testar se um real é um número inteiro. Mas, certamente, 42 é um real e podemos dizer se é um número inteiro. De fato, qualquer real em particular que criamos, , 88 ln 89 , e π √sin1188ln89 , etc., podemos perfeitamente dizer se são números inteiros. Precisamente,podemosdizer porquetemosinformações extras: esses reais não nos são dados como sequências, mas como expressões simbólicas das quais podemos calcular o bit Tsuyoshi. Assim que a única informação que temos sobre o real é uma sequência de aproximações racionais convergindo para ele (enãoquero dizer uma expressão simbólica descrevendo a sequência, mas uma caixa preta que gera on-ésimo termo na entradaneπ163√nn ), então nós será tão impotente quanto as máquinas.
A moral da história
Não faz sentido falar sobre a implementação de um conjunto, a menos que saibamos que tipo de operações queremos executar nele.