Bisakah pengujian menunjukkan tidak adanya bug?

18

( N + 1 ) n(n+1) poin diperlukan untuk secara unik menentukan polinomial derajat ; misalnya, dua titik di pesawat menentukan dengan tepat satu garis.n

Berapa banyak poin yang diperlukan untuk secara unik menentukan fungsi yang dapat dihitung , mengingat lamanya program yang menghitung dalam bahasa tetap? (Yaitu terikat pada kompleksitas Kolmogorov dari ).f : N N f:NNf fff

Idenya adalah bahwa, setidaknya secara teoritis, seseorang dapat membuktikan kebenaran suatu program dengan membuat tes yang cukup.

Jika seseorang memiliki program panjang yang menghitung , ada terikat pada jumlah fungsi yang dapat dihitung dengan panjang sumber paling .PPLLffLL

Karena itu seseorang "hanya" perlu membuktikan bahwa:

  • ff dapat dihitung dengan panjang sumberLL
  • PP tidak menghitung fungsi lain yang dapat dihitung dalam byte atau kurang (dengan pengujian)LL

Gagasan ini mungkin tidak memiliki konsekuensi praktis (batas-batasnya pasti bersifat eksponensial).

pbaren
sumber
4
Misalkan deskripsi Anda dari fungsi diberikan dalam biner, maka ada paling 2 L + 1 - 12L+11 dari panjang deskripsi paling . Tetapi sekarang masalahnya adalah bahwa tidak seperti polinomial, dua fungsi yang dapat dihitung dapat dengan mudah mengambil nilai yang sama pada jumlah input yang tak terbatas. Jadi masalah Anda tampaknya tidak mungkin bagi saya. LL
Bruno
Saya mengerti idemu. Tetapi dua fungsi computable yang berbeda dari panjang deskripsi <= L harus berbeda di beberapa titik (untuk beberapa n0). Bisakah seseorang menemukan nilai n0 yang diberikan L?
pbaren
4
Anda dapat menemukan titik seperti itu jika ada satu, hanya menghitung fungsi pada semua nilai menggunakan dovetailing, tetapi jika tidak ada maka Anda tidak akan pernah tahu, itu tidak dapat diputuskan, memiliki upperbound panjang pada ukuran program tidak mengubah apa pun.
Kaveh
7
Sebenarnya, @Kaveh, dengan argumen Anda sendiri, batas atas pada K ( f ) memberi tahu Anda sesuatu tentang di mana mereka berbeda, hanya saja bukan sesuatu yang dapat dihitung. Jika K ( f ) L , dan f g , maka K ( x ) 2 L + c di mana c adalah panjang algoritma yang Anda (@Kaveh) jelaskan dan x adalah string pertama di mana dan berbeda. Secara khusus,K(f)K(f)LfgK(x)2L+ccxffggxxdibatasi oleh beberapa fungsi sibuk seperti . Namun, menemukan semua sedemikian rupa sehingga atau komputasi BB masih belum dapat dihitung. Jadi @pbaren: ada batasan, tetapi lebih dari sekadar eksponensial, tidak dapat dihitung. 2L+c2L+cxxK(x)2L+cK(x)2L+c
Joshua Grochow
6
@ Kaveh: Itulah yang saya maksud dengan fungsi "Sibuk-berang-seperti": biarkan menjadi panjang dari string terpanjang yang kompleksitas Kolmogorov (memperbaiki mesin universal) paling banyak . Hanya ada banyak string seperti itu sehingga ini didefinisikan dengan baik hingga pilihan mesin universal. Maka adalah batas atas: jika dua fungsi (total yang dapat dihitung) dari kompleksitas Kolmogorov paling banyak setuju pada semua titik hingga panjang , maka keduanya sama. BB(n)BB(n)nnBB(2L+c)BB(2L+c)LLBB(2L+c)BB(2L+c)
Joshua Grochow

Jawaban:

9

(Ini dimaksudkan sebagai komentar, tetapi berlangsung lama). Pertanyaan yang sangat menarik. Jika Anda bersedia untuk memikirkan langkah-langkah kompleksitas lain selain Kolmogorov, maka ada beberapa jawaban dalam teori Belajar yang mungkin memuaskan Anda. Saya meninggalkannya untuk para ahli di daerah.

Misalnya, jika saya tidak salah, dalam "Sebuah teori yang dapat dipelajari" Valiant membuktikan bahwa fungsi boolean dapat direkonstruksi dengan jumlah polinomial "titik positif" pada ukuran rumus k-CNF-nya (untuk setiap k , dan maksud saya dengan "poin positif" yang ada dalam formulir ).(x1,,xn,1)(x1,,xn,1)

Dalam TAOCP 7.2.1.6 Knuth ditunjukkan dengan cara yang menakjubkan (menggunakan pola pohon Natal) bahwa untuk merekonstruksi fungsi monote boolean (yaitu tidak menurun pada setiap variabel) Anda membutuhkan tepat poin.(n+1n/2+1)(n+1n/2+1)

Diego de Estrada
sumber
7

Untuk melanjutkan jawaban Deigo, kompleksitas sampel standar yang dibatasi oleh teori belajar memberi tahu Anda bahwa jika Anda puas menemukan program yang "kira-kira benar", Anda tidak perlu mencoba banyak poin sama sekali. Katakanlah kita meng-encode program dalam biner, sehingga hanya ada program dengan panjang d. Mari kita misalkan juga bahwa ada beberapa distribusi lebih contoh masukan . Mungkin tujuan Anda adalah untuk menemukan program yang Anda yakini hampir benar ("Kemungkinan Sekitar Tepat" yaitu seperti dalam model pembelajaran Pali Valiants). Artinya, Anda ingin menjalankan algoritma yang akan mengambil sejumlah kecil sampel bersama dengan , dan akan dengan probabilitas setidaknya2d2dDDxDxDf(x)f(x)(1δ)(1δ)Output program beberapa yang setuju dengan pada setidaknya sebagian kecil dari input diambil dari . PPff(1ϵ)(1ϵ)DD

Kami hanya akan menggambar contoh , dan menampilkan program dengan panjang yang sesuai dengan pada semua contoh. (Satu dijamin ada karena kami menganggap memiliki kompleksitas Kolmogorov paling banyak ) ...mmxDxDPPddffffdd

Berapa probabilitas bahwa suatu program tertentu yang tidak setuju dengan pada lebih dari fraksi contoh konsisten dengan contoh kami pilih? Paling banyak . Kami ingin menjadikan probabilitas ini paling banyak sehingga kami dapat mengambil ikatan serikat atas semua program dan mengatakan bahwa dengan probabilitas setidaknya , tidak ada program "buruk" yang konsisten dengan contoh menarik kami. Memecahkan, kita melihat bahwa itu cukup untuk mengambil contoh hanya . (Yaitu hanya banyak linear dalam kompleksitas Kolmogorov dariPPffϵϵmm(1ϵ)m(1ϵ)mδ/2dδ/2d2d2d1δ1δm1ϵ(d+log1/δ)

m1ϵ(d+log1/δ)
ff...)

BTW, argumen seperti ini dapat digunakan untuk menjustifikasi "Occam's Razor": mengingat sejumlah pengamatan, di antara semua teori yang menjelaskannya, Anda harus memilih teori dengan kompleksitas Kolmogorov terendah, karena ada sedikit peluang untuk overfitting.

Tentu saja, jika Anda hanya ingin memeriksa satu program tetap dengan cara ini, Anda hanya perlu contoh ...O(log(1/δ)/ϵ)O(log(1/δ)/ϵ)

Aaron Roth
sumber
3

Inilah jawaban yang sepele: dengan asumsi L lg | N | , maka Anda perlu tahu nilai f sama sekali | N | poin untuk menentukan secara unik f . Oleh karena itu, pendekatan yang Anda buat sketsa sama sekali tidak membantu, kecuali Anda entah bagaimana tahu bahwa panjang L dari program ini sangat pendek: jauh lebih pendek daripada lg | N | bit.Llg|N|f|N|fLlg|N|

Pertimbangkan sekumpulan fungsi F = { f i : i N } , di mana f i didefinisikan sebagai fungsi f i ( x ) = 1 jika i = x dan f i ( x ) = 0 jika i x . Perhatikan bahwa kompleksitas Kolmogorov komputasi f i adalah tentang lg | N | bit, karena Anda dapat meng-hardcode nilai iF={fi:iN}fifi(x)=1i=xfi(x)=0ixfilg|N|idalam kode sumber dan kemudian yang Anda butuhkan hanyalah pernyataan kondisional sederhana ( O ( 1 ) ekstra).O(1)

Namun, Anda tidak dapat membedakan f i dari fungsi all-zero kecuali Anda mengujinya di input i . Anda tidak dapat membedakan f i dari f j kecuali Anda menguji pada input i atau j . Karena itu, Anda harus mengevaluasi f sama sekali | N | input, untuk secara unik menentukan f i kita hadapi. (OK, secara teknis, Anda perlu mengevaluasinya di | N | - 1 input, tapi apa pun.)fii

DW
sumber
0

Anda bisa membuat program ini panjang dan sewenang-wenang. Jadi dengan program apa pun, Anda dapat memutuskan apakah bahasanya setara dengan program ini. Anda tidak dapat melakukannya dengan teorema Rice.

Zirui Wang
sumber
1
Anda memiliki poin yang valid bahwa gagasan memeriksa program dengan menjalankannya pada beberapa contoh tidak akan berfungsi secara umum.
Tsuyoshi Ito