루프 변형은 루프의 모든 반복 전후에 true 인 문으로 정의됩니다. 그러나 그 정의가 너무 느슨한가? 구체적인 예를 살펴 보겠습니다 : 선형 검색.루프 불변성을 어떻게 정의합니까?
입력 : 인덱스 : N 번호 A = (a 1하는 2하는 3 ...하는 N) 및 V 값
출력의 순서 그래서 일반적인
linear_search(A, v)
1 for i ∈ {1, 2, ..., n}
2 if A[i] = v
3 return i
4 return NIL
: 내가되도록 V는 V = A 여기서
에서 발견되지 않으면 [I] 또는 NIL 내 의사 인 루프 불변량은 (왼쪽에서 오른쪽으로 검색하기 때문에) v가 현재 색인의 왼쪽에 있지 않거나 수학적으로 P: ∀p ∈ {1, 2, ..., i - 1}, A[p] ≠ v.
입니다. p Ø Ø가 false이기 때문에 시작시에도 분명히 사실입니다. 그러면 P 사실, 모든 보편적으로 정량화 된 문장은 조건문으로 생각할 수 있습니다. (그러나 비공식적으로 생각하는 것이 더 쉽습니다. 처음에는 v의 왼쪽에 아무것도 없습니다.)
제한이 적은 조건문을 사용할 수도 있습니다. 이 경우, Q: If A[i] = v, then 1 ≤ i ≤ n.
분명히 v가 발견되면 이것은 사실입니다. v가 발견되지 않으면, A [i] = v는 거짓이고 Q는 i의 값에 관계없이 참이됩니다. 알고리즘을 오른쪽에서 왼쪽으로 검색하도록 변경하면 Q가 true입니다.
어쩌면 우리는 그보다 덜 제한되기를 원할 것입니다. 항상 진실한 진술을 사용하는 것은 어떻습니까? R: Either A[i] = v or A[i] ≠ v.
루프의 반복마다 전후에 R이 유지됩니다.
P, Q 및 R 문 중 루프 불변으로 사용할 수있는 문장은 어느 것입니까?
루프 불변 값은 루프 자체의 '유용한'속성이어야합니다. 당신의 재산 R은 루프에 관계없이 더 반복됩니다. 그래서 IMO 만 P와 Q는 Q가 약하지만 루프 불변량으로 생각할 수 있습니다. –
나는 David Gries, The Science of Programming을 강력히 추천한다.이 주제는이 주제와 많은 것들을 체계적으로 개발한다. – Gene
가능한 복제본 - http://stackoverflow.com/questions/3221577/what-is-a-loop-invariant –