Les travaux de Liskov dans ce domaine se sont concentrés sur le sous-typage comportemental qui, outre la sécurité du système de types discuté dans cet article, exige également que les sous-types préservent tous les invariants garantis par les supertypes dans certains contrats. [3] Cette définition du sous-typage est généralement indécidable, elle ne peut donc pas être vérifiée par un vérificateur de type.
la source
BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }
il n'est pas difficile de prouver qu'une méthode particulière renvoie toujours la somme des éléments d'un tableau entier et ne fait rien d'autre (à condition que l'argument ne soit pas nul).Parce que presque toutes les questions sur le comportement des programmes sont indécidables. Par le théorème de Rice , tout problème de décision de la forme:
est indécidable. Ainsi, par exemple, vous ne pouvez pas toujours distinguer le code qui calcule le carré d'une entrée du code qui ne le fait pas. Bien que dans des cas simples, il soit souvent possible de prouver qu'une fonction le fait ou non, il n'y a pas de procédure générale qui fonctionne pour tous les programmes.
Presque tout invariant comportemental intéressant relève du théorème de Rice, car ces déclarations parlent rarement (voire jamais) de ce à quoi ressemble la méthode en interne, uniquement de ce qu'elle renvoie et des effets secondaires qu'elle provoque en réponse à certaines entrées.
la source