Nos tipos dependentes, a unificação de padrões de Miller é usada para resolver um fragmento decidível da unificação de ordem superior. Isso permite que idiomas de tipo dependente contenham metavariáveis ou argumentos implícitos.
Existem muitos trabalhos que descrevem, dado um problema de unificação no fragmento de padrão, como encontrar uma solução, se houver. Os exemplos incluem (Gundry-McBride) , (Abel-Pientka) e o artigo original de Miller .
O que eu queria saber é que, dado um programa dependente de digitação que contém metavariáveis (ou argumentos implícitos), como alguém gera os problemas que são passados para o solucionador de unificação?
Respostas:
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:
Vou usar a regra do aplicativo como exemplo. A regra de verificação em tipos dependentes é esta:
A linearização dessa regra requer renomear as 2 ocorrências deA , de modo que obtemos:
Mas isso não está mais correto! Precisamos adicionar a restriçãoA1≃UMA2 :
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 det em si poderia ser uma meta-variável no contexto! Uma regra mais geralmente aplicável seria, portanto,
Ou, como alternativa, mantendo a regra anterior e adicionando a regra
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.
fonte
Se você modelar os termos lambda por meio de índices deBruijn e as meta-variáveis por meio de variáveis Prolog, poderá criar um solucionador de restrições Prolog. Aqui está um exemplo que já funciona muito bem, as restrições básicas usadas são as seguintes:
% shift (+ Indexado, + Nat, + Nat, -Indexado)
% subst (+ Indexado, + Nat, + Indexado, -Indexado)
% de redução (+ Indexado, + Indexado, -Indexado)
https: //gist.github. com / jburse / 0ccd12698bfa24ce5c36 # file-implicit2-p
Todo o maquinário também assume que lutamos por formas normais, pois reduzimos beta em uma determinada ordem. Há uma interação entre o normalizador e como novas restrições acima são geradas. Como reduzir um redex pode exigir reavaliação da normalização.
O solucionador de restrições já implementa algumas simplificações de restrições cruzadas, sem essas simplificações e apenas com um atraso de restrição, o solucionador de restrições seria burro demais e praticamente não utilizável. Ainda estamos planejando adicionar mais uma ou duas simplificações. Um tesouro para simplificações é o seguinte artigo:
Teoria Residual em λ-calculus
A Desenvolvimento Formal, Gerard Huet, 1998
http://pauillac.inria.fr/~huet/PUBLIC/residuals.pdf
No artigo, encontramos também as definições indutivas originais das restrições que estávamos usando. Consulte as seguintes seções:
2.2 Elevação
2.3 Substituição
3.1 Redução β de uma etapa
Aviso: Os termos deBruijn nos ajudam na igualdade dos termos normais, não precisamos de nenhuma etapa para a conversão alfa. Mas usamos um tipo dependente não nivelado, portanto, por exemplo, não há distinção entre tipos e tipos sob o capô. Isso torna todo o empreendimento especialmente simples; por outro lado, isso não é padrão.
Tchau
fonte