No System F à la Church, podemos automatizar a inferência de tipos para a eliminação de todos?


9

A questão é a seguinte. Geralmente quando se tem um termo como , podemos eliminar o forall por aplicar este termo a um tipo, como exemplo ( Λ X . t ) [ t ] t [ X : = T ] .ΛX.t(ΛX.t)[T]t[X:=T]

Agora, suponha que seja uma flecha e desejemos fornecer um argumento; então, precisamos aplicar esse termo ao tipo apropriado, para que ele possa receber esse argumento. É isso que estou perguntando se posso automatizar: É possível construir uma função usando dois termos e retornando um tipo tal que nos forneça o tipo necessário para ser substituído por em modo que possa aceitar o argumento ?f < Λ X . t > < r > X t t rff<ΛX.t><r>Xttr

Alguns exemplos:

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

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


2
Sua pergunta seria um pouco mais legível se você não colocar o argumento em f como sub / sobrescrito, cada um contendo outros sub / sobrescrito.
Dave Clarke

Para referência: Esse tipo de problema é um dos dois problemas resolvidos por "Inferência de tipo local" ( dl.acm.org/citation.cfm?id=345100 ). Também relevante deve ser dl.acm.org/citation.cfm?id=1086383 .
Blaisorblade 13/10

Respostas:


8

Não tenho muita certeza de ter entendido a pergunta. Primeiro, tento reduzir o seu problema ao seguinte problema de unificação:

Dado um sistema F, digite τ (X) com uma variável livre (do tipo) X e um tipo σ.
É possível encontrar um tipo γ tal que τ (γ) = σ?

Aqui está um pseudocódigo (com uma exceção levantada quando não é unificável) para resolver esse problema.

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

Você pode provar (por indução) que γ = τ (unificar (τ (X), σ) funciona se e somente uma exceção não for gerada.

Agora, para o seu problema, você pode

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

(é claro que sua função f deve ter como argumento um contexto se seus termos estiverem abertos).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.