В двух словах : алгоритм является конструктивной частью конструктивного доказательства того, что данная проблема имеет решение. Мотивация для этого определения - изоморфизм Карри-Ховарда между программами и доказательством, учитывая, что программа имеет интерес только в том случае, если она решает проблему, но доказуемо так. Это определение допускает дополнительную абстракцию и оставляет некоторые двери открытыми в отношении типа областей, которые могут быть затронуты, например, в отношении свойств конечности.
Предупреждение . Я пытаюсь найти правильный формальный подход к ответу на вопрос. Я действительно думаю, что это необходимо, но кажется, что ни один из пользователей, которые ответили до сих пор (включая меня, и некоторые были более или менее откровенными об этом в других сообщениях), не имеет достаточного фона для правильной разработки проблем, связанных с конструктивная математика, теория доказательств, теория типов и такие результаты, как изоморфизм Карри-Говарда между доказательствами и программами. Я делаю все возможное здесь, с любыми фрагментами знаний, которые у меня есть (я верю), и я слишком хорошо осознаю ограничения этого ответа. Я только надеюсь дать некоторые подсказки того, на что, я думаю, должен выглядеть ответ. Если вы видите какой-либо пункт, который явно неверен формально (доказуемо), пожалуйста, дайте мне сейчас в комментарии - или по электронной почте.
Выявление некоторых проблем
Стандартный способ рассмотрения алгоритма состоит в том, чтобы утверждать, что алгоритм - это произвольная конечно определенная программа для некоторого вычислительного устройства , включая те, которые не имеют ограничений в памяти. Язык также может быть языком машинного компьютера. На самом деле достаточно рассмотреть все программы для полного вычислительного устройства Тьюринга (что подразумевает отсутствие ограничений памяти). Это может не дать вам представление всех алгоритмов, в том смысле, что алгоритмы должны быть выражены в форме, которая в своих деталях зависит от контекста интерпретации, даже теоретического, поскольку все определяется до некоторой кодировки. Но, поскольку он будет вычислять все, что нужно вычислить, он будет каким-то образом включать все алгоритмы, вплоть до кодирования.
π
πВозможно, в математическом смысле почти все. Но это потребовало бы большей точности в определениях.
Таким образом, реальный вопрос состоит в том, чтобы знать, каковы значимые алгоритмы. Ответ заключается в том, что значимые алгоритмы - это те, которые решают проблему, шаг за шагом вычисляя «решение», «ответ» этой проблемы. Алгоритм интересен, если он связан с проблемой, которую он решает.
Итак, учитывая формальную проблему, как мы получаем алгоритм, который решает проблему. Явно или неявно, алгоритмы связаны с идеей, что существует решение проблемы, которое может быть доказано правильным. То, насколько точны наши методы доказательства, - это другой вопрос, но мы стараемся, по крайней мере, убедить себя. Если вы ограничиваете себя конструктивной математикой, которая на самом деле является тем, что мы должны делать (и это является очень приемлемым аксиоматическим ограничением для большей части математики), способ доказать существование решения состоит в том, чтобы пройти этапы доказательства, которые фактически демонстрируют конструкт это представляет решение, включая, возможно, другие шаги, которые устанавливают его правильность.
Все программисты думают примерно так: если я так и так поиграюсь с данными, то получу этот виджет, который обладает только правильными свойствами из-за теоремы Сезама, и, запустив это преобразование, сохраняющее foo, получу желаемый ответ . Но доказательства обычно неформальны, и мы не прорабатываем все детали, что объясняет, почему спутник пытался вывести на орбиту Марс (среди прочего). Мы делаем большую часть рассуждений, но на самом деле мы оставляем только конструктивную часть, которая строит решение, и мы описываем его на компьютерном языке как алгоритм, который решает проблему.
Интересные алгоритмы (или программы)
Все это должно было представить следующие идеи, которые являются объектом многих современных исследований (из которых я не специалист). Понятие « интересный алгоритм », используемое здесь, мое, введенное в качестве неофициального заполнителя для более точных определений.
Интересный алгоритм - это конструктивная часть конструктивного доказательства того, что данная задача имеет решение . Это означает, что доказательство должно на самом деле демонстрировать решение, а не просто доказывать его существование, например, путем противоречия. Для более подробной информации см. Интуиционистская логика и конструктивизм в математике.
Это, конечно, очень ограничительное определение, которое учитывает только то, что я назвал интересными алгоритмами. Так что игнорирует почти все из них. Но так же поступают все наши учебники по алгоритму. Они пытаются преподавать только некоторые из интересных.
Учитывая все параметры задачи (входные данные), он говорит вам, как получить указанный результат шаг за шагом. Типичным примером является разрешение уравнений ( алгоритм имени на самом деле происходит от имени персидского математика Мухаммада ибн Муса аль-Хваризми , который изучал разрешение некоторых уравнений). Части доказательства используются, чтобы установить, что некоторые значения, вычисленные в алгоритме, действительно имеют некоторые свойства, но эти части не нужно хранить в самом алгоритме.
Разумеется, это должно происходить в формализованной логической структуре, которая устанавливает, с какими данными рассчитываются, какие допускаются элементарные вычислительные шаги и какие используются аксиомы.
Возвращаясь к вашему факториальному примеру, он может быть истолкован как алгоритм, хотя и тривиальный. Нормальная факториальная функция соответствует доказательству того, что с учетом некоторой арифметической структуры и целого числа n существует число, являющееся произведением первых n целых чисел. Это довольно просто, как и факторные вычисления. Это может быть более сложным для других функций.
Теперь, если вы решите составить таблицу факториала, предполагая, что можете, что не верно для всех целых чисел (но может быть верно для некоторой конечной области значений), все, что вы делаете, это включаете в свои аксиомы существование факториала, определяя с помощью Новая аксиома - это значение для каждого целого числа, так что вам больше не нужно ничего доказывать (следовательно, вычислять).
Но система аксиом должна быть конечной (или, по крайней мере, конечно определенной). И существует множество значений факториала, по одному на целое число. Таким образом, у вас возникнут проблемы с вашей конечной системой аксиом, если вы аксиоматизируете бесконечную функцию, то есть определенную в бесконечной области. Это означает, что ваш потенциальный поиск в таблице не может быть реализован для всех целых чисел. Это убило бы обычное требование к конечности для алгоритмов (но должно ли оно быть столь же строгим, как часто представленное?).
Вы могли бы решить иметь конечно определенный генератор аксиом для обработки всех случаев. Это будет более или менее равносильно включению в ваш алгоритм стандартной факториальной программы для инициализации массива по мере необходимости. Это называется запоминанием программистами. Это на самом деле ближе всего к эквиваленту предварительно вычисленной таблицы. Понятно, что у него есть предварительно вычисленная таблица, за исключением того факта, что таблица фактически создается в режиме отложенной оценки , когда это необходимо. Это обсуждение, вероятно, потребует немного более формальной заботы.
Вы можете определить свои примитивные операции по своему усмотрению (в соответствии с вашей формальной системой) и назначить им любую стоимость, которую вы выберете при использовании в алгоритме, чтобы выполнить анализ сложности или производительности. Но если конкретные системы, которые на самом деле реализуют ваш алгоритм (например, компьютер или мозг), не могут удовлетворить эти спецификации затрат, ваш анализ может быть интеллектуально интересным, но бесполезным для реального использования в реальном мире.
21000
Какие программы интересны
Это обсуждение должно быть более правильно связано с такими результатами, как
изоморфизм Карри-Ховарда между программами и доказательство. Если какая-либо программа на самом деле является доказательством чего-либо, любая программа может быть истолкована как интересная программа в смысле определения выше.
Однако, по моему (ограниченному) пониманию, этот изоморфизм ограничен программами, которые могут быть хорошо напечатаны в некоторой подходящей системе типирования, где типы соответствуют предложениям аксиоматической теории. Следовательно, не все программы можно квалифицировать как интересные программы. Я предполагаю, что именно в этом смысле алгоритм должен решить проблему.
Это, вероятно, исключает большинство «случайно сгенерированных» программ.
Это также несколько открытое определение того, что является «интересным алгоритмом». Любая программа, которая может показаться интересной, определенно такова, поскольку существует определенная система типов, которая делает ее интересной. Но программа, которая до сих пор не была типизированной, могла стать типизируемой с более продвинутой системой типов и, таким образом, стать интересной. Точнее, это всегда было интересно, но из-за недостатка знаний о правильной системе типов мы не могли этого знать.
Однако известно, что не все программы являются типизируемыми, поскольку известно, что некоторые лямбда-выражения, такие как реализация Y-комбинатора , не могут быть набраны в системе звукового типа .
Это представление относится только к программным формализмам, которые могут быть непосредственно связаны с некоторой аксиоматической системой доказательств. Я не знаю, как его можно распространить на вычислительные формализмы низкого уровня, такие как машина Тьюринга. Однако, поскольку алгоритмика и вычислимость часто являются игрой кодирования проблем и решений (представьте себе арифметику, закодированную в лямбда-исчислении ), можно считать, что любое формально определенное вычисление, которое может быть показано как кодирование алгоритма, также является алгоритмом. Такие кодировки, вероятно, используют только очень небольшую часть того, что может быть выражено в формализме низкого уровня, таком как машины Тьюринга.
Один интерес этого подхода состоит в том, что он дает понятие алгоритма, которое является более абстрактным и независимым от вопросов фактического кодирования, «физической представимости» вычислительной области. Таким образом, можно, например, рассматривать области с бесконечными объектами, пока существует вычислительный способ их использования.