Чому алгоритм Гіндлі-Мілнера ніколи не видасть такий тип, як t1 -> t2?


14

Я читаю про алгоритм набору тексту Хіндлі-Мілнера під час написання програми і бачу, що доки кожна змінна буде пов'язана, ви завжди отримуватимете атомні типи або типи, де аргументи визначатимуть кінцевий тип, наприклад, t1 -> t1або (t1 -> t2) -> (t1 -> t2)де t1і t2є змінними типу.

Я не можу придумати спосіб, як ви отримаєте щось на кшталт t1 -> t2або просто t1, що, наскільки я розумію, означало б, що алгоритм порушений, оскільки не було б можливості визначити реальний тип виразу. Звідки ти знаєш, що ти ніколи не отримаєш такого типу, як ці "зламані", доки кожна змінна пов'язана?

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

(Здається, ви можете отримати ці "зламані" типи в ML , але я прошу обчислення лямбда.)

Відповіді:


16

У обчисленні лямбда без констант із системою типу Хіндлі-Мілнера ви не можете отримати таких типів, коли результатом функції є нерозв'язана змінна тип. Усі змінні типу повинні десь мати "походження". Наприклад, немає терміна типу , але є термін типуα .α,β.αβ (функція тотожності λ x . x ).α.ααλх.х

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

Тільки тому, що немає значення певного типу, не означає, що не існує терміна цього типу: може бути термін без значення, тобто термін, що не закінчується (саме кажучи, термін без нормальної форми). Причина, чому немає лямбда-терміна з такими типами, полягає в тому, що всі добре набрані терміни HM сильно нормалізуються. Це узагальнення результату, яке стверджує, що просто набране лямбдальне числення сильно нормалізується. Це наслідок того, що система F сильно нормалізується: система F схожа на HM, але дозволяє застосовувати квантори кількості типів скрізь у типах, а не лише на верхньому рівні. Наприклад, у системі F має тип ( α . α ) ( α . α ) - але ΔΔ=λх.хх(α.α)(α.α) неправильно набраний.ΔΔ

HM і System F - приклади систем типів, які мають відповідність Curry-Howard : добре набрані терміни відповідають доказів у певній логіці, а типи відповідають формулі. Якщо типова система відповідає послідовній теорії, то ця теорія не дозволяє доводити такі теореми, як ; тому немає терміна відповідного типу α , β .А,Б,АБα,β.αβ

Цей результат розбивається, як тільки ви додаєте певні константи до обчислення. Наприклад, якщо ви дозволите загальний комбінатор точок фіксації, такий як , можна побудувати умови довільного типу: Y ( λ x . X ) має тип YY(λx.x)α.αA,B,AB

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

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


"Це наслідок того, що Система F сильно нормалізується". Як можна показати, що HM сильно нормалізується - це наслідок, коли система F сильно нормалізується?
Рафаель Кастро

1
@RafaelCastro Кожен добре введений у HM термін добре набраний у Системі F. Кожен добре набраний термін у Системі F є SN. Тому кожен термін, що добре набраний у НМ, - це SN.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.