El ejemplo de Dijkstra de un programa ambiguo

12

Saludos Dijkstra escribió que incluso unas pocas líneas de código aparentemente simple podrían ser irremediablemente ambiguas. En al menos un trabajo, que no puedo encontrar ahora para salvar mi vida, dio un pequeño programa de ejemplo para demostrar esta ambigüedad. ¿Alguien puede señalarme un artículo suyo donde incluya uno de estos ejemplos?

Dijkstra Reader
fuente

Respuestas:

11

Lee esto:

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

http://www.cs.ucsb.edu/~pconrad/cs40/08S/notes/ tiene buena cobertura; buscar "problema de detención"

Hay varias formas de la contradicción de detención esencial.

def halts( code_block ):
    # Some magical code

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

¿El "silbador" silba cero, una vez o un número infinito de veces?

Si la halts()función determina que la función whistlerparece detenerse, la función whistlerno puede detenerse.

Si la halts()función determina que la función whistlerno parece detenerse, la función se whistlerdetiene.

Por lo tanto, la halts()función no puede existir.

S.Lott
fuente
44
Olvidó la tercera opción, donde regresa FILE_NOT_FOUND;)
FrustratedWithFormsDesigner
2
¡Gracias! Sin embargo, lo que Dijkstra estaba describiendo en el periódico que leí no fue el problema de detención. Son solo unas pocas líneas de código simple, pero no se puede decir lo que significa. El contexto es que Dijkstra está hablando de los métodos que usa para demostrar al público que programar es difícil, por lo tanto, los programadores deben ser humildes. Tenga en cuenta que el documento no es, me entristece decir, "El programador humilde". :)
Dijkstra Reader
Gracias de nuevo. Es triste decirlo, ese no es el indicado. En el artículo al que me refiero, Dijkstra dice específicamente que la programación es difícil, incluso para las personas inteligentes, tenemos que respetar eso, "Por ejemplo, ¿qué hace el siguiente pequeño programa?"
Dijkstra Reader
Probablemente no cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html . Pero lo levanto como una cita común sobre lo difícil que es la programación.
S.Lott
2

¿Estás seguro de que el papel fue de Dijkstra? Reflections on Trusting Trust de Ken Thompson parece que podría ser lo que estabas pensando. Demuestra cómo los programas absolutamente simples, directos y correctos podrían terminar haciendo algo absolutamente inesperado que no es visible en absoluto en la fuente. Incluso si no es lo que estaba pensando, es un documento que vale la pena leer.

Yendo en una dirección diferente, si quieres excelentes ejemplos de programas cortos con un comportamiento sorprendente, el concurso de C es genial. Por ejemplo, mire al ganador de 2008 . El desafío consistía en escribir un programa de línea de comando para dejar en blanco parte de una imagen, de tal manera que la imagen se borrara visualmente a la perfección, pero el archivo retiene cierta información sobre la parte eliminada de la imagen. Y de tal manera que su código pueda pasar la revisión del código. (Puede elegir el formato en el que se almacena la imagen).

btilly
fuente
¡Gracias! Sí, definitivamente es un artículo de Dijkstra al que me refiero.
Dijkstra Reader