L'esempio di Dijkstra di un programma ambiguo


12

Saluti. Dijkstra ha scritto che anche poche righe di codice apparentemente semplice potrebbero essere irrimediabilmente ambigue. In almeno un'opera, che non riesco a trovare ora per salvarmi la vita, ha dato un piccolo esempio di programma per dimostrare questa ambiguità. Qualcuno può indicarmi un suo documento in cui include uno di questi esempi?

Risposte:


11

Leggi questo:

http://en.wikipedia.org/wiki/Halting_problem#Recognizing_partial_solutions

http://www.cs.ucsb.edu/~pconrad/cs40/08S/notes/ ha una buona copertura; cerca "problema di arresto"

Esistono diverse forme della contraddizione essenziale che blocca.

def halts( code_block ):
    # Some magical code

def whistler():
    while halts(whistler): 
        sys.whistle( 1 )

Il "fischio" fischia zero, una volta o un numero infinito di volte?

Se la halts()funzione determina che la funzione whistlersembra arrestarsi, la funzione whistlernon può arrestarsi.

Se la halts()funzione determina che la funzione whistlernon appare arrestata, la funzione si whistlerinterrompe.

Pertanto, la halts()funzione non può esistere.


4
Hai dimenticato la terza opzione, dove ritorna FILE_NOT_FOUND;)
FrustratedWithFormsDesigner

2
Grazie! Ciò che Dijkstra stava descrivendo nel documento che ho letto, tuttavia, non era il problema di arresto. Sono solo poche righe di codice semplice, ma non puoi dire cosa significhi. Il contesto è che Dijkstra sta parlando dei metodi che usa per dimostrare al pubblico che la programmazione è difficile, quindi i programmatori devono essere umili. Si noti che il documento non è, sono triste a dire, "L'umile programmatore". :)
Dijkstra Reader,


Grazie ancora. Triste a dirsi, non è quello. Nel documento a cui mi riferisco, Dijkstra afferma specificamente che la programmazione è difficile, anche per le persone intelligenti, dobbiamo rispettare questo, "Ad esempio, cosa fa il seguente piccolo programma?"
Dijkstra Reader,

Probabilmente non cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html . Ma lo sollevo come una citazione comune su quanto sia dura la programmazione.
S.Lott

2

Sei sicuro che il giornale fosse di Dijkstra? Riflessioni su Trusting Trust di Ken Thompson sembra che potrebbe essere quello a cui stavi pensando. Dimostra come i programmi assolutamente semplici, diretti e corretti potrebbero finire facendo qualcosa di assolutamente inaspettato che non è affatto visibile nella fonte. Anche se non è quello a cui stavi pensando, è un documento utile da leggere.

Andando in una direzione diversa, se vuoi esempi eccellenti di programmi brevi con comportamenti sorprendenti, il contestato C è fantastico. Ad esempio, guarda il vincitore del 2008 . La sfida era quella di scrivere un programma da riga di comando per oscurare parte di un'immagine, in modo che l'immagine fosse visivamente cancellata perfettamente, ma il file conserva alcune informazioni sulla parte redatta dell'immagine. E in modo tale che il tuo codice possa superare la revisione del codice. (È possibile scegliere il formato in cui è memorizzata l'immagine.)


Grazie! Sì, è sicuramente un articolo di Dijkstra a cui mi riferisco.
Dijkstra Reader,
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.