为什么行为亚型还不确定?


12

Liskov在该领域的工作集中于行为子类型,除了本文讨论的类型系统安全性之外,Liskov还要求子类型保留某些契约中由超类型保证的所有不变量。[3] 子类型的定义通常无法确定,因此类型检查器无法验证。

来自:http : //www.wikiwand.com/cn/Subtyping#/Function_types

Answers:


24

oType 的操作合同T对于所有输入都停止。现在确定o子类型的操作是否S <: T满足该约束:您刚刚解决了暂停问题

更一般地,S::o必须计算相同的功能,T::o如果S <: T。确定两个程序是否计算相同的函数称为函数问题,等同于解决暂停问题。

通常,静态地决定任何非平凡的运行时属性几乎总是等同于暂停问题。


3
最后一行钉住了它。当您想证明有关程序在行为设置中可能做什么的属性时,您将步入不可能。类型系统和静态分析工具之所以起作用,是因为它们对待不同的语言(程序类型,程序变量范围等)而不是程序直接运行的属性。
本杰明·格伦鲍姆

5
@BenjaminGruenbaum Jorg的回答和您的评论是正确的,但我想澄清一点。通常可以证明有关特定程序的属性。只是没有一种算法可以盲目遵循,该算法适用于所有程序。考虑一下用Java编写的此方法:BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }不难证明特定方法总是返回整数数组元素的总和,并且不执行其他任何操作(只要参数不为null)。
2015年

1
而且当它不等于停顿问题时,它甚至更糟因为不可能还不够困难。
user2357112支持Monica 2015年

2
或者用另一种(直截了当的)方式表达Doval的观点,这正是图灵完整语言有趣而有用的原因。实际工作通常不需要图灵完备性(一定在模块级别)。
Leushenko

@Doval:非常好。虽然确实不能拥有证明随机程序终止和/或正确性的算法,但是可以通过编写程序来证明其正确性来编写程序。
Giorgio

12

因为关于程序行为的几乎每个问题都是无法确定的。根据赖斯定理,任何形式的决策问题:

一些程序计算具有此属性的函数,其他程序计算不具有此属性的函数。给定程序P,由P计算的函数是否具有上述属性?

是无法决定的。因此,例如,您无法始终将计算输入平方的代码与非代码区分开。尽管在简单的情况下,通常可以证明某个函数可以执行或不执行该操作,但是没有适用于所有程序的通用过程。

赖斯定理几乎涵盖了所有有趣的行为不变式,因为这些陈述很少(如果有的话)谈论该方法的内部外观,只谈论该方法返回什么以及它对某些输入的响应会产生什么副作用。


3
您可能需要澄清一点:不是一个给定的程序,无论其病态如何,都可以抵抗所有分析,但是对于任何给定的分析,至少存在一个程序不能正确地归类。
内森·塔吉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.