Чи можемо в System F à la Church автоматизувати умовиводи для усунення для всіх?


9

Питання наступне. Як правило, коли у вас є такий термін, як , ми можемо усунути forall, застосувавши цей термін до типу, наприклад .ΛX.t(ΛX.t)[T]t[X:=T]

Тепер, припустимо, це стрілка, і ми хочемо надати їй аргумент, тоді нам потрібно було б застосувати цей термін до належного типу, таким, щоб він міг отримати такий аргумент. Ось що я запитую, чи можу я автоматизувати: чи можна побудувати функцію з двома членами і повернути такий тип, що надає нам тип, необхідний для заміни в t таке, що t може прийняти аргумент r ?ff<ΛX.t><r>Xttr

Деякі приклади:

  • f<ΛX.λxXX.t><λxT.x>=T .

  • f<ΛX.λxX.r><(λxR.tT) s>=T


2
Ваше запитання було б трохи зрозумілішим, якщо ви не ставите аргумент на f як під / супріскрипти, кожен з яких містить інші суб / надписи.
Дейв Кларк

Для довідки: Ця проблема є однією з двох проблем, вирішених "Локальним висновком типу" ( dl.acm.org/citation.cfm?id=345100 ). Також доречним має бути dl.acm.org/citation.cfm?id=1086383 .
Blaisorblade

Відповіді:


8

Я не дуже впевнений, що зрозумів питання. По-перше, я намагаюся звести вашу проблему до наступної проблеми об’єднання:

Дано систему F типу τ (X) з вільною (type) змінною X, а тип σ.
Чи можна знайти тип γ такий, що τ (γ) = σ?

Ось псевдокод (за винятком, піднятий, коли не є уніфікованим) для вирішення цієї проблеми.

unify (X, σ) = σ
unify (Y, Y) = Y
unify (τ₁ → τ₂, σ₁ → σ₂) = unify(τ₁,σ₁) → unify(τ₂,σ₂)
unify (∀Y.τ(Y), ∀Y.σ(Y)) = ∀Y.unify(τ(Y),σ(Y)) (with Y a fresh variable)
unify (_,_) = raise Not_unifiable

Ви можете довести (за допомогою індукції), що γ = τ (уніфікувати (τ (X), σ) працює, якщо і не виключено виключення.

Тепер за вашу проблему ви можете взяти

f (ΛX.t) (r) = match type of t with "τ₁ → τ₂" => unify (τ₁, type of r) | _ => fail end

(звичайно, ваша функція f повинна брати за аргумент контекст, якщо ваші умови відкриті).

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