Resolução de equações funcionais para funções desconhecidas no cálculo lambda


14

Existem técnicas para resolver equações funcionais para funções desconhecidas no cálculo lambda?

Suponha que eu tenha a função de identidade definida extensionalmente como tal:

Eux=x

(isto é, por escrever uma equação para o comportamento esperado dessa função) e agora eu quero resolver isso para fazendo alguma transformação algébrica para obter a fórmula intensional para essa função:Eu

Eu=λx.x

que informa exatamente como a função faz o que era esperado (ou seja, como implementá-la no cálculo lambda).

Obviamente, a função de identidade é usada apenas como exemplo. Estou interessado em métodos mais gerais de resolver essas equações. Em particular, gostaria de encontrar uma função que atenda ao seguinte requisito:B

Bf(λx.M)=(λx.fM)

isto é, "injeta" a função dada na função lambda fornecida antes de seu "corpo" (que é uma expressão arbitrária do lambda), possivelmente desmontando-a e construindo uma nova, para que se torne um parâmetro ao qual a função é aplicada.f(λx.M)Mf

Respostas:


13

Esse é um problema conhecido, conhecido como Unificação de Ordem Superior .

Infelizmente, esse problema é indecidível em geral. Existe um fragmento decidível, conhecido como Fragmento de Padrão de Miller. É usado extensivamente, entre outras coisas, na verificação tipográfica de programas de tipo dependente com metavariáveis ​​ou correspondência de padrões. É neste fragmento que as variáveis ​​de unificação são aplicadas apenas a variáveis ​​distintas do programa vinculado.

Este documento fornece um ótimo tutorial de como a unificação de ordem superior funciona e mostra uma implementação (relativamente) simples.

Infelizmente, não parece que sua função se enquadra nesse fragmento de padrão. Dito isto, o que estou vendo é bastante semelhante à composição das funções. A função a seguir satisfaz sua propriedade?

B=λf g x .f (g x)

Nós temos:

  • B f (λx.M)
  • α=B f (λy.[y/x]M) por -equivalênciaα
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M

1
Sim, parece que sim :) O engraçado é que quase consegui essa solução, mas por algum motivo pensei que chamar em algo "executaria", atrapalhando a expressão: q O que eu perdi é que podemos substituir a variável por outra variável ligada fora. (λx.M)
precisa saber é o seguinte

1
Obrigado pelo link do artigo também, eu o verificarei e aceitarei sua resposta em alguns dias para dar a outras pessoas a chance também.
precisa saber é o seguinte

3
Essa unificação é de ordem superior? A questão parece ser sobre o cálculo lambda não digitado, em vez do cálculo lambda simplesmente digitado.
Peter Taylor

2

Eu acho que tenho uma resposta parcial, em relação à equação com a função de identidade:

Ix=x

Queremos resolvê-lo, encontrando a fórmula para , que terá a forma ( λ p . M ) com alguma expressão ainda desconhecida como seu corpo. Vamos substituí-lo por na equação original:I(λp.M)IMI

(λp.M)x=x

aplique a função em no lado esquerdo:x

M[p/x]=x

Mas o que temos aqui? :> Esta equação é a fórmula para a expressão que estamos procurando, depois de substituir todas as ocorrências de nela por , e diz que ela deve parecer com o lado direito depois :) Em outras palavras, a função we estava procurando é:p xMpx

I=(λx.x)

qual, é claro, é a resposta certa :)


Vamos tentar a mesma abordagem para encontrar a fórmula para o combinador . Queremos que funcione de tal maneira que, quando aplicado a si mesmo, se produza aplicado a si mesmo:ω

ωω=ωω

Agora vamos encontrar a fórmula para que é da forma para alguma expressão ainda desconhecido . Substituindo isso na equação, obtemos:ω(λx.M)M

(λx.M)ω=ωω

A aplicação ao parâmetro no lado esquerdo fornece a fórmula para :M

M[x/ω]=ωω

Isso diz que, depois de substituir cada ocorrência de em por ela produziu , então podemos deduzir que a expressão original antes da substituição deveria ter sido portanto, a função que procurávamos deveria parece com isso:xMωωωMxx

ω=(λx.xx)

que é realmente o caso :)


Tenho a sensação, no entanto, de que pode ficar tão fácil só porque o lado direito já estava no formato que procuramos.


M[x/ω]=ωωω=(λx.xx)

Nestes dois casos simples - sim, existe: simplesmente inverta a substituição. Mas, como eu disse, esses casos podem funcionar com pura "sorte": que o lado direito já esteja na forma necessária. Quando tentei com alguns exemplos mais complexos, não funcionou. É isso que estou procurando: de uma maneira algorítmica.
precisa saber é o seguinte

1
ωω=ωωωω
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.