"Lógicos famosos cometeram erros embaraçosos aqui", uma linha do SICP. A que isso se refere?

13

Aqui está o contexto ( Estrutura e Interpretação de Programas de Computador , seção 1.1.8, sob o título "Nomes locais"):

Um parâmetro formal de um procedimento tem um papel muito especial na definição do procedimento, pois não importa qual o nome do parâmetro formal. Esse nome é chamado de variável vinculada e dizemos que a definição do procedimento liga seus parâmetros formais. O significado de uma definição de procedimento é inalterado se uma variável vinculada for renomeada consistentemente em toda a definição.

No final dessa última linha, há uma nota de rodapé (26), que diz:

O conceito de renomeação consistente é realmente sutil e difícil de definir formalmente. Lógicos famosos cometeram erros embaraçosos aqui.

A que ou a quem o texto se refere? Por que seria difícil definir "renomeação consistente", quais lógicos cometeram erros ao tentar definir isso e quais eram esses erros?

ubadub
fonte
3
Eu digo aos meus alunos que a única maneira de entender "renomear consistentemente variáveis ​​vinculadas" é implementar a maldita coisa corretamente. Muitos livros de lógica evitam o problema, fornecem procedimentos de renomeação incompletos ou, no mínimo, omitem provas de que os procedimentos de renomeação fornecidos estão corretos. Mas não sei a que fofoca específica o livro se refere.
Andrej Bauer
5
Lidar com precisão com renomeação de variáveis, nomes novos, substituição para evitar capturas e similares é uma das coisas mais triviais que rapidamente se torna realmente complicada em definições e provas. Para uma questão tão trivial, não se deseja gastar mais do que uma quantidade trivial de ciclos mentais, mas muito mais do que isso seria necessário para evitar muitas capturas / colisões / etc. complicadas. definições, mas depois invoque a "convenção de Barendregt" e ignore o problema, abusando um pouco de "novo" aqui e ali, quando necessário.
chi
1
Eu apreciaria respostas mais concretas, abaixo na caixa de respostas, se possível. Esses comentários ainda fazem o problema parecer misterioso, pois você os escreveu para serem lidos por alguém que já está familiarizado com o problema em questão, enquanto eu não sou.
ubadub
@chi em particular, eu gostaria de ler recomendações que abordem esse tópico, se você tiver algum. Agradecemos antecipadamente
ubadub 23/09/18

Respostas:

11

Esta é uma resposta parcial: não tenho idéia sobre a quais erros ou pessoas o SICP está se referindo. Só posso fornecer algumas dicas sobre "por que" renomear variáveis ​​pode ser doloroso de lidar com precisão.

Antes de tudo, parece trivial definir. Por exemplo, podemos renomear variáveis ​​vinculadas em somas indexadas

xe=y(e{y/x})

onde e é qualquer expressão e e{y/x} denota a substituição sintática de cada x por y . Trivial, certo?

Bem, se aplicarmos cegamente a regra acima, obtemos

x(x+y)=y(y+y)

Isso não é bom. Precisamos adicionar o requisito " y não ocorre em e " ou temos um conflito de nome.

Agora, considere esta renomeação correta

xy(x+y)=xz(x+z)

se queremos renomear x emy

Uma abordagem típica aqui é recorrer à redefinição de e{y/x} como "substituição que evita a captura" e relaxar o requisito " y não ocorre em e " e, em vez disso, usar " y não ocorre livre eme

Em seguida, definimos ocorrências livres:

free(x)={x}free(e+t)=free(e)free(t)free(xe)=free(e){x}

Por fim, capture evitando a substituição:

  • x{t/y}tx=yx de outra forma.
  • (e+e){t/y}=e{t/y}+e{t/y}
  • (xe){t/y}=??

x=yxxe

yx(xe){t/y}=x(e{t/y})xt

zytxe(xe){t/y}=z(e{z/x}{t/y})

Espero ter acertado. (Minha primeira tentativa estava errada, a propósito)

zz funcionaria bem e levaria ao mesmo resultado (novamente, até renomear).

αλx no cálculo lambda, definições de funções em muitos PLs, etc.).

Agora, imagine ter que lidar com essa definição complexa toda vez que quisermos provar algo na teoria da PL. Poderíamos, mas não queremos. É chato, tedioso, propenso a erros, atravessa a prova e não fornece informações ao leitor. Por esse motivo, muitos autores de PL simplesmente ignoram os detalhes dizendo (ou mesmo aceitando!) Que os termos devem ser considerados "até a renomeação de variáveis", que todas as variáveis ​​vinculadas são assumidas distintas daquilo que precisam ser distintas, que assumimos a "convenção Barendregt", ou algo do mesmo efeito.

Para ser brutalmente honesto, isso é trapaça nas provas. Também poderíamos adicionar "piscadela piscadela, nudge nudge, não diga mais nada!" no mesmo espírito. Essencialmente, pedimos misericórdia e dizemos ao leitor: "olha, isso é chato, eu não quero fazer isso, você não quer ler - nós dois sabemos que, com um grande esforço, poderíamos reescrever essa prova para inclua todos os detalhes ".

Tecnicamente, é possível explorar esse atalho para provar uma declaração falsa. O revisor experiente, no entanto, sabe o que é "moralmente bom" e pode ser aperfeiçoado (com grande esforço) e o que é suspeito. O último pode incluir algo que depende da escolha real dos nomes de limite (portanto, não estamos realmente trabalhando "de acordo com o prometido!). Nesses casos, a revisão solicitará mais detalhes, para que ele possa ser convencido.

chi
fonte