I test possono mostrare l'assenza di bug?


18

(n+1) sono necessari punti per determinare in modo univoco un polinomio di gradon ; per esempio, due punti in un piano determinano esattamente una linea.

Quanti punti sono necessari per determinare in modo univoco una funzione calcolabile , vista la lunghezza di un programma che calcola f in una lingua fissa? (cioè legato alla complessità di Kolmogorov di f ).f:NNff

L'idea è che, almeno teoricamente, si potrebbe dimostrare la correttezza di un programma facendo abbastanza test.

Se uno ha un programma di lunghezza L che calcola f , c'è un limite al numero di funzioni che possono essere calcolati con una lunghezza di fonte al massimo L .PLfL

Pertanto si dovrebbe "solo" dimostrare che:

  • puòessere calcolato con una lunghezza della sorgenteLf L
  • non calcola alcuna altra funzione calcolabile in L byte o meno (mediante test)PL

Questa idea non ha probabilmente conseguenze pratiche (i limiti sono sicuramente destinati a essere esponenziali).


4
Supponiamo che il vostro descrizioni delle funzioni sono riportati in binario, poi ci sono al massimo di descrizione di lunghezza al massimo L . Ma ora il problema è che a differenza dei polinomi, due distinte funzioni calcolabili possono facilmente assumere gli stessi valori su un numero infinito di input. Quindi il tuo problema mi sembra impossibile. 2L+11L
Bruno

Capisco la tua idea. Ma due distinte funzioni calcolabili della lunghezza della descrizione <= L dovrebbero differire ad un certo punto (per alcuni n0). Si potrebbe trovare il valore di n0 dato L?
pbaren,

4
puoi trovare un punto del genere se ne esiste uno, calcola semplicemente le funzioni su tutti i valori usando la coda di rondine, ma se non c'è allora non lo saprai mai, è indecidibile, avere una lunghezza superiore alle dimensioni del programma non cambia nulla.
Kaveh,

7
In realtà, @Kaveh, secondo il tuo stesso argomento, un limite superiore su ti dice qualcosa su dove differiscono, ma non qualcosa di calcolabile. Se K ( f ) L e f g , allora K ( x ) 2 L + c dove c è la lunghezza dell'algoritmo che tu (@Kaveh) hai descritto e x è la prima stringa su cui f e g differiscono. In particolare, xK(f)K(f)LfgK(x)2L+ccxfgxè limitato da una funzione simile a un castoro indaffarato di . Tuttavia, trovare tutti x tali che K ( x ) 2 L + c o BB di calcolo sia ancora ineccepibile. Quindi @pbaren: c'è un limite, ma è molto più di un semplice esponenziale, è incontestabile. 2L+cxK(x)2L+c
Joshua Grochow,

6
@Kaveh: Questo è ciò che intendevo con una funzione "simile a un castoro indaffarato": lascia che sia la lunghezza della stringa più lunga la cui complessità di Kolmogorov (correggi una macchina universale) è al massimo n . Esistono solo molte stringhe di questo tipo, quindi questo è ben definito fino alla scelta della macchina universale. Quindi B B ( 2 L + c ) è un limite superiore: se due funzioni (calcolabili totali) della complessità di Kolmogorov al massimo L concordano su tutti i punti fino alla lunghezza B B ( 2 L + c )BB(n)nBB(2L+c)LBB(2L+c), quindi sono uguali.
Joshua Grochow,

Risposte:


9

(Questo era inteso come un commento, ma è andato a lungo). Domanda molto interessante. Se sei disposto a pensare ad altre misure di complessità oltre a quelle di Kolmogorov, allora ci sono alcune risposte nella teoria dell'apprendimento che potrebbero soddisfarti. Lascio per gli esperti della zona.

(x1,,xn,1)

In Knuth's TAOCP 7.2.1.6 viene mostrato in modo sorprendente (usando il modello dell'albero di Natale) che per ricostruire una funzione booleana del monote (cioè non decrescente in ogni variabile) è necessario esattamente punti.(n+1n/2+1)


7

Per continuare sulla falsariga della risposta di Deigo, i limiti standard della complessità del campione dalla teoria dell'apprendimento ti dicono che se sei soddisfatto di trovare un programma "approssimativamente corretto", non devi assolutamente provare molti punti. Diciamo che stiamo codificando i programmi in binario, quindi ci sono solo programmi di lunghezza d. Consente supponiamo anche che v'è una certa distribuzione su esempi di ingresso . Forse il tuo obiettivo è trovare un programma che sei quasi sicuro sia quasi giusto ("Probabilmente approssimativamente corretto", ad esempio come nel modello di apprendimento PAC dei Valiant). Cioè, si desidera eseguire un algoritmo che prenderà un piccolo numero di campioni insieme a e con probabilità almeno2dDxDf(x)(1δ)uscita qualche programma che concorda con su almeno una frazione ingressi tratte da . Pf(1ϵ)D

Disegneremo semplicemente esempi e genereremo qualsiasi programma di lunghezza che sia d'accordo con su tutti gli esempi. (Uno è garantito per esistere poiché supponiamo che abbia la complessità di Kolmogorov al massimo ) ...mxDPdffd

Qual è la probabilità che un particolare programma che non sia d'accordo con su più di una frazione di esempi sia coerente con gli esempi abbiamo selezionato? È al massimo . Vorremmo prendere questa probabilità di essere al massimo modo da poter prendere un'unione vincolata su tutti i programmi e dire che con probabilità almeno , nessun programma "cattivo" è coerente con i nostri esempi disegnati. Risolvendo, vediamo che è sufficiente prendere solo esempi . (cioè solo linearmente molti nella complessità di Kolmogorov diPfϵm(1ϵ)mδ/2d2d1δ

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

A proposito, argomenti come questo possono essere usati per giustificare "Occam's Razor": dato un numero fisso di osservazioni, tra tutte le teorie che le spiegano, dovresti scegliere quella con la più bassa complessità di Kolmogorov, perché c'è la minima possibilità di overfitting.

Naturalmente, se si desidera controllare solo un singolo programma fisso in questo modo, sono necessari solo esempi ...O(log(1/δ)/ϵ)


3

Ecco una risposta banale: assumendo, Allora avete bisogno di conoscere il valore di affattopunti per determinare in modo univoco . Pertanto, l'approccio che disegni non ti aiuta affatto, a meno che tu non sappia in qualche modo che la lunghezza del programma è estremamente breve: molto più breve dibit.Llg|N|f|N|fLlg|N|

Considera la famiglia di funzioni , dove è definita come la funzione se e se . Si noti che la complessità di Kolmogorov è di circabit, dato che è possibile codificare il valore di nel codice sorgente e quindi è sufficiente una semplice istruzione condizionale ( extra).f i f i ( x ) = 1 i = x f i ( x ) = 0 i x f i lg | N | i O ( 1 )F={fi:iN}fifi(x)=1i=xfi(x)=0ixfilg|N|iO(1)

Tuttavia, non è possibile distinguere dalla funzione di tutti zeri a meno che non venga verificato all'ingresso . Non è possibile distinguere da se non si test all'ingresso o . Pertanto, è necessario valutare affattoinput, per determinare in modo univoco con quale abbiamo a che fare. (OK, tecnicamente, è necessario valutarlo con input , ma comunque.) i f i f j i j f | N | f i | N | - 1fiififjijf|N|fi|N|1


0

È possibile rendere il programma arbitrariamente lungo. Quindi, dato qualsiasi programma, puoi decidere se la sua lingua è equivalente a quella di questo programma. Non puoi farlo secondo il teorema di Rice.


1
Hai un punto valido sul fatto che l'idea di controllare il programma eseguendolo su più istanze non funzionerà in generale.
Tsuyoshi Ito,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.