Sangat mudah untuk bingung tentang apa artinya "mewakili" atau "menerapkan" bilangan real. Bahkan, kami menyaksikan diskusi di komentar di mana representasi itu kontroversial. Jadi izinkan saya mengatasi ini dulu.
Bagaimana kita tahu bahwa implementasi itu benar?
Teori yang menjelaskan bagaimana merepresentasikan sesuatu dalam komputer adalah realisasi . Ide dasarnya adalah bahwa, diberikan himpunan , kami memilih tipe data dan untuk setiap set nilai dari tipe yang menyadarinya . Kami menulis ketika adalah nilai yang menyadari . Misalnya (saya akan menggunakan Haskell tanpa alasan yang jelas), implementasi masuk akal mungkin merupakan tipe data di mana saat mengevaluasi ke angka ( dengan demikian khususnyaτ x ∈ X τ v ⊢ x ∈ X v x N v ⊢ k ∈ N v ¯ k T r u e ⊢ 42 ∈ N F a l s e ⊢ n ∈ n ∈ N n ≠ 42Xτx ∈ Xτv ⊢ x ∈ XvxNInteger
v ⊢ k ∈ Nvk¯¯¯-42
tidak mewakili angka alami, dan juga tidak ada program yang berbeda). Tetapi beberapa joker bisa berjalan dan menyarankan agar kita gunakan Bool
untuk merepresentasikan bilangan asli dengan dan untuk . Kenapa ini salah? Kami membutuhkan kriteria .T r u e ⊢42∈ NF a l s e ⊢n∈ Nn ≠ 42
Dalam kasus "angka joker" pengamatan yang mudah adalah bahwa penambahan tidak dapat diterapkan. Misalkan saya memberi tahu Anda saya memiliki dua angka, keduanya diwakili oleh . Bisakah Anda memberi realizer untuk jumlah mereka? Ya, itu tergantung apakah jumlahnya 42, tetapi Anda tidak tahu. Karena penambahan adalah "bagian penting dari bilangan asli", ini tidak dapat diterima. Dengan kata lain, implementasi bukan tentang set, tetapi tentang struktur , yaitu, kita harus mewakili set sedemikian rupa sehingga dimungkinkan untuk juga menerapkan struktur yang relevan. Biarkan saya menekankan ini:F a l s e
Kami menerapkan struktur, bukan set telanjang. Oleh karena itu, kita harus dapat mengimplementasikan seluruh struktur, bersama dengan operasi dan semua aksioma, agar implementasi menjadi benar.
Jika Anda tidak mematuhi prinsip ini, maka Anda harus menyarankan kriteria matematis alternatif tentang kebenaran. Saya tidak tahu satu pun.
Contoh: representasi bilangan asli
Untuk bilangan asli struktur yang relevan dijelaskan oleh aksioma Peano, dan aksioma penting yang harus dilaksanakan adalah induksi (tetapi juga , penerus, dan ). Kita dapat menghitung, menggunakan kesadaran, apa yang dilakukan oleh induksi. Ternyata menjadi peta (di mana datatype belum diketahui yang mewakili bilangan asli)+ ×0+×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
memuaskan induction x f zero = x
dan induction x f (succ n) = f n (induction x f n)
. Semua ini keluar dari kesadaran. Kami memiliki kriteria: implementasi bilangan asli benar ketika memungkinkan implementasi aksioma Peano. Hasil serupa akan diperoleh jika kita menggunakan karakterisasi angka sebagai aljabar awal untuk functor .X↦ 1 + X
Implementasi bilangan real yang benar
Mari kita perhatikan bilangan real dan pertanyaan yang ada. Pertanyaan pertama yang diajukan adalah "apa struktur yang relevan dari bilangan real?" Jawabannya adalah: Archimedean Cauchy isian lengkap yang dipesan . Ini adalah arti mapan dari "bilangan real". Anda tidak bisa mengubahnya, itu telah diperbaiki oleh orang lain untuk Anda (dalam kasus kami real Dedekind alternatif ternyata isomorfik dengan real Cauchy, yang kami pertimbangkan di sini.) Anda tidak dapat mengambil bagian dari itu, Anda tidak diperbolehkan mengatakan "Saya tidak peduli tentang penerapan penambahan", atau "Saya tidak peduli dengan pesanan". Jika Anda melakukan itu, Anda tidak boleh menyebutnya "bilangan real", tetapi sesuatu seperti "bilangan real di mana kami lupa urutan linier".
Saya tidak akan membahas semua detail, tetapi izinkan saya hanya menjelaskan bagaimana berbagai bagian struktur memberikan berbagai operasi pada real:
- yang Archimedean aksioma adalah tentang komputasi rasional perkiraan dari real
- struktur lapangan memberikan operasi aritmatika yang biasa
- urutan linier memberi kita prosedur yang dapat ditentukan sebelumnya untuk pengujian x < y
lim : (nat -> real) -> real
( xn)n m , n|xn−xm|≤2min(n,m)m , n
Apa yang kita tidak dapatkan adalah fungsi tes untuk kesetaraan. Tidak ada dalam aksioma untuk real yang meminta bahwa dapat dipilih. (Sebaliknya, aksioma Peano menyiratkan bahwa bilangan asli dapat ditentukan, dan Anda dapat membuktikan bahwa dengan menerapkan hanya menggunakan sebagai latihan yang menyenangkan).=eq : nat -> nat -> Bool
induction
Adalah fakta bahwa representasi desimal biasa dari realita yang digunakan umat manusia adalah buruk karena dengan itu kita bahkan tidak dapat mengimplementasikan penambahan. Titik mengambang dengan mantissa tak terbatas juga gagal (olahraga: mengapa?). Apa yang berhasil, bagaimanapun adalah representasi digit yang ditandatangani , yaitu, di mana kami mengizinkan digit negatif dan juga digit positif. Atau kita bisa menggunakan urutan rasional yang memenuhi tes Cauchy cepat, seperti yang dinyatakan di atas.
Representasi Tsuyoshi juga mengimplementasikan sesuatu, tetapi tidakR
Mari kita perhatikan representasi real berikut: a nyata diwakili oleh pasangan mana adalah deretan Cauchy cepat yang konvergen ke dan adalah Boolean yang menunjukkan apakah adalah bilangan bulat. Agar ini menjadi representasi dari real, kita harus mengimplementasikan penambahan, tetapi ternyata kita tidak dapat menghitung bendera Boolean. Jadi ini bukan representasi dari real. Tapi itu masih merupakan sesuatu, yaitu bagian dari real( q , b ) ( q n ) n x b x Z ∪ ( R ∖ Z ) Z ∪ ( R ∖ Z ) Rx(q,b)(qn)nxbxZ∪(R∖Z). Memang, menurut interpretasi realisasi sebuah serikat diterapkan dengan bendera yang menunjukkan bagian mana dari serikat kita berada. Omong-omong, adalah a tidak sama dengan , kecuali jika Anda percaya pada tengah yang dikecualikan, yang tidak dapat diimplementasikan dan karena itu sangat tidak relevan untuk diskusi ini. Kita dipaksa oleh komputer untuk melakukan berbagai hal secara intuisi.Z∪(R∖Z)R
Kami tidak dapat menguji apakah real adalah bilangan bulat
Akhirnya, izinkan saya menjawab pertanyaan yang diajukan. Kita sekarang tahu bahwa representasi real yang dapat diterima adalah satu dengan deretan rasional Cauchy yang cepat. (Teorema penting menyatakan bahwa dua representasi real yang dapat diterima sebenarnya adalah isomorfik yang dapat dihitung).
Teorema: Menguji apakah real adalah integer tidak dapat ditentukan.
Bukti. Misalkan kita dapat menguji apakah real adalah bilangan bulat (tentu saja, real direalisasikan oleh deretan Cauchy yang cepat). Idenya, yang akan memungkinkan Anda untuk membuktikan teorema yang jauh lebih umum jika Anda mau, adalah untuk membangun urutan Cauchy cepat dari non-integer yang konvergen ke integer. Ini mudah, ambil saja . Selanjutnya, selesaikan masalah Hentikan sebagai berikut. Diberikan mesin Turing , tentukan urutan baru oleh
Artinya, urutan baru seperti urutan selamax n = 2 - n T ( y n ) n y n = { x n jika T tidak berhenti dalam n langkah x m jika T berhenti pada langkah m dan m ≤ n ( x n ) n T x m T m T z = lim n y n z 0(xn)nxn=2−nT(yn)n
yn={xnxmif T has not stopped within n stepsif T stopped in step m and m≤n
(xn)nTberjalan, tetapi kemudian "macet" di jika berhenti pada langkah . Sangat penting, urutan baru juga merupakan urutan Cauchy cepat (dan kita dapat membuktikan ini tanpa mengetahui apakah berhenti). Oleh karena itu, kita dapat menghitung batasnya , karena representasi real kita benar. Uji apakah adalah bilangan bulat. Jika ya, maka harus dan ini hanya terjadi jika berjalan selamanya. Kalau tidak, bukan bilangan bulat, jadi harus berhenti. QED.
xmTmTz=limnynz0z TTzT
Latihan: sesuaikan bukti di atas untuk menunjukkan bahwa kita tidak dapat menguji angka rasional. Kemudian sesuaikan untuk menunjukkan bahwa kami tidak dapat menguji apa pun yang non-sepele (ini agak sulit).
Terkadang orang bingung tentang semua bisnis pengujian ini. Mereka pikir kami telah membuktikan bahwa kami tidak pernah dapat menguji apakah real adalah bilangan bulat. Tapi yang pasti, 42 adalah nyata dan kita bisa tahu apakah itu bilangan bulat. Faktanya, setiap real khusus yang kita buat, , , , dll., Kita dapat dengan baik mengetahui apakah mereka bilangan bulat. Tepatnya, kita dapat mengetahui karena kita memiliki informasi tambahan: real ini tidak diberikan kepada kita sebagai urutan, melainkan sebagai ekspresi simbolik dari mana kita dapat menghitung bit Tsuyoshi. Begitu satu-satunya informasi yang kita miliki tentang yang sebenarnya adalah serangkaian perkiraan rasional yang menyatu dengannya (dan saya lakukan88 ln 89 e π √sin1188ln89 nneπ163√bukan berarti ekspresi simbolik yang menggambarkan urutan, tetapi kotak hitam yang menampilkan istilah ke- pada input ) maka kita akan sama tidak berdaya dengan mesin.nn
Moral cerita
Tidak masuk akal untuk berbicara tentang implementasi suatu set kecuali kita tahu operasi apa yang ingin kita lakukan di atasnya.