Зв'язок між теорією Руссельського типу та системами типів


12

Нещодавно я зрозумів, що існує якась залежність між теорією типу Руссель та типовими системами, як, наприклад, у Haskell Насправді, деякі позначення типів у Haskell, схоже, є попередниками в теорії типів. Але, IMHO, мотивація Рассела в 1908 році полягала в тому, щоб уникнути парадоксу Рассела, і я не впевнений, як це пов’язано з типами систем в інформатиці.

Чи є парадокс Рассела в тій чи іншій формі чимось, про що ми б мали турбуватися, наприклад, якби у нас не було гарної системи типу на даній мові?

Відповіді:


8

"Теорія типів" у розумінні мов програмування та в значенні Рассела тісно пов'язана. Насправді сучасне поле теорії залежних типів має на меті створити конструктивні основи математики. На відміну від теорії множин, більшість досліджень в теорії типів засновані математика проводиться в таких помічниках, як Coq, NuPRL або Agda. Як такі, докази, зроблені в цих системах, не тільки "формалізуються", але фактично є повністю формальними і перевірені машиною. Використовуючи тактику та інші методи автоматизації доказів, ми намагаємось довести це. системи "високого рівня" і, таким чином, нагадують неформальну математику, але оскільки все перевірено, ми маємо набагато кращі гарантії на правильність.

дивіться тут

Типи в звичайних мовах програмування, як правило, більш обмежені, але мета-теорія та ж.

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

Type : Type

зазвичай призводить до суперечності. Coq і подібні роботи, гніздування всесвітів

Type_0 : Type_1

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

У деяких системах (Agda, Idris) правило типу типу ввімкнено через прапор компіляції. Це робить логіку непослідовною, але часто спрощує дослідницьке програмування / доведення.

Навіть у більш основних мовах парадокс Рассела час від часу виявляється. Наприклад, в Haskell можливе кодування парадоксу Рассела, що поєднує в собі непередбачуваність і випадок відкритого типу, що дозволяє будувати розбіжні умови з рекурсією навіть на рівні типу. Haskell є `` непослідовним '' (коли його трактувати як логіку звичайним чином), оскільки він підтримує рекурсію як типу, так і значення, не кажучи вже про винятки. Тим не менш, цей результат є досить цікавим.


Дякуємо за детальну відповідь - наскільки це стосується доказів, досі не існує інструментів, щоб довести правильність програм на необхідних мовах, таких як C ++ чи Java, правда? Я хотів би покласти руки на одну з таких ... Я розумію, що це повна дотична. Я знаю про Coq та Agda, але вони, здається, не є правильним інструментом для підтвердження правильності програм, написаних на C ++ або Java.
Френк

3
є деякі інструменти. Кілька для C, багато для Java, і тонни для Ada. Див. Наприклад: Чому (Java, C, Ada), Кракатоа (Java) або SPARK (підмножина Ада з дуже хорошим інструментом). Хоча для C ++, не так вже й багато. Вас також може зацікавити YNot (Coq DSL).
Philip JF

3

Ви маєте рацію щодо мотивації Рассела. Його парадокс зачіпає всі теорії множин, які допускають необмежену аксіому розуміння, що: будь-яка пропозиційна функція визначає множину, а саме цю, що відповідає усім сутностям, які задовольняють функцію. Серед теорій чи на основі множин, які мали цю ваду, були теорія наївних множин Кантора та система Фреге Грюндгезеце (конкретно: аксіома 5).

Оскільки типи вважаються спеціальними типами наборів, якщо не дотримуватися обережності, подібний парадокс може переповзти в типову систему. Сказати, я не знаю жодної системи типів, яка спіткала таку долю. Я можу лише згадати перші спроби Церкви сформулювати обчислення лямбда в 30-х роках, які виявилися непослідовними (парадокс Клейна-Россера), але це не було пов'язано ні з типом, ні з парадоксом Рассела.

Оновлення : див. Відповідь Філіпа для фактичної відповіді на ваше запитання.


1
Дякую за вашу відповідь. Можливо, є альтернативи типам а-ля-Рассел, щоб уникнути парадоксальності Рассела. Чи зможе будь-яке з цих альтернативних рішень зробити щось цікавим, щоб внести свій внесок у комп'ютерні мови? Мінданські типи дуже корисні, щоб чітко вказати контракти між частинами коду і навіть перед цим, щоб взагалі надати семантику програмам. Чи були б інші семантики, які можна було б отримати з чимось іншим, ніж типи? (Я поняття не маю, що це буде :-)
Френк

1
Так, багато альтернатив (NF, Quine, NFC тощо), але я не бачу прямих зв’язків між основоположними кризами та мовами програмування. Якщо ви розглядаєте теорію типу Мартіна Лофа як мову програмування, можливо, там буде якийсь зв’язок, що повертається до інтуїціонізму. Що стосується семантики мов програмування, то існують деякі основні мови, такі як PDL (Пропозиційна динамічна логіка), які мають крипке (або можливі світи) семантикою. Але типи мені здаються такими принциповими, що вони можуть бути просто за кадром :)
Хунан Ростомян

1
Але типи - це обриви: ви хочете і потрібні, але вам би не хотілося їх вказувати (отже, ІМХО, чому у нас є системи виводу типу таких мов, як Haskell або Ocaml (я люблю ці мови)). На іншому кінці спектру Python відчуває себе дуже інтуїтивно, і приємно (і ефективно з точки зору часу кодування) не потрібно занадто переживати про типи цієї мови. Можливо, типний висновок найкращий для обох країн - але це говорить інженер. Мені просто мріяло, що математика може внести ще одну важливу концепцію (як типи) в інформатику :-)
Френк

1
@Frank Кожен раз, коли я використовую мову без статичних типів (в основному Ruby), я ненавиджу цей досвід, тому що я ненавиджу помилки виконання, які можна уникнути. Отже, це, здається, є справою смаку. Я погоджуюся, що потужний висновок типу може дати вам найкраще з обох світів. Що, певно, чому мені так подобається Скала.
Рафаель

Я не переконаний, що відсутність типів "автоматично" призводить до помилок виконання, як ви, мабуть, маєте на увазі :-) У Python у мене ніколи не було проблем.
Френк

3

Оскільки ви згадуєте про Python, питання не є чисто типовим теоретичним. Тому я намагаюся дати ширший погляд на типи. Типи - це різні речі для різних людей. Я зібрав щонайменше 5 різних (але пов'язаних) понять типів:

  1. Системи типів - це логічні системи та теорії множин.

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

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

  4. Абстрактні типи даних дозволяють абстрагувати дані мовами високого рівня. ADT часто реалізуються як модулі: інтерфейс модуля оголошує процедури, що відповідають операціям ADT. Ця стратегія приховування інформації дозволяє змінювати реалізацію модуля без порушення клієнтських програм.

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

Цитати з Вікіпедії, але я можу надати кращі посилання, якщо виникне потреба.

Типи-1 виникли від роботи Русселя, але сьогодні вони не просто захищають від парадоксів: набрана мова теорії типу гомотопії - це новий спосіб кодування математики формальною, зрозумілою машиною мовою, і новий спосіб зрозуміти людині основи математики. ("Старий" спосіб кодування за допомогою теорії аксіоматичних множин).

Типи 2-5 виникли в програмуванні з кількох різних потреб: щоб уникнути помилок, класифікувати розробників програмного забезпечення даних та програмістів, розробляти великі системи та ефективно впроваджувати мови програмування відповідно.

Системи типу в C / C ++, Ada, Java, Python не виникли внаслідок роботи Русселя чи бажання уникати помилок. Вони виникли через необхідність описувати різні типи даних там (наприклад, "прізвище - це символьний рядок, а не число"), модулювати дизайн програмного забезпечення та оптимально вибирати представлення низьких рівнів для даних. Ці мови не мають типів-1 або типів-2. Java забезпечує відносну безпеку від помилок не за допомогою доведення коректності програми за допомогою системи типу, а ретельним дизайном мови (відсутність арифметики вказівника) та системи виконання (віртуальна машина, перевірка байт-коду). Система типів у Java не є ні логічною системою, ні теорією множин.

Однак система типу в мові програмування Agda - це сучасний варіант системи типу Русселя (заснований на пізніших роботах або Пер Мартін-Лоф та інші математики). Система типів в Agda призначена для вираження математичних властивостей програми та доказів цих властивостей, це логічна система та теорія множин.

Тут немає чорно-білих відмінностей: багато мов вписуються між собою. Наприклад, типова система мови Haskell має коріння у роботі Русселя, її можна розглядати як спрощену систему Агда, але з математичної точки зору вона є непослідовною (суперечливою), якщо розглядати її як логічну систему або теорію множин.

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

Типова система Scala ще більше віддаляється від праці Русселя та досконалої мови підтвердження Агди, але все ще має коріння в роботі Русселя.

Щодо доведення властивостей промислових мов, системи типів яких не були розроблені для цього, існує багато підходів та систем.

Про цікаві, але різні підходи див. Дослідницький проект Coq та Microsoft Boogie. Coq покладається на теорію типів для створення імперативних програм із програм Coq. Бугі покладається на анотацію імперативних програм із властивостями та доводить ці властивості за допомогою теореми Z3, використовуючи абсолютно інший підхід, ніж Coq.

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