По-перше, я припускаю, що ви вже чули про тезу Церкви Тьюрінга , в якій говориться, що все, що ми називаємо «обчисленням», - це те, що можна зробити за допомогою машини Тьюрінга (або будь-якої з багатьох інших еквівалентних моделей). Таким чином, повна мова Тьюрінга - це мова, в якій можна виразити будь-які обчислення. І навпаки, мова неповноти Тьюрінга - це мова, в якій є деякі обчислення, які неможливо виразити.
Гаразд, це було не дуже інформативно. Дозвольте навести приклад. Є одна річ, яку ви не можете зробити ні на якій неповній мові Тьюрінга: ви не можете написати тренажер машини Тьюрінга (інакше ви могли б кодувати будь-які обчислення на модельованій машині Тьюрінга).
Гаразд, що все ще було не дуже інформативно. справжнє питання полягає в тому, яка корисна програма не може бути написана неповноцінною мовою Тьюрінга? Ну, ніхто не придумав визначення "корисної програми", що включає всі програми, які хтось десь написав для корисної мети, і це не включає всі обчислення машин Тьюрінга. Тому проектування неповної мови Тьюрінга, на якій можна писати всі корисні програми, все ще є дуже довготерміновою метою дослідження.
Зараз існує декілька дуже різних мов неповного тюрінга, і вони відрізняються тим, що не можуть зробити. Однак існує загальна тема: Мови, які закінчують Тьюрінг, повинні містити певний спосіб умовно припинити або продовжувати час, який не обмежений розміром програми, і спосіб використовувати програму кількість пам'яті, що залежить від введення даних . Конкретніше, більшість імперативних мов програмування забезпечують ці можливості за допомогою циклів while і динамічного розподілу пам'яті відповідно. Більшість функціональних мов програмування забезпечують ці можливості завдяки рекурсії та введенню структури даних.
Ідріс сильно натхненний Агдою . Агда - мова, призначена для доведення теорем . Зараз доведення теорем та запущених програм дуже тісно пов'язані , тож ви можете писати програми в Агді так само, як доводити теорему. Інтуїтивно, доказ теореми «A означає B» - це функція, яка приймає доказ теореми A як аргумент і повертає доказ теореми B.
Оскільки метою системи є доведення теорем, ви не можете дозволити програмісту писати довільні функції. Уявіть, що мова дозволила вам написати дурну-рекурсивну функцію, яка щойно називала себе:
oops : A -> B
oops x = oops x
Ви не можете дозволити існуванню такої функції переконати вас, що A має на увазі B, інакше ви зможете довести що-небудь, а не лише справжні теореми! Так Агда (і подібні докази теореми) забороняють довільну рекурсію. Коли ви пишете рекурсивну функцію, ви повинні довести, що вона завжди припиняється , так що коли ви запустите її на доказ теореми А, ви знаєте, що вона побудує доказ теореми B.
Безпосереднім практичним обмеженням Agda є те, що ви не можете записувати довільні рекурсивні функції. Оскільки система повинна бути в змозі відхиляти всі незакінчені функції, невизначуваність проблеми зупинки (або загалом теорему Райса ) забезпечує наявність функцій завершення, які також відкидаються. Додаткова практична складність полягає в тому, що вам потрібно допомогти системі довести, що ваша функція припиняється.
Проводиться багато досліджень щодо того, щоб зробити доказові системи більш схожими на мову програмування, не порушуючи їх гарантії, що якщо у вас функція від A до B, це так само добре, як математичний доказ, що A передбачає B. Розширення системи на прийняття більше припинення функцій - одна з тем дослідження. Інші напрямки розширення включають подолання таких проблем у реальному світі, як введення / виведення та одночасність. Інша проблема полягає в тому, щоб зробити ці системи доступними для простих смертних (або, можливо, переконати простих смертних у тому, що вони насправді доступні).
Я не знайомий з Ідрісом. Це питання, про яке я згадав. Наскільки я розумію з побіжного погляду на переддрук 2013 року , Ідріс є повним Тьюрінгом, але включає перевірку сукупності. Перевірка сукупності перевіряє, що кожна функція, позначена ключовим словом, total
закінчується. Мовний фрагмент, що містить лише програми Idris, де кожна функція є тотальною, виразною силою схожа на Arda (напевно, не точна відповідність через відмінності в теорії типів, але достатньо близька, що ви б не помітили, якщо б навмисно не намагалися).
Щодо інших прикладів мов, які по-різному не закінчують Тьюрінга, див. Які практичні обмеження такої неповної мови, як Coq? (звідки ця відповідь значною мірою взята).