Liskov在该领域的工作集中于行为子类型,除了本文讨论的类型系统安全性之外,Liskov还要求子类型保留某些契约中由超类型保证的所有不变量。[3] 子类型的定义通常无法确定,因此类型检查器无法验证。
Liskov在该领域的工作集中于行为子类型,除了本文讨论的类型系统安全性之外,Liskov还要求子类型保留某些契约中由超类型保证的所有不变量。[3] 子类型的定义通常无法确定,因此类型检查器无法验证。
Answers:
让o
Type 的操作合同T
对于所有输入都停止。现在确定o
子类型的操作是否S <: T
满足该约束:您刚刚解决了暂停问题。
更一般地,S::o
必须计算相同的功能,T::o
如果S <: T
。确定两个程序是否计算相同的函数称为函数问题,等同于解决暂停问题。
通常,静态地决定任何非平凡的运行时属性几乎总是等同于暂停问题。
BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }
不难证明特定方法总是返回整数数组元素的总和,并且不执行其他任何操作(只要参数不为null)。
因为关于程序行为的几乎每个问题都是无法确定的。根据赖斯定理,任何形式的决策问题:
一些程序计算具有此属性的函数,其他程序计算不具有此属性的函数。给定程序P,由P计算的函数是否具有上述属性?
是无法决定的。因此,例如,您无法始终将计算输入平方的代码与非代码区分开。尽管在简单的情况下,通常可以证明某个函数可以执行或不执行该操作,但是没有适用于所有程序的通用过程。
赖斯定理几乎涵盖了所有有趣的行为不变式,因为这些陈述很少(如果有的话)谈论该方法的内部外观,只谈论该方法返回什么以及它对某些输入的响应会产生什么副作用。