Eu tenho uma resposta para esta pergunta que é possivelmente nova. De fato, ainda estou pensando nos últimos 6 meses ou mais, e ainda não foi escrito em artigos.
A tese geral é que princípios de raciocínio relacional como "relações lógicas", "simulações" e até "invariantes" são manifestações de abstração de dados ou ocultação de informações. Onde quer que oculte informação, esses princípios surgem.
As primeiras pessoas a descobri-lo foram os teóricos dos autômatos. Os autômatos têm um estado oculto. Portanto, você precisa de um raciocínio relacional para falar sobre sua equivalência. Os teóricos dos autômatos lutaram com os homomorfismos por um tempo, desistiram e criaram uma noção chamada "cobertura relacional", que é uma forma de relações de simulação.
Milner pegou a idéia em um artigo pouco conhecido, mas muito fundamental, chamado " Uma noção algébrica de simulação entre programas " em 1971. Hoare sabia disso e a usou na criação de " Prova de correção de representações de dados " em 1972 (mas usada abstração funciona em vez de relações, porque ele pensava que eram "mais simples"). Mais tarde, ele retirou a reivindicação de simplicidade e voltou a usar as relações em " Refinamento de dados refinado ". Reynolds usou o raciocínio relacional em " Craft of Programming"", Capítulo 5 (1981). Ele achava que as relações eram mais naturais e gerais do que as funções de abstração. Se você voltar e ler este capítulo, encontrará idéias de parametridade relacional à espreita, à espera de serem descobertas. Com certeza, dois anos depois, Reynolds publicou "Tipos, abstração e polimorfismo paramétrico" (1983).
Parece que todas essas idéias não têm nada a ver com tipos, mas realmente têm. Linguagens e modelos com estado têm abstração de dados incorporada . Você não precisa definir um "tipo de dado abstrato" para ocultar as informações. Você apenas declara uma variável local e a oculta. Podemos ensiná-lo aos alunos do primeiro ano nas aulas de Java nas primeiras semanas. Sem suor.
Linguagens e modelos funcionais, por outro lado, precisam esconder suas informações por meio de tipos . Os modelos funcionais não possuem abstração de dados incorporada. Temos que adicioná-lo explicitamente, usando ou ∃ . Portanto, se você traduzir um idioma com estado para um idioma funcional, notará todo o estado local sendo traduzido em variáveis de tipo. Para uma descrição explícita de como isso funciona, consulte meu artigo " Objetos e classes em linguagens semelhantes a Algol ", mas as idéias realmente vêm de Reynolds 1981 ("A Essência de Algol"). Estamos apenas entendendo melhor essas idéias clássicas agora.∀∃
Pegue duas máquinas e M ' que você deseja provar equivalentes. Milner 1971 diz, define uma relação entre os estados de M e M ' e mostra que as duas máquinas preservam a relação. A parametridade de Reynolds diz: pense nos estados das máquinas como pertencendo aos tipos X e X ' . Defina uma relação R entre eles. Se as máquinas são do tipo F ( X ) e F ( X ′ ) , parametrizadas pelos tipos de seus estados, verifique se as duas máquinas estão relacionadas pela relação FMM′MM′XX′RF(X)F(X′) . F(R)
Portanto, simulações e parametridade relacional são essencialmente a mesma idéia . Não é apenas uma semelhança superficial. O primeiro é feito para linguagens com estado onde há abstração de dados embutida. O último é feito para linguagens sem estado onde a abstração de dados é obtida por meio de variáveis de tipo.
E as relações lógicas, então? Aparentemente, as relações lógicas parecem ser uma ideia mais geral. Enquanto a parametridade fala sobre como relacionar variáveis de tipo dentro do mesmo modelo, relações lógicas parecem relacionar tipos entre modelos diferentes. (Dave Clarke escreveu uma exposição brilhante disso antes.) Mas meu sentimento é (e ainda precisa ser demonstrado) que esse é um exemplo de alguma forma de parametridade de tipo superior que ainda não foi formulada. Fique atento para mais progresso nessa frente.
[Nota adicionada] A conexão entre relações lógicas e simulações é discutida em nosso artigo recente Relações lógicas e parametria: Um programa de Reynolds para teoria de categorias e linguagens de programação .