È facile confondersi su cosa significhi "rappresentare" o "implementare" un numero reale. In effetti, stiamo assistendo a una discussione nei commenti in cui la rappresentazione è controversa. Quindi vorrei prima parlarmene.
Come facciamo a sapere che un'implementazione è corretta?
La teoria che spiega come rappresentare le cose in un computer è la realizzabilità . L'idea di base è che, dato un insieme , scegliamo un tipo di dati τ e ad ogni x ∈ X un insieme di valori di tipo τ che lo realizzano . Scriviamo v ⊢ x ∈ X quando v è un valore che realizza x . Ad esempio (userò Haskell senza una buona ragione), un'implementazione ragionevole di N potrebbe essere il tipo di dati in cui v ⊢ k ∈ N quando vXτx ∈ Xτv ⊢ x ∈ XvXNInteger
v ⊢ k ∈ Nvvaluta il numero (quindi, in particolare , non rappresenta un numero naturale, né un programma divergente). Ma alcuni joker potrebbero passare e suggerire che usiamo per rappresentare numeri naturali con T r u e ⊢ 42 ∈ N e F a l s e ⊢ n ∈ N per n ≠ 42 . Perché questo non è corretto? Abbiamo bisogno di un criterio .K¯¯¯-42
Bool
T r u e ⊢42∈ NF a l s e ⊢n∈ Nn ≠ 42
Nel caso dei "numeri joker" l'osservazione semplice è che l'aggiunta non può essere implementata. Supponiamo che ti dica che ho due numeri, entrambi rappresentati da . Puoi dare un realizzatore per la loro somma? Bene, questo dipende dal fatto che la somma sia 42, ma non si può dire. Poiché l'aggiunta è una "parte essenziale di ciò che sono i numeri naturali", questo è inaccettabile. In altre parole, l'implementazione non riguarda gli insiemi, ma le strutture , ovvero dobbiamo rappresentare gli insiemi in modo tale che sia possibile implementare anche la struttura pertinente. Vorrei sottolineare questo:F a l s e
Implementiamo strutture, non set nudi. Pertanto, dobbiamo essere in grado di implementare l'intera struttura, insieme alle operazioni e a tutti gli assiomi, affinché l'implementazione sia corretta.
Se non ti attieni a questo principio, allora devi suggerire un criterio matematico alternativo di correttezza. Non ne conosco uno.
Esempio: rappresentazione di numeri naturali
Per i numeri naturali la struttura pertinente è descritta dagli assiomi di Peano e l'assioma cruciale che deve essere implementato è l'induzione (ma anche , successore, + e × ). Possiamo calcolare, usando la fattibilità, cosa fa l'implementazione dell'induzione. Risulta essere una mappa (dov'è il tipo di dati ancora sconosciuto che rappresenta i numeri naturali)0+×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
soddisfacente induction x f zero = x
e induction x f (succ n) = f n (induction x f n)
. Tutto ciò deriva dalla realizzabilità. Abbiamo un criterio: un'implementazione di numeri naturali è corretta quando consente un'implementazione degli assiomi di Peano. Analogo risultato si otterrebbe se abbiamo utilizzato la caratterizzazione dei numeri come algebra iniziale per il funtore .X↦ 1 + X
Corretta implementazione di numeri reali
Rivolgiamo l'attenzione ai numeri reali e alla domanda a portata di mano. La prima domanda da porsi è "qual è la struttura pertinente dei numeri reali?" La risposta è: Archimedean Cauchy completa il campo ordinato . Questo è il significato stabilito di "numeri reali". Non puoi cambiarlo, è stato riparato da altri per te (nel nostro caso i reali Dedekind alternativi si rivelano isomorfi ai reali di Cauchy, che stiamo prendendo in considerazione qui.) Non puoi toglierne nessuna parte, non puoi dire "Non mi interessa implementare l'aggiunta" o "Non mi interessa l'ordine". Se lo fai, non devi chiamarlo "numeri reali", ma qualcosa come "numeri reali in cui dimentichiamo l'ordine lineare".
Non ho intenzione di entrare in tutti i dettagli, ma lasciatemi solo spiegare come le varie parti della struttura danno varie operazioni sui reali:
- l' assioma di Archimede riguarda il calcolo di approssimazioni razionali dei reali
- la struttura del campo fornisce le solite operazioni aritmetiche
- l'ordine lineare ci fornisce una procedura semidecidabile per testare x < y
- la completezza di Cauchy ci dà una funzione
lim : (nat -> real) -> real
che prende una (rappresentazione di) rapida sequenza di Cauchy e restituisce il suo limite. (Una sequenza è rapida se | x n - x m | ≤ 2 min ( n , m ) per tutti m , n .)( xn)n| Xn−xm|≤2min(n,m)m,n
Ciò che non otteniamo è una funzione di test per l'uguaglianza. Non c'è nulla negli assiomi per i reali che chiede che sia decidibile. (Al contrario, gli assiomi di Peano implicano che i numeri naturali sono decidibili, e puoi dimostrarlo implementandolo usando solo come esercizio divertente).=eq : nat -> nat -> Bool
induction
È un dato di fatto che la solita rappresentazione decimale dei reali che l'umanità usa è cattiva perché con essa non possiamo nemmeno implementare l'aggiunta. Anche la virgola mobile con mantissa infinita fallisce (esercizio: perché?). Ciò che funziona, però è firmato rappresentazione cifre, vale a dire, quella in cui ci lasciamo le cifre negative e quelle positive. Oppure potremmo usare sequenze di razionali che soddisfano il rapido test di Cauchy, come detto sopra.
La rappresentazione Tsuyoshi implementa anche qualcosa, ma non R
Consideriamo la seguente rappresentazione di reali: un vero è rappresentato da una coppia ( q , b ) dove ( q n ) n è un Cauchy rapido convergendo x e b è un booleano che indica se x è un numero intero. Perché questa sia una rappresentazione dei reali, dovremmo implementare l'addizione, ma a quanto pare non possiamo calcolare le bandiere booleane. Quindi questa non è una rappresentazione dei reali. Ma rappresenta ancora qualcosa, vale a dire il sottoinsieme dei reali Z ∪ ( R ∖ Z )x(q,b)(qn)nxBXZ ∪( R ∖ Z ). Infatti, secondo l'interpretazione realizzabilità un'unione è implementata con un flag che indica quale parte del sindacato ci troviamo. A proposito, è un non pari a R , a meno che non si crede in terzo escluso, che non può essere implementato ed è quindi del tutto irrilevante per questa discussione. Siamo costretti dai computer a fare le cose in modo intuitivo.Z ∪( R ∖ Z )R
Non possiamo verificare se un reale è un numero intero
Infine, lasciami rispondere alla domanda che è stata posta. Ora sappiamo che una rappresentazione accettabile dei reali è una rapida sequenza di razionali di Cauchy. (Un importante teorema afferma che due rappresentazioni di realtà accettabili sono in realtà calcolabili isomorfe.)
Teorema: verificare se un reale è un numero intero non è decidibile.
Prova. Supponiamo di poter verificare se un reale è un numero intero (ovviamente, il reale è realizzato da una rapida sequenza di Cauchy). L'idea, che ti permetterà di dimostrare un teorema molto più generale, se lo desideri, è quella di costruire una rapida sequenza di Cauchy di non numeri interi che converge in un numero intero. Questo è facile, basta prendere x n = 2 - n . Quindi, risolvere il problema di Halting come segue. Data una macchina di Turing T , definire una nuova sequenza ( y n ) n per
y n = { x n se T( xn)nXn= 2- nT( yn)n
Cioè, la nuova sequenza appare come la sequenza(xn)nfinchéTscorre, ma poi si "blocca" axmseT siferma al puntom. Cosa molto importante, la nuova sequenza è anche una rapida sequenza di Cauchy (e possiamo dimostrarlo senza sapere seT siferma). Pertanto, possiamo calcolare il suo limitez=limnyn
yn= { xnXmse T non si è fermato entro n passaggise T arrestato nel passaggio m e m ≤ n
( xn)nTXmTmTz= limnyn, perché la nostra rappresentazione dei reali è corretta. Verifica se
è un numero intero. Se lo è, allora deve essere
0 e questo accade solo se
T funziona per sempre. Altrimenti,
z non è un numero intero, quindi
T deve essersi fermato. QED.
z0TzT
Esercizio: adattare la prova di cui sopra per dimostrare che non possiamo verificare numeri razionali. Quindi adattalo per mostrare che non possiamo testare nulla di non banale (è un po 'più difficile).
A volte le persone si confondono su tutte queste attività di test. Pensano che abbiamo dimostrato che non possiamo mai verificare se un reale è un numero intero. Ma sicuramente 42 è un reale e possiamo dire se è un numero intero. In effetti, ogni particolare reale che ci viene in mente, , 88 ln 89 , e π √peccato1188 ln89 , ecc., Possiamo perfettamente dire se sono numeri interi. Precisamente,possiamodirlo perchéabbiamoulteriori informazioni: questi reali non ci vengono dati come sequenze, ma piuttosto come espressioni simboliche da cui possiamo calcolare il bit Tsuyoshi. Non appena l'unica informazione che abbiamo sul reale è una sequenza di approssimazioni razionali convergenti ad esso (e iononsignifica un'espressione simbolica che descrive la sequenza, ma una scatola nera che emette iln-esimo termine sull'ingresson) allora sarà impotente quanto le macchine.eπ163√nn
La morale della storia
Non ha senso parlare dell'implementazione di un set a meno che non conosciamo il tipo di operazioni che vogliamo eseguire su di esso.