Які межі загального функціонального програмування?


19

Які обмеження в загальному функціональному програмуванні? Він не є повним Тьюрінгом, але все ще підтримує велику підмножину можливих програм. Чи існують важливі конструкції, які ви могли б написати мовою, що повністю завершує Тьюрінга, але не цілком функціональною мовою?

І чи правильно сказати, що програми, написані загальнофункціональними мовами, можна повністю проаналізувати статично, тоді як статичний аналіз на мовах, повних Тьюрінга обмежений такими речами, як проблема зупинки? Маючи на увазі, я не маю на увазі, що в загальних функціональних мовах все може бути визначено статично, тому що деякі речі відомі лише під час виконання, але я маю на увазі, що теоретично програми, написані ідеальною повною функціональною мовою програмування, можна проаналізувати, щоб усе, що теоретично можна визначити статично, можна визначити статично. Або все ще існують невирішені проблеми, що успадковуються в цілому функціональних мовах, що робить статичний аналіз неповним? Деякі проблеми завжди будуть невирішеними, незалежно від того, якою мовою вони написані, але мене цікавлять такі проблеми, які передаються у спадок мові,

Відповіді:


16

Це залежить від загальної функціональної мови .

Ця відповідь звучить як коп, але нічого більш конкретного не можна сказати. Зрештою, розгляньте будь-яку важливу програму, яка вас цікавить. Напишіть програму на улюбленій мові Тюрінга, щоб її вирішити. Оскільки проблема вирішується, ваша програма зупинятиметься на всіх входах.

(Можливо, нерозв'язувана проблема може мати цікаві програми, але не такі, якими користуються люди, оскільки вони ніколи не зможуть чекати досить довго, щоб знати відповідь.)

Тепер визначте нову мову таким чином, щоб вона мала лише одну дійсну програму введення: програму, яку ви тільки що написали, з тією ж семантикою, що і раніше. Це, безумовно, загально, оскільки всі вклади до всіх написаних в ній програм (яких є лише одна) завжди закінчуються.

Цей дешевий трюк справді корисний: наприклад, мова Coq - це цілком функціональна мова, оскільки жодна програма не перевіряє типів, якщо немає доказів її припинення. (Якщо ви відмовилися від цієї вимоги, це було б повним Тюрінгом, тому єдиною перешкодою є пошук доказів припинення.)

Я не впевнений, що ви маєте на увазі під "всім, що теоретично можна було б визначити статично, можна визначити статично"; це звучить тавтологічно правдиво. Тим не менш, загальні мови не властиві легко; ви знаєте, що нічого не розходиться, що є корисним фактом, але взаємозв'язок між входом і виходом все ще складний. (Зокрема, все ще існує нескінченно багато можливих даних, тому ви не можете вичерпно спробувати їх усі, навіть теоретично.)


Дякую за вашу відповідь. Тож бути тотальним дещо допомагає, але це залишається дуже складною проблемою. Що я мав на увазі під "всім, що теоретично можна визначити статично, можна визначити статично", - це було б можливо, надзвичайно складно чи ні, проаналізувати всі взаємозв'язки між входом і виходом, якби у вас було достатньо ресурсів для цього . Або основні причини, чому це обмежено? Як і теорія Райса, доводи, що це стосується часткових функцій. Або я нерозумію теорему Райса?
Matthijs Steen

Я думаю, це може залежати від того, що ви маєте на увазі під "відносинами". Зокрема, якщо ви просто маєте на увазі "вхід A йде на вихід B", це можна визначити в цілому функціональною мовою; просто запустіть програму. Але вас, мабуть, цікавлять аналізи, які щось говорять про нескінченний клас матеріалів.
Пол Стансіфер

(Ой, хіт ввести випадково) ... але це відкриває ще один дурний трюк, тому що я можу задати нерозв'язні питання про тотожною функції , якщо я хочу: «Для деяких X, це (identity X)машина Тьюринга , яка зупиняється?» Звичайно, це не здається, про identity , але як ви визначаєте «о»?
Пол Стансіфер

Так, я хочу знати, чи відповідає воно для всіх можливих вхідних значень певного визначення, а не для окремих входів. Отже, якщо я вас правильно зрозумів, ви маєте на увазі, що завжди будуть виникати невідрізні питання, незалежно від того, який тип мови програмування використовується? Хоча деякі з цих невирішених питань можна обійти, запобігаючи виникненню проблеми в першу чергу, як цілісні функціональні мови для проблеми зупинки? Тому що не було б ваше питання про функцію ідентичності вирішити цілком функціональною мовою?
Matthijs Steen

Так; модифікована версія проблеми, в якій "Машина Тьюрінга" замінена на "Збій після закінчення гарантії, машина Тюрінга" тривіально вирішена. Для цих цілей настільки клопітно, що проблема зупинки - це приклад нерозв'язної проблеми, коли розгляд програм переповнюється невизначеністю.
Пол Стансіфер

16

Які обмеження в загальному функціональному програмуванні? Він не є повним Тьюрінгом, але все ще підтримує велику підмножину можливих програм. Чи існують важливі конструкції, які ви могли б написати мовою, що повністю завершує Тьюрінга, але не цілком функціональною мовою?

Якщо припустити , що функціональна мова дозволяє кодувати арифметичні операції, є одна програма , яку ви можете розраховувати на що не представимо , якщо це загальне , а саме: інтерпретатор , написаний в .L LLLL

  1. Доказом цього факту є по суті теорема про незавершеність Геделя, що розглядається через об'єктив листування Кері-Говарда. Нагадаємо, що доказ послідовності - це доказ того, що помилка не може бути виведена. В логічній системі. Оскільки CH каже, що докази - це програми, то підтвердження послідовності - це доказ того, що немає закритих програм порожнього типу. (Зауважте, що неприпинення дає вам простий спосіб заселення всіх типів, оскільки циклічній програмі можна надати будь-який тип, який вам подобається, оскільки він ніколи не оцінить значення.) Отже, в цілому функціональній мові, інтерпретатор для дає доказ у що кожна програма в закінчується, а значить, доводить, щоL L LLLLLє послідовним. Це якраз те, що виключає теорема Геделя, припускаючи, що ви можете робити арифметику. Тому ми знаємо, що не можемо писати самоперекладачів загальнофункціональними мовами.

  2. Зворотний бік цього, однак, полягає в тому, що обмеження на виразну силу загальних мов по суті є обмеженнями на виразну силу самої математики . Наприклад, функції, визначені в Coq (кореспондент із доказування), - це ті, які можна довести, що можна обчислити за допомогою ZFC, із значною кількістю недоступних кардиналів. Тому по суті визначається будь-яка функція, яку ви могли б довести до задоволення працюючого математика.

  3. Перевернутий бік зворотного боку полягає в тому, що математика важка! Тож немає легкого сенсу, в якому загальні мови "повністю проаналізовані" - навіть якщо ви знаєте, що функція припиняється, вам, можливо, доведеться зробити багато творчих робіт, щоб довести, що вона має властивість, яку ви хочете. Наприклад, лише знаючи, що функція від списків до списків є тотальною, не дає вам дуже далеко довести, що це функція сортування ....


Дякую за вашу відповідь. Я прочитав пост про цю проблему в веб- журналі « Lambda the Ultimate» , але деякі люди в коментарях зазначають, що, хоча неможливо мати власного оцінювача як звичайний явно сконструйований термін, можна було б створити робочу самодію, оцінювач з деякими хитрощами. Тож мені цікаво, чи існують проблеми, які неможливо вирішити (або наблизити) цілком функціональною мовою за допомогою деяких хитрощів обходу?
Matthijs Steen

Я б сказав, що самооцінка не вважається проблемою, оскільки вона змінюється залежно від мови. Проблема "оцінити програму мовою X" - це та сама проблема, незалежно від того, намагаєтесь ви її вирішити мовою X чи Y. Зокрема, якщо мова X є загальною функціональною мовою, проблема вирішується деякою загальною функціональною мовою , використовуючи той самий нерозумний трюк, який я використовував раніше.
Пол Стансіфер

Ніл, здається, що це має бути значно простіше, ніж це довести, що загальна мова не може підтримувати власного перекладача. Я вас нерозумію? За допомогою простої діагоналізації будь-яка мова з функцією без фіксованих точок не може підтримувати власного інтерпретатора (підтримує він арифметику чи ні). Аргумент розроблений Конором
Том Елліс

@TomEllis: Мій аргумент по суті такий же, як аргумент Конора. Насправді його посада вже робить це спостереження (з характерною кмітливістю Конора), коли він називає це «аргументом Епіменіда / Кантора / Рассела / Квіне / Годеля / Тьюрінга».
Ніл Крішнасвамі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.