Permasalahan dan program
Apakah untuk semua masalah dapat dibuat program untuk menjawabnya? Sekilas tampaknya bisa. Betul begitu?
Kita akan memeriksa hal ini. Kita akan memulai dengan mengasumsikan hipotesis nol terlebih dahulu:
Untuk setiap masalah, ada program yang dapat dibuat untuk menjawab masalah tersebut.
Namun istilah masalah
di sini dapat bermakna terlalu luas. Kita akan membatasinya pada masalah penentuan, yaitu masalah berupa pertanyaan yang dapat dijawab sebagai ya atau tidak.
Untuk setiap masalah penentuan, ada program yang dapat dibuat untuk menjawab masalah tersebut.
Notasi untuk pemberani
Setiap program dapat dituliskan sebagai bilangan asli. Sebagai contoh, fungsi genapkah yang ditulis dalam Python berikut ini akan menentukan apakah bilangan asli yang diberikan adalah genap atau bukan. Hasilnya bisa True (jika benar genap), atau False (jika bukan genap).
Dalam memori komputer, program di atas disimpan sebagai rangkaian bit yang jika diartikan sebagai bilangan nilanya adalah sangat besar, yaitu
Dengan menganggap bahwa inputnya pasti diwakili oleh variabel x, maka bagian penting program tersebut sebenarnya hanyalah return x%2==0. Spasi kita buang sebanyak mungkin selama tidak mengubah makna. Bagian ini yang akan kita terjemahkan sebagai bilangan menggunakan pengkodean ASCII atau UTF-8.
| Karakter | r | e | t | u | r | n | x | % | 2 | = | = | 0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Heksadesimal | 72 | 65 | 74 | 75 | 72 | 6E | 20 | 78 | 25 | 32 | 3D | 3D | 30 |
| Biner | 01110010 | 01100101 | 01110100 | 01110101 | 01110010 | 01101110 | 00100000 | 01111000 | 00100101 | 00110010 | 00111101 | 00111101 | 00110000 |
| Desimal | 9.063.409.302.640.908.429.385.436.839.216 | ||||||||||||
Masih ingat bilangan Gödel? Dalam pembuktian teorema ketaklengkapan, bilangan Gödel adalah bilangan asli yang mewakili teorema. Kali ini kita menggunakan bilangan Gödel juga tetapi untuk mewakili program.
Selain program, input juga perlu dinyatakan sebagai bilangan asli. Karena input untuk program genapkah adalah bilangan asli, maka kita tidak perlu melakukan konversi.
Berbeda dengan program genapkah, program berikut ini akan menentukan apakah banyaknya huruf dalam sebuah untaian adalah genap. Berarti input program ini bukan bilangan, melainkan rangkaian huruf. Dalam Python kita menuliskan inputnya sebagai rangkaian huruf (disebut sebagai string atau untai) di antara tanda kutip. Untuk keperluan pembuktian, kita perlu konversi input ini terlebih dahulu menjadi bilangan.
Karena setiap program dapat dikonversi ke dalam bilangan asli, sementara ada tak berhingga program yang mungkin diciptakan, berarti kardinalitas himpunan semua program yang mungkin dibuat adalah
Input juga dapat dikonversi ke dalam bilangan asli. Alih-alih mulai dari 1, kita mengizinkan input nol, sehingga kita dapat mendaftar input sebagai bilangan 0, 1, 2, 3, dan seterusnya.
Sebagai contoh, kata streptococcus
merupakan barisan bit sebagai berikut, yang nilainya dalam desimal adalah 9.147.277.246.856.551.059.006.056.265.075.
| Karakter | s | t | r | e | p | t | o | c | o | c | c | u | s |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Heksadesimal | 73 | 74 | 72 | 65 | 70 | 74 | 6F | 63 | 6F | 63 | 63 | 75 | 73 |
| Biner | 01110011 | 01110100 | 01110010 | 01100101 | 01110000 | 01110100 | 01101111 | 01100011 | 01101111 | 01100011 | 01100011 | 01110101 | 01110011 |
| Desimal | 9.147.277.246.856.551.059.006.056.265.075 | ||||||||||||
Sekarang mari kita anggap bahwa
| Program | Input | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | … | ||||
| P1 | : | ✔ | ✔ | ✔ | · | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | … | ||
| P2 | : | ✔ | · | · | ✔ | · | ✔ | · | · | · | · | … | ||
| P3 | : | ✔ | · | ✔ | · | ✔ | ✔ | ✔ | · | · | ✔ | … | ||
| P4 | : | ✔ | ✔ | ✔ | · | · | · | ✔ | ✔ | · | · | … | ||
| P5 | : | · | ✔ | ✔ | ✔ | · | ✔ | ✔ | ✔ | ✔ | · | … | ||
| P6 | : | · | · | ✔ | ✔ | · | ✔ | ✔ | · | · | · | … | ||
| P7 | : | ✔ | · | · | ✔ | · | · | ✔ | ✔ | ✔ | ✔ | … | ||
| P8 | : | · | · | · | · | · | ✔ | · | ✔ | ✔ | ✔ | … | ||
| P9 | : | ✔ | ✔ | · | · | · | ✔ | ✔ | · | ✔ | · | … | ||
| P10 | : | · | ✔ | · | ✔ | · | ✔ | · | · | · | · | … | ||
| ⋮ | : | … | ⋱ | |||||||||||
| PD | : | ✔ | · | ✔ | · | · | ✔ | ✔ | ✔ | ✔ | · | … | ||
| PD' | : | · | ✔ | · | ✔ | ✔ | · | · | · | · | ✔ | … | ||
Dengan mengambil diagonalnya, kita akan dapat mengandaikan ada program
Setelah itu, kita mengandaikan ada program
Program
Namun pada saat yang sama, menurut sifat diagonal, program
Jadi ada kontradiksi di sini:
Karena kontradiksi ini dihasilkan oleh hipotesis awal kita, maka hipotesis awal tersebut salah, dan kita harus menerima yang sebaliknya.
Untuk setiap masalah penentuan, ada program yang dapat dibuat untuk menjawab masalah tersebut.
Ada masalah penentuan yang tidak dapat dibuat programnya.
Jadi ternyata sekalipun ada tak berhingga program yang mungkin kita buat, tetap tak dapat menjawab setiap permasalahan penentuan yang dapat kita tanyakan. Banyaknya masalah jauh lebih banyak daripada banyaknya program yang dapat dibuat untuk menjawab masalah tersebut.
Pembuktian ini menggunakan diagonalisasi Cantor, sehingga kita juga dapat memperoleh kardinalitas masalah
| Banyaknya masalah penentuan | |
|---|---|
| Banyaknya program yang dapat menjawab masalah penentuan |
Apakah manusia dapat menyelesaikan semua masalah di dunia?
Perhatikan bahwa setiap kali kita berpikir untuk menjawab permasalahan tertentu, kita berpikir dalam langkah-langkah yang diskret dan berhingga. Berarti manusia sebenarnya berpikir secara algoritmik, setara dengan program komputer, setidaknya ketika manusia dalam keadaan sadar.
Masalah yang kita bicarakan di sini barulah masalah penentuan, yaitu masalah-masalah yang berupa pertanyaan yang selalu dapat dijawab ya atau tidak. Masih ada permasalahan lain yang lebih rumit.
Setidaknya, karena kita telah membuktikan bahwa tidak semua masalah penentuan (yang adalah bagian dari masalah yang lebih umum) dapat dibuat programnya, berarti secara umum kita tidak dapat menyelesaikan semua masalah. Akan ada jauh lebih banyak masalah di dunia yang tidak sanggup kita selesaikan.
Mungkinkah menyelesaikan masalah dengan cara yang lebih tinggi?
Kemampuan komputasi manusia ketika berusaha memikirkan masalah secara sadar terbatas pada komputasi algoritmik yang setara dengan program maupun mesin Turing. Kita dapat menyebut bahwa kemampuan komputasi manusia yang dilakukan secara sadar berada dalam level
Saya tidak tahu apakah manusia memiliki kemampuan komputasi di atas mesin Turing. Jika manusia memiliki kemampuan komputasi yang lebih tinggi dari Aha!
untuk suatu masalah yang selama ini kamu tidak menemukan jawabannya, itu adalah komputasi di atas
Berikutnya: Halting Problem