Що Ідріс не може зробити, відмовившись від повноти Тьюрінга?


35

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

Я думаю, це досить специфічне питання, але я не знаю величезної кількості про залежні типи та пов'язані системи типів.


2
Я думаю, ви шукаєте конкретний приклад? Я не знайомий з Ідрісом, але в Isabelle / HOL ви не можете писати (а точніше, компілювати) функції, які не завжди припиняються (що ще гірше, вам потрібно дати підтвердження припинення ).
Рафаель

Щось у цьому напрямку так - я не був абсолютно впевнений, чи буде щось цілком нішевий випадок, наприклад, ви не можете закодувати мову з певними властивостями в системі типів, чи буде це трохи більш загальним (наприклад, як ви сказали , всі функції повинні бути доведені до припинення)
Squidly

1
Здогадайтесь, це помилкове припущення походить від Едвіна Брейді, який каже, що Ідріс - "повний Pacman". Я думаю, що його головним моментом, кажучи "Pacman завершений" замість "Turing завершений", є те, що він хоче підкреслити важливість мов, які легко складаються людськими мізками, а не лише машинами! .. Напевно, дурні мови, як BrainFuck Тюрінг завершений, але людському мозку може знадобитися досить багато часу, щоб зрозуміти код, написаний на BrainFuck, таким чином розвиваючи і навіть важливіше підтримання , програма Pacman в BrainFuck вимагає великих зусиль ..
Michelrandahl

@Mitzh Не дуже. Я думаю, це тому, що я неправильно зрозумів щось, що чув, як він говорив у розмові.
Кальмар

Відповіді:


50

Ідріс - Тюрінг завершений! Він перевіряє сукупність (припинення при програмуванні з даними, продуктивність при програмуванні з коданими), але не вимагає, щоб все було загальним.

Цікаво, що наявності даних і кода даних досить для моделювання повноти Тьюрінга, оскільки ви можете написати монаду для часткових функцій. Я робив це років тому в Coq - це, мабуть, до цього часу пошкоджено, але ось все-таки: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

Вам потрібна одна втеча, щоб насправді запускати такі речі, але Ідріс дозволяє вам це зробити.

Idris не зменшить часткові функції на рівні типу для того, щоб перевірка типу не була вирішальною. Крім того, лише до загальних програм можна вважати доказом.


4
Сама людина. Яка продуктивність у цьому контексті?
Кальмар

5
Подвійне до припинення: хоча індуктивне визначення повинне припинятися (споживаючи всі його дані), коіндуктивне визначення повинно бути результативним - на практиці це означає, коротко кажучи, що будь-який рекурсивний виклик повинен захищати конструктор. Я вважаю, що це пояснення є найяснішим (ymmv): adam.chlipala.net/cpdt/html/Coinductive.html
Едвін Брейді

14

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

Гаразд, це було не дуже інформативно. Дозвольте навести приклад. Є одна річ, яку ви не можете зробити ні на якій неповній мові Тьюрінга: ви не можете написати тренажер машини Тьюрінга (інакше ви могли б кодувати будь-які обчислення на модельованій машині Тьюрінга).

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

Зараз існує декілька дуже різних мов неповного тюрінга, і вони відрізняються тим, що не можуть зробити. Однак існує загальна тема: Мови, які закінчують Тьюрінг, повинні містити певний спосіб умовно припинити або продовжувати час, який не обмежений розміром програми, і спосіб використовувати програму кількість пам'яті, що залежить від введення даних . Конкретніше, більшість імперативних мов програмування забезпечують ці можливості за допомогою циклів 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? (звідки ця відповідь значною мірою взята).


3
"яка корисна програма не може бути написана неповною мовою Тюрінга?" Віртуальна машина Java.
Девід Річербі

@DavidRicherby Ти не можеш? Чи справді СВМ справді повний Тьюрінг? Існує обмеження на розмір окремого об’єкта, чи можете ви домовитись про виділення та доступ до необмеженої кількості об'єктів? Наприклад, в C, здається, відповідь ні, тому що існує лише кінцево багато значень покажчика.
Жил "ТАК - перестань бути злим"

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

3
@Gilles Я вважаю, що це більш-менш рівнозначно тому, що жодна реальна мова програмування не є повною Тьюрінгом? Зрештою, будь-яка реалізація зіткнеться з тими бар'єрами, які ви згадуєте. Це здається досить великим слоном у кімнаті, розглядаючи те, що втрачає Ідріс, не будучи Тюрінгом-повним. Чи втрачає вона більше, ніж будь-яка інша мова, наприклад? Якщо ви забороняєте без обмеженого зовнішнього сховища (наприклад, програма, яка зупиняє говорити "будь-ласка, вставте наступний / попередній диск"), будь-яка мова є тривіально не завершеною Тьюрінгом, тому будь-яке запитання про цей випадок є невиправданим.
Девід Річербі

3
@DavidRicherby Мої коментарі (але не моя відповідь) знаходяться в режимі теорії мови програмування. Якщо взяти офіційну специфікацію SML (наприклад), можна спроектувати (але, звичайно, не реалізувати у фізичному світі) реалізацію мови, яка може імітувати всі обчислювані програми. У C це не так, оскільки скінченність пам'яті вбудована в мову ( sizeof(void*)). У своїй відповіді я розглядаю мови ідеалізованим способом, тому SML або C вважатимуться Тьюрінгом.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.