Bingung dengan teorema Rice

37

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!nn

  • Demikian pula, apakah program menggunakan lebih atau kurang dari unit memori dalam langkah-langkah eksekusi m pertamanya ? Komputasi sepele.nm

  • Apakah teks program menyebutkan variabel bernama ? Analisis tekstual yang sepele akan mengungkapkan jawabannya.k

  • 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?

Matematika Matematika
sumber
8
"Menurut teorema Rice, semuanya tidak mungkin." - Tidak. "Setiap properti dari program komputer tidak dapat dikomputasi." - Tidak. Namun, Anda tidak sendirian: sebagian besar siswa mengalami kesalahpahaman ini.
Raphael

Jawaban:

36

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.fgnf(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 PPfgP atau keduanya tidak memilikinya.

Berikut adalah beberapa contoh properti non- ekstensional:

  1. Program terhenti dalam n langkah. (Kami selalu dapat memodifikasi program menjadi program yang secara ekstensi sama dengan yang berjalan lebih lama.)
  2. Program ini menggunakan kurang dari sel memori dalam m pertamanm langkah eksekusi. (Kami selalu dapat memodifikasi program menjadi program yang secara ekstensi sama sehingga ia menggunakan sebagian memori tanpa alasan yang jelas.)
  3. Teks program menyebutkan variabel bernama k . (Kami dapat mengubah nama variabel.)
  4. Apakah program memanggil perintah . Ini mungkin sedikit bergantung pada apa σ itu, tetapi jika itu adalah sesuatu yang dapat disimulasikan dalam beberapa cara, maka kita dapat menghindari σ dan masih memiliki program yang secara ekstensi sama dengan yang asli.σσσ

Saya yakin Anda telah memperhatikan bahwa saya mencantumkan secara tepat dugaan contoh-berlawanan Anda dengan teorema Rice, yang mengatakan:

Teorema (Padi): Properti ekstensional yang dapat dihitung dari program baik dimiliki oleh semua program atau tidak sama sekali.

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.

Andrej Bauer
sumber
Saya tidak bisa mendapatkan jawaban ini .. (Maaf jika saya menanyakan hal yang sama, tetapi akan lebih baik untuk memperjelas hal ini). Dikatakan bahwa Anda dapat memodifikasi program-program tersebut dengan mengubah sintaks mereka untuk mendapatkan padanan ekstensional , tetapi bagaimana cara mengeceknya secara ekuivalen ekstensional? Anda tidak dapat menggunakan program untuk membandingkan jika fungsi-fungsi program secara umum memiliki kedua properti itu, jadi ketika Anda mengatakan "modifikasi", saya pikir itu mungkin karena merupakan contoh sederhana, (akankah Anda menambahkan "modifikasi dengan hati-hati"? Atau gunakan "yang baik" IDE untuk itu "? ..) Saya pikir sekali dimodifikasi Anda tidak dapat memeriksa secara umum jadi, mungkin Rice memegang.
Hernan_eche
1
n+m=m+n
Juga, Anda melakukan lompatan penalaran yang aneh dalam penalaran Anda: karena kesetaraan ekstensional tidak dapat ditentukan, teorema Rice mungkin salah. Bagaimana? Dan hanya karena kesetaraan ekstensional tidak dapat diputuskan, itu tidak berarti tidak ada contoh yang dapat kita putuskan. Yang saya sebutkan - kita bisa memutuskan itu.
Andrej Bauer
36

Kesalahpahaman mendasar:

Setiap properti dari program komputer tidak dapat dihitung

PRE

{MfMP}

P

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 .

Raphael
sumber
1
Saya tersesat setelah kira-kira kalimat pertama. Maaf. Adakah yang bisa menjelaskan perbedaan antara semantik dan properti sintaksis?
MathematicalOrchid
@MathematicalOrchid: Anda dapat dengan aman mengabaikan kalimat itu; paragraf pertama menampung semua informasi yang Anda butuhkan. Saya akan menjelaskan lebih lanjut.
Raphael
2
Semantic = tentang apa yang dilakukan program. Sintaksis = tentang seperti apa program itu.
reinierpost