Come si controlla se due algoritmi restituiscono lo stesso risultato per qualsiasi input?


18

Come si fa a verificare se due algoritmi (diciamo Merge sort e Naïve sort) restituiscono lo stesso risultato per qualsiasi input, quando l'insieme di tutti gli input è infinito?

Aggiornamento: Grazie Ben per aver descritto come sia impossibile fare algoritmicamente nel caso generale. La risposta di Dave è un ottimo riassunto dei metodi sia algoritmici che manuali (soggetti all'umorismo umano e alla metafora) che non sempre funzionano, ma sono abbastanza efficaci.


5
come diceva Yuval, non esiste una procedura che possa determinarlo per due programmi. ma in un caso speciale come il tuo esempio puoi dimostrarlo: ad esempio se provi che entrambi i tuoi algoritmi restituiscono una sequenza ordinata e sono stabili, avrai finito.
Sasho Nikolov,

1
Vuoi una tecnica / algoritmo automatico o un insieme di tecniche manuali?
Dave Clarke,

@SashoNikolov, se le prestazioni sono considerate parte dell'output, dovresti anche mostrare che funzionano entrambi nella stessa complessità tempo / spazio.
edA-qa mort-ora-y

1
Intendi "controllare" o provare? Vuoi dire "qualsiasi input" o tutti gli input? Qual è la motivazione e il contesto per la domanda?
Kaveh,

2
@AndresRiorio: le tecniche di prova sono diverse dagli algoritmi che risolvono il problema generale. Ad esempio, il problema dell'arresto è indecidibile, ma è certamente possibile provare la conclusione di molti programmi (a mano o euristica automatizzata).
Raffaello

Risposte:


16

Contrariamente a ciò che dicono i neofiti, ci sono molte tecniche efficaci per farlo.

  • La bisimulazione è un approccio. Vedi ad esempio l'articolo di Gordon su Coinduction and Functional Programming .

  • Un altro approccio consiste nell'utilizzare teorie operative sull'equivalenza del programma, come il lavoro di Pitts .

  • Un terzo approccio consiste nel verificare che entrambi i programmi soddisfino le stesse specifiche funzionali. Ci sono migliaia di articoli su questo approccio.

  • Un quarto approccio è mostrare che un programma può essere riscritto nell'altro usando trasformazioni sonore di programmi .

Naturalmente nessuno di questi metodi è completo a causa di indecidibilità, ma volumi e volumi di lavoro sono stati prodotti per affrontare il problema.


heu · ris · tic . [Gr. εὑρίσκω "scopri"] n. 1. Una tecnica progettata per risolvere un problema che ignora se la soluzione può essere dimostrata corretta, ma che di solito produce una buona soluzione o risolve un problema più semplice che contiene o si interseca con la soluzione del problema più complesso. 2. ( Teor. ) Un algoritmo che non funziona.
JeffE,

1
Bart Simpson: "Non posso vincere. Non provarci."
Dave Clarke,

9
@JeffE: se vuoi verificare se due algoritmi restituiscono lo stesso risultato, fai una prova. Ci sono molte buone tecniche per farlo. Certo, tutti i metodi sono incompleti, ma a chi importa? Il teorema di incompletezza di Goedel non è un motivo per rinunciare alla matematica!
Neel Krishnaswami,

3
@JeffE Solo perché non esiste una funzione calcolabile per determinare se due algoritmi arbitrari restituiscono lo stesso risultato non significa che non è possibile rispondere alla domanda per due algoritmi particolari , soprattutto perché il processo di ricerca di una prova non è calcolabile la funzione . Allo stesso modo ci sono un sacco di documenti che dimostrano la terminazione garantita per determinati algoritmi, indipendentemente dal fatto che non è possibile determinare meccanicamente se un algoritmo arbitrario verrà sempre terminato.
Ben

2
In pratica, due algoritmi che dovrebbero calcolare la stessa funzione non consentono quasi mai una prova di equivalenza basata su bisimulazione. (Nel caso dei suddetti algoritmi di ordinamento, gli stadi intermedi dei loop / ricorsione sono diversi.) Direi che usare la buona vecchia logica Hoare per mostrare che entrambi implementano la stessa specifica del comportamento I / O è il modo andare.
Kai,

10

Per elaborare leggermente le dichiarazioni "è impossibile", ecco un semplice schizzo di prova.

Possiamo modellare algoritmi con output di Turing Machines che si fermano con il loro output sul loro nastro. Se vuoi avere macchine che possono fermarsi accettando con l'output sul loro nastro o rifiutando (nel qual caso non c'è output) puoi facilmente inventare una codifica che ti permetta di modellare queste macchine con "halt or halt not, non ci sono "macchine di rifiuto".

Ora, supponiamo di avere un algoritmo P per determinare se due di queste TM hanno lo stesso output per ogni input. Quindi, dati una TM A e un input X , posso costruire una nuova TM B che funziona come segue:

  1. Controlla se l'ingresso è esattamente X
  2. Se sì, inserisci un ciclo infinito
  3. In caso contrario, eseguire A sull'input

Ora posso correre P su A e B . B non si ferma su X , ma ha lo stesso output di A per tutti gli altri input, quindi se e solo se A non si ferma su X, questi due algoritmi hanno lo stesso output per ogni input. Ma si presumeva che P fosse in grado di dire se due algoritmi hanno lo stesso output per ogni input, quindi se avessimo P potremmo dire se una macchina arbitraria si ferma su un input arbitrario, che è il problema di interruzione. Poiché è noto che il problema dell'arresto è indecidibile, P non può esistere.

Ciò significa che non esiste un approccio generale (calcolabile) per determinare se due algoritmi hanno lo stesso output che funziona sempre, quindi è necessario applicare un ragionamento particolare alla coppia di algoritmi che si stanno analizzando. Tuttavia, in pratica potrebbero esserci approcci calcolabili che funzionano per grandi classi di algoritmi e ci sono certamente tecniche che puoi usare per provare a elaborare una prova per ogni caso particolare. La risposta di Dave Clarke ti dà alcune cose rilevanti da guardare qui. Il risultato di "impossibilità" si applica solo all'elaborazione di un metodo generico che risolva il problema una volta per tutte, per tutte le coppie di algoritmi.


P

@Raphael Sì, l'argomento che ho disegnato non dice nulla su una P così limitata , solo che non può esistere una completamente generale. Il mio istinto è che il problema dell'arresto è ancora indecidibile anche quando lo si limita agli "algoritmi di ordinamento" piuttosto che agli algoritmi generali, nel qual caso la prova di impossibilità è ancora valida, anche se non ho mai sentito una simile affermazione.
Ben

2
Più in generale, il teorema di Rice afferma che non esiste un modo calcolabile per provare qualcosa su un algoritmo, non appena c'è almeno un algoritmo che ha la proprietà che stai cercando di dimostrare e almeno uno che non lo fa. Ad esempio, dato un algoritmo A, non esiste una funzione calcolabile che accetta un algoritmo B come input e verifica se B è equivalente ad A.
Il SO di Gilles

È importante notare che il teorema di Rice si applica solo alle proprietà delle lingue , non di Turing Machines (quando le usi come modello di "algoritmo"). Se è possibile che esistano due macchine di Turing che riconoscono entrambe la stessa lingua ma una ha la proprietà e l'altra no, il teorema di Rice non si applica e potrebbe esserci un metodo generale calcolabile per testare la proprietà. Ma il teorema di Rice si applica chiaramente a questo caso, sì.
Ben

2

In generale è impossibile, ma molti vincoli possono renderlo possibile. Ad esempio, è possibile verificare l'equivalenza di due programmi di codice in linea retta utilizzando i BDD. L'esecuzione simbolica può gestire molti altri casi.


1

È impossibile escogitare un algoritmo che provi questa uguaglianza in generale. Suggerimento: riduzione del problema di Halting.


Esistono molte tecniche, sebbene nessuna sia completamente automatica.
Dave Clarke,

Non so è possibile o no, dalla tua risposta è solo un commento. non una risposta.

@SaeedAmiri: ho approfondito un po 'il contesto della risposta; Penso che sia abbastanza completo, se non forse particolarmente buono.
Raffaello

@Raphael, La riduzione che è nella mente di Yuval è ovvia, e non penso che OP non ne sia consapevole, ma il problema difficile dell'IMO sta trovando un modo per casi speciali, quindi questa ovvia riduzione potrebbe essere un commento al solo ricordo di OP per caso generale.

2
@SaeedAmiri: Questo è per il PO e gli elettori a decidere allora, non noi.
Raffaello
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.