Explicação simples de por que certas funções computáveis ​​não podem ser representadas por um termo digitado?

8

Lendo o artigo Uma Introdução ao Cálculo Lambda , me deparei com um parágrafo que eu realmente não entendia, na página 34 (em itálico):

Dentro de cada um dos dois paradigmas, existem várias versões do cálculo lambda digitado. Em muitos sistemas importantes, especialmente nos da Igreja, os termos que possuem um tipo sempre possuem uma forma normal. Pela insolubilidade do problema de parada, isso implica que nem todas as funções computáveis ​​podem ser representadas por um termo digitado, ver Barendregt (1990), Teorema 4.2.15. Isso não é tão ruim quanto parece, porque, para encontrar funções computáveis ​​que não podem ser representadas, é preciso ficar de pé. Por exemplo, em 2, o cálculo lambda digitado de segunda ordem, apenas as funções recursivas parciais não podem ser representadas que são totais, mas não provadamente na análise matemática (aritmética de segunda ordem).

Estou familiarizado com a maioria desses conceitos, mas não com o conceito de função recursiva parcial, nem com o conceito de função comprovadamente total. No entanto, não é isso que estou interessado em aprender.

Estou procurando uma explicação simples sobre por que certas funções computáveis ​​não podem ser representadas por um termo digitado, bem como por que essas funções só podem ser encontradas "estando de pé na cabeça".

magnetar
fonte

Respostas:

9

Dado que você não deseja aprender conceitos precisos, aqui está uma explicação intuitiva. Na discussão abaixo, "função" sempre se refere a uma função que mapeia números naturais para números naturais (possivelmente indefinido em alguns argumentos).

Qualquer linguagem de programação que tenha

  1. sintaxe computável e regras de avaliação, e
  2. implementa todas as funções computáveis totais

necessariamente implementa algumas funções parciais .

Para ver isso, suponha que todas as funções definíveis nessa linguagem fossem totais. Como a linguagem possui sintaxe computável, podemos enumerar todas as definições de funções (apenas enumerar todas as strings e filtrar aquelas que causam erros sintáticos). Como as regras de avaliação são computáveis, a segunda suposição nos permite concluir que, em nossa linguagem, podemos definir a função total eval(n,m)que avalia a n-a função definível m(essencialmente, esse é um mini-intérprete escrito na própria linguagem). Mas então a função

λ k . (1 + eval(k,k))

é uma função definível total que é diferente de toda função definível total, uma contradição.

O simplesmente digitado λ-calculus satisfaz a primeira condição e define apenas funções totais. Portanto, não satisfaz a segunda condição.

No que diz respeito a "estar de cabeça para baixo", para uma forte normalização λ-cálculo é bastante fácil fornecer uma função total que não é definível no cálculo, ou seja, o próprio procedimento de normalização . Não é muito importante o quão sofisticado é o seu cálculo fortemente normalizador, pode ser o polimórficoλ-cálculo, ou teoria do tipo Martin-Lof, ou Cálculo de construções. (Exercício: se você puder implementar o procedimento de normalização, poderá implementar evalacima.)

Andrej Bauer
fonte
Receio não poder analisar sua segunda frase explicativa: Qualquer linguagem de programação com 1. e 2. verifica o que? Eu suponho que você queria dizer que nenhuma linguagem pode existir ...
Cody
Desculpe, estraguei o texto. Deve ler bem agora.
Andrej Bauer
Legal, não pensei nisso. Veja aqui o plano de fundo desta resposta.
Raphael
4

Acho que a resposta de Merijn trata muito bem a primeira parte da sua pergunta. Tentarei responder à segunda parte: por que encontrar funções que são computáveis, mas não representáveis, no processo polimórfico?λ-calculus requer "ficar de pé sobre a cabeça".

Receio que exija alguma explicação dos conceitos nos quais você não está interessado. Uma função recusativa parcial é umaλtermo que representa uma função de N para N{}. UMAλ-prazo t aplicado ao representante de um número natural n é enviado para se e apenas se t nse não tem uma forma normal. Se nenhum número for enviado paradizemos que a função é total . Agora, a ideia é que nenhuma teoria lógicaT pode provar que um termo t representa uma função total para cada função total t, sempre há "pontos cegos" onde t termina em todas as entradas n, mas a declaração

n,t n termina

é indecidível em T. Se a declaração acima for comprovável emT, dizemos que a função representada por té comprovadamente total . Que nem todas as funções totais são comprovadamente totais emT é uma conseqüência (uma variante) do Teorema de Godel Incompleteness T.

Agora, o ponto é que o amplo programa da maioria que desejamos escrever (classificação de listas, passagem de gráficos, sistemas operacionais) não é apenas funções totais, mas é comprovadamente total em sistemas lógicos razoáveis, como o Peano Arithmetic.

Agora, para o polimórfico λ-cálculo. Pode-se mostrar que os termos que se pode digitar neste cálculo são exatamente os termos que representam as funções comprovadamente totais na Aritmética Peano de Segunda Ordem. A Aritmética Peano de Segunda Ordem é muito, muito mais poderosa que a Aritmética Peano comum.

Isso significa pelas explicações acima que existem termos que são totais, mas não comprovadamente totais, mas essas funções são extremamente raras, pois já são raras para a Aritmética Peano (e muito mais raras na teoria de segunda ordem). Daí a afirmação "em pé de cabeça".

cody
fonte
2
Faltam condições à sua teoria T, ou seja, consistência e que o conjunto de axiomas é recursivo, caso contrário, podemos tomar como T uma teoria cujo conjunto de axiomas inclui "f termina "para cada fque termina.
Andrej Bauer
Obrigado por essas precisões, Andrej. Uma explicação mais completa provavelmente também detalharia o que exigimos de nossa teoria, a saber, que a teoria pode pelo menos expressar o que significa terminar (a aritmética com multiplicação é suficiente, mas eu tendem a favorecer sistemas um pouco mais expressivos).
C26
Certo, acho justo ressaltar que faltam algumas condições técnicas, para que os leitores interessados ​​possam procurá-las.
Andrej Bauer
3

Estou achando um pouco difícil escrever a prova de forma concisa, mas espero que essa explicação forneça intuição suficiente para ver por que termos simples digitados não podem representar todos os termos não digitados.

O cálculo lambda simplesmente digitado está fortemente normalizando. Cadaβredução nos aproximará da forma normal. Quando a funçãof::αβγ é aplicado a um valor do tipo α será β reduzir a uma função do tipo βγ. Dado um número finito de argumentos, é necessário um número finito de etapas de redução para alcançarβ-forma normal, na qual não há mais reduções possíveis.

Para contrastar isso com o cálculo lambda sem tipo. Um dos combinadores UTLC mais famosos é oY-combinador:

Y=λf.(λx.f(xx))(λx.f(xx))

Quando tentamos reduzir o Y-combinator acontece o seguinte:

λf.(λx.f(xx))(λx.f(xx))g
(λx.g(xx))(λx.g(xx))
g((λx.g(xx))(λx.g(xx)))
g(g((λx.g(xx))(λx.g(xx))))

Independentemente das funções em que passamos, ficamos presos em uma sequência infinita de reduções! Se tentarmos fixar um tipo STLC no UTLCY-combinator, rapidamente achamos isso impossível, porque o aplicativo de funções não reduz o tipo, conforme é necessário no STLC. oY-combinator é claramente computável (representa, usando a recursão, o conceito de um loop infinito), mas não pode ser representado no STLC, pois todos os termos do STLC estão fortemente normalizando.

merijn
fonte
Esse argumento tem muito pouco a ver com o fato de que nem todas as funções teóricas dos números totais são representáveis ​​no tipo λ-calculus, que é a questão. Em que sentido é oYcombinador uma função total?
Andrej Bauer
@AndrejBauer A pergunta termina com "Estou procurando uma explicação simples sobre por que certas funções computáveis ​​não podem ser representadas por um termo digitado". Como minha resposta não cobre isso? oY-combinator é um exemplo de função computável que não pode ser representada por um termo simplesmente digitado, e espero que minha explicação seja suficientemente coerente para explicar por que não pode ser representada por um termo simplesmente digitado.
merijn
Bem, se você pretende interpretar a pergunta como um exemplo de uma função parcial que não é definível no tipo simplesmente digitado λ-calculus, qualquer função desse tipo funcionará (e a pergunta é um absurdo). Por exemplo, aquele que é indefinido em todos os lugares. Não é definível no tipo simplesmente digitadoλ-calculus também. A questão é sobre funções totais, como eu a li.
Andrej Bauer