Halting -problemet är ett av problemen i teorin om algoritmer [1] , som informellt kan uttryckas som:
Beskrivningen av proceduren och dess initiala indata ges. Det krävs för att fastställa: kommer utförandet av proceduren med dessa data någonsin att sluta; eller att proceduren kommer att köras hela tiden utan att stanna.Alan Turing bevisade 1936 att stoppproblemet är obestämbart på en Turing-maskin . Det finns med andra ord ingen generell algoritm för att lösa detta problem. [2]
Det stoppande problemet är centralt för beräkningsbarhetsteorin eftersom det är det första exemplet på ett problem som inte kan lösas algoritmiskt.
När det gäller funktioner kan problemet enkelt beskrivas på följande sätt:
För varje funktion F(G, start_state) som kan avgöra om en annan funktion stoppar, kan du alltid skriva en funktion G(start_state) som, när den skickas till F, kommer att få motsatt resultat av exekvering som F förutsäger.För många andra uppgifter[ vad? ] kan man bevisa deras algoritmiska obestämbarhet genom att försöka reducera dem till stoppproblemet. Detta görs enligt schemat "tvärtom": låt det finnas ett visst problem för vilket det krävs för att fastställa dess olösbarhet. Sedan antar vi att det är lösbart och försöker, med hjälp av detta faktum, skriva en algoritm för att lösa stoppproblemet för detta problem. Om detta lyckas kommer vi att komma till en motsägelse, eftersom det är känt att det inte finns någon algoritm för att lösa stoppproblemet. Det betyder att antagandet var fel och att det ursprungliga problemet också är olösligt.
Betrakta en uppsättning algoritmer som tar ett naturligt tal som indata och även ger ett naturligt tal som utdata. Låt oss välja något Turing-komplett programmeringsspråk. Varje algoritm kan skrivas som en ändlig sekvens av tecken på detta språk. Låt oss beställa mängden (detta är möjligt, eftersom det är en uppsättning ändliga sekvenser av element i en ändlig mängd och därför räknebara ), och varje algoritm kommer att få sitt eget serienummer. Låt oss kalla analysatorn för en hypotetisk algoritm som tar emot ett par naturliga tal som indata och:
Stoppproblemet kan omformuleras enligt följande: Finns det en analysator?
Sats. Analysatorn finns inte.
Låt oss bevisa det genom motsägelse. Låt oss säga att analysatorn finns. Låt oss skriva Diagonalizer-algoritmen, som tar ett tal som indata , skickar ett par argument till analysatorn och returnerar resultatet av sitt arbete. Med andra ord, Diagonalizern stannar om och endast om algoritmen med nummer inte stannar efter att ha tagit emot numret som inmatning . Låt vara ordningsnumret för diagonalisatorn i uppsättningen . Kör Diagonalizer genom att skicka detta nummer till den . Diagonalisatorn kommer att stanna om och bara om algoritmen med numret (det vill säga den själv) inte stannar när den tar emot ett nummer som indata (som vi skickade till den). Det följer av denna motsägelse att vårt antagande är felaktigt: Analysatorn existerar inte, vilket skulle bevisas.