実数を「表現」または「実装」することの意味について混乱するのは簡単です。実際、私たちは、表現が論争的であるコメントの議論を目撃しています。最初にこれを取り上げましょう。
実装が正しいことをどのようにして知ることができますか?
コンピューターで物事を表現する方法を説明する理論は実現可能性です。基本的な考え方は、そのセットを与えられている、我々はデータ型ピックアップτを、すべてにX ∈ X型の値のセットτ実現して。私たちは、書きV ⊢ のx ∈ Xをするときvは実現がその値であるxは。例えば(私は正当な理由なくハスケルを使用しなければならない)、の賢明な実装Nはデータ型であるかもしれないV ⊢ のk ∈ N際VXτx∈Xτv⊢x∈XvxNInteger
v⊢k∈Nv評価符号(従って、特に自然数を表し、いずれもない発散プログラムありません)。しかし、いくつかのジョーカーはで歩き、私たちが使用することを示唆している可能性と自然数を表すために、T R U E ⊢ 42 ∈ NとFはL S E ⊢ のn ∈ Nに対してN ≠ 42。なぜこれが間違っているのですか?基準が必要です。k¯¯¯-42
Bool
True⊢42∈NFalse⊢n∈Nn≠42
「ジョーカー番号」の場合、簡単に観察できるのは、加算を実装できないことです。2つの数値があり、どちらも表されているとしましょう。あなたは彼らの合計の実現者を与えることができますか?まあ、それは合計が42かどうかによって異なりますが、わかりません。加算は「自然数の本質的な部分」であるため、これは受け入れられません。言い換えれば、実装はセットに関するものではなく、構造に関するものです。つまり、関連する構造も実装できるようにセットを表現する必要があります。これを強調しましょう:False
ベアセットではなく、構造を実装します。したがって、実装を正しく行うには、操作とすべての公理とともに構造全体を実装できる必要があります。
この原則に従わない場合は、正確さの代替の数学的基準を提案する必要があります。私は知りません。
例:自然数の表現
自然数の場合、関連する構造はペアノ公理によって記述され、実装する必要がある重要な公理は帰納法(ただし、後継者、+0+および)です。実現可能性を使用して、帰納法の実装が行うことを計算できます。それはマップであることが判明します(ここで、自然数を表すまだ未知のデータ型があります)×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
満足 induction x f zero = x
とinduction x f (succ n) = f n (induction x f n)
。これらはすべて実現可能性から生まれます。基準があります。自然数の実装は、ペアノ公理の実装を許可するときに正しいものです。我々はファンクタの初期代数として数値の特性を使用した場合、同様の結果が得られるであろう。X↦1+X
実数の正しい実装
実数と手元の質問に注目しましょう。最初に尋ねる質問は、「実数の関連構造は何ですか?」です。答えは次のとおりです。アルキメデスコーシー完全順序フィールド。これは、「実数」の確立された意味です。あなたはそれを変更することはできません、それはあなたのために他の人によって修正されています(私たちのケースでは、代替のDedekind実数は、ここで検討しているコーシー実数と同型であることが判明します)。 「追加の実装を気にしない」または「順序を気にしない」と言うことはできません。その場合、「実数」ではなく「線形順序を忘れた実数」などと呼ぶ必要があります。
すべての詳細については説明しませんが、構造のさまざまな部分がどのように実数に対してさまざまな操作を行うかを説明します。
- アルキメデスの公理を約計算された合理的な実数の近似を
- フィールド構造は通常の算術演算を提供します
- 線形順序はxをテストするための半決定可能な手順を提供しますx<y
- コーシー完全には私たちに与え機能
lim : (nat -> real) -> real
(の表現)かかり、迅速なコーシー列を、その制限を返します。(配列あれば迅速で| X N - X M | ≤ 2 分(N 、M )のすべてのためのM 、N)。(xn)n|xn−xm|≤2min(n,m)m,n
取得できないのは、同等性のテスト関数です。決定可能であることを要求する実数の公理には何もありません。(対照的に、ペアノの公理は、自然数が決定可能であることを意味し、楽しい練習としてのみを使用して実装することでそれを証明できます)。=eq : nat -> nat -> Bool
induction
人類が使用する実数の通常の10進数表現は、加算を実装することさえできないため、悪いのは事実です。無限仮数を持つ浮動小数点も失敗します(運動:なぜ?)。ただし、有効なのは符号付き数字表現です。つまり、正の数字だけでなく負の数字も使用できます。または、前述のように、高速コーシー検定を満たす有理数列を使用できます。
剛表現も何かを実装しますが、Rは実装しませんR
次の実数表現を考えてみましょう:実数はペア(q 、b )で表されます。ここで(q n )nはxに収束する高速コーシーシーケンスで、bはxが整数かどうかを示すブール値です。これを実数の表現とするには、加算を実装する必要がありますが、ブールフラグを計算することはできません。したがって、これは実数の表現ではありません。しかし、それはまだ何か、実数のの、すなわちサブセット表しんZ ∪ (R ∖ Zをx(q,b)(qn)nxbxZ∪(R∖Z)。確かに、実現可能性の解釈に応じて組合が、我々はしている組合のどの部分を示すフラグで実装されている。ちなみに、あるないに等しいRあなたが信じていない限り除外途中で、どの実装できないため、この説明にはまったく関係ありません。私たちはコンピューターに直観的に物事をさせることを強いられています。Z∪(R∖Z)R
実数が整数かどうかはテストできません
最後に、尋ねられた質問に答えさせてください。現在、実数の許容可能な表現は、有理数の高速コーシーシーケンスによるものであることがわかっています。(重要な定理は、受け入れ可能な実数の2つの表現は実際に計算上同型であると述べています。)
定理:実数が整数かどうかをテストすることは決定できません。
証明。実数が整数かどうかをテストできると仮定します(もちろん、実数は高速のコーシーシーケンスによって実現されます)。必要に応じてより一般的な定理を証明できるアイデアは、整数に収束する非整数の高速コーシーシーケンスを構築することです。これは簡単で、ちょうど取るX N = 2 - n個。次に、次のように停止問題を解決します。チューリングマシンTが与えられた場合、新しいシーケンス(y n )nを
y n = { x n if T(xn)nxn=2−nT(yn)n
つまり、新しいシーケンスシーケンスのように見えている(Xのn個)のn限りTの動作しますが、それはで「スタック」を取得するのxメートルの場合Tはステップmで停止します。非常に重要なことは、新しいシーケンスも高速コーシーシーケンスである(Tが停止するかどうかを知らなくてもこれを証明できる)。したがって、その制限z=limnynを計算できます
yn={xnxmif T has not stopped within n stepsif T stopped in step m and m≤n
(xn)nTxmTmTz=limnynなぜなら、実数の表現は正しいからです。
が整数かどうかをテストします。もしそうなら、それは
0でなければならず、これは
Tが永久に実行される場合にのみ起こります。それ以外の場合、
zは整数ではないため、
Tは停止している必要があります。QED。
z0TzT
演習:有理数をテストできないことを示すために、上記の証明を適合させます。次に、それを調整して、重要なことをテストできないことを示します(これは少し難しいです)。
時には、このすべてのテスト事業について人々が混乱することがあります。彼らは、実数が整数かどうかをテストできないことを証明したと考えています。しかし、確かに42は実数であり、整数であるかどうかはわかります。実際には、任意の特定の我々が思い付く本当の、、88 LN 89、電子π √sin1188ln89など、これらが整数であるかどうかを完全に知ることができます。正確には、私たちはので、伝えることができ、我々は、余分な情報を持っています。これらの実数はシーケンスとしてではなく、我々は剛ビットを計算することができ、そこから記号式として私たちに与えられていません。本当のおよそ我々が持っている唯一の情報は、それに収束する合理的な近似値のシーケンスである(と私はないとすぐにではないシーケンスを記述する記号表現が、出力のブラックボックスを意味するn個の入力上の番目の項のnを、私たちは、その後)機械と同じように無力になります。eπ163√nn
物語の教訓
セットに対して実行する操作の種類がわからない限り、セットの実装について話すことは意味がありません。