Коротше кажучи : алгоритм є конструктивною частиною конструктивного доказу того, що дана проблема має рішення. Мотивацією цього визначення є ізоморфізм Керрі-Говарда між програмами та доказом, враховуючи, що програма має інтерес лише в тому випадку, якщо вона вирішує проблему, але, мабуть, так. Це визначення дозволяє отримати більшу абстракцію і залишає відкритими деякі двері стосовно виду доменів, які можуть стосуватися, наприклад, щодо властивостей кінцевості.
Попередження . Я намагаюся знайти належний формальний підхід до відповіді на питання. Я думаю, що це потрібно, але здається, що жоден з тих, хто відповів на даний момент (я включив, а деякі були більш-менш явні про це в інших публікаціях) не має належного підходу для належного розробки питань, пов'язаних з конструктивна математика, теорія доказів, теорія типів та такі результати, як ізоморфізм Керрі-Говарда між доказами та програмами. Я роблю все можливе тут, з будь-якими фрагментами знань, які я маю (вважаю), і я лише надто усвідомлюю обмеження цієї відповіді. Я лише сподіваюся дати деякі підказки, як я думаю, відповідь має виглядати. Якщо ви бачите будь-який момент, який явно неправильно формально (доказово), будь ласка, дозвольте мені зараз у коментарі - або електронною поштою.
Визначення деяких питань
Стандартним способом розгляду алгоритму є твердження, що алгоритм є довільною кінцево заданою програмою для деяких обчислювальних пристроїв , у тому числі тих, що не мають обмежень у пам'яті. Мова для комп'ютера також може бути мовою комп'ютерної машини. Насправді достатньо розглянути всі програми для повного обчислювального пристрою Тьюрінга (що означає, що немає обмежень пам'яті). Це може не дати вам усіх презентацій алгоритмів, в тому сенсі, що алгоритми повинні бути виражені у формі, яка залежить від його деталей від контексту інтерпретації, навіть теоретичної, оскільки все визначено до певного кодування. Але, оскільки він буде обчислювати все, що потрібно обчислити, він буде включати якось всі алгоритми, аж до кодування.
π
π, можливо, в математичному сенсі майже всіх. Але це вимагало б більшої точності у визначеннях.
Тож справжнє питання - знати, які є змістовні алгоритми. Відповідь полягає в тому, що значущі алгоритми - це ті, що вирішують проблему, обчислюючи крок за кроком "рішення", "відповідь", на цю проблему. Алгоритм цікавий, якщо він пов'язаний з проблемою, яку він вирішує.
Отже, задавши формальну проблему, як нам отримати алгоритм, який вирішує проблему. Незалежно від того, явно чи неявно, алгоритми пов'язані з думкою про існування рішення проблеми, яке може бути доведено правильним. Чи точні наші методи доказування - інша справа, але ми намагаємось принаймні переконати себе. Якщо ви обмежитеся конструктивною математикою, що насправді є тим, що ми маємо робити (і є дуже прийнятним аксіоматичним обмеженням для більшості математики), спосіб довести існування рішення - пройти етапи доказування, які фактично демонструють конструкцію що представляє рішення, включаючи, можливо, інші кроки, що встановлюють його правильність.
Усі програмісти думають щось на кшталт: якщо я спізнаюсь із даними таким і таким чином, то я отримую цей віджет, який має правильні властивості завдяки теоремі Сезама, і виконуючи цю перетворену конверсію, я отримую потрібну відповідь . Але доказ зазвичай неформальний, і ми не опрацьовуємо всі деталі, що пояснює, чому супутник намагався здійснити орбіту Марса під землею (серед іншого). Ми робимо велику частину міркувань, але насправді зберігаємо лише конструктивну частину, яка будує рішення, і описуємо це комп'ютерною мовою як алгоритм, який вирішує проблему.
Цікаві алгоритми (або програми)
Все це полягало в тому, щоб запровадити наступні ідеї, які є об’єктом багатьох сучасних досліджень (з яких я не фахівець). Поняття " цікавий алгоритм ", що використовується тут, моє, введене як неофіційне місце для більш точних визначень.
Цікавим алгоритмом є конструктивна частина конструктивного доказу того, що дана проблема має рішення . Це означає, що доказ має насправді демонструвати рішення, а не просто доводити його існування, наприклад, суперечливістю. Детальніше див. Інтуїціоністична логіка та конструктивізм з математики.
Звичайно, це дуже обмежувальне визначення, яке враховує лише те, що я назвав цікавими алгоритмами. Так воно ігнорує майже всіх. Але так роблять усі наші підручники за алгоритмом. Вони намагаються навчити лише деяких цікавих.
Враховуючи всі параметри задачі (вхідні дані), вона розповідає, як отримати визначений результат поетапно. Типовим прикладом є роздільна здатність рівнянь ( алгоритм імен насправді походить від імені перського математика Мухаммада ібн Муса аль-Хварізмі , який вивчав роздільну здатність деяких рівнянь). Частини доказування використовуються для встановлення того, що деякі значення, обчислені в алгоритмі, мають деякі властивості, але ці частини не потрібно зберігати в самому алгоритмі.
Звичайно, це має відбуватися у формалізованій логічній структурі, яка встановлює, які дані обчислюються, які дозволені елементарні обчислювальні етапи та які використовуються аксіоми.
Повернувшись до вашого факторного прикладу, він може розглядатися як алгоритм, хоч і банальний. Нормальна факторіальна функція відповідає доказу, що з огляду на деяку арифметичну рамку та задане ціле число n існує число, яке є добутком перших n цілих чисел. Це досить просто, як і факторні обчислення. Це може бути складнішим для інших функцій.
Тепер, якщо ви вирішили скласти таблицю факторіалів, припускаючи, що ви можете, що не вірно для всіх цілих чисел (але може бути правдою для деякої кінцевої області значень), все, що ви робите, - це включити у ваші аксіоми існування факторіалу шляхом визначення за допомогою нова аксіома - її значення для кожного цілого числа, так що вам більше не потрібно доводити (отже, обчислювати) що-небудь.
Але система аксіом повинна бути кінцевою (або принаймні кінцево визначеною). І існує нескінченність значень для факторіалів, одне на ціле число. Таким чином, ви переживаєте свою кінцеву систему аксіом, якщо аксіоматизуєте нескінченну функцію, тобто визначену в нескінченній області. Це обчислювально перекладається на те, що пошук вашого потенційного таблиці не може бути реалізований для всіх цілих чисел. Це вбило б звичну вимогу до кінцевості для алгоритмів (але чи слід бути такою ж суворою, як часто представлено?).
Ви можете вирішити, щоб мати кінцево визначений генератор аксіом, який би вирішував усі випадки. Це означатиме, більш-менш, включення до вашого алгоритму стандартної факторної програми для ініціалізації масиву за потребою. Це називається запам'ятовування програмістами. Це насправді найближче ви до еквіваленту попередньо обчисленої таблиці. Можна зрозуміти, що має попередньо обчислену таблицю, за винятком того факту, що таблиця фактично створюється в режимі ледачої оцінки , коли це потрібно. Це обговорення, мабуть, потребує трохи більше формальної допомоги.
Ви можете визначити свої примітивні операції за своїм бажанням (у відповідності зі своєю офіційною системою) та призначити їм будь-яку вартість, яку ви обираєте при використанні в алгоритмі, щоб зробити складність чи аналіз продуктивності. Але якщо конкретні системи, які реально реалізують ваш алгоритм (наприклад, комп’ютер або мозок), не можуть дотримуватися цих специфікацій витрат, ваш аналіз може бути інтелектуально цікавим, але марний для реального використання в реальному світі.
21000
Які програми цікаві
Ця дискусія повинна бути більш правильно пов'язана з результатами, такими як
ізоморфізм Крірі-Говарда між програмами та доказом. Якщо будь-яка програма насправді є доказом чогось, будь-яка програма може бути розтлумачена як цікава програма у розумінні вищевказаного визначення.
Однак, на моє (обмежене) розуміння, цей ізоморфізм обмежений програмами, які можна добре набрати в якійсь відповідній системі типізації, де типи відповідають положенням аксіоматичної теорії. Отже, не всі програми можна кваліфікувати як цікаві програми. Я здогадуюсь, що саме в цьому сенсі алгоритм повинен вирішити проблему.
Це, ймовірно, виключає більшість "випадково створених" програм.
Це також дещо відкрите визначення того, що таке "цікавий алгоритм". Будь-яка програма, яку можна вважати цікавою, безумовно, так, оскільки існує ідентифікована система типів, яка робить її цікавою. Але програма, яка до цього часу не була набрана, може набрати тип із вдосконаленою системою типу і, таким чином, стати цікавою. Точніше, це завжди було цікаво, але через незнання правильної системи типу ми не могли його знати.
Однак відомо, що не всі програми є типовими, оскільки відомо, що деякий лямбда-вираз, наприклад реалізація комбінатора Y , не може бути введений у звукову систему .
Цей погляд стосується лише формалізмів програмування, які можуть бути безпосередньо пов'язані з якоюсь аксіоматичною системою доказування. Я не знаю, як це можна поширити на обчислювальні формалізми низького рівня, такі як машина Тюрінга. Однак, оскільки алгоритміка та обчислюваність часто є грою кодування проблем та рішень (подумайте про арифметику, закодовану в обчисленні лямбда ), можна вважати, що будь-які формально визначені обчислення, які можуть бути показані як кодування алгоритму, також є алгоритмом. Такі кодування, ймовірно, використовують лише дуже малу частину того, що можна виразити в низькому рівні формалізму, наприклад, машини Тюрінга.
Один із зацікавлень цього підходу полягає в тому, що він дає поняття алгоритму, який є більш абстрактним і незалежним від питань фактичного кодування, "фізичної репрезентативності" області обчислень. Так, наприклад, можна розглядати домени з нескінченними об'єктами, якщо існує обчислювально обгрунтований спосіб їх використання.