Zastavení problému - Halting problem
![]() | Tento článek obsahuje seznam obecných Reference, ale zůstává z velké části neověřený, protože postrádá dostatečné odpovídající vložené citace.Září 2018) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v teorie vypočítatelnosti, zastavení problému je problém určit z popisu libovolného počítačový program a vstup, zda program dokončí běh, nebo bude pokračovat navždy. Alan Turing v roce 1936 dokázal, že generál algoritmus k vyřešení problému zastavení u všech možných párů vstupů programu nemůže existovat.
Pro jakýkoli program F to by mohlo určit, zda se programy zastaví, „patologický“ program G, volaný s nějakým vstupem, může předat svůj vlastní zdroj a svůj vstup F a pak konkrétně udělat opak toho, co F předpovídá G udělám. Ne F může existovat, která tento případ řeší. Klíčovou součástí důkazu je matematická definice počítače a programu, která je známá jako Turingův stroj; problém s zastavením je nerozhodnutelný přes Turingovy stroje. Je to jeden z prvních případů rozhodovací problémy se ukázala jako neřešitelná. Tento důkaz je důležitý pro praktické výpočetní úsilí a definuje třídu aplikací, které žádný programovací vynález nemůže dokonale fungovat.
Jack Copeland (2004) připisuje zavedení tohoto pojmu zastavení problému k práci Martin Davis v padesátých letech.[1]
Pozadí
Problém zastavení je problém rozhodnutí o vlastnostech počítačových programů na pevném Turing-kompletní model výpočtu, tj. všechny programy, které lze psát v daném programovací jazyk to je dostatečně obecné, aby to bylo ekvivalentní Turingovu stroji. Problémem je určit, vzhledem k programu a vstupu do programu, zda se program při spuštění s tímto vstupem nakonec zastaví. V tomto abstraktním rámci neexistují žádná omezení zdrojů týkající se množství paměti nebo času potřebného pro spuštění programu; může trvat libovolně dlouho a před zastavením využít libovolné množství úložného prostoru. Otázkou je jednoduše, zda se daný program někdy zastaví na konkrétním vstupu.
Například v pseudo kód, Program
- while (true) continue
nezastaví se; spíše to jde navždy v nekonečná smyčka. Na druhou stranu program
zastaví se.
Při rozhodování, zda je zastavení těchto programů jednoduché, se složitější programy ukázaly jako problematické. Jedním z přístupů k problému může být spuštění programu pro určitý počet kroků a kontrola, zda se zastaví. Pokud se však program nezastaví, není známo, zda se program nakonec zastaví nebo bude fungovat navždy. Turing dokázal, že neexistuje žádný algoritmus, který vždy správně rozhodne, zda se pro daný libovolný program a vstup program zastaví, když je spuštěn s tímto vstupem. Podstatou Turingova důkazu je, že jakýkoli takový algoritmus lze udělat, aby si odporoval, a proto nemůže být správný.
Důsledky programování
Nějaký nekonečné smyčky může být docela užitečné. Například, smyčky událostí jsou obvykle kódovány jako nekonečné smyčky.[2]Většina podprogramů je však určena k dokončení (zastavení).[3]Zejména v tvrdé výpočet v reálném čase, programátoři se pokoušejí psát podprogramy, u nichž je zaručeno nejen dokončení (zastavení), ale také dokončení před daným termínem.[4]
Někdy tito programátoři používají nějaký programovací jazyk pro všeobecné účely (Turing-complete), ale pokoušejí se psát omezeným stylem - například MISRA C nebo JISKRA —To usnadňuje prokázání, že výsledné podprogramy končí před daným termínem.[Citace je zapotřebí ]
Jindy tito programátoři použijí pravidlo nejmenší moci - záměrně používají počítačový jazyk, který není zcela Turingův-úplný. Často se jedná o jazyky, které zaručují dokončení všech podprogramů, například Coq.[Citace je zapotřebí ]
Běžné úskalí
Problém s problémem spočívajícím v zastavení spočívá v požadavku, že rozhodovací postup musí fungovat u všech programů a vstupů. Konkrétní program se buď zastaví na daném vstupu, nebo se nezastaví. Zvažte jeden algoritmus, který vždy odpovídá „zastaví“, a druhý, který vždy odpovídá „nezastaví“. U každého konkrétního programu a vstupu odpovídá jeden z těchto dvou algoritmů správně, i když nikdo nemusí vědět, který z nich. Ani jeden algoritmus však problém zastavení obecně nevyřeší.
Existují programy (tlumočníci ), které simulují provádění jakéhokoli zdrojového kódu, který dostanou. Takové programy mohou prokázat, že se program zastaví, pokud tomu tak je: samotný tlumočník nakonec zastaví svou simulaci, což ukazuje, že původní program byl zastaven. Tlumočník se však nezastaví, pokud se nezastaví jeho vstupní program, takže tento přístup nemůže vyřešit problém zastavení, jak je uvedeno; neodpovídá úspěšně na „nezastaví se“ u programů, které se nezastaví.
Problém zastavení je teoreticky rozhodnutelný pro lineárně ohraničené automaty (LBA) nebo deterministické stroje s konečnou pamětí. Stroj s konečnou pamětí má konečný počet konfigurací, a proto jakýkoli deterministický program na něm musí nakonec buď zastavit, nebo opakovat předchozí konfiguraci:
- ...jakýkoli stroj v konečném stavu, pokud je zcela ponechán sám sobě, nakonec spadne do dokonale periodického opakujícího se vzoru. Doba trvání tohoto opakujícího se vzoru nesmí překročit počet vnitřních stavů stroje ... (kurzíva v originále, Minsky 1967, s. 24)
Minsky však poznamenává, že počítač s milionem malých částí, každý se dvěma stavy, by měl alespoň 21,000,000 možné stavy:
- Toto je 1 následované asi třemi stovkami nul ... I kdyby takový stroj pracoval na frekvencích kosmického záření, věky galaktického vývoje by byly ve srovnání s dobou cesty takovým cyklem jako nic ( Minsky 1967 s. 25):
Minsky uvádí, že i když stroj může být konečný, a konečné automaty „mají řadu teoretických omezení“:
- ... zúčastněné veličiny by měly vést k podezření, že věty a argumenty založené hlavně na pouhé konečnosti stavového diagramu nemusí mít velký význam. (Minsky str.25)
Rovněž lze automaticky rozhodnout, zda nedeterministický stroj s konečnou pamětí zastaví na žádném, na některých nebo na všech možných posloupnostech nedeterministických rozhodnutí, vyčíslením stavů po každém možném rozhodnutí.
Dějiny
![]() |
Problém zastavení je historicky důležitý, protože to byl jeden z prvních problémů, který se prokázal nerozhodnutelný. (Turingův důkaz byl uveden do tisku v květnu 1936) Alonzo Church Důkaz nerozhodnutelnosti problému v EU lambda kalkul byly již publikovány v dubnu 1936 [Church, 1936].) Následně bylo popsáno mnoho dalších nerozhodnutelných problémů.
Časová osa
- 1900: David Hilbert klade svých "23 otázek" (nyní známých jako Hilbertovy problémy ) ve druhém Mezinárodní kongres matematiků v Paříži. „Druhým z nich bylo prokazování konzistence„Peanoovy axiomy „na kterém, jak ukázal, závisela přísnost matematiky“. (Hodges s. 83, Davisův komentář v Davis, 1965, s. 108)
- 1920–1921: Emil Post zkoumá problém zastavení pro značkovací systémy, považovat to za kandidáta na neřešitelnost. (Absolutně neřešitelné problémy a relativně nerozhodné návrhy - účet s očekáváním, Davis, 1965, str. 340–433.) Jeho neřešitelnost byla prokázána až mnohem později, a Marvin Minsky (1967).
- 1928: Hilbert přepracoval svůj „druhý problém“ na Boloňském mezinárodním kongresu. (Reid s. 188–189) Hodges tvrdí, že položil tři otázky: tj. # 1: Byla matematika kompletní? # 2: Byla matematika konzistentní? # 3: Byla matematika rozhodnutelné? (Hodges, str.91). Třetí otázka je známá jako Entscheidungsproblem (Problém s rozhodnutím). (Hodges str. 91, Penrose str. 34)
- 1930: Kurt Gödel oznamuje důkaz jako odpověď na první dvě Hilbertovy otázky z roku 1928 [srov. Reid str. 198]. „Nejprve byl [Hilbert] jen naštvaný a frustrovaný, ale pak se začal s tímto problémem pokoušet konstruktivně ... Gödel sám cítil - a ve svém příspěvku vyjádřil myšlenku -, že jeho práce nebyla v rozporu s Hilbertovým formalistickým bodem zobrazit "(Reid str. 199)
- 1931: Gödel vydává „K formálně nerozhodnutelným návrhům Principia Mathematica a souvisejících systémů I“ (přetištěno v Davis, 1965, s. 5 a dále)
- 19. dubna 1935: Alonzo Church publikuje „Neřešitelný problém teorie elementárních čísel“, ve kterém identifikuje, co to znamená pro funkci efektivně vypočítatelné. Taková funkce bude mít algoritmus a „... skutečnost, že algoritmus byl ukončen, se stane účinně známou ...“ (Davis, 1965, s. 100)
- 1936: Církev vydává první důkaz, že Entscheidungsproblem je neřešitelný. (Poznámka k problému Entscheidungs, přetištěno v Davis, 1965, str. 110.)
- 7. října 1936: Emil Post Je přijat článek "Konečné kombinované procesy. Formulace I". Post přidává do svého „zpracování“ instrukci „(C) Stop“. Nazval takový proces „typ 1 ... pokud proces, který určuje, končí pro každý konkrétní problém.“ (Davis, 1965, s. 289 a dále)
- 1937: Alan Turing papír O vypočítatelných číslech s aplikací na Entscheidungsproblem dosáhne tisku v lednu 1937 (přetištěno v Davis, 1965, s. 115). Turingův důkaz se odchyluje od výpočtu rekurzivní funkce a zavádí pojem výpočtu strojem. Stephen Kleene (1952) o tom hovoří jako o jednom z „prvních příkladů problémů s rozhodováním, které se ukázaly jako neřešitelné“.
- 1939: J. Barkley Rosser dodržuje zásadní rovnocennost „efektivní metody“ definované Gödelem, Churchem a Turingem (Rosser in Davis, 1965, s. 273, „Neformální expozice důkazů Gödelovy věty a církevní věty“)
- 1943: V novinách Stephen Kleene uvádí, že „Při sestavování úplné algoritmické teorie to, co děláme, je popsat postup ... který postup nutně končí a takovým způsobem, že z výsledku můžeme vyčíst definitivní odpověď„ Ano “nebo„ Ne “na otázka: ‚Je predikátová hodnota pravdivá? '.“
- 1952: Kleene (1952) Kapitola XIII („Computable Functions“) zahrnuje diskusi o neřešitelnosti problému zastavení u Turingových strojů a přeformuluje jej ve smyslu strojů, které se „nakonec zastaví“, tj. Zastaví: „... neexistuje žádný algoritmus pro rozhodování, zda kterýkoli daný stroj při spuštění z dané situace nakonec se zastaví. “(Kleene (1952) str. 382)
- 1952: "Martin Davis považuje za pravděpodobné, že poprvé použil výraz „problém zastavení“ v řadě přednášek, které přednesl v Control Systems Laboratory na University of Illinois v roce 1952 (dopis Davise Copelandovi ze dne 12. prosince 2001). “(poznámka pod čarou 61 v Copeland (2004), str. 40 a více)
Formalizace
Ve svém původním důkazu Turing formalizoval koncept algoritmus zavedením Turingovy stroje. Výsledek však pro ně není nijak specifický; platí stejně pro jakýkoli jiný model výpočet to je ekvivalentní ve své výpočetní síle s Turingovými stroji, jako např Markovovy algoritmy, Lambda kalkul, Poštovní systémy, registrovat stroje nebo značkovací systémy.
Důležité je, že formalizace umožňuje přímé mapování algoritmů na některé datový typ že algoritmus může operovat. Například pokud formalismus umožňuje algoritmům definovat funkce přes řetězce (například Turingovy stroje), pak by mělo existovat mapování těchto algoritmů na řetězce, a pokud formalismus umožňuje algoritmům definovat funkce přes přirozená čísla (například vypočítatelné funkce ) pak by mělo existovat mapování algoritmů na přirozená čísla. Mapování na řetězce je obvykle nejpřímější, ale řetězce nad abeceda s n postavy lze také namapovat na čísla jejich interpretací jako čísel v n-ary číselná soustava.
Reprezentace jako sada
Konvenčním znázorněním problémů s rozhodováním je sada objektů, které vlastní dotyčnou vlastnost. The zastavovací sada
- K. = {(i, X) | program i zastaví se při spuštění na vstupu X}
představuje problém zastavení.
Tato sada je rekurzivně spočetné, což znamená, že existuje vypočítatelná funkce, která uvádí všechny páry (i, X) obsahuje. Doplněk této sady však není rekurzivně vyčíslitelný.[5]
Existuje mnoho ekvivalentních formulací problému zastavení; jakákoli sada, jejíž Turingův stupeň odpovídá formulaci problému zastavení. Mezi příklady takových sad patří:
- {i | program i nakonec se zastaví při spuštění se vstupem 0}
- {i | existuje vstup X takový ten program i nakonec se zastaví při spuštění se vstupem X}.
Důkazní koncept
Důkaz, že problém zastavení není řešitelný, je a důkaz rozporem. Pro ilustraci pojmu důkazu předpokládejme, že existuje a celkový vypočítatelná funkce zastaví (f) který vrátí true, pokud je podprogram F zastaví (pokud je spuštěn bez vstupů) a v opačném případě vrátí hodnotu false. Nyní zvažte následující podprogram:
def G(): -li zastaví(G): loop_forever()
zastaví (g) musí buď vrátit true nebo false, protože zastaví bylo považováno za celkový. Li zastaví (g) pak se vrátí true G zavolá loop_forever a nikdy se nezastaví, což je rozpor. Li zastaví (g) potom vrátí hodnotu false G zastaví, protože to nezavolá loop_forever; to je také rozpor. Celkově, zastaví (g) nemůže vrátit hodnotu pravdy, která je v souladu s tím, zda G zastaví. Proto je původní předpoklad, že zastaví is a total computable function must be false.
Volá se metoda použitá v důkazu diagonalizace - G dělá opak toho, co zastaví říká G měl by udělat. Rozdíl mezi tímto náčrtkem a skutečným důkazem je v tom, že ve skutečném důkazu je vypočítatelná funkce zastaví nebere přímo podprogram jako argument; místo toho přebírá zdrojový kód programu. Skutečný důkaz vyžaduje další práci s řešením tohoto problému. Skutečný důkaz se navíc vyhýbá přímému použití rekurze uvedené v definici G.
Náčrt důkazu
Koncept výše ukazuje obecnou metodu důkazu; v této části budou uvedeny další podrobnosti. Celkovým cílem je ukázat, že neexistuje celkový vypočítatelná funkce který rozhodne, zda je libovolný program i zastaví se při libovolném vstupu X; tj. následující funkce h nelze vypočítat (Penrose 1990, s. 57–63):