Apakah mungkin untuk menguji apakah bilangan yang dihitung rasional atau bilangan bulat?

18

Apakah mungkin untuk menguji secara algoritmik apakah bilangan yang dihitung rasional atau bilangan bulat? Dengan kata lain, apakah mungkin bagi perpustakaan yang mengimplementasikan angka yang dapat dihitung untuk menyediakan fungsi isIntegeratau isRational?

Saya menduga itu tidak mungkin, dan bahwa ini entah bagaimana terkait dengan fakta bahwa tidak mungkin untuk menguji apakah dua angka sama, tetapi saya tidak melihat bagaimana membuktikannya.

Sunting: Angka dapat dihitung diberikan oleh fungsi yang dapat mengembalikan perkiraan rasional dengan presisi : , untuk setiap . Dengan fungsi seperti itu, apakah mungkin untuk menguji apakah atau ?f x ( ϵ ) x ϵ | x - f x ( ϵ ) | ϵ ϵ > 0 x Q x Zxfx(ϵ)xϵ|xfx(ϵ)|ϵϵ>0xQxZ

dbarbosa
sumber
3
Bagaimana angka yang dapat dihitung diberikan?
Tsuyoshi Ito
10
Bagaimana angka itu diberikan tentu saja relevan. Sebagai contoh konyol, jika input berisi flag apakah angka tersebut bilangan bulat atau tidak, memutuskan apakah input bilangan bulat atau tidak adalah sepele.
Tsuyoshi Ito
3
Pertanyaan serupa: cstheory.stackexchange.com/questions/10495/…
Kristoffer Arnsfelt Hansen
3
(1) "Bagaimana Anda tahu bahwa ini bilangan bulat?" Mengapa saya harus peduli? Anda tidak mengatakan apa pun tentang persyaratan tentang operasi. (2) "Jika Anda melihat dua jawaban sejauh ini, mereka tidak menyebutkan apa-apa tentang implementasi." Saya tidak tahu apa yang Anda maksud dengan "implementasi" di sini, atau mengapa kalimat ini relevan dengan komentar saya.
Tsuyoshi Ito
16
Saya harap jawaban saya mengubur diskusi ini. Tsuyoshi, Anda salah, itu relevan operasi apa yang dapat dihitung. Kami tidak menerapkan bilangan real dalam ruang hampa, tetapi untuk memanipulasi mereka . Menurut Anda, kami bisa menggunakan tipe unit untuk mengimplementasikan semuanya. Ya, kita bisa, tapi kemudian beberapa operasi tidak akan dihitung, dan itu adalah justru kriteria dengan mana kita menilai representasi.
Andrej Bauer

Jawaban:

32

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 e42 N F a l s en n N n 42XτxXτvxXvxNIntegervkNvk¯-42tidak mewakili angka alami, dan juga tidak ada program yang berbeda). Tetapi beberapa joker bisa berjalan dan menyarankan agar kita gunakan Booluntuk merepresentasikan bilangan asli dengan dan untuk . Kenapa ini salah? Kami membutuhkan kriteria .True42NFalsenNn42

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:False

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 = xdan 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 .X1+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|xnxm|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 -> Boolinduction

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( RZ ) Z( RZ ) Rx(q,b)(qn)nxbxZ(RZ). 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(RZ)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=2nT(yn)n

yn={xnif T has not stopped within n stepsxmif T stopped in step m and mn
(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π163bukan 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.

Andrej Bauer
sumber
16
Jika jawaban saya adalah istri, saya hanya bisa menjawab sekali. Atau setidaknya saya harus menghapus jawaban sebelumnya sebelum saya menulis jawaban berikutnya.
Andrej Bauer
5
@ Max: teorema pertama dari jenis ini diberikan oleh Kreisel, Lacombe dan Shoenfield (lihat teorema KLS). Secara independen Tsteitin memberikan teorema yang menggeneralisasi KLS dan secara eksplisit berbentuk "setiap peta yang dapat dihitung adalah terus menerus yang dapat dihitung".
Andrej Bauer
6
Saya perlu menulis buku teks - (Google google google). Oke, bagus, Anda memiliki masa jabatan. Lakukan itu!
Jeffε
10
@ Tsuyoshi: Pertanyaannya menggunakan frasa "bilangan real" yang ditetapkan tanpa kualifikasi. Struktur bilangan real adalah standar. Anda bebas untuk mempertimbangkan struktur lain, tetapi Anda tidak bebas untuk salah menafsirkan terminologi standar.
Andrej Bauer
21
Secara teknis, Anda benar, kata "asli" tidak digunakan. Tetapi Anda salah tentang definisi bilangan real. Atau saya akan begini: matematika yang buruk untuk berpikir bahwa real adalah set tertentu yang datang pertama, hanya diikuti oleh beberapa struktur. Sama seperti kita mendefinisikan kelompok, cincin, ruang topologi, dll., Dalam hal strukturnya, jadi kita harus mendefinisikan objek khusus dalam hal sifat universal mereka (bilangan alami adalah semiring awal, bilangan bulat cincin awal, bilangan awal rationals, bidang awal, real .....).
Andrej Bauer
10

Saya cenderung berpikir ini tidak dapat diputuskan:

Biarkan menjadi bilangan irasional yang dapat dihitung. Pertimbangkan TM . Anda dapat membangun fungsi yang menjalankan pada , dan secara paralel menghitung dengan presisi yang semakin besar. Jika berhenti, ia berhenti menghitung , jika tidak ia akan melanjutkan.M M ϵ x M xxMMϵxMx

Memutuskan apakah fungsi ini menghitung bilangan rasional setara dengan masalah penghentian.

Shaull
sumber
Saya tidak mengerti jawaban Anda, bisakah Anda menjelaskan lebih lanjut? Saya tidak mengerti bagaimana Anda mengaitkannya dengan masalah penghentian, dan yang lebih penting, saya pikir tidak ada alasan bagi untuk berhenti (bahkan jika adalah bilangan bulat). xMx
dbarbosa
Seperti yang ditunjukkan Tsuyoshi, jawabannya tergantung pada representasi dan model perhitungannya. Jawaban Anda dengan benar mengatakan bahwa jika mengambil input menjadi bilangan real yang dapat dihitung yang diberikan oleh TM, menghitungnya maka kesetaraan tidak dapat ditentukan. Ini benar, namun tidak dekat dengan model apa pun yang digunakan dalam praktik.
Kaveh
2
Memang, jawaban saya merujuk pada representasi sebagaimana diposting dalam pertanyaan, apakah itu praktis atau tidak. @ dbarbosa - Saya akan menjelaskan: diberi TM , ikuti konstruksi dalam jawabannya. Kemudian, asumsikan dengan cara kontradiksi bahwa Anda dapat memutuskan apakah mesin yang dihasilkan mewakili yang rasional atau tidak. Jika rasional, itu berarti bahwa pada titik tertentu, berhenti dan kami berhenti menghitung angka. Di sisi lain, jika tidak rasional, maka tidak berhenti. Dengan demikian, kita tahu apakah berhenti, memecahkan masalah yang terputus-putus, yang diketahui tidak dapat dipastikan. M M MMMMM
Shaull
10

Dengan asumsi nyata diberikan sebagai urutan perkiraan rasional dengan kesalahan yang dibatasi oleh beberapa fungsi yang diketahui dapat dihitung yang cenderung nol (semua perkiraan tersebut setara, dan sesuai dengan topologi biasa pada real).

Fungsi yang dapat dihitung kontinu. IsRational dan IsInteger tidak berkelanjutan dan karenanya tidak dapat dihitung.

IsInteger bersifat semi- komputasi: ada prosedur yang pada akhirnya akan menampilkan "false" jika inputnya bukan bilangan bulat, tetapi akan berjalan selamanya jika inputnya adalah bilangan bulat. Prosedur ini hanya melihat pada setiap perkiraan dan memeriksa apakah ada bilangan bulat dalam batas kesalahan. Fungsi ini kontinu ketika kita menggunakan topologi Sierpiński pada {true, false} (yaitu {false} adalah himpunan terbuka tetapi {true} tidak).

Maks
sumber
Terima kasih atas jawabannya. Saya tidak mengerti = tidak kontinyu tidak dapat dihitung, saya kira Anda menggunakan teorema (mungkin dikenal luas) yang tidak saya sadari atau tidak saya ingat. Bisakah Anda memberikan detail lebih lanjut tentang langkah ini?
dbarbosa
1
"computable => continuous" tampaknya merupakan teorema rakyat - saya tidak dapat menemukan kutipan asli. Teori perhitungan pada objek tak terbatas dan koneksi ke topologi dijelaskan dengan cukup baik (IMO) dalam slide ini oleh Brattka ( math.uni.wroc.pl/ ~ pkowa/ slides / brattka.pdf ). Proposisi 2 dalam slide menyatakan bahwa semua fungsi yang dapat dihitung pada urutan naturals adalah kontinu; dikombinasikan dengan Teorema 12, seseorang mendapatkan hasil untuk fungsi tipe lain.
Maks
6

Tidak dapat dipastikan apakah angka yang dihitung sama dengan nol .

(Jadi oracle perkiraan Anda menghasilkan 0 untuk setiap ε yang Anda coba? Mungkin Anda belum memberikan ε yang cukup kecil.)

Dengan demikian, tidak dapat dipastikan apakah angka yang dapat dihitung antara -½ dan + ½ adalah bilangan bulat.

Jeffε
sumber
2

Fungsi yang dapat dihitung lebih kuat daripada fungsi yang berkelanjutan, artinya fungsi yang dapat dihitung harus kontinu dalam topologi informasi.

F:R{Yes,No}

F(r)={YESrQNOo.w.

dapat dihitung.

rk2nr[k2n,k+12n]n

Maka fungsi Anda tidak kontinu dan karenanya tidak dapat dihitung.

M0n[12n,12n]MMmM[12m,12m]MMNOYESM[12m,12m]MYESM

Bukti bahwa setiap fungsi yang dikomputasi perlu kontinu adalah serupa.

Kaveh
sumber