З огляду на те, що листування Кері-Говарда настільки широко розповсюджене / розширене, чи є різниця між доказами та програмами (або між пропозиціями та типами)? Чи можемо ми реально їх ідентифікувати?
З огляду на те, що листування Кері-Говарда настільки широко розповсюджене / розширене, чи є різниця між доказами та програмами (або між пропозиціями та типами)? Чи можемо ми реально їх ідентифікувати?
Відповіді:
Мови програмування, якими користуються люди щодня, не так добре вписуються у листування Кері-Говарда, оскільки їхні типові системи занадто слабкі. Щоб сказати щось цікаве, використовуючи Curry-Howard для імперативних програм, потрібно мати більш складну систему типів. Книга Адаптація доказів як програм підштовхує цей кут з метою синтезу імперативних програм. Коли залежні типи стають все більш популярними, безумовно, у дослідницьких функціональних мовах ( Agda , Epigram ), розмежування стає розмитим. Звичайно, ви можете зробити синтез / вилучення програми в рамках теореми Кока (і, мабуть, інших), яка, звичайно, заснована на Керрі-Говарда.
Переписка Кері-Говарда також може використовуватися в ситуаціях, коли докази не так чітко відповідають програмам (або вони не є програмами, які ніхто ніколи не запускатиме). Одним із прикладів цього є авторизація перевірки . Пропозиції відповідають заявам про те, хто має право робити що. Докази забезпечують необхідні докази наявності пропозиції, тому запит на авторизацію дозволений. Для кодування доказів вводяться умови доказування (через Curry-Howard). Умови доказування надсилаються між сторонами як представлення доказів дійсності запитів на авторизацію, але вони не вважаються програмами.
У Coq є 2 типи (Prop і Set), вони використовуються програмістом для розділення того, що є доказом, який не видасть фактичний код, і тієї частини доказу, яка буде використана для вилучення запущеного коду (вашої програми).
Це приємне рішення проблеми, про яку ви ставите, як визначити, що означає генерувати машинний код (програму) і що існує для завершення підтвердження пропозиції (або типу).
AFAIK не існує автоматичного способу розрізнити обидва. Це може бути щось цікаве для дослідження? А може хтось може вказати, що це явно неможливо?
Залежно від типів не тільки не існує чіткого розрізнення між доказами та програмами, але також немає відмінності між програмами та типами! Єдине відмінність полягатиме в тому, де відображається тип (або програма), що робить його частиною місця "програми" або "типу" даного терміна.
Приклад дозволить зрозуміти, що я сподіваюся:
Коли ви використовуєте функцію ідентичності з залежними типами, вам потрібно передати тип, з яким ви збираєтеся використовувати цю функцію! Тип використовується як значення у вашій "програмі"!
Нетипічне обчислення лямбда:
id =
Залежно від типів:
id: (A: Встановити) -> A -> A
ID =
Якщо ви використовуєте цю функцію, ви зробите це так, як на цьому прикладі:
id Naturals 1
Зауважте, що "тип" (у цьому випадку Набір природних), який передається як значення, викидається, тому він ніколи не буде обчислюватися, але все-таки він знаходиться в "програмній" частині терміна. Ось що також буде з деталями "доказування", вони повинні бути там, щоб термін перевірити тип, але під час обчислень вони будуть викинуті.
Я вийду на кінцівку тут і скажу, що, якщо ви готові трохи примружити, докази і припинення програми можна визначити.
Будь-яка програма, що закінчується, - це доказ того, що ви можете взяти її внесок і отримати його вихід. Це дуже основний вид доказів наслідків.
Зрозуміло, щоб зробити цей підхід нести інформацію більш значущою, ніж констатувати очевидну, вам потрібно вміти показати, що програма працює для будь-яких та всіх примірників, введених із форми, класу з логічним значенням. (І так само для виходу.)
З іншого боку, будь-який доказ з кінцевими кроками висновку - це символічна програма, що маніпулює об'єктами в певній логічній системі. (Якщо ми не надто переживаємо про те, що обчислювально означають логічні символи та правила.)
з явними умовами істинності. Будь-яке судження може бути перетворене на тип його доказів.
Це досить спрощено, але я думаю, що це говорить про надійність ідеї. (Навіть якщо деяким людям це не подобається. ;-))
Підтвердження недоречності?
Коли ви пишете якусь програму, вас цікавить її продуктивність, споживання пам’яті тощо.
Наприклад, краще використовувати якийсь розумний алгоритм сортування замість сортування бульбашок, навіть якщо їх реалізація має однакові типи (навіть у залежному від налаштування типу).
Але коли ти доводиш якусь теорему, це цікавить лише існування доказу.
Звичайно, з естетичної точки зору деякі докази більш прості / красиві / надихаючі / тощо (наприклад, докази з Книги).
Якщо ви приймаєте листування Кері-Говарда, то питання в основному є філософським. "Чи відрізняються докази та програми? Звичайно. Як? Ну, ми називаємо докази" доказами ", а програми називаємо" програмами "."
Або кажучи менш легковажно, якщо між доказами та програмами існує ізоморфізм - який, здається, явно є, - тоді ви ставите питанням, чи існує якийсь оракул, здатний розрізнити їх два. Люди класифікують їх як різні (здебільшого), тому, безумовно, можна стверджувати, що такий оракул існує. Тоді важливим питанням стає чи є якась змістовна різниця між ними, що підлягає філософській дискусії. Що таке "доказ"? Не існує формального визначення того, що є доказом; це термін мистецтва, подібно до поняття "ефективного обчислення" в тезі Церкви – Тьюрінга. З цього приводу "програма" також не має формального визначення.
Це слова природної мови, які використовуються для категоризації різних областей математичного дослідження. Що зауважили Керрі і Говард, це те, що ці дві різні галузі насправді вивчають одне і те ж. Помітити цей зв'язок важливо, оскільки воно говорить про те, що ці різні дослідники повинні спілкуватися один з одним. Але на іншому рівні помітити зв’язок - це повірити в різницю між ними. Під час вирішення проблеми іноді вигідніше сприймати це як проблему програмування, тоді як в інших випадках вигідніше розглядати це як логічну проблему. Ця різниця в перспективі є, я думаю, важливою різницею між ними. Але чи різниця в точці зору є різницею ідентичності - це глибоке філософське питання, яке досліджувалося принаймні так само, як і у ФрегеUeber Sinn und Bedeutung .