Ringkasan: Menurut teorema Rice, semuanya tidak mungkin. Namun, saya melakukan hal - hal yang dianggap mustahil sepanjang waktu!
Tentu saja, teorema Rice tidak hanya mengatakan "semuanya tidak mungkin". Itu mengatakan sesuatu yang lebih spesifik: "Setiap properti dari program komputer tidak dapat dikomputasi."
(Jika Anda ingin membagi rambut, setiap properti "non-sepele". Yaitu, properti yang dimiliki semua program atau tidak ada program yang dapat dihitung secara sepele. Tetapi properti lainnya tidak dapat dihitung.)
Itulah yang dikatakan teorema, atau tampaknya dikatakan. Dan mungkin sejumlah besar orang yang sangat pintar telah dengan cermat memverifikasi kebenaran teorema ini. Tetapi tampaknya benar-benar menentang logika! Ada banyak properti program yang mudah untuk dihitung !! Sebagai contoh:
Berapa banyak langkah yang dijalankan suatu program sebelum berhenti? Memutuskan apakah angka ini terbatas atau tidak terbatas justru merupakan Masalah Pemutusan, yang tidak dapat dihitung. Untuk memutuskan apakah angka ini lebih besar atau kurang dari beberapa hingga adalah sepele! Jalankan saja program hingga n langkah dan lihat apakah itu berhenti atau tidak. Mudah!
Demikian pula, apakah program menggunakan lebih atau kurang dari unit memori dalam langkah-langkah eksekusi m pertamanya ? Komputasi sepele.
Apakah teks program menyebutkan variabel bernama ? Analisis tekstual yang sepele akan mengungkapkan jawabannya.
Apakah program memanggil perintah ? Sekali lagi, pindai teks program mencari nama perintah itu.
Saya dapat melihat banyak properti yang memang terlihat tidak dapat dikomputasi juga; misalnya, berapa banyak penambahan yang dijalankan oleh program secara lengkap? Yah, itu hampir sama dengan menanyakan berapa banyak langkah yang dilakukan oleh program, yang sebenarnya adalah Masalah Berhenti. Tapi sepertinya ada banyak program properti yang sangat, sangat mudah untuk dihitung. Namun, teorema Rice menegaskan bahwa tidak satupun dari mereka yang dapat dihitung.
Apa yang kulewatkan di sini?
sumber
Jawaban:
Untuk keperluan diskusi ini, "program" adalah bagian dari kode yang selalu mengambil integer sebagai input, dan berjalan selamanya atau mengembalikan integer. Kita mengatakan bahwa dua program dan g secara ekstensi sama jika mereka menghitung fungsi yang sama, yaitu, untuk setiap angka n baik f ( n ) dan g ( n ) berjalan selamanya, atau keduanya mengakhiri dan menghasilkan angka yang sama.f g n f( n ) g( n )
Sebuah properti ekstensional dari program adalah properti yang hal kesetaraan ekstensional, yaitu, jika f dan g adalah extensionally sama maka mereka baik keduanya memiliki properti PP f g P atau keduanya tidak memilikinya.
Berikut adalah beberapa contoh properti non- ekstensional:
k
. (Kami dapat mengubah nama variabel.)Saya yakin Anda telah memperhatikan bahwa saya mencantumkan secara tepat dugaan contoh-berlawanan Anda dengan teorema Rice, yang mengatakan:
Ada cara lain untuk menjelaskan ini: Anda harus membedakan antara program dan fungsi yang dikomputasinya. Banyak program yang berbeda menghitung fungsi yang sama (semuanya secara ekstensi sama). Teorema Rice adalah tentang sifat-sifat fungsi, bukan tentang sifat-sifat program yang menghitungnya.
sumber
Kesalahpahaman mendasar:
Teorema Rice berkaitan dengan properti semantik (properti fungsi yang dihitung oleh suatu program, misalnya domain atau rentang nilai). Apa yang Anda rujuk adalah sifat sintaksis (properti program , seperti runtime atau berapa banyak variabel yang digunakan).
Tampaknya tidak banyak yang diketahui untuk sifat sintaksis; lihat pertanyaan ini .
sumber