Permasalahan dan program
Apakah semua masalah yang decidable dapat dibuat program untuk menjawabnya? Sekilas sepertinya seperti itu, bukan?
Baiklah, kita akan membuat hipotesis nol kita:
Untuk setiap masalah yang decidable, ada program yang dapat dibuat untuk menjawab masalah tersebut.
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.
def genapkah(x):
return x % 2 == 0
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. 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.
def genapkahBanyakHurufnya(x):
return len(x) % 2 == 0
Berarti input program ini bukan bilangan, melainkan rangkaian huruf, sehingga kita perlu konversi terlebih dahulu menjadi bilangan.
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 | ||||||||||||
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.
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 yang decidable, ada program yang dapat dibuat untuk menjawab masalah tersebut.
Ada masalah decidable yang tidak dapat dibuat programnya.
Jadi ternyata, program yang dapat kita buat, sekalipun jumlahnya tak berhingga, 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 yang decidable | |
|---|---|
| Banyaknya program yang decidable |
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.
Dengan demikian, pastilah ada jauh lebih banyak masalah di dunia yang tidak sanggup kita selesaikan.
Perhatikan bahwa masalah yang kita bicarakan di sini barulah masalah yang decidable, yaitu masalah-masalah yang berupa pertanyaan yang selalu dapat dijawab ya atau tidak. Masih ada permasalahan lain yang lebih rumit, yaitu masalah-masalah yang semi-decidable maupun undecidable.
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 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