공동귀납적 정확 실수 연산의 형식 검증
초록
이 논문은 실수를 공동귀납적 스트림으로 표현하고, 그 위에서 동형변환과 2차 변환(필드 연산 포함)을 수행하는 지연 알고리즘의 정확성을 Coq를 이용해 형식적으로 증명한다. 알고리즘은 부분적으로만 생산성을 보장하므로, Coq의 구성적 타입 이론이 요구하는 구문적 제한을 극복하는 방법을 제시한다. 또한 증명된 알고리즘이 실수에 대한 연속 함수와 일치함을 보인다.
상세 분석
본 연구는 Edalat‑Potts가 제안한 정확 실수 연산 체계에서 핵심이 되는 두 종류의 변환, 즉 동형(Homographic) 변환과 2차(Quadratic) 변환을 공동귀납적 스트림 형태로 구현하고, 그 구현이 수학적으로 올바른지를 Coq 증명 도구를 통해 검증한다. 실수는 무한히 이어지는 Möbius 변환(Möbius map)들의 스트림으로 표현되며, 이러한 스트림은 공동귀납(coinductive) 타입으로 정의된다. 동형 변환은 일반적인 선형 변환 a·x+b / (c·x+d) 형태이며, 2차 변환은 (a·x²+b·x+c) / (d·x²+e·x+f) 형태로 확장된다. 두 변환 모두 필드 연산(덧셈, 뺄셈, 곱셈, 나눗셈)의 특수 사례이므로, 이들의 형식적 검증은 정확 실수 연산 전체의 신뢰성을 보장한다는 점에서 중요하다.
알고리즘은 입력 스트림을 탐색하면서 필요한 경우 새로운 Möbius 변환을 앞에 삽입하고, 출력 스트림을 점진적으로 생성한다. 그러나 모든 입력에 대해 무한히 출력 스트림을 생성한다는 ‘생산성(productivity)’을 전역적으로 보장하지 못한다. 즉, 특정 입력 조합에서는 알고리즘이 중단될 위험이 있다. 이를 ‘부분 생산성(partial productivity)’이라고 부르며, Coq의 구조적 재귀와 공동귀납 규칙이 요구하는 전역적 무한 생산성 조건과 충돌한다.
논문은 이 문제를 해결하기 위해 두 가지 주요 기법을 도입한다. 첫째, 입력 스트림에 대한 사전 조건을 타입 수준에서 명시하여, Coq가 허용하는 형태의 ‘잘 정의된’ 입력만을 허용한다. 둘째, 부분 생산성을 다루는 ‘관측자(observer)’와 ‘지연(lazy)’ 연산자를 정의하고, 이를 통해 알고리즘이 중단되지 않는 경우에만 출력 스트림을 관찰하도록 설계한다. 이러한 접근은 Coq의 구성적 논리와 호환되면서도 실제 알고리즘의 동작을 정확히 모델링한다.
형식적 증명 부분에서는 각 변환이 실수 집합 ℝ 위의 연속 함수임을 보이고, 스트림 수준에서의 변환이 실수 수준의 연속성에 정확히 대응함을 증명한다. 특히, 공동귀납적 정의와 Coq의 ‘cofix’ 구문을 이용해 무한 스트림의 각 단계가 정의된 연산과 일치함을 보이며, 부분 생산성 조건이 만족될 때 전체 스트림이 무한히 생성된다는 것을 보장한다.
마지막으로, 구현된 Coq 스크립트와 증명 파일을 공개함으로써 다른 연구자들이 동일한 프레임워크를 확장하거나 다른 정확 연산에 적용할 수 있도록 한다. 이 작업은 형식 검증과 정확 실수 연산 사이의 격차를 메우는 중요한 사례로 평가된다.