user: 호어 논리란 무엇인가?

gpt: **호어 논리**, **플로이드-호어 논리** 또는 **호어 규칙**은 엄격하게 추론하기 위한 일련의 논리적 규칙을 갖춘 형식 체계이다. 1969년 영국의 컴퓨터 과학자이자 논리학자인 토니 호어는 호어 논리를 제안하였고, 이후 호어와 다른 연구자들이 호어 논리를 개선하였다. 원래 아이디어는 순서도에 대해 유사한 체계를 발표한 로버트 플로이드의 작업에서 비롯되었다.

user: 추론 규칙은?

gpt: ## 빈 명령 공리 도식
**빈 명령 공리 도식**은 다음과 같다.

## 할당 공리 도식
**할당 공리 도식**은 다음과 같다.

변수 를 자유 변수로 갖는 표명 에 대해, 는 에서 자유롭게 나타나는 를 각각 표현 로 치환하여 얻은 표명을 나타낸다.

할당 공리 도식은 이 거짓이라면 할당 이후 는 거짓이다.

유효한 세 쌍의 예는 다음과 같다.

치환을 통해 바뀌지 않은 전제조건은 모두 사후조건으로 넘어갈 수 있다. 첫 번째 예에서는 할당 으로 단순화할 수 있다.

할당 공리 도식을 통해 전제 조건을 찾기 위해서는 우선 사후 조건을 선택한 후 할당의 좌변에 있는 모든 변수를 할당의 우변에 있는 표현으로 치환하여야 한다. 이 과정에서 전제 조건과 사후 조건을 바꾼 가 이 규칙의 반례가 된다.
언뜻 보기에 올바를 것 같은 가 이 규칙의 반례가 된다.

주어진 사후 조건 이 전제 조건 을 유일하게 결정하는 반면, 역은 성립하지 않는다. 다음 호어 세 쌍들은 모두 할당 공리 도식의 유효한 예시이고 같은 전제 조건을 가지고 있지만 서로 다른 사후 조건을 갖는다.

호어가 제안한 할당 공리는 둘 이상의 이름이 동일한 저장된 값을 참조할 수 있는 경우 적용되지 않는다. 예를 들어, 호어 세 쌍 으로 놓아서 얻을 수 있으므로 할당 공리 도식의 유효한 예시이다. 하지만, 와 가 동일한 변수를 참조하는 경우 이는 올바르지 않다.

## 합성 규칙
**합성 규칙**은 다음과 같다.

프로그램 가 실행된 이후 프로그램 를 실행하는  프로그램을 으로 표기한다. 이때 는 **중간 조건**이라고 부른다.

예를 들어, 할당 공리의 다음 두 가지 예시
에서, 합성 규칙을 적용하여
와 같은 결론을 얻을 수 있다.

## 조건문 규칙
**조건문 규칙**에서, 과 부분에 공통되는 사후 조건 가 전체 조건문 의 사후 조건이 된다. 과 에서는 전제 조건에 각각 와 를 추가할 수 있다. 조건 에는 부작용이 없어야 한다.

조건문 규칙은 호어의 원본 논문에는 포함되어 있지 않다. 그러나

는 일회성 반복문인

와 동일한 효과가 있으므로, 조건문 규칙은 다른 추론 규칙으로부터 유도할 수 있다.

비슷한 방식으로, 반복, 반복, , , 같은 다른 파생 프로그램 구성에 대한 규칙도 호어의 원본 논문의 규칙으로부터 프로그램을 변환하여 유도할 수 있다.

## 결과 규칙
**결과 규칙**은 전제 조건을 강화하거나 사후 조건을 약화한다. 결과 규칙을 통해 얻는 새로운 호어 세 쌍은 일반적으로 전제가 되는 호어 세 쌍보다 약하지만, 원하는 것보다 더 강한 호어 세 쌍을 이미 증명하였을 때 구문론적으로 일치하는 호어 세 쌍을 얻기 위해 결과 규칙을 사용할 수 있다.

예를 들어, 다음을 검증하자.

조건부 규칙을 적용하여, 다음을 증명하면 충분하다.

그러나, 을 이끌어 내야 한다.

마찬가지로, 할당 공리 도식을 적용하면 를 이끌어 낼 수 있다.

거칠게 말해서, 결과 규칙은 너무 강한 전제로부터 얻는 정보 를 증명하기 위해서는 그만큼 강한 정보가 필요하지 않기 때문이다.

## 반복문 규칙
**반복문 규칙**은 다음과 같다.

여기서 는 반복 불변량으로, 반복문의 내용 에 의해 보존된다. 반복이 완료된 후 는 여전히 유지되고, 반복이 종료되려면 가 성립하여야 한다. 조건문 규칙과 마찬가지로 에는 부작용이 없어야 한다.

예를 들어,

는 반복문 규칙에 의해,

으로부터 추론할 수 있다. 이는 할당 공리 도식을 통해 쉽게 얻을 수 있다.
마지막으로 사후조건 으로 단순화할 수 있고, 이를 통해

와 같이 간단한 반복문 프로그램을 검증할 수 있다.

또 다른 예시로, 반복문 규칙을 사용하면 임의의 수 의 정확한 제곱근 를 계산하는 ― 가 정수 변수이고 제곱수가 아닌 경우에도 ― 다음과 같은 이상한 프로그램을 형식적으로 검증할 수 있다.

이는 결과 규칙과 빈 명령 규칙을 통해 증명할 수 있으므로, 추론 규칙을 따라 유효한 증명을 만든 것이다.
한편 이 프로그램의 반복문은 비어있고, 계속 반복한다고 하여도 계산에 진전이 없으므로 이 프로그램에 유효한 검증이 있다는 것은 이상하게 보일 수 있다. 사실, 이는 이상한 프로그램이 부분적으로 정확하다는 것을 검증한 것이다. 만약 프로그램이 종료된다면 는  의 제곱근 값을 포함하고 있음이 확실하지만, 다른 모든 경우에는 프로그램이 종료되지 않는다. 이 증명은 프로그램의 총 정확성을 증명한 것이 아니다.

## 총 정확성과 반복문 규칙
위의 일반적인 반복문 규칙을 다음 규칙으로 대체하면 호어 대수를 사용하여 총 정확성을, 즉 부분 정확성과 종료를 함께 증명할 수도 있다. 일반적으로, 중괄호 대신 대괄호를 사용하여 프로그램 정확성에 대한 다른 개념임을 나타낸다.

이 규칙에서는 반복 불변량 을 유지하는 동시에, 어떤 집합 위의 정초 관계 에 대해 값이 절대적으로 감소하는 표현식 을 사용하여 종료를 증명한다. 이러한 표현 를 **반복 변량**이라고 부른다. 는 정초 관계이므로, 절대 감소하는 안의 사슬은 유한한 길이만 가질 수 있다.  따라서 는 무한히 감소할 수 없고, 유한한 길이의 실행 이후 반복문이 종료한다는 증거가 된다.

반복 불변량 가 주어졌을 때, 조건 는 가 의 극소 원소가 아니라는 것을 이끌어내야 한다. 그렇지 않으면 반복문의 내용 가 더 이상 를 감소시킬 수 없고, 규칙의 전제가 거짓이 되기 때문이다.  호어의 원본 논문에서는 총 정확성에 관한 규칙을 제시하지 않았다 . 레이놀즈의 교과서에는 다음과 같은 총 정확성 규칙이 있다: 가 , , 에서 자유 변수가 아닌 정수 변수이고, 가 정수 표현일 때,

이전 절의 첫 번째 예시인

에서는, 확장된 반복문 규칙을 사용해서 총 정확성을 증명할 수 있다.

거칠게 말하자면, 매 반복마다 '종료까지 남은 거리' 가 음수가 아닌 상태를 유지하며 줄어든다는 것을 증명하여야 한다. 이 감소 과정은 자연수의 감소 수열을 이루므로, 유한한 횟수의 반복 이후에 종료되어야 한다.

증명 목표는 다음과 같이 단순화될 수 있다.

이는 다음과 같이 증명할 수 있다.

이전 절의 두 번째 예에서는 반복이 비어 있으므로 반복 내용에 의해 감소하는 표현 를 찾을 수 없고, 따라서 종료를 증명할 수 없다.