Чи будь-які мови програмування використовують основні рекурсивні функції як основу?


23

Це наївне і, отже, можливо неправильне запитання, тому заздалегідь вибачтесь!

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

Нещодавно я дізнався, що теза Церкви Тьюрінга також показує взаємну еквівалентність з третьою моделлю обчислення: загальними рекурсивними функціями . Чи є якісь мови програмування, які використовують це як свою модель обчислення? Якщо ні, чи є технічна причина, чому; тобто, окрім "Ще ніхто не пробував"?


1
Я б сказав, що машини Тьюрінга або універсальні регістрові машини є основою процесорних PL (складальних PL). Вони не мають функцій. -рекурсивні функції є основою імперативних ПЛ. Вони не мають функцій вищого порядку. μ
beroal

1
Я також рекомендую вивчити логіку першого порядку та Prolog.
beroal

1
До початку C ++ 11 constexprви могли (/ мусили) використовувати "шаблони", щоб компілятори виконували під час компіляції час. Обмеження щодо шаблонів не дозволяють циклічно, але ви можете використовувати рекурсію для емуляції будь-якого циклу, щоб у кінцевому підсумку вийти з Turing-Complete (метапрограмування) об'єктом як частини мовного стандарту C ++, див., Наприклад, stackoverflow.com/questions / 189172 / c-шаблони-turing-complete
JimmyB

Відповіді:


45

Пряма відповідь на питання: так, існують езотеричні та вкрай непрактичні ПЛ, засновані на -рекурсивних функціях (думаю, Whitespace), але жодна практична мова програмування не ґрунтується на μ -рекурсивних функціях з поважних причин.μμ

Загальні рекурсивні (тобто -рекурсивні) функції значно менш виразні, ніж лямбда-обчислення. Таким чином, вони створюють погану основу для мов програмування. Ви також не впевнені, що ТМ є основою імперативних ПЛ: насправді хороші імперативні мови програмування набагато ближче до λ- розрахунку, ніж вони до машин Тьюрінга.μλ

З точки зору обчислюваності, -рекурсивні функції, машина Тьюрінга і нетипізований λ -рахунок є рівнозначними. Однак нетипізований ЖК має хороші властивості, яких не має жоден з двох інших. Він дуже простий (лише 3 синтаксичні форми і 2 обчислювальні правила), є високо композиційним і може виражати конструктивні програми досить легко. Більше того, оснащена системою простого типу (наприклад, System F ωμλFω розширена з ), λ -рахунок може бути надзвичайно виразним тим, що він може легко, правильно та композиційно виражати багато складних програм програмування. Ви також можете продовжити λfixλλ-розрахунок легко включати конструкції, які не є лямбдами. Жодна з інших обчислювальних моделей, згаданих вище, не надає цих приємних властивостей.

Машина Тьюрінга не є ні композиційною, ні універсальною (для кожної проблеми потрібно мати ТМ). Немає понять "функції", "змінні" або "склад". Також не зовсім вірно, що ТМ є основою імперативних ПЛ - FWIW, імперативні ПЛ набагато, набагато ближче до лямбда-обчислень з операторами управління, ніж до машин Тьюрінга. Докладне пояснення дивіться у "Переписці між ALGOL 60 та лямбда-нотацією Церкви" Пітера Дж. Ландіна . Якщо ви запрограмували в Brainf ** k (який фактично реалізує досить просту машину Тьюрінга), ви знатимете, що машини Тьюрінга не є хорошою ідеєю для програмування.

-рекурсивні функції в цьому відношенні схожі на ТМ. Вони композиційні, але майже не такі композиційні, як ЖК. Ви також просто не можете кодувати корисні програми програмування вμ -рекурсивних функціях. Більше того, μ- рекурсивні функції обчислюють лише N , а для обчислення будь-чого іншого вам потрібно буде кодувати свої дані в натуральні числа, використовуючи якусь нумерацію Геделя, що болісно.μμN

Отже, не випадково більшість мов програмування якимось чином базується на обчисленні! Λ -ісчісленіе володіє хорошими властивостями: виразність, композиційних і розширюваність, що інші системи НЕ хапають. Однак машини Тьюрінга хороші для вивчення обчислювальної складності таλλ -рекурсивні функції хороші для вивчення логічного поняття обчислюваності. Вони обидва мають видатні властивості,яких не вистачає λ -калькулюванню, але в області програмування λ -калькулюс явно перемагає.μλλ

Насправді існує багато-багато інших повних систем Тьюрінга, але їм не вистачає жодної видатної властивості. Гра життя, Конвея, макроси LaTeX і навіть (деякі заявляють) ДНК - це Тюрінг завершений, але жодна програма (тобто серйозне програмування) з Конвеєм не вивчає складності обчислень, використовуючи макроси LaTeX. У них просто відсутні хороші властивості. Що стосується завершення , то майже безглуздо, що стосується програмування.

Крім того, багато нетурбінних повних обчислювальних систем дуже корисні, коли справа стосується програмування. Регулярні вирази та yacc не є Тюрінгом завершеними, але вони надзвичайно потужні у вирішенні певного класу завдань. Кок також не є Тюрінгом повним, але він неймовірно потужний (він насправді вважається набагато виразнішим, ніж його повний двоюрідний брат Тюрінга, OCaml). Що стосується програмування, повнота Тьюрінга не є ключовим, оскільки багато (близькі до) непотрібних систем нецікаво завершують Тьюрінга. Ви не збираєтесь стверджувати, що Brainf ** k або Whitespace є більш потужними мовами програмування, ніж Coq, чи не так? Виразна основою є ключем до потужних мов програмування, і саме тому сучасні мови програмування майже завжди засновані на λ-розрахунок.


7
"Ніхто не програмує з Конвеєм" ... дехто
будує

Один із способів переконатися в тому, що функція розрахунку, яка імітує машини Тьюрінга, ймовірно, буде набагато коротшою, ніж машина Тьюрінга, що імітує λ -рахунок (не те, що я бачив). λλ
Безконтекстний правопис

@AlexeiLevenkov Це абсолютно неправда. Пробіл по суті - це (проста) імперативна мова, хоча і з дивним синтаксисом. Він має засоби для арифметики, базового керування потоком, маніпулювання штабелем та купами та вводу / виводу . Проект QFT, з іншого боку, вимагав спроектувати компілятор від дуже простої мови аж до складання RISC, створеного для процесора, побудованого в стільниковому автоматі, подібному Wireworld, емульованому за допомогою OTCA Metapixels .
Безконтекстний правопис

@AlexeiLevenkov Кінцевий компілятор Cogol → CGoL вимагав роботи багатьох людей протягом чотирьох років, тоді як існує проект під назвою HaPyLi , який склав набагато складнішу мову для Whitespace, написану однією людиною у вільний час.
Безконтекстний правопис

4

Введення тексту µ-recursive function programming languageв Google привело мене до цього репортажу GitHub , тому відповідь на ваше запитання:

Так, і це називається короткозорість

Це написано в Haskell, до речі.


μ

2
Звичайно. Я просто припустив, що ОП хоче знайти таку мову, щоб вивчити теорію чи щось таке, а не насправді завойовувати світ ;-)
Kapol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.