Há um bom idioma, que é explicado mais no capítulo 22 de Tipos e linguagens de programação (é usado para polimorfismo em vez de tipos dependentes, mas a idéia é a mesma). O idioma é o seguinte:
Um sistema de verificação de tipo pode ser transformado em um sistema de inferência de tipo , tornando as regras lineares e adicionando restrições .
Vou usar a regra do aplicativo como exemplo. A regra de verificação em tipos dependentes é esta:
Γ⊢t:Πx:A.BΓ⊢u:AΓ⊢t u:B[u/x]
A linearização dessa regra requer renomear as 2 ocorrências deA, de modo que obtemos:
Γ⊢t:Πx:A1.BΓ⊢u:A2Γ⊢t u:B[u/x]
Mas isso não está mais correto! Precisamos adicionar a restrição A1≃UMA2:
Y- ⊢ t : Π x :UMA1 1.BY- ⊢ u :UMA2Γ⊢t u:B[u/x]A1≃A2
Observe que ≃ denota módulo de equivalência sua relação de conversão (βη, normalmente), assim como na regra de conversão, mas agora é uma restrição de unificação , pois você pode ter meta-variáveis em seus termos.
No curso da verificação de tipo, você acumulará restrições como essas, para potencialmente resolvê-las todas de uma vez no final (ou mais cedo por razões de eficiência).
Agora as coisas podem ficar mais complicadas, porque o tipo de tem si poderia ser uma meta-variável no contexto! Uma regra mais geralmente aplicável seria, portanto,
Y ⊢ t : CY- ⊢ u :UMA2Y ⊢ t u : B [ u / x ] C≃ ¸ x :UMA1 1. B , UMA1 1≃UMA2
Ou, como alternativa, mantendo a regra anterior e adicionando a regra
Γ1 1, x : C,Γ2⊢ x : AC≃ A
no tempo de pesquisa variável.
Outra observação útil é que, no sistema de verificação , a regra de conversão precisa ser aplicada apenas antes dos aplicativos e, possivelmente, uma vez no final da derivação. Como essas regras correspondem a uma restrição de unificação no sistema de inferência , isso indica onde colocar as restrições.