Я думаю, що відповідь на перше питання полягає в тому, що загалом це занадто багато роботи з сучасними інструментами. Щоб отримати таке відчуття, я пропоную спробувати довести правильність сортування бульбашок у Coq (або якщо ви віддаєте перевагу трохи більше проблем, скористайтеся швидким сортуванням). Я не думаю, що доцільно очікувати, що програмісти пишуть перевірені програми до тих пір, поки довести правильність таких основних алгоритмів так складно і забирає багато часу.
Це питання схоже на запитання, чому математики не пишуть офіційних доказів, перевірених перевіряючими? Написання програми з формальним підтвердженням правильності означає доведення математичної теореми про написаний код, і відповідь на це питання також стосується вашого запитання.
Це не означає, що не було успішних випадків перевірених програм. Я знаю, що є групи, які доводять правильність таких систем, як гіпервізор Microsoft . Пов’язаний випадок - це підтверджений компілятор Microsoft . Але загалом сучасні інструменти потребують значного розвитку (включаючи їх аспекти SE та HCI), перш ніж стати корисними для загальних програмістів (і математиків).
Щодо останнього пункту відповіді Ніла про зростання розміру програми для мов, які мають лише загальні функції, насправді легко довести ще більше (Якщо я правильно це зрозумів). Доцільно розраховувати, що синтаксис будь-якої мови програмування буде ce і набір загальних обчислюваних функцій не ce, тому для будь-якої мови програмування, де всі програми є загальною, існує загальна обчислювальна функція, яку неможливо обчислити жодна програма ( будь-якого розміру) на цій мові.
На друге запитання я відповів на подібне запитання в блозі Скотта десь тому. В основному, якщо клас складності має хорошу характеристику і є виразно представницьким (тобто це ce), то ми можемо довести, що деяке представлення проблем у класі складності виявляється сумарним у дуже слабких теоріях, що відповідають класу складності. Основна ідея полягає в тому, що суто загальні функції теорії містять усі функції і задачу, яка A C 0AC0AC0-комплект для класу складності, тому він містить усі проблеми класу складності і може довести сукупність цих програм. Співвідношення між доказом і теорією складності вивчається в доказівній складності, див. С.А. Кука та останню книгу П.Нгуєна " Логічні основи складності доказування ", якщо вас цікавить. ( Проект від 2008 р. Доступний.) Отже, основна відповідь полягає в тому, що для багатьох класів "Доведено C = C".
Це взагалі не вірно, оскільки існують класи семантичної складності, які не мають синтаксичної характеристики, наприклад, загальні обчислювані функції. Якщо під рекурсивним способом ви маєте на увазі загальну рекурсивну функцію, то обидві не є рівними, а набір обчислюваних функцій, які в теорії є загальнодоступними, добре вивчений у літературі теорії доказів і називається доказівно сумарними функціями теорії. Наприклад: суттєво сумарні функції є ϵ 0 -рекурсивними функціями (або еквівалентними функціями в системі Годеля Гольделя T ), а суттєво сумарні функції P A 2 є функцією в системі Жирара F , а сумарні функціїPAϵ0TPA2F - примітивні рекурсивні функції, ....IΣ1
Але мені не здається, що це значно означає в контексті верифікації програми, оскільки є також програми, які розширюють одну і ту ж функцію, але ми не можемо довести, що обидві програми обчислюють одну і ту ж функцію, тобто програми є рівними, але не навмисно. (Це схоже на "Ранкова зірка" та "Вечірня зірка". Більше того, легко змінити задану суттєво загальну програму, щоб отримати ту, яку теорія не може довести її сукупність.
Я думаю, що два питання пов'язані між собою. Мета - отримати перевірену програму. Перевірені програми означають, що програма задовольняє опису, який є математичним твердженням. Один із способів - написати програму мовою програмування, а потім довести її властивості так, як вона задовольняє опису, що є звичайнішою практикою. Інший варіант - спробувати довести математичне твердження, що описує проблему, за допомогою обмежених засобів, а потім витягнути з неї перевірену програму. Наприклад, якщо ми докажемо в теорії, що відповідає що для будь-якого заданого числа n існує послідовність простих чисел, їх добуток дорівнює n , то ми можемо отримати PPnnPалгоритм факторизації з доведення. (Є також дослідники, які намагаються максимально автоматизувати перший підхід, але перевірити цікаві нетривіальні властивості програм обчислювально важко і їх неможливо повністю перевірити без помилкових позитивів і негативів.)