Por que a subtipagem comportamental é indecidível?


12

O trabalho de Liskov nessa área enfocou a subtipagem comportamental, que além da segurança do sistema de tipos discutida neste artigo também exige que os subtipos preservem todos os invariantes garantidos pelos supertipos em algum contrato. [3] Essa definição de subtipagem geralmente é indecidível, portanto, não pode ser verificada por um verificador de tipos.

De: http://www.wikiwand.com/en/Subtyping#/Function_types

Respostas:


24

Seja o contrato de operação odo Tipo Tque ele interrompe todas as entradas. Agora decida se a operação odo subtipo S <: Tsatisfaz esse contrato: você acabou de resolver o problema da parada .

De maneira mais geral, S::odeve calcular a mesma função como T::ose S <: T. Decidir se dois programas calculam a mesma função é chamado Problema da Função e é equivalente a resolver o Problema da Parada.

Em geral, decidir estaticamente qualquer propriedade de tempo de execução não trivial é quase sempre equivalente ao Problema da Parada.


3
Essa última linha acertou em cheio. No momento em que você deseja provar uma propriedade sobre o que o programa pode fazer em um ambiente comportamental, você está entrando no impossível. A razão pela qual os sistemas de tipos e as ferramentas de análise estática funcionam é que eles tratam uma linguagem diferente (dos tipos do programa, do escopo das variáveis ​​no programa e assim por diante) e não as propriedades de como o programa é executado diretamente.
Benjamin Gruenbaum

5
@BenjaminGruenbaum A resposta de Jorg e seu comentário estão corretos, mas gostaria de esclarecer uma sutileza. Geralmente, é possível provar uma propriedade sobre um programa específico . Simplesmente não existe um algoritmo que você possa seguir cegamente que funcione para todos os programas. Considere este método escrito em Java: BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }Não é difícil provar que um método específico sempre retorna a soma dos elementos de uma matriz inteira e não faz mais nada (desde que o argumento não seja nulo).
Doval

1
E quando não é equivalente ao problema da parada, geralmente é ainda pior . Porque impossível já não era difícil o suficiente.
User2357112 suporta Monica

2
Ou, para colocar o argumento de Doval de outra maneira (brusca), é exatamente por isso que linguagens completas não- Turísticas são interessantes e úteis. Geralmente, você não precisa da integridade de Turing (certamente no nível do módulo) para um trabalho real.
Leushenko 6/12/15

@Doval: Muito bom ponto. Embora seja verdade que você não pode ter um algoritmo que comprove a finalização e / ou a correção de um programa aleatório, é possível gravar programas de tal maneira que você possa provar sua correção.
Giorgio

12

Porque quase todas as questões sobre o comportamento dos programas são indecidíveis. Pelo teorema de Rice , qualquer problema de decisão da forma:

Alguns programas calculam funções que possuem essa propriedade, outros programas calculam funções que não possuem essa propriedade. Dado um programa P, a função calculada por P tem a propriedade acima mencionada ou não?

é indecidível. Portanto, por exemplo, nem sempre é possível distinguir o código que calcula o quadrado de uma entrada do código que não. Embora em casos simples, muitas vezes seja possível provar que uma função o faça ou não, não há procedimento geral que funcione para todos os programas.

Quase qualquer invariante comportamental interessante se enquadra no teorema de Rice, uma vez que essas afirmações raramente (se é que alguma vez) falam sobre como o método se parece internamente, apenas o que ele retorna e os efeitos colaterais que causa em resposta a determinadas informações.


3
Você pode esclarecer um pouco: não é que um único programa, por mais patológico que seja, possa resistir a todas as análises, mas que, para qualquer análise, existe pelo menos um programa que não pode ser categorizado adequadamente com isso.
Nathan Tuggy
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.