Bukti ketidaktentuan Masalah Pemutusan

25

Saya mengalami kesulitan memahami bukti tentang keraguan atas Masalah yang Menghambat.

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

Jika kembali apakah program yang perhentian pada input b , mengapa kita harus melewati kode P untuk kedua a dan b ?H(a,b)abPab

Mengapa kita tidak bisa memberi makan dengan P dan beberapa input sewenang-wenang, katakanlah, x ?H()Px

Netik
sumber
Ingatlah bahwa dalam model komputasi yang digunakan di sini, input apa pun (yang disandikan) diizinkan. Tidak ada pemeriksaan jenis atau semacamnya. Anda selalu dapat menyandikan program dan meneruskannya sebagai input untuk dirinya sendiri.
penanggung jawab
2
Anda bisa memberi makan masukan apa pun yang Anda inginkan. Struktur pembuktian ini membutuhkan pertimbangan input tertentu. H
David Richerby
1
Anda dapat memberikan input apa pun ke program. Tujuannya adalah untuk menemukan kontradiksi. Secara teoritis mesin 'H' harus bekerja untuk semua jenis input. Jadi kami mempertimbangkan salah satu dari semua input yang mungkin, yang mengarah pada kontradiksi.
Ugnes
Bukti ini sedikit cacat. Pertimbangkan jika saya memiliki H () yang berfungsi untuk semuanya kecuali dirinya sendiri; itu masih akan menjadi solusi umum untuk Masalah Henti.
Yosua
Terkait, mungkin duplikat: cs.stackexchange.com/questions/42819/…
Ilmari Karonen

Jawaban:

27

Buktinya bertujuan untuk menemukan kontradiksi. Anda harus memahami apa yang berasal dari kontradiksi, untuk memahami mengapa digunakan sebagai input untuk dirinya sendiri. Kontradiksinya adalah, secara informal: jika kita memiliki mesin H (a, b) yang memutuskan "a accepts b", maka kita dapat membuat mesin yang menerima mesin yang tidak menerima sendiri. (Baca yang beberapa kali sampai Anda mendapatkannya.) Mesin ditampilkan dalam gambar - sebut saja M - M ( P ) = tidak P tidak menerima P ?PMM(P)=PP

Kontradiksi terjadi ketika Anda bertanya: apakah menerima M ? Cobalah untuk mencari dua opsi untuk melihat bagaimana ada kontradiksi.MM

menerimaM jika dan hanya jika M tidak menerimaM ; ini jelas sebuah kontradiksi.MMMM

Inilah sebabnya mengapa penting untuk bukti menjalankan pada dirinya sendiri bukan input sewenang-wenang. Ini adalah tema umum dalam bukti ketidakmungkinan yang dikenal sebagai argumen diagonal.P

aelguindy
sumber
38

Abaikan gambar sejenak; kita akan membahasnya segera. Program seharusnya menjadi tester berhenti: ketika kita memberikan H input dari program a (pikirkanH(a,b)Ha sebagai daftar program) dan apa-apa untuk b , H ( a , b ) bertindak sebagai berikutabH(a,b)

  1. Jika program yang diwakili oleh perhentian ketika diberikan b sebagai masukan, H ( a , b )abH(a,b) akan menjawab "ya". Di sisi lain, jika program yang dijelaskan oleh berjalan selamanya ketika diberi masukan b maka H ( a , b ) akan menjawab "tidak".abH(a,b)
  2. Yang penting, program akan selalu berhenti dan memberikan jawaban yang benar untuk setiap pasangan ( a , b ) .H(a,b)

Argumen bahwa tidak mungkin dibangun bergantung pada aksi program "sesat" tertentu, P , yang menggunakan H sebagai subrutin. P mengambil input dari daftar program apa pun, x , dan melakukan hal berikut:HPHPx

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

Tidak sulit melihatnya

akan berhenti jika dan hanya jika program x akan berjalan selamanya ketika diberi deskripsi sendiri sebagai input.P(x)x

Sejauh ini bagus: pasti akan menjadi sebuah program selama subrutin H-nya adalah sebuah program.PH

Sekarang kembali ke gambar. Apa yang terjadi jika P diberi deskripsi sendiri sebagai input? Gambar hanya menjelaskan skenario itu: Misalkan menjadi deskripsi program P , lalu, sebagai pengganti bagian yang disorot di atas, kita haruspP

akan berhenti jika dan hanya jika program P ( p ) akan berjalan selamanya.P(p)P(p)

Jelas, perilaku paradoks ini tidak mungkin, jadi kami terpaksa mengambil kesimpulan bahwa subroutine tidak bisa menjadi tester berhenti, karena gagal dalam satu kasus, di mana ia diberikan ( p , p )H(p,p) sebagai input. Mungkin ada kasus-kasus lain di mana bekerja sebagaimana mestinya, tetapi karena H gagal dalam setidaknya satu situasi, itu tidak dapat menjadi tester berhenti lengkap, seperti yang disyaratkan.HH

Rick Decker
sumber
Saya suka jawaban ini. Meskipun sekarang saya mengerti buktinya, sepertinya membuktikan bahwa H dapat membuang pengecualian batas rekursi.
Faks
2
@Fax Htidak dipanggil lebih dari sekali, tidak ada rekursi Psama sekali. H(P, P)tidak mengeksekusi P, itu hanya "secara ajaib" menentukan apakah Pberhenti ketika dilewatkan sendiri.
Ajedi32
@ Ajedi32 H(P,P)tidak harus mengeksekusi P, tetapi harus dijalankan H(x ↦ H(x,x), P)sebagai bagian dari menentukan apakah Pberhenti. Yang mengembang ke H(x ↦ H(y ↦ H(y,y), x), P)dan seterusnya.
Faks
@Fax Implementasi dari Htidak ditentukan dalam bukti ini. Jadi tidak, itu tidak harus mengeksekusi apa pun, apakah itu Psendiri atau tidak. Buktinya dimulai dengan asumsi bahwa ada semacam program Hyang secara ajaib memutuskan masalah penghentian, kemudian berlanjut untuk membuktikan bahwa keberadaan program semacam itu akan menjadi kontradiksi, dan dengan demikian tidak ada program semacam itu.
Ajedi32
1
@Fax Anda menaikkan poin yang baik tentang apakah suatu program bisa ada yang memutuskan masalah penghentian kecuali ketika dipanggil sendiri. Lihat Apakah ada bukti keraguan terhadap masalah penghentian yang tidak bergantung pada rujukan sendiri atau diagonalisasi? untuk pertanyaan menarik tentang itu.
Ajedi32
9

Coba bukti yang lebih cantik dengan animasi. Dan karena ansewrs harus mengandung lebih dari sekadar tautan ke situs, inilah jawaban untuk pertanyaan Anda.

Pertama, mari kita ingat bagaimana bukti tidak adanya oracle Menghentikan bekerja. Kami membuktikan bahwa dengan memberikan kandidat Huntuk Menghentikan oracle, ada program Pdan input ayang Hgagal memprediksi dengan benar apa yang P(a)dilakukan.

Teorema: Biarkan Hprogram apa pun yang mengambil dua input dan selalu mengembalikan salah satu haltatau loop. Lalu ada program Qdan input ayang Q(a)berhenti jika, dan hanya jika, H(Q,a)kembali loop.

Bukti. Pertimbangkan programnya

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Biarkan Q = Pdan a = P. Salah satu H(Q,a) = haltatau H(Q,a) = loop:

  • jika H(Q,a) = haltkemudian Q(a)(yang adil P(P)) berjalan selamanya dengan definisi P.
  • jika H(Q,a) = loop kemudian Q(a)dihentikan oleh definitoin dari P.

QED

Anda bertanya mengapa kami mempertimbangkan H(P,P)alih-alih H(P,X)untuk yang lain X. Jawaban yang jelas adalah "karena H(P,P)apa yang membuat buktinya bekerja"! Jika Anda menggunakanH(P,X) untuk beberapa sewenang-wenang X, maka Anda akan terjebak. Memang, buktinya akan terlihat seperti ini:

Bukti rusak.Pertimbangkan programnya

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Biarkan Q = Pdan a = Xuntuk beberapa sewenang-wenang X. AntaraH(Q,X) = halt atau H(Q,X) = loop:

  • misalkan H(Q,X) = haltkita tidak bisa mengatakan apa yang P(X)terjadi, karena apakah P(X)penghentian tergantung pada apa yang H(X,X)kembali. Kami terjebak. Namun, jika kita tahu ituP(X) dan X(X)sama, kita bisa membuat kemajuan. (Jadi, kita harus mengambilnya X = P).
  • jika H(Q,a) = loop kemudian kita terjebak lagi, dan kita akan macet jika X = P.

Tidak QED.

Saya harap ini menunjukkan bahwa kita harus mempertimbangkan H(P,P)untuk membuat ide kita berfungsi.

Andrej Bauer
sumber
Ha ha. Luar biasa! :)
aelguindy
2

Kesimpulan dari buktinya adalah analogi ini:

P(P)P(P)P(P)(P)(P)

(P)(P)

Ahmed Nassar
sumber