Equivalência de duas expressões lambda para NOT

7

Eu vi duas expressões lambda diferentes para a função lógica NOT.
Um deles apenas aplica seu parâmetro a constantes truee falseinternamente em uma ordem inversa:

NOT=λx.xfalsetrue=λx.x(λt.λf.f)(λt.λf.t)

e o outro que captura mais dois parâmetros em vez de passá-los para a função retornada externamente e aplica a eles na ordem inversa também:x

NOT=λx.λt.λf.xft

dos quais o outro parece um pouco mais simples (e também é mais simples quando codificado em binário).

Portanto, minha pergunta é a seguinte:
existe alguma transformação que possa me levar de uma dessas representações para a outra?

Vejo que eles são equivalentes "extensionalmente", isto é, ambos produzem os mesmos resultados. Mas eu gostaria de "provar" de alguma forma por transformações algébricas, como as das conversões alfa, beta e eta. Infelizmente, nada disso pode me ajudar neste caso: Alpha é apenas para renomear. Beta funciona apenas para chamadas de função, mas não temos aqui nenhuma chamada de função que possa ser reduzida, pois x é livre no corpo da função (embora não seja toda a expressão) em todas essas expressões até que realmente invoquemos NOTalgo. O mais próximo parece ser o eta, que está relacionado à equivalência extensional e aos parâmetros de encaminhamento, mas quando os parâmetros estão sendo revertidos, não é mais um encaminhamento simples e o eta parece não se aplicar aqui.

Há mais alguma regra de conversão em falta?
(Bem, acho que eles não vão pular duas letras gregas sem motivo específico, não é?)

PS: Esta questão é na verdade um modelo, uma vez que existem muitas outras definições para outras funções que têm várias formas diferentes que parecem ser extensionalmente equivalentes, mas completamente diferentes em relação às regras de redução conhecidas. Eu escolhi o exemplo mais simples deste problema.

Editar:
para esclarecer melhor o que eu gostaria de saber, aqui está um diagrama mostrando as etapas de redução para as duas versões da notfunção: http://sasq.comyr.com/Stuff/Lambda/Not.png

Como você pode ver, eles realmente reduzem os mesmos resultados (ao contrário do que Jonathan Gallagher estava dizendo abaixo). Isto é o que eu já sei: eles são confluentes e, portanto, são equivalentes a Church-Rosser. O que eu não sei, no entanto, é se existe alguma regra de conversão (semelhante a alfa, beta e eta) que possa me permitir transformar uma forma de notoutra. Isso me permitiria, pelo menos, garantir que algumas outras funções (mais complicadas que essas duas aqui) também sejam equivalentes, o que pode ser difícil quando elas podem reduzir para mais do que apenas duas respostas possíveis. Gostaria de saber se existe alguma regra de conversão que permita converter uma definição intensional em outra quandoduas funções já são extensionalmente equivalentes (ou seja, fornecem os mesmos resultados para os mesmos parâmetros). Ou (o que seria melhor) se alguma função puder ser convertida de alguma forma na outra, mesmo que eu não saiba se elas são extensionalmente equivalentes.

SasQ
fonte
Você não poderá provar nada apenas nessas duas codificações de NOT, mas o resultado que poderá querer provar seria algo como: dado f um termo lambda booleano, NOT f true falsedeve reduzir para a mesma forma normal, independentemente da codificação de NÃO escolhida.
Tpecatte
Humm, muuuito ... você sugere usar o teorema de Church-Rosser para mostrar confluência de ambas as reduções? Mas isso não sugere que possa haver alguma transformação envolvida? (talvez alguns que ainda não foi descoberto)
SasQ
Não tenho certeza de que haja alguma transformação envolvida, a confluência apenas significa que a escolha de não realmente não importa. É o mesmo que número inteiro da Igreja, você pode trocar os dois parâmetros para definir números inteiros, e ambos são válidos e são equivalentes de alguma forma quando "avaliados", mas não equivalentes usando transformações.
Tpecatte

Respostas:

3

Para provar que as duas formas NOT geralmente não são equivalentes, tudo o que você precisa fazer é encontrar um termo que, quando cada uma for aplicada, retorne um resultado diferente, como:

NOT1λx.x=(λx.x(λt.λf.f)(λt.λf.t))λx.x=λx.x

NOT2λx.x=(λx.λt.λf.xft)λx.x=λt.λf.ft

dansalmo
fonte
-3

Que o primeiro não seja chamado de not1 e o segundo não2. Então você tem o seguinte:

not1MβMfalsetrue
e
not2Mβλtf.Mftηλt.MtηM

Agora, se supusermos que

M=true
então a redução superior nos daria falsa, enquanto a redução inferior nos daria verdadeira - de modo que fazer a identificação pareceria dar um resultado estranho.
Jonathan Gallagher
fonte
Isso porque você cometeu um erro. Tanto quanto eu sei, você não pode reduzir esse caminho.not2Mβλtf.Mft está OK e esta é a forma normal correta até você saber M. Mas isso não é:λtf.Mftηλt.Mt; você não pode se livrar deλfporque não é o último parâmetro no aplicativo de função subordinada. Se você chamar a função reduzida dessa maneira com os mesmos parâmetros, ela retornaráMt, que por sua vez será chamado no outro parâmetro (anteriormente f), que dá Mtf, não Mft.
SasQ 17/09/13
Eu acredito que você está incorreto. Eta é uma reescrita, portanto deve ser uma congruência - fechada sob substituição e contexto. Isso deve permitir a redução dada. Eu também posso fazer o contrário, se você quiser. ConjuntoS=λf.Mf). Entãoλt.StηS e então novamente, λf.MfηM.
Jonathan Gallagher
11
@JonathanGallagher: λtf.Mft deve ser lido como λt.λf.((Mf)t)e não tãoλt.(λf.(Mf))t. Você entendeu errado suas parênteses, e é por isso que acha que pode executar oη-redução.
Andrej Bauer
Ah Eu vejo. Obrigado pelo esclarecimento. Minha resposta está incorreta.
Jonathan Gallagher