В Системе F à la Church, можем ли мы автоматизировать вывод типов для полного исключения?


9

Вопрос в следующем. Обычно, когда у кого-то есть термин, такой как , мы можем исключить результат, применив этот термин к типу, например, .ΛX.t(ΛX.t)[T]t[X:=T]

Теперь предположим, что это стрелка, и мы хотим дать ей аргумент, а затем нам нужно применить этот термин к соответствующему типу, чтобы он мог получить такой аргумент. Это то, что я спрашиваю, могу ли я автоматизировать: возможно ли построить функцию принимающую два члена и возвращающую тип такой, что дает нам тип, который необходимо заменить на в такой, что может принять аргумент ?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) со свободной (типовой) переменной 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

Вы можете доказать (по индукции), что γ = τ (unify (τ (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.