Чи є мінімальні критерії для мови програмування завершеною?


55

Чи існує набір мов програмування на мові програмування для того, щоб він вважався Тюрінг завершеним?

З того, що я можу сказати з вікіпедії , мова повинна підтримувати рекурсію, або, здавалося б, повинна бути здатна працювати без зупинки. Це все є для цього?


6
Можливо, у вашому запитанні слід задати "Чи існує мінімальний набір конструкторських програм ...?", Оскільки, як це висловлено, відповідь "Усі обчислювані".
Дейв Кларк


@DaveClarke, дякую, я оновив це. Я вважаю, що ваш коментар задає питання дещо, хоча я припускаю, що це моя мова погана. Я мав намір запитати, чи існує чи не кілька операцій, що якщо мова може обчислити, це було б рівнозначним.
Ханзор

Відповіді:


45

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

  1. Постійна функція0
  2. Функція правонаступника
  3. Вибір параметрів
  4. Функціональний склад
  5. Первісна рекурсія
  6. μx

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

Ви можете перекласти ці буквально в основні синтаксичні елементи для програм WHILE , а саме

  1. Постійна 0
  2. Приріст _ + 1
  3. Змінений доступ x
  4. Зв'язування програми / заяви _; _
  5. Петлі зворотного відліку for ( x to 0 ) do _ end
  6. Поки петлі while ( x != 0 ) do _ end

1
Я думаю, що очевидно, що ви не можете скинути 5 правило в мові. Оскільки whileцикл у 6 порівнюється з постійним нулем, змінні можна збільшувати лише за правилом 2 і немає негативних констант для початку (правило 1), whileцикл у 6 або не вводиться (x = 0), або нескінченний ( x> 0, і тіло циклу не може зменшити його).
MSalters

1
@MSalters Я думаю, ти маєш рацію; для моделювання, яке я, мабуть, мав на увазі, нам потрібен, _ - 1і я не можу придумати спосіб, як це здійснити for. Дякуємо, що це зробили! (Що "краще" - у тому числі _ - 1чи for? Хм.)
Рафаель

20

Чи існує набір обчислень, які потрібно виконати в мові програмування, щоб це можна було вважати Тюрінг завершеним?

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

З того, що я можу сказати з вікіпедії, мова повинна підтримувати рекурсію, або, здавалося б, повинна бути здатна працювати без зупинки. Це все є для цього?

Ні. Наприклад, мова, де єдиною дозволеною операцією є рекурсія (тобто єдина можлива функція, яку ви можете записати f(x) = f(x), не є Turing завершеною, тому що все, що ви можете написати в ній, це програми, які ніколи не припиняються. Як я вже говорив раніше, повна мова Тьюрінга потрібно мати можливість здійснювати будь-які обчислення, які можуть виконувати машини Тьюрінга.

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


Що стосується того, чи існує мінімальний набір необхідних і достатніх операцій, такий, що будь-яка мова, що підтримує ці операції, є Turing завершеним, а будь-яка мова, яка ні - ні. Ні, немає (якщо ви не чітко визначите "операцію") , що стає безглуздим):

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


Єдине, в чому я не впевнений, це ваша відповідь на мінімальний набір необхідних операцій. Ви, здається, обмежуєте своє визначення операцій контрольними структурами, що здається набагато вужчим, ніж запитується, і поза вашою власною вимогою не визначати їх "настільки розпливчасто, що [вони] стають безглуздими".
Джошуа Дрейк

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

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

@JoshuaDrake Я не думаю, що використання "стрибка" замість goto приводить нас до того, що ми можемо визначити достатній і необхідний набір операцій. Напевно, правда, що для кожної мови знадобиться якась операція стрибка (і якщо це лише виклики функції), але я не думаю, що ви зможете придумати подальші операції, щоб зробити її достатньою. Наприклад, обчислення лямбда має дві операції: застосування (тобто наша стрибкова операція) та абстракція (тобто створення функцій) ...
sepp2k

1
@JoshuaDrake Я не думаю, що стаття намагається стверджувати, що для будь-якої мови Тюрінга потрібні ці операції. Тим більше, що він конкретно обмежує цю заяву процедурними мовами. За винятком форми goto (тобто застосування функцій), у Lambda Calculus немає жодної з цих речей. Я думаю, що "мінімум" тут означає лише те, що мовою, яка має лише ті особливості, ви не можете видалити жодну з них, не втрачаючи повноти Тьюрінга. Мало того, що немає іншого мінімального набору операцій, який також достатній для повноти Тьюрінга.
sepp2k

14

Існують різні одиничні інструкції, які ведуть до повної мови Тюрінга. Типовим прикладом є "віднімання і розгалуження, якщо нуль". Вони добре відомі в контексті програмування мови складання. Детальніше дивіться у статті Вікіпедії .

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


13

Це не загальна відповідь на ваше запитання, але за допомогою структурованої теореми програмування все, що потрібно, - це можливість робити вибір (наприклад, ifв C / C ++) та повторення (наприклад, whileв C / C ++). Правка: як вказував Дейв Кларк у коментарях, структурована теорема програмування також вимагає послідовності. Я спочатку не перераховував це, оскільки читач сприйняв, що основні блоки інших вказівок, наприклад, ті, на які пізніше натякали на читання та запис у сховище пам'яті тощо, також були необхідні). Звичайно, краще бути явним; вам потрібно вміти робити і ці речі.

Оскільки і те, і інше можна реалізувати, використовуючи умовну інструкцію стрибка (наприклад, JNZу x86), цього також достатньо для Тьюрінга-еквівалентності.

Зауважте, що потрібні інші речі, тобто можливість запису необмеженої кількості символів (наприклад, бітів ... 0 або 1) до якогось сховища зовнішньої пам'яті. У цьому сенсі справжні комп’ютери не є еквівалентом Тюрінга, оскільки жоден з них не має нескінченного обсягу пам’яті. Модель Тьюрінга все ще корисна, оскільки об'єм пам'яті, як правило, величезний, і хоча будь-яка проблема, яку може вирішити справжній комп'ютер, може бути вирішена детермінованим кінцевим автоматом, використовуючи цю модель обчислення не особливо корисно (оскільки кількість штатів буде надзвичайно величезною).

Зауважте, що це не обов'язково суперечить відповіді sepp2k; це свого роду просто інший спосіб думати про те саме питання.

Редагувати:

Зауважте також, що вам ifі whileв C / C ++ не потрібно. Ви можете імітувати, ifвикористовуючи whileнаступне:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

Наступний код завжди еквівалентний:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

Ну ... будівництво має працювати і бути можливим, якщо ви обережні, тобто. Зауважте також, що якщо у вас є рекурсивні функції, з часом вам також потрібен вибір; оскільки рекурсивні функції без вибору реально не можуть реалізувати базові випадки, тому будь-яка рекурсивна функція призведе до нескінченної рекурсії.

Редагувати:

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


13

SK(S x y z)=(x z (y z))(K x y)=x

X=λx.((x S) K)


5

Мовні конструкції взаємозамінні

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

Щоб довести це - мова, яка забезпечує лише операцію "віднімання і розгалуження, якщо нуль", закінчується Тюрінгом; існують повні мови Тюрінга, які не містять окремої конструкції "субстрат і гілка, якщо нуль", у ergo немає конструкції або набору конструкцій, які є обов'язковими.

Ефекти будь-якої конструкції мови, повної TP, можуть бути імітовані конструкціями будь-якого іншого мови, повного TP.

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