Il est facile de se méprendre sur ce que signifie «représenter» ou «implémenter» un nombre réel. En fait, nous assistons à une discussion dans les commentaires où la représentation est controversée. Permettez-moi donc d'aborder cette question.
Comment savons-nous qu'une implémentation est correcte?
La théorie qui explique comment représenter les choses dans un ordinateur est la réalisabilité . L'idée de base est que, étant donné un ensemble , nous choisissons un type de données τ et pour chaque x ∈ X un ensemble de valeurs de type τ qui le réalisent . Nous écrivons v ⊢ x ∈ X lorsque v est une valeur qui réalise x . Par exemple (j'utiliserai Haskell sans raison valable), une implémentation raisonnable de N pourrait être le type de données où v ⊢ k ∈ N lorsque vXτx∈Xτv⊢x∈XvxNInteger
v⊢k∈Nvs'évalue au nombre (donc en particulier ne représente pas un nombre naturel, pas plus qu'un programme divergent). Mais un petit rigolo pourrait marcher et suggérer que nous utilisons pour représenter des nombres naturels avec T r u e ⊢ 42 ∈ N et F a l s e ⊢ n ∈ N pour n ≠ 42 . Pourquoi est-ce incorrect? Nous avons besoin d'un critère .k¯¯¯-42
Bool
True⊢42∈NFalse⊢n∈Nn≠42
Dans le cas des «numéros joker», l'observation facile est que l'addition ne peut pas être mise en œuvre. Supposons que je vous dis que j'ai deux nombres, tous deux représentés par . Pouvez-vous donner un réalisateur pour leur somme? Eh bien, cela dépend si la somme est de 42, mais vous ne pouvez pas le dire. Étant donné que l'addition est "une partie essentielle de ce que sont les nombres naturels", cela est inacceptable. En d'autres termes, l'implémentation ne concerne pas les ensembles, mais les structures , c'est-à-dire que nous devons représenter les ensembles de manière à ce qu'il soit possible d'implémenter également la structure pertinente. Permettez-moi de souligner ceci:F a l s e
Nous mettons en œuvre des structures, pas des ensembles nus. Par conséquent, nous devons être en mesure de mettre en œuvre la structure entière, ainsi que les opérations et tous les axiomes, afin que la mise en œuvre soit correcte.
Si vous ne respectez pas ce principe, vous devez alors suggérer un autre critère mathématique d'exactitude. Je n'en connais pas.
Exemple: représentation des nombres naturels
Pour les nombres naturels, la structure pertinente est décrite par les axiomes de Peano, et l'axiome crucial qui doit être implémenté est l'induction (mais aussi , successeur, + et × ). Nous pouvons calculer, en utilisant la réalisabilité, ce que fait l'implémentation de l'induction. Cela s'avère être une carte (où est le type de données encore inconnu qui représente les nombres naturels)0+×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
satisfaisant induction x f zero = x
et induction x f (succ n) = f n (induction x f n)
. Tout cela vient de la réalisabilité. Nous avons un critère: une implémentation de nombres naturels est correcte lorsqu'elle permet une implémentation d'axiomes de Peano. Un résultat similaire serait obtenu si nous avons utilisé la caractérisation des nombres comme l'algèbre initiale du foncteur .X↦ 1 + X
Mise en œuvre correcte des nombres réels
Tournons-nous vers les chiffres réels et la question qui se pose. La première question à se poser est "quelle est la structure pertinente des nombres réels?" La réponse est: Archimedean Cauchy complète le champ ordonné . Telle est la signification établie de «nombres réels». Vous ne pouvez pas le changer, il a été fixé par d'autres pour vous (dans notre cas, les réels Dedekind alternatifs se révèlent isomorphes aux réels de Cauchy, que nous considérons ici.) Vous ne pouvez pas en retirer une partie, vous n'êtes pas autorisé à dire "je ne me soucie pas de l'implémentation de l'addition" ou "je ne me soucie pas de la commande". Si vous faites cela, vous ne devez pas l'appeler "nombres réels", mais quelque chose comme "nombres réels où nous oublions l'ordre linéaire".
Je ne vais pas entrer dans tous les détails, mais permettez-moi d'expliquer comment les différentes parties de la structure donnent différentes opérations sur les réels:
- l' axiome archimédien concerne le calcul d' approximations rationnelles de réels
- la structure du champ donne les opérations arithmétiques habituelles
- l'ordre linéaire nous donne une procédure semi - décidable pour tester x < y
- l' exhaustivité de Cauchy nous donne une fonction
lim : (nat -> real) -> real
qui prend une (représentation de) séquence de Cauchy rapide et renvoie sa limite. (Une séquence est rapide si | x n - x m | ≤ 2 min ( n , m ) pour tout m , n .)( xn)n| Xn- xm| ≤ 2min ( n , m )m,n
Ce que nous n'obtenons pas, c'est une fonction de test pour l'égalité. Il n'y a rien dans les axiomes des réels qui demande que soit décidable. (En revanche, les axiomes Peano impliquent que les nombres naturels sont décidables, et vous pouvez le prouver en implémentant l' utilisation uniquement comme un exercice amusant).=eq : nat -> nat -> Bool
induction
C'est un fait que la représentation décimale habituelle des réels que l'humanité utilise est mauvaise parce qu'avec elle, nous ne pouvons même pas implémenter l'addition. Le point flottant avec une mantisse infinie échoue également (exercice: pourquoi?). Ce qui fonctionne, cependant , c'est la représentation numérique signée , c'est-à-dire celle dans laquelle nous autorisons les chiffres négatifs aussi bien que les chiffres positifs. Ou nous pourrions utiliser des séquences de rationnels qui satisfont au test de Cauchy rapide, comme indiqué ci-dessus.
La représentation Tsuyoshi implémente également quelque chose, mais pas R
Considérons la représentation suivante des réels: un réel est représenté par une paire ( q , b ) où ( q n ) n est une séquence de Cauchy rapide convergeant vers x et b est un booléen indiquant si x est un entier. Pour que cela soit une représentation des réels, nous devons implémenter l'addition, mais il s'avère que nous ne pouvons pas calculer les drapeaux booléens. Ce n'est donc pas une représentation des réels. Mais cela représente quand même quelque chose, à savoir le sous-ensemble des réels Z ∪ ( R ∖ Z )x(q,b)(qn)nxbxZ∪(R∖Z). En effet, selon l'interprétation de réalisabilité un syndicat est mis en œuvre avec un drapeau indiquant quelle partie de l'union que nous sommes. Soit dit en passant, est un pas égal à R , à moins que vous croyez en milieu exclu, ce qui ne peut pas être mis en œuvre et est donc tout à fait hors de propos pour cette discussion. Nous sommes obligés par les ordinateurs de faire les choses de manière intuitionniste.Z∪(R∖Z)R
Nous ne pouvons pas tester si un réel est un entier
Enfin, permettez-moi de répondre à la question qui a été posée. Nous savons maintenant qu'une représentation acceptable des réels est celle par des séquences rapides de Cauchy de rationnels. (Un théorème important déclare que deux représentations de réels acceptables sont en réalité isomorphes de façon calculable.)
Théorème: Tester si un réel est un entier n'est pas décidable.
Preuve. Supposons que nous puissions tester si un réel est un entier (bien sûr, le réel est réalisé par une séquence de Cauchy rapide). L'idée, qui vous permettra de prouver un théorème beaucoup plus général si vous le souhaitez, est de construire une séquence de Cauchy rapide de non entiers qui converge vers un entier. C'est facile, prenez simplement x n = 2 - n . Ensuite, résolvez le problème d'arrêt comme suit. Étant donné une machine de Turing T , définir une nouvelle séquence ( y n ) n par
y n = { x n si T(xn)nxn=2−nT(yn)n
Autrement dit, la nouvelle séquence ressemble à la séquence(xn)ntant queTs'exécute, mais elle est "bloquée" àxmsiTs'arrête à l'étapem. Très important, la nouvelle séquence est également une séquence de Cauchy rapide (et nous pouvons le prouver sans savoir siTs'arrête). Par conséquent, nous pouvons calculer sa limitez=limnyn
yn= { xnXmsi T ne s'est pas arrêté en n étapessi T arrêté à l'étape m et m ≤ n
( xn)nTXmTmTz= limnyn, car notre représentation des réels est correcte. Testez si
est un entier. Si c'est le cas, alors il doit être
0 et cela ne se produit que si
T s'exécute pour toujours. Sinon,
z n'est pas un entier, donc
T doit s'être arrêté. QED.
z0TzT
Exercice: adaptez la preuve ci-dessus pour montrer que nous ne pouvons pas tester les nombres rationnels. Ensuite, adaptez-le pour montrer que nous ne pouvons pas tester quoi que ce soit de non trivial (c'est un peu plus difficile).
Parfois, les gens sont confus à propos de toutes ces activités de test. Ils pensent que nous avons prouvé que nous ne pouvons jamais tester si un réel est un entier. Mais sûrement, 42 est un réel et nous pouvons dire s'il s'agit d'un entier. En fait, tout réel particulier que nous trouvons, , 88 ln 89 , e π √péché1188 ln89 , etc., nous pouvons parfaitement dire s'il s'agit d'entiers. Précisément,nouspouvons le dire parce quenousavons des informations supplémentaires: ces réels ne nous sont pas donnés comme des séquences, mais plutôt comme des expressions symboliques à partir desquelles nous pouvons calculer le bit de Tsuyoshi. Dès que la seule information dont nous disposons sur le réel est une séquence d'approximations rationnelles qui y convergent (et je neparlepas d'une expression symbolique décrivant la séquence, mais d'une boîte noire qui renvoie len-ème terme sur l'entréen), alors nous sera tout aussi impuissant que les machines.eπ163√nn
La morale de l'histoire
Cela n'a aucun sens de parler de l'implémentation d'un ensemble à moins que nous ne sachions quel type d'opérations nous voulons y effectuer.