호어 논리 문서 원본 보기
←
호어 논리
둘러보기로 이동
검색으로 이동
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
{{위키데이터 속성 추적}} '''호어 논리'''({{Llang|en|Hoare logic}}), '''플로이드-호어 논리'''({{Llang|en|Floyd-Hoare logic}}) 또는 '''호어 규칙'''({{Llang|en|Hoare rules}})은 {{임시 링크|정확성 (컴퓨터 과학)|en|Correctness (Computer Science)|label=컴퓨터 프로그램의 정확성(correctness)}} 엄격하게 추론하기 위한 일련의 논리적 규칙을 갖춘 [[형식 체계]]이다. 1969년 영국의 컴퓨터 과학자이자 [[수리 논리학|논리학자]]인 [[토니 호어]]는 호어 논리를 제안하였고, 이후 호어와 다른 연구자들이 호어 논리를 개선하였다.<ref name="hoare">{{저널 인용|제목=An axiomatic basis for computer programming|저널=[[Communications of the ACM]]|성=Hoare|이름=C. A. R.|저자링크=토니 호어|url=https://dl.acm.org/doi/pdf/10.1145/363235.363259|날짜=October 1969|권=12|호=10|쪽=576–580|doi=10.1145/363235.363259}}</ref> 원래 아이디어는 [[순서도]]에 대해 유사한 체계를 발표한 [[로버트 플로이드]]의 작업에서 비롯되었다.<ref>{{저널 인용|제목=Assigning meanings to program|저널=Proceedings of the American Mathematical Society Symposia on Applied Mathematics|성=Floyd|이름=R. W.|url=https://www.cs.tau.ac.il/~nachumd/term/FloydMeaning.pdf|저자링크=로버트 플로이드|권=19|쪽=19–31|날짜=1967}}</ref> == 호어 세 쌍 == 호어 논리의 핵심 특징은 '''호어 세 쌍'''({{Llang|en|Hoare triple}})이다. 호어 세 쌍은 명령을 실행하는 것이 계산 상태를 어떻게 바꾸는지 설명한다. <math>P</math>와 <math>Q</math>가 '''[[표명]]'''({{lang|en|assertion}})이고 <math>C</math>가 '''명령'''({{lang|en|command}})일 때, 호어 세 쌍은 <math>\{P\} C \{Q\}</math>와 같은 형태이다.<ref group="note">호어의 원래 논문에서는 "<math>\{P\}C\{Q\}</math>" 대신 "<math>P\{C\}Q</math>"이 사용되었다.</ref> 이때 <math>P</math>는 '''전제 조건'''({{lang|en|precondition}}), <math>Q</math>는 '''사후 조건'''({{lang|en|postcondition}})으로, 위의 호어 세 쌍은 전제 조건이 충족된 상태에서 명령을 실행하였을 때 사후 조건이 성립함을 나타낸다. 각 표명은 [[1차 논리]]의 논리식이다. 호어 논리는 간단한 [[명령형 프로그래밍|명령형 프로그래밍 언어]]의 모든 구성에 대한 [[공리]]와 [[추론 규칙]]을 제공한다. 호어의 원본 논문에 있는 간단한 언어에 대한 추론 규칙 외에도, 호어를 비롯한 많은 연구자들은 다른 언어 구성에 대한 추론 규칙을 개발하였다. 예시로는 [[병행성|동시성]], [[함수 (컴퓨터 과학)|프로시저]], [[브랜치 (컴퓨터 과학)|점프]] 및 [[포인터 (프로그래밍)|포인터]]에 대한 추론 규칙이 있다. == 부분 정확성과 총 정확성 == 호어 세 쌍은 직관적으로 다음과 같은 뜻을 갖는다: 모든 상태에 대해, 상태가 <math>C</math>를 실행하기 전에 <math>P</math>를 만족하고, <math>C</math>를 실행하여 종료되었을 때, 그 결과 상태는 <math>Q</math>를 만족한다. 만약 <math>C</math>가 종료되지 않는다면 <math>Q</math>가 임의의 표명이더라도 호어 세 쌍은 유효하다. 이는 '종료된 이후의 상태'가 존재하지 않기 때문에, "종료된 이후의 상태는 <math>Q</math>를 만족한다"라는 명제가 공허하게 참이 된다고 설명할 수 있다. 예를 들어, <math>Q</math>를 false로 선택하면 <math>C</math>는 항상 종료되지 않는다는 것을 표현할 수 있다. 즉, 호어 논리는 프로그램의 '''부분 정확성'''({{lang|en|partial correctness}})만을 검증한다. '''총 정확성'''({{lang|en|total correctness}})을 보이기 위해서는 명령이 '''종료'''({{lang|en|termination}})하는지 추가로 검증해야 한다. 이는 별도의 방법을 사용하거나 반복문 규칙을 확장하여 증명할 수 있다.<ref name="Reynolds.2009">{{서적 인용|제목=Theories of Programming Languages|성=John C. Reynolds|저자링크=John C. Reynolds|연도=2009|출판사=Cambridge University Press}}) Here: Sect. 3.4, p. 64.</ref> 이 문서에서 '종료'는 계산이 언젠가 완료된다는 더 넓은 의미로 사용되고, 계산에 무한 루프가 없음을 의미한다. 이는 0으로 나누기 등 프로그램을 곧바로 중지시키는 구현 제한 위반이 없다는 것을 의미하지 않는다. 1969년 논문에서 호어는 구현 제한 위반이 없음을 수반하는 더 좁은 종료 개념을 사용하였다. 호어는 더 넓은 종료 개념을 선호한다고 하였는데, 그러한 개념이 표명의 구현 독립성을 유지하기 때문이다.<ref>Hoare (1969), p.578-579</ref> == 추론 규칙 == === 빈 명령 공리 도식 === '''[[NOP (코드)|빈 명령]] 공리 도식'''({{lang|en|empty statement axiom schema}})은 다음과 같다.<ref group="note">호어 규칙을 [[자연 연역]] 표현법으로 표현하였다. 예를 들어, <math>\dfrac{\alpha,\beta}{\phi}</math>는 "{{수학 변수|α}}와 {{수학 변수|β}}가 성립한다면 {{수학 변수|φ}}가 성립한다"를 의미한다. {{수학 변수|α}}, {{수학 변수|β}}는 추론 규칙의 '''전제'''({{lang|en|premise}})이고, {{수학 변수|φ}}는 추론 규칙의 '''결론'''({{lang|en|conclusion}})이다. 전제가 없는 추론 규칙을 '''공리'''({{lang|en|axiom}})라고 하고, <math>\dfrac{}{\quad\phi\quad}</math>으로 표기한다.</ref> : <math>\dfrac{}{\{P\}\texttt{skip}\{P\}}</math> {{모노|skip}} 문은 프로그램의 상태를 변경하지 않으므로, 실행 이전에 참이었던 것은 무엇이든 실행 이후에도 마찬가지로 참임을 나타낸다. === 할당 공리 도식 === '''할당 공리 도식'''({{lang|en|assignment axiom schema}})은 다음과 같다. : <math>\dfrac{}{\{P[E/x]\} x := E \{P\}}</math> 변수 {{수학 변수|x}}를 [[자유 변수와 종속 변수|자유 변수]]로 갖는 표명 {{수학 변수|P}}에 대해, <math>P[E/x]</math>는 {{수학 변수|P}}에서 [[자유 변수와 종속 변수|자유롭게 나타나는]] {{수학 변수|x}}를 각각 표현 {{수학 변수|E}}로 [[치환 실례|치환]]하여 얻은 표명을 나타낸다. 할당 공리 도식은 <math>P[E/x]</math>의 진리값은 할당 이후의 {{수학 변수|P}}의 진리값과 같다는 것을 의미한다. 따라서 <math>P[E/x]</math>이 할당 이전에 참이라면 할당 이후 {{수학 변수|P}}는 참이다. 한편 공리 도식에서 표명 <math>\neg P</math>를 사용하면, <math>\neg P[E/x]</math>이 할당 이전에 참일 때 할당 이후 <math>\neg P</math>가 참이라는 명제를 얻는다. 따라서 할당 공리의 이 또한 성립하는데, 할당 이전에 <math>P[E/x]</math>이 거짓이라면 할당 이후 {{수학 변수|P}}는 거짓이다. 유효한 세 쌍의 예는 다음과 같다. :* <math>\{ x+1 = 43 \} y := x + 1 \{ y = 43 \}</math> :* <math>\{ x + 1 \leq N \} x := x + 1 \{ x \leq N \}</math> 치환을 통해 바뀌지 않은 전제조건은 모두 사후조건으로 넘어갈 수 있다. 첫 번째 예에서는 할당 <math>y:=x+1</math>이후에도 <math>x+1=43</math>이라는 사실은 변하지 않으므로 표명 <math>x+1=43</math>은 사후 조건에 나타날 수 있다. 엄밀하게는, {{수학 변수|P}}를 "<math>y=43</math> 그리고 <math>x+1=43</math>"으로 놓고 공리 도식을 적용하여 얻을 수 있다. 이때 전제 조건 <math>P[(x+1)/y]</math>는 "<math>x+1=43</math> 그리고 <math>x+1=43</math>"이 되는데, 이는 주어진 전제 조건인 <math>x+1=43</math>으로 단순화할 수 있다. 할당 공리 도식을 통해 전제 조건을 찾기 위해서는 우선 사후 조건을 선택한 후 할당의 좌변에 있는 모든 변수를 할당의 우변에 있는 표현으로 치환하여야 한다. 이 과정에서 전제 조건과 사후 조건을 바꾼 <math>\{P\} x:=E \{P[E/x]\}</math>는 올바르지 않은 규칙이므로 주의하여야 한다. <math>\{ x = 5 \} x := 3 \{ 3 = 5 \}</math>가 이 규칙의 반례가 된다. 언뜻 보기에 올바를 것 같은 <math>\{P\} x:=E \{P \wedge x=E\}</math> 또한 올바르지 않은 규칙이다. <math>\{ x = 5 \} x := x + 1 \{ x = 5 \wedge x = x + 1 \}</math>가 이 규칙의 반례가 된다. 주어진 사후 조건 {{수학 변수|P}}이 전제 조건 <math>P[E/x]</math>을 유일하게 결정하는 반면, 역은 성립하지 않는다. 다음 호어 세 쌍들은 모두 할당 공리 도식의 유효한 예시이고 같은 전제 조건을 가지고 있지만 서로 다른 사후 조건을 갖는다. :* <math>\{ 0 \leq y\cdot y \wedge y\cdot y \leq 9 \} x := y \cdot y \{ 0 \leq x \wedge x \leq 9 \}</math> , :* <math>\{ 0 \leq y\cdot y \wedge y\cdot y \leq 9 \} x := y \cdot y \{ 0 \leq x \wedge y\cdot y \leq 9 \}</math>, :* <math>\{ 0 \leq y\cdot y \wedge y\cdot y \leq 9 \} x := y \cdot y \{ 0 \leq y\cdot y \wedge x \leq 9 \} </math>, :* <math>\{ 0 \leq y\cdot y \wedge y\cdot y \leq 9 \} x := y \cdot y \{ 0 \leq y\cdot y \wedge y\cdot y \leq 9 \}</math> 호어가 제안한 할당 공리는 둘 이상의 이름이 동일한 저장된 값을 참조할 수 있는 경우 적용되지 않는다. 예를 들어, 호어 세 쌍 <math>\{ y = 3 \} x := 2 \{ y = 3 \}</math>은 <math>\{P\}</math>와 <math>\{P[2/x]\}</math>를 <math>\{y=3\}</math>으로 놓아서 얻을 수 있으므로 할당 공리 도식의 유효한 예시이다. 하지만, {{수학 변수|x}}와 {{수학 변수|y}}가 동일한 변수를 참조하는 경우(앨리어싱) 이는 올바르지 않다. === 합성 규칙 === {| class="wikitable collapsible collapsed" align="right" !보조 변수 없는 swap 명령 검증 |- | {| style="border:1px solid grey;" |+ 아래의 세 명령(2, 4, 6행)은 변수 {{수학 변수|a}}와 {{수학 변수|b}}의 값을 보조 변수 없이 교환한다. 증명에서 {{수학 변수|a}}와 {{수학 변수|b}}의 초기값은 각각 상수 {{수학 변수|A}}와 {{수학 변수|B}}로 표시하였다. 증명은 7행부터 거꾸로 읽는 것이 가장 좋다. 예를 들어, 5행은 7행에서 {{수학 변수|a}} (6행의 대상 표현식)를 <math>a-b</math> (6행의 소스 표현식)으로 대체하여 얻는다. . <math>a-(a-b) = b</math> (5행→3행), <math>a+b-b = a</math> (3행→1행)와 같은 산술 표현 단순화가 암묵적으로 사용되었다. | '''번호''' | '''명령''' | colspan="6" | '''표명''' |- | '''1:''' | |<math>\{a = A \wedge b = B \}</math> |- | '''2:''' | <math>a := a + b;</math> |- |'''3:''' | | <math>\{ a - b = A \wedge b = B \}</math> |- | '''4:''' | <math>b := a - b;</math> |- | '''5:''' | | <math>\{b=A\wedge a-b=B\}</math> |- | '''6:''' | <math>a := a - b</math> |- | '''7:''' | | <math>\{b= A\wedge a = B \}</math> |} |} '''합성 규칙'''({{lang|en|rule of composition}})은 다음과 같다.<ref>{{서적 인용|url=http://www.cs.bham.ac.uk/research/projects/lics/|제목=Logic in Computer Science|성=Huth|이름=Michael|성2=Ryan|이름2=Mark|날짜=2004-08-26|판=second|출판사=CUP|쪽=276|isbn=978-0521543101}}</ref> : <math>\dfrac{\{P\} S \{Q\}\quad,\quad \{Q\} T \{R\}}{\{P\} S;T \{R\}}</math> 프로그램 {{수학 변수|S}}가 실행된 이후 프로그램 {{수학 변수|T}}를 실행하는 (즉 {{수학 변수|S}}, {{수학 변수|T}}를 순차적으로 실행하는) 프로그램을 <math>S;T</math>으로 표기한다. 이때 {{수학 변수|Q}}는 '''중간 조건'''({{lang|en|midcondition}})이라고 부른다. 예를 들어, 할당 공리의 다음 두 가지 예시 : <math>\{ x + 1 = 43 \} y := x + 1 \{ y = 43 \}</math>, <math>\{ y = 43 \} z := y \{ z = 43 \}</math> 에서, 합성 규칙을 적용하여 : <math>\{ x + 1 = 43 \} y := x + 1; z := y \{ z = 43 \}</math> 와 같은 결론을 얻을 수 있다. === 조건문 규칙 === : <math>\dfrac{\{B \wedge P\} S \{Q\}\quad,\quad \{\neg B \wedge P \} T \{Q\}}{\{P\} \texttt{if}\ B\ \texttt{then}\ S\ \texttt{else}\ T\ \texttt{endif} \{Q\}}</math> '''조건문 규칙'''({{lang|en|conditional rule}})에서, {{모노|then}}과 {{모노|else}} 부분에 공통되는 사후 조건 {{수학 변수|Q}}가 전체 조건문 {{모노|if...endif}}의 사후 조건이 된다.<ref>{{저널 인용|제목=Fifty years of Hoare's logic|저널=Formal Aspects of Computing|성=Apt|이름=Krzysztof R.|성2=Olderog|이름2=Ernst-Rüdiger|url=https://ir.cwi.nl/pub/29146|날짜=December 2019|권=31|호=6|쪽=759|doi=10.1007/s00165-019-00501-3}}</ref> {{모노|then}}과 {{모노|else}}에서는 전제 조건에 각각 {{수학 변수|B}}와 <math>\neg B</math>를 추가할 수 있다. 조건 {{수학 변수|B}}에는 부작용이 없어야 한다. 조건문 규칙은 호어의 원본 논문에는 포함되어 있지 않다.<ref name="hoare" /> 그러나 : <math>\texttt{if}\ B\ \texttt{then}\ S\ \texttt{else}\ T\ \texttt{endif}</math> 는 일회성 반복문인 : <math>\texttt{bool}\ b:=\texttt{true}; \texttt{while}\ B\wedge b\ \texttt{do}\ S; b:=\texttt{false}\ \texttt{done}; b:=\texttt{true}; \texttt{while}\ \neg B\wedge b\ \texttt{do}\ T; b:=\texttt{false}\ \texttt{done}</math> 와 동일한 효과가 있으므로, 조건문 규칙은 다른 추론 규칙으로부터 유도할 수 있다. 비슷한 방식으로, {{모노|for}} 반복, {{모노|do...until}} 반복, {{모노|switch}}, {{모노|break}}, {{모노|continue}} 같은 다른 파생 프로그램 구성에 대한 규칙도 호어의 원본 논문의 규칙으로부터 [[프로그램 변환|프로그램을 변환하여]] 유도할 수 있다. === 결과 규칙 === : <math>\dfrac{P_1 \rightarrow P_2\quad ,\quad \{P_2\} S \{Q_2\}\quad ,\quad Q_2 \rightarrow Q_1}{\{P_1\} S \{Q_1\}}</math> '''결과 규칙'''({{lang|en|consequence rule}})은 전제 조건을 강화하거나 사후 조건을 약화한다. 결과 규칙을 통해 얻는 새로운 호어 세 쌍은 일반적으로 전제가 되는 호어 세 쌍보다 약하지만, 원하는 것보다 더 강한 호어 세 쌍을 이미 증명하였을 때 구문론적으로 일치하는 호어 세 쌍을 얻기 위해 결과 규칙을 사용할 수 있다. 예를 들어, 다음을 검증하자. : <math>\{0 \leq x \leq 15 \}\texttt{if}\ x<15\ \texttt{then}\ x:=x+1\ \texttt{else}\ x:=0\ \texttt{endif} \{0 \leq x \leq 15 \}</math> 조건부 규칙을 적용하여, 다음을 증명하면 충분하다. * {{모노|then}}에 해당하는 <math>\{0 \leq x \leq 15 \wedge x < 15 \} x:=x+1 \{ 0 \leq x \leq 15 \}</math>, 또는 단순화하여 <math>\{0 \leq x < 15 \} x:=x+1 \{0 \leq x \leq 15 \}</math>를 증명하여야 한다. * {{모노|else}}에 해당하는 <math>\{0 \leq x \leq 15 \wedge x \geq 15\} x:=0 \{0 \leq x \leq 15\}</math>, 또는 단순화하여 <math>\{x=15\} x:=0 \{0 \leq x \leq 15 \}</math>를 증명하여야 한다. 그러나, <math>P</math>를 <math>0 \le x \le 15</math>로 두어 할당 공리 도식을 적용하면 <math>\{0 \leq x+1 \leq 15\} x:=x+1 \{0 \leq x \leq 15\}</math>, 또는 단순화하여 <math>\{-1 \leq x < 15\} x:=x+1 \{0 \leq x \leq 15\}</math>를 얻는다. 이 호어 세 쌍의 전제는 <math>\{0 \leq x < 15\}</math>보다 약하므로, 결과 규칙을 적용하여 <math>\{0 \leq x < 15\} x:=x+1 \{0 \leq x \leq 15\}</math>을 이끌어 내야 한다. 마찬가지로, 할당 공리 도식을 적용하면 <math>\{0 \leq 0 \leq 15\} x:=0 \{0 \leq x \leq 15\}</math>, 또는 단순화하여 <math>\{\texttt{true}\} x:=0 \{0 \leq x \leq 15\}</math>를 얻는다. 이 호어 세 쌍의 전제는 <math>\{x = 15\}</math>보다 약하므로, 결과 규칙을 적용하여 <math>\{x=15\} x:=0 \{0 \leq x \leq 15 \}</math>를 이끌어 낼 수 있다. 거칠게 말해서, 결과 규칙은 너무 강한 전제로부터 얻는 정보 <math>\{x=15\}</math>를 "잊어버리는" 효과를 준다. <math>\{x=15\} x:=0 \{0 \leq x \leq 15 \}</math>를 증명하기 위해서는 그만큼 강한 정보가 필요하지 않기 때문이다. === 반복문 규칙 === '''반복문 규칙'''({{lang|en|while rule}})은 다음과 같다. : <math>\dfrac{\{P \wedge B\} S \{P\}}{\{P\} \texttt{while}\ B\ \texttt{do}\ S\ \texttt{done} \{\neg B \wedge P\}}</math> 여기서 {{수학 변수|P}}는 [[반복 불변량]]({{lang|en|loop invariant}})으로, 반복문의 내용 {{수학 변수|S}}에 의해 보존된다. 반복이 완료된 후 {{수학 변수|P}}는 여전히 유지되고, 반복이 종료되려면 <math>\neg B</math>가 성립하여야 한다. 조건문 규칙과 마찬가지로 {{수학 변수|B}}에는 부작용이 없어야 한다. 예를 들어, : <math>\{x \leq 10\} \texttt{while}\ x<10\ \texttt{do}\ x:=x+1\ \texttt{done} \{\neg x < 10 \wedge x \leq 10\}</math> 는 반복문 규칙에 의해, : <math>\{x \leq 10 \wedge x < 10\} x := x + 1 \{x \leq 10 \}</math>, 또는 단순화하여 <math>\{x < 10\} x := x + 1 \{x \leq 10 \}</math> 으로부터 추론할 수 있다. 이는 할당 공리 도식을 통해 쉽게 얻을 수 있다. 마지막으로 사후조건 <math>\{\neg x <10 \wedge x\leq 10\}</math>을 <math>\{x=10\}</math>으로 단순화할 수 있고, 이를 통해 : <math>\{x \leq 10\} \texttt{while}\ x<10\ \texttt{do}\ x:=x+1\ \texttt{done} \{x = 10\}</math> 와 같이 간단한 반복문 프로그램을 검증할 수 있다. 또 다른 예시로, 반복문 규칙을 사용하면 임의의 수 {{수학 변수|a}}의 정확한 제곱근 {{수학 변수|x}}를 계산하는 ― {{수학 변수|x}}가 정수 변수이고 {{수학 변수|a}} 제곱수가 아닌 경우에도 ― 다음과 같은 이상한 프로그램을 형식적으로 검증할 수 있다. : <math>\{\texttt{true}\} \texttt{while}\ x\cdot x \neq a\ \texttt{do}\ \texttt{skip}\ \texttt{done} \{x \cdot x = a \wedge \texttt{true}\}</math> {{수학 변수|P}}를 {{모노|true}}로 놓아 반복문 규칙을 적용하여, 다음을 증명하면 된다. : <math>\{\texttt{true} \wedge x\cdot x \neq a\} \texttt{skip} \{\texttt{true}\}</math> 이는 결과 규칙과 빈 명령 규칙을 통해 증명할 수 있으므로, 추론 규칙을 따라 유효한 증명을 만든 것이다. 한편 이 프로그램의 반복문은 비어있고, 계속 반복한다고 하여도 계산에 진전이 없으므로 이 프로그램에 유효한 검증이 있다는 것은 이상하게 보일 수 있다. 사실, 이는 이상한 프로그램이 부분적으로 정확하다({{lang|en|partially correct}})는 것을 검증한 것이다. 만약 프로그램이 종료된다면 {{수학 변수|x}}는 (우연히) {{수학 변수|a}}의 제곱근 값을 포함하고 있음이 확실하지만, 다른 모든 경우에는 프로그램이 종료되지 않는다. 이 증명은 프로그램의 총 정확성({{lang|en|totally correct}})을 증명한 것이 아니다. === 총 정확성과 반복문 규칙 === 위의 일반적인 반복문 규칙을 다음 규칙으로 대체하면 호어 대수를 사용하여 총 정확성을, 즉 부분 정확성과 종료를 함께 증명할 수도 있다. 일반적으로, 중괄호 대신 대괄호를 사용하여 프로그램 정확성에 대한 다른 개념임을 나타낸다. : <math>\dfrac{<\ \text{is a well-founded ordering on the set}\ D\quad,\quad [P \wedge B \wedge t \in D \wedge t = z] S [P \wedge t \in D \wedge t < z ]}{[P \wedge t \in D] \texttt{while}\ B\ \texttt{do}\ S\ \texttt{done} [\neg B \wedge P \wedge t \in D]}</math> 이 규칙에서는 반복 불변량 {{수학 변수|P}}을 유지하는 동시에, 어떤 집합 {{수학 변수|D}} 위의 [[정초 관계]] {{수학 변수|<}}에 대해 값이 절대적으로 감소하는 표현식 {{수학 변수|t}}을 사용하여 종료를 증명한다. 이러한 표현 {{수학 변수|t}}를 '''반복 변량'''({{lang|en|loop variant}})이라고 부른다. {{수학 변수|<}}는 정초 관계이므로, 절대 감소하는 {{수학 변수|D}}안의 [[전순서 집합|사슬]]은 유한한 길이만 가질 수 있다. (예를 들어, [[자연수]] <math>\mathbb{N}</math> 위의 순서 {{수학 변수|<}}는 정초 관계이다. 한편, 정수 <math>\mathbb{Z}</math>와 [[양수 (수학)|양의 실수]] <math>\mathbb{R}^+</math> 위의 순서 {{수학 변수|<}}에 대해서는 무한히 감소하는 수열을 선택할 수 있고, 이들은 정초 관계가 아니다.) 따라서 {{수학 변수|t}}는 무한히 감소할 수 없고, 유한한 길이의 실행 이후 반복문이 종료한다는 증거가 된다. 반복 불변량 {{수학 변수|P}}가 주어졌을 때, 조건 {{수학 변수|B}}는 {{수학 변수|t}}가 {{수학 변수|D}}의 [[극대 원소와 극소 원소|극소 원소]]가 아니라는 것을 이끌어내야 한다. 그렇지 않으면 반복문의 내용 {{수학 변수|S}}가 더 이상 {{수학 변수|t}}를 감소시킬 수 없고, 규칙의 전제가 거짓이 되기 때문이다. (이는 총 정확성을 나타내는 다양한 표기법 중 하나이다.)<ref group="note"> 호어의 원본 논문에서는 총 정확성에 관한 규칙을 제시하지 않았다 (p.579 논의 참조). 레이놀즈(Reynolds)의 교과서에는 다음과 같은 총 정확성 규칙이 있다: {{수학 변수|z}}가 {{수학 변수|P}}, {{수학 변수|B}}, {{수학 변수|S}}에서 자유 변수가 아닌 정수 변수이고, {{수학 변수|t}}가 정수 표현일 때, <math>\dfrac{P \wedge B \rightarrow 0\leq t\quad ,\quad [P \wedge B \wedge t=z] S [P \wedge t<z]}{[P] \texttt{while}\ B\ \texttt{do}\ S\ \texttt{done} [P \wedge \neg B]}</math>이다.</ref> 이전 절의 첫 번째 예시인 : <math>[x \leq 10]\texttt{while}\ x < 10\ \texttt{do}\ x:=x+1\ \texttt{done} [\neg x < 10 \wedge x \leq 10]</math> 에서는, 확장된 반복문 규칙을 사용해서 총 정확성을 증명할 수 있다. {{수학 변수|D}}를 보통 순서를 가진 자연수 집합, 표현 {{수학 변수|t}}를 <math>10 - x</math>으로 놓고 반복문 규칙을 적용하여, 다음 목표를 얻는다. : <math>[x \leq 10 \wedge x < 10 \wedge 10-x \geq 0 \wedge 10-x = z] x:= x+1 [x \leq 10 \wedge 10-x \geq 0 \wedge 10-x < z]</math> 거칠게 말하자면, 매 반복마다 '종료까지 남은 거리' <math>10-x</math>가 음수가 아닌 상태를 유지하며 줄어든다는 것을 증명하여야 한다. 이 감소 과정은 자연수의 감소 수열을 이루므로, 유한한 횟수의 반복 이후에 종료되어야 한다. 증명 목표는 다음과 같이 단순화될 수 있다. : <math>[x < 10 \wedge 10-x = z] x:=x+1 [x \leq 10 \wedge 10-x < z]</math> 이는 다음과 같이 증명할 수 있다. * 할당 규칙을 통해 <math>[x+1 \leq 10 \wedge 10-x-1 < z] x:=x+1 [x \leq 10 \wedge 10-x < z]</math>을 얻는다. * 결과 규칙에 따라 <math>[x+1 \leq 10 \wedge 10-x-1 < z]</math>를 <math> [x < 10 \wedge 10-x = z]</math>으로 강화할 수 있다. 이전 절의 두 번째 예에서는 반복이 비어 있으므로 반복 내용에 의해 감소하는 표현 {{수학 변수|t}}를 찾을 수 없고, 따라서 종료를 증명할 수 없다. == 같이 보기 == {{columns-list|* [[표명]] * [[표시적 의미론]] * [[규약에 따른 설계]]({{lang|en|Design by contract}}) * {{임시링크|동적 논리|en|Dynamic logic (modal logic)}}({{lang|en|Dynamic logic}}) * [[형식적 검증]]({{lang|en|Formal verification}}) * [[반복 불변량]]({{lang|en|loop invariant}}) * {{임시링크|술어변환의미론|en|Predicate transformer semantics}}({{lang|en|Predicate transformer semantics}}) * [[정적 프로그램 분석]]|colwidth=20em}} == 각주 == {{각주|group=note}} == 참고자료 == {{각주}} == 읽을거리 == * Robert D. Tennent. ''[http://www.cs.queensu.ca/home/specsoft/ Specifying Software]'' (호어 논리에 대한 소개가 포함된 교과서, 2002년){{ISBN|0-521-00401-2}} == 외부 링크 == * [https://web.archive.org/web/20071117054808/http://www.key-project.org/download/hoare/ KeY-Hoare] [[KeY]] 정리증명기를 기반으로 구축된 반자동 검증 시스템. 간단한 while 언어에 대한 호어 대수가 특징이다. * [http://j-algo.binaervarianz.de/index.php?language=en j-Algo-modul 호어 대수] {{웹아카이브|url=https://web.archive.org/web/20110505192011/http://j-algo.binaervarianz.de/index.php?language=en}} — 알고리즘 시각화 프로그램 j-Algo의 호어 대수 시각화 {{전거 통제}} [[분류:정적 프로그램 분석]] [[분류:1969년 컴퓨팅]] [[분류:컴퓨터 과학 내 논리]]
이 문서에서 사용한 틀:
틀:Columns-list
(
원본 보기
)
틀:ISBN
(
원본 보기
)
틀:Lang
(
원본 보기
)
틀:Llang
(
원본 보기
)
틀:각주
(
원본 보기
)
틀:모노
(
원본 보기
)
틀:서적 인용
(
원본 보기
)
틀:수학 변수
(
원본 보기
)
틀:웹아카이브
(
원본 보기
)
틀:위키데이터 속성 추적
(
원본 보기
)
틀:임시 링크
(
원본 보기
)
틀:저널 인용
(
원본 보기
)
틀:전거 통제
(
원본 보기
)
호어 논리
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
한국어
보기
읽기
원본 보기
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보