Методи доказування, що показують, що перевірка залежного типу вирішується


10

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

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

Зокрема, я зациклювався на наступному:

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

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


7
Звичайні двонаправлені алгоритми перевірки типу ніколи не намагаються нормалізувати термін (або тип), не попередньо перевіряючи, чи він добре введений (або добре сформований). Вам не потрібно турбуватися про нормалізацію нетипізованих термінів.
Андрій Бауер

7
Щодо застосування правил: усі правила терміна та типу знижують мету, крім перетворення типів. Таким чином, нам потрібно контролювати перетворення типів, що ми робимо, використовуючи двонаправлений підхід.
Андрій Бауер

Відповіді:


9

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

DΓt:ADΓA:ssutBΔDΔu:B

Цей приємний факт дещо важко довести і компенсувати досить неприємним протилежним фактом:

Факт 2: Загалом, і не є підпохідними !DD DD

Це трохи залежить від точного формулювання системи вашого типу, але більшість "оперативних" систем, реалізованих на практиці, задовольняють Факт 2.

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

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

Однак у випадку умовиводу типу можна одночасно надати алгоритм виводу типу і сортування (тип типу) шляхом індукції на структуру терміна, який може включати алгоритм, керований типом, як пропонує Андрій. Для даного терміна (і контексту ви або не вдається, або знайдете таким, що і . Для пошуку останнього не потрібно використовувати індуктивну гіпотезу виведення, і, зокрема, ви уникаєте проблеми, поясненої вище.tΓA,sΓt:AΓA:s

Найважливіший випадок (і єдиний випадок, який дійсно вимагає конверсії) - це застосування:

infer(t u):
   type_t, sort_t <- infer(t)
   type_t' <- normalize(type_t)
   type_u, sort_u <- infer(u)
   type_u' <- normalize(type_u)
   if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
      return B, sort_t (or the appropriate sort)
   else fail

Кожен заклик до нормалізації робився на чітко набраних умовах, оскільки це є інваріантом inferуспіху Росії.


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

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


Я вважав вашу відповідь дуже корисною, дякую. У мене є два питання: 1. Що означає "операційні системи"? Яка альтернатива? 2. Чи можете ви бути більш чіткими на прикладі: що це означає (який факт ми намагаємось довести?) "Системи з типовим перетворенням еквівалентні тим, що мають нетипізовані перетворення." Дякую!
Łukasz Lew

1
@ ŁukaszLew Альтернативою операційній системі (яка реалізована на практиці, наприклад, програмне забезпечення Coq або Agda) була б теоретична система, яка корисна для доказу метатеоретичних властивостей, але неефективна або незручна для використання на практиці. Доведення еквівалентності операційної та теоретичної системи часто є важливою частиною проекту системи. Я говорю більше про це тут: cstheory.stackexchange.com/a/41457/3984
cody

Я думаю, що варто згадати простіше, легше Леннарта Авгуссона ! . Це мінімальна реалізація перевірки типу Haskell і деякий висновок для обчислення залежно від лямбда. Існує код, який близько відповідає коді infer(t u):; щоб знайти його, шукайте " tCheck r (App f a) =". Для більш повної, але все ж простої реалізації ви можете перевірити Morte'stypeWith .
Łukasz Lew

1
@ ŁukaszLew Проблема перетворення типізованих проти нетипізованих типів є добре відомим відкритим питанням, яке стосується 2 рецептур теорій типів, і було вирішено досить недавно: pauillac.inria.fr/~herbelin/articles/…
cody

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