이 분야에서 Liskov의 연구는 행동 하위 유형에 초점을 두 었으며,이 기사에서 논의 된 유형 시스템 안전성 외에도 하위 유형은 일부 계약에서 상위 유형이 보장하는 모든 불변량을 유지해야합니다. [3] 이 하위 유형 정의는 일반적으로 결정하기 어렵 기 때문에 유형 검사기로 확인할 수 없습니다.
보낸 사람 : http://www.wikiwand.com/en/Subtyping#/Function_types
이 분야에서 Liskov의 연구는 행동 하위 유형에 초점을 두 었으며,이 기사에서 논의 된 유형 시스템 안전성 외에도 하위 유형은 일부 계약에서 상위 유형이 보장하는 모든 불변량을 유지해야합니다. [3] 이 하위 유형 정의는 일반적으로 결정하기 어렵 기 때문에 유형 검사기로 확인할 수 없습니다.
보낸 사람 : http://www.wikiwand.com/en/Subtyping#/Function_types
답변:
o
Type 의 작동 계약이 T
모든 입력에 대해 중지되도록하십시오. 이제 o
하위 유형의 작업 이 S <: T
해당 계약을 충족 하는지 여부를 결정 하십시오. 중지 문제를 방금 해결했습니다 .
보다 일반적 S::o
으로 T::o
if 와 동일한 함수를 계산해야합니다 S <: T
. 두 프로그램이 같은 기능을 계산하는지 결정하는 것을 기능 문제 라고 하며 정지 문제를 해결하는 것과 같습니다.
일반적으로 사소한 런타임 속성을 정적으로 결정 하는 것은 거의 항상 정지 문제와 같습니다.
BigInteger sum(int[] arr) { BigInteger sum = BigInteger.ZERO; for (int x: arr) sum = sum.add(BigInteger.valueOf(x)); return sum; }
특정 메소드가 항상 정수 배열 요소의 합계를 리턴하고 다른 것은 수행하지 않는다는 것을 증명하는 것은 어렵지 않습니다 (인수가 널이 아닌 경우).
프로그램의 행동에 관한 거의 모든 질문은 결정 불가능하기 때문입니다. 으로 쌀의 정리 , 형태의 의사 결정 문제 :
일부 프로그램은이 속성이있는 함수를 계산하고 다른 프로그램은이 속성이없는 함수를 계산합니다. 프로그램 P가 주어지면, P에 의해 계산 된 함수는 위에서 언급 한 속성을 가지고 있습니까?
결정할 수 없습니다. 예를 들어 입력의 제곱을 계산하는 코드와 그렇지 않은 코드를 항상 구별 할 수는 없습니다. 간단한 경우에 함수가 그렇게하거나하지 않는다는 것을 증명하는 것이 종종 가능하지만 모든 프로그램에 적용되는 일반적인 절차는 없습니다.
거의 모든 흥미로운 행동 불변은 쌀의 정리에 속한다. 왜냐하면 이러한 진술은 그 방법이 내부적으로 어떻게 보이는지, 어떤 방식으로 돌아 오는지, 특정 입력에 대한 부작용으로 인한 부작용에 대해서는 거의 이야기하지 않기 때문이다.