Від Кантора до Тюрінга
Чому жоден аналізатор не скаже про кожну програму, чи вона зависне
У таблиці рядки означають програми, стовпці вхідні числа, а клітинка каже, чи зупиняється програма на цьому вході, чи працює вічно. Програма «Навпаки» дивиться на діагональ і робить протилежне: на вході k вона зупиняється, якщо програма k на вході k працює вічно, і зациклюється, якщо та зупиняється. Тож «Навпаки» відрізняється від кожної програми в таблиці хоча б на одному вході, як рядок Кантора.
Тепер припустімо, що хтось написав перевірник, який про будь-яку програму на будь-якому вході правильно каже, зупиниться вона чи ні. Тоді «Навпаки» можна було б написати як звичайну програму: спитай перевірник і зроби протилежне. Але всі програми можна пронумерувати, як гостей, і «Навпаки» мала б свій номер k. На вході k вона мусила б і зупинитися, і не зупинитися. Отже, такого перевірника не існує. Цю ідею, яку сьогодні вчать як проблему зупинки, Алан Тюрінг виклав у статті 1936 року.
На практиці це означає, що компілятори, аналізатори коду й антивіруси завжди чогось не знають: вони або пропускають частину зависань, або іноді даремно б'ють на сполох, або ставлять обмеження часу. Ідеальний перевірник неможливий не через брак швидкості, а через логіку.