Ett av de mest berömda exemplen på ett obeslutbart språk är
stoppproblemet .
Stoppproblemet:
Stoppproblemet är problemet med att bestämma, med tanke på en beskrivning av ett godtyckligt datorprogram och en input, om programmet kommer att slutföra eller fortsätta att köras för alltid. Mer formellt frågar det:
* Input: `
` var:
* `P` är en Turing-maskin (eller en representation av något datorprogram för allmänt ändamål).
* `Jag 'är ingången till Turing Machine` p`.
* Utgång:
* "Ja" om Turing Machine `p` stannar (avslutar körning) när den ges ingång` i '.
* "Nej" om Turing Machine `p` inte stoppar (slingor för alltid) när de ges ingång` i '.
Varför är det obeslutbart:
Stoppproblemet är obeslutbart, vilket innebär att det finns * ingen * Turing -maskin (eller algoritm) som korrekt kan lösa stoppproblemet för * alla * möjliga ingångar `
`.
Beviset görs vanligtvis genom motsägelse. Antag att det * är * en Turing Machine `H` som löser stoppproblemet. `H` tar`
`som inmatning och utgångar" ja "om" p "stoppar på" i "och" nej "om" p "slingor för alltid på" i ".
Sedan kan vi konstruera en annan Turing Machine `D" (ofta kallad "diagonalizer") som använder `H` som en subroutine:
`` `
Turing Machine D (P):
1. Kör H (P, P) // Kör H med P som både programmet och ingången
2. Om h (p, p) returnerar "ja" (p stoppar på ingång p):
Sedan slinga för alltid.
3. Om h (p, p) returnerar "nej" (p slingor för evigt på input p):
Sedan stopp.
`` `
Vad händer nu när vi kör `d` med sig själv som input:` d (d) `?
* Scenario 1:Anta `d (d)` stopp.
- Detta innebär att i steg 1, `h (d, d)` returnerad "ja" (eftersom `d` stannar om och bara om` h (d, d) säger att `d` stannar på input 'd`).
- men om `h (d, d)` returnerade "ja", var `d` utformad för att slinga för evigt (i steg 2). Detta strider mot vårt antagande att `d (d)` stoppar.
* Scenario 2:Anta `d (d)` slingor för alltid.
- Detta innebär att i steg 1, `h (d, d)" returnerade "nej" (eftersom `d` slingor för alltid om och bara om` h (d, d) `säger att` d` slingor på input 'd`).
- men om `h (d, d)` returnerade "nej", var `d` utformad för att stoppa (i steg 3). Detta strider mot vårt antagande att `d (d)` slingor för alltid.
Eftersom båda scenarierna leder till en motsägelse måste vårt första antagande att det finns en Turing -maskin "H" som löser stoppproblemet vara falskt. Därför är stoppproblemet obeslutbart.
i enklare termer: Du kan inte skriva ett program som alltid kan förutsäga om ett annat program så småningom kommer att stoppa eller köra för alltid.
Betydelse:
Olyckan hos stoppproblemet har djupa konsekvenser för datavetenskap. Det visar att det finns grundläggande gränser för vad datorer kan beräkna. Det fungerar också som en grund för att bevisa obeslutbarhet av många andra problem. Om du kan visa att att lösa ett annat problem skulle göra det möjligt för dig att lösa stoppproblemet, måste det andra problemet också vara obeslutbart.