El trabajo de Liskov en esta área se centró en el subtipo de comportamiento, que además de la seguridad del sistema de tipos discutido en este artículo también requiere que los subtipos preserven todos los invariantes garantizados por los supertipos en algún contrato. [3] Esta definición de subtipo es generalmente indecidible, por lo que no puede ser verificada por un verificador de tipo.
fuente
BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }
no es difícil demostrar que un método en particular siempre devuelve la suma de los elementos de una matriz entera y no hace nada más (siempre que el argumento no sea nulo).Porque casi todas las preguntas sobre el comportamiento de los programas son indecidibles. Según el teorema de Rice , cualquier problema de decisión de la forma:
Es indecidible. Entonces, por ejemplo, no siempre se puede distinguir el código que calcula el cuadrado de una entrada del código que no lo hace. Aunque en casos simples, a menudo es posible demostrar que una función lo hace o no, no existe un procedimiento general que funcione para todos los programas.
Casi cualquier invariante conductual interesante cae dentro del teorema de Rice, ya que esas afirmaciones rara vez (si alguna vez) hablan sobre cómo se ve internamente el método, solo qué devuelve y qué efectos secundarios causa en respuesta a ciertas entradas.
fuente