Cálculo Kappa

Fonte: testwiki
Saltar para a navegação Saltar para a pesquisa

Em lógica matemática, teoria das categorias, e ciência da computação, kappa cálculo é um sistema formal para a definição de funções de primeira ordem.

Ao contrário do cálculo lambda, o cálculo kappa não tem funções de ordem superior; as suas funções não são objetos de primeira classe. Kappa-cálculo pode ser considerado como "uma reformulação do fragmento de primeira-ordem do cálculo lambda tipado[1]".

Em razão do fato de que suas funções não são objetos de primeira classe, a avaliação de expressões de cálculo kappa não exige fechos.

Definição

A definição abaixo foi adaptada a partir de diagramas nas páginas 205 e 207 de Hasegawa.[2]

Gramática

Cálculo kappa consiste em tipos e expressões, dado pela gramática abaixo:

τ=1τ×τ

e=xidτ!τliftτ(e)eeκx:1τ.e

Em outras palavras,

  • 1 é um tipo
  • If τ1 and τ2 forem tipos então τ1×τ2é um tipo
  • Toda variável é uma expressão
  • Se τ for um tipo então idτ é uma expressão
  • Se τ for um tipo então !τ é uma expressão
  • Se τ for um tipo e e for uma expressão então liftτ(e) é uma expressão
  • Se e1 e e2 forem expressões então e1e2 é uma expressão
  • Se x for uma variável, τ for um tipo, e e for uma expressão, então κx:1τ.eé uma expressão

O tipo :1τ e os índices de id, !, e lift são às vezes omitidos quando eles podem ser inequivocamente determinados a partir do contexto.

Justaposição é frequentemente usada como uma abreviação para uma combinação de "lift" e composição:

e1e2=defe1lift(e2)

Regras de tipagem

A apresentação aqui usa sequentes (Γe:τ) em vez de julgamentos hipotéticos, a fim de facilitar a comparação com o cálculo lambda simplesmente tipado. Isso requer que a adição da regra Var, que não aparecem no Hasegawa[3]

No cálculo kappa existem dois tipos de expressões: o tipo de origem e o tipo de destino. A notação e:τ1τ2 é usada para indicar que a expressão e tem o tipo da fonte τ1 e o tipo de destino τ2.

Expressões no cálculo kappa são tipos de atribuídos de acordo com as seguintes regras:

x:1τΓΓx:1τ (Var)

idτ:ττ (Id)

!τ:τ1 (Bang)

Γe1:τ1τ2Γe2:τ2τ3Γe2e1:τ1τ3 (Comp)

Γe:1τ1Γliftτ2(e):τ2(τ1×τ2) (Lift)

Γ,x:1τ1e:τ2τ3Γκx:1τ1.e:τ1×τ2τ3 (Kappa)

Em outras palavras,

  • Var: assumindox:1τ permite você concluir quex:1τ
  • Id: para qualquer tipo , idτ:ττ
  • Bang: para qualquer tipo τ, !τ:τ1
  • Comp: se o tipo de destino corresponde ao tipo de origem , eles podem ser compostos para formar uma expressão com o tipo de origem de e o tipo de destido dee2
  • Lift: se e:1τ1, entãoliftτ2(e):τ2(τ1×τ2)
  • Kappa: se nós podemos concluir que sob a suposição que , então nós podemos concluir sem essa suposição queκx:1τ1.e:τ1×τ2τ3

Igualdades

Cálculo kappa obedece as seguintes igualdades:

  • Neutralidade: Se f:τ1τ2 então fidτ1=f e f=idτ2f
  • Associatividade: Se f:τ1τ2, g:τ2τ3, e h:τ3τ4, então (hg)f=h(gf).
  • Terminalidade: Se e entãof=g
  • Redução de ascensor: (κx.f)liftτ(c)=f[c/x]
  • Redução Kappa: κx.(hliftτ(x))=h se x não é livre em h

As últimas duas igualdades são regras de redução para os cálculos, reescrevendo da esquerda para direita

Proriedades

O tipo 1 pode ser considerado como o tipo unitário. Devido a isso, quaisquer duas funções cujo tipo de argumento é o mesmo e cujo tipo de resultado é 1 deve ser igual - uma vez que existe apenas um único valor do tipo 1 as duas funções devem retornar esse valor para cada argumento (Terminalidade).

Expressões com tipo podem ser considerado como "constantes" ou valores de "tipo de base"; isto é porque o 1 é o tipo unitário e, portanto, uma função deste tipo é necessariamente uma função constante. Observe que o regra kappa permite abstrações apenas quando a variável que está sendo abstraída tem o tipo para alguns. Este é o mecanismo básico que garante que todas as funções são de primeira ordem.

Semântica categórica

Cálculo kappa destina-se a ser a linguagem interna de categorias completas contextualmente.

Exemplos

Expressões com múltiplos argumentos têm tipos fonte que são árvores binárias "desbalanceadas à direita". Por exemplo, uma função f com três argumentos de tipos A,B, e C e tipo do resultado for D terá tipo

f:A×(B×(C×1))D

Se definirmos justaposição associativa-à-esquerda (f c) como uma abreviação para (flift(c)), então – assumindo que a:1A, b:1B, e que c:1C – podemos aplicar essa função:

fabc:1D

Como a expressão fabc tem tipo fonte 1, ela é um "valor básico" e pode ser passado como um argumento para uma outra função. Se g:(D×E)F, então

g(fabc):EF

Bem semelhante a uma função "curryficada" de tipo A(B(CD)) no lambda cálculo, aplicação parcial é possível:

fa:B×(C×1)D

Entretanto nenhum tipo de alta ordem (i.e. (ττ)τ) está envolvido. Note que em razão do fato de que o tipo fonte de fa não é 1, a seguinte expressão não pode ser tipada sob as suposições mencionadas até aqui :

h(fa)

Em razão do fato de que a aplicação sucessiva é usada para argumentos múltiplos não é necessário saber a aridade de uma função para determinar sua tipagem; por exemplo, se sabemos que c:1C então a expressão

jc

é bem tipada desde que j tenha tipo (C×α)β para algum α e algum β. Essa propriedade é importante quando calculando o tipo principal de uma expressão, algo que pode ser difícil quando se tentar excluir funções de alta-ordem dos lambda-cálculos tipados restringindo a gramática de tipos.

História

Barendregt originalmente introduziu[4] o termo "completude funcional" no contexto da álgebra combinatória. O Kappa cálculo surgiu a partir de esforços de Lambek[5] para formular um análogo apropriado de completude funcional para categorias arbitrárias (ver Hermida & Jacobs,[6] section 1). Hasegawa mais tarde desenvolveu o kappa cálculo para uma linguagem de programação utilizável (embora simples) incluindo aritmética sobre números naturais e recursão primitiva.[1] Conexões a setas foram investigadas mais tarde[7] por Power, Thielecke, e outros.

Variantes

É possível explorar versões do kappa cálculo com tipos subestruturais tais como linear, afim, e tipos ordenados. Essas extensões requerem eliminar ou restringir a expressão !τ. Em tais circunstâncias o operador de tipo × não é um verdadeiro produto cartesiano, e é geralmente escrito para deixar isso claro.

Referências

Erro de citação: Elemento <ref> definido em <references> não tem um atributo de nome.