Якщо ви знайомі з верифікацією програми, ви, швидше за все, вважаєте за краще прочитати питання перед фоном . Якщо ви не знайомі з верифікацією програми, можливо, ви все ще зможете відповісти на це запитання, але ви, швидше за все, бажаєте спочатку прочитати тло .
Фон
Часто зазначається, що перевірка часткової коректності не підлягає визначенню. Для обговорення виберемо один дуже конкретний спосіб зробити це твердження точним у стилі Флойда - Хоара. Flowgraph є Орграф з виділеним початковим вузлом , з якого все вузли досяжні. Програма є Flowgraph, вузли якого є командами. Існують три типи команд (1) припущення припускають q , (2) твердження стверджують q , і (3) призначення v: = e. Тут q - формула fol (першого порядку), e - термін fol, а v - змінна.
Ми говоримо, що програма є частково правильною, коли є спосіб анотувати кожен вузол x з попередньою умовою a (x) і постумовою b (x) , що (1) попередня умова початкового вузла є дійсною, (2) { a (x) } x { b (x) } виконується для всіх команд x , а (3) ( b (x) означає, що (y) ) справедливо для всіх ребер від x до y . Тут трійки Хоара визначаються так:
- { p } стверджувати q { r } означає, що ( p означає ( q і r )) є дійсним
- { p } припустимо, що q { r } означає, що (( p і q ) означає, що r ) є дійсним
- { p } v: = e { r } означає, що (( p з e заміщений на v ) означає, що r ) є дійсним
Ось рукохвильовий аргумент того, чому перевірити цю часткову правильність неможливо: Після заповнення деяких (x) та деяких b (x) вам потрібно перевірити, чи деякі формули фолів є дійсними, і це не можна визначити.
Типовим способом кодування закінчення в частковій коректності є додавання деяких спеціальних тверджень, які по суті говорять: «з моменту, коли я був виконаний, був прогрес до припинення». Ці твердження про прогрес повинні бути розміщені таким чином, що всі нескінченні прогулянки на блок-схемі (що починаються з початкового вузла) містять нескінченно багато тверджень про прогрес. Якщо конкретніше сказати, скажімо, що твердження про прогрес завжди мають форму затвердження u < v , де u і v - натуральні цілі числа, передує присвоєнню u : = f і супроводжується призначенням v : = u . Тут f - aваріантна функція , u - її поточне значення, а v - колишнє значення. Тепер, оскільки ми говоримо про "натуральні числа" і порівнюємо їх, нам потрібно переконатися, що є трохи більше, ніж фол: Скажімо, наявна арифметика Пеано . (Я не відчуваю сильного з цього приводу вибору. Не соромтесь ігнорувати, якщо це зручно.) Звичайно, f може використовувати будь-які інші функції та константи, про які йдеться у програмі. (Зауважте, що додавання припущень на початку програми еквівалентно введенню нелогічних аксіом.)
Тепер, якщо програма з твердженнями про прогрес все ще частково правильна, ми знаємо, що початкова програма припиняється.
Питання
Враховуючи програму, що закінчується, вважається, що розробити варіанти варіантів для затвердження прогресу важко. Але як важко? (Я знаю, що навіть з величезним фоном вище, я все-таки залишив це питання наскрізним або невідомим, залежно від того, як ви хочете на це подивитися.)
Якщо говорити інакше: я шукаю посилання, яке формалізує проблему зведення терміналу до часткової коректності, а потім щось говорить про його складність. Відповідь, яка робить все це, звичайно, вітається.