Я думаю, что ответ на первый вопрос заключается в том, что обычно слишком много работы с текущими инструментами. Чтобы почувствовать, я предлагаю попробовать доказать правильность Bubble Sort в Coq (или, если вы предпочитаете немного больше испытаний, используйте Quick Sort). Я не думаю, что разумно ожидать, что программисты будут писать проверенные программы, пока доказательство правильности таких базовых алгоритмов так сложно и отнимает много времени.
Этот вопрос похож на вопрос, почему математики не пишут формальные доказательства, проверяемые средствами проверки? Написание программы с формальным доказательством правильности означает доказательство математической теоремы о написанном коде, и ответ на этот вопрос также относится к вашему вопросу.
Это не означает, что не было успешных случаев проверенных программ. Я знаю, что есть группы , которые доказывают правильность таких систем, как гипервизор Microsoft . Связанный случай - проверенный компилятор C от Microsoft . Но в целом текущие инструменты требуют большой разработки (включая аспекты SE и HCI), прежде чем они станут полезными для программистов общего профиля (и математиков).
Что касается последнего абзаца ответа Нила о росте размера программы для языков с только полными функциями, то на самом деле легко доказать еще больше (если я правильно понял). Разумно ожидать, что синтаксис любого языка программирования будет ce, а набор общих вычислимых функций не является ce, поэтому для любого языка программирования, где все программы являются суммарными, существует общая вычислимая функция, которая не может быть вычислена какой-либо программой ( любого размера) на этом языке.
На второй вопрос я ответил на аналогичный вопрос в блоге Скотта некоторое время назад. В основном, если класс сложности имеет хорошую характеристику и вычислимо представим (то есть, это ce), то мы можем доказать, что некоторые представления задач в классе сложности доказуемо полны в очень слабых теориях, соответствующих классу сложности. Основная идея заключается в том, что доказуемо общие функции теории содержит все C 0 функции и задачи , которая является C 0AC0AC0-полный для класса сложности, поэтому он содержит все проблемы в классе сложности и может доказать совокупность этих программ. Связь между доказательствами и теорией сложности изучается с точки зрения сложности доказательств, если вам интересно , см. Недавнюю книгу С. А. Кука и П. Нгуена « Логические основы сложности доказательств ». ( Доступен черновой вариант с 2008 года.) Итак, основной ответ таков: для многих классов «Обеспечиваемо C = C».
В целом это не так, поскольку существуют классы семантической сложности, которые не имеют синтаксической характеристики, например, полные вычислимые функции. Если под рекурсивом вы имеете в виду полные рекурсивные функции, то эти две функции не равны, и набор вычислимых функций, которые доказуемо полны в теории, хорошо изучен в литературе по теории доказательств и называется доказуемо полными функциями теории. Например: доказуемо полные функции являются ϵ 0 -рекурсивными функциями (или эквивалентно функциями в системе Гёделя T ), доказуемо полные функции P A 2 являются функциями в системе F Жирара F , доказуемо полными функциямиPAϵ0TPA2F - примитивные рекурсивные функции, ....IΣ1
Но мне не кажется, что это много значит в контексте проверки программ, поскольку есть также программы, которые в расширенном порядке вычисляют одну и ту же функцию, но мы не можем доказать, что эти две программы вычисляют одну и ту же функцию, то есть программы в равной степени равны, но не намеренно. (Это похоже на «Утреннюю звезду» и «Вечернюю звезду».) Кроме того, легко модифицировать данную доказуемо полную программу, чтобы получить такую, которую теория не может доказать своей совокупностью.
Я думаю, что эти два вопроса связаны между собой. Цель состоит в том, чтобы получить проверенную программу. Проверенные программы означают, что программа удовлетворяет описанию, которое является математическим утверждением. Один из способов - написать программу на языке программирования, а затем доказать, что ее свойства удовлетворяют описанию, что является более распространенной практикой. Другой вариант - попытаться доказать математическое утверждение, описывающее проблему, используя ограниченные средства, а затем извлечь проверенную программу из нее. Например, если мы докажем в теории, соответствующей что для любого данного числа n существует последовательность простых чисел, произведение которых равно n , то мы можем извлечь PPnnPалгоритм факторизации из доказательства. (Существуют также исследователи, которые пытаются максимально автоматизировать первый подход, но проверка интересных нетривиальных свойств программ сложна в вычислительном отношении и не может быть полностью проверена без ложных срабатываний и негативов.)