<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/resources/xsl/jats-html.xsl"?>
<article article-type="research-article" dtd-version="1.1" xml:lang="ko" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
	<journal-meta>
		<journal-id journal-id-type="publisher-id">jkits</journal-id>
		<journal-title-group>
		<journal-title>한국지식정보기술학회 논문지</journal-title>
		<journal-title xml:lang="en">Journal of Knowledge Information Technology and Systems</journal-title>
		</journal-title-group>
		<issn pub-type="ppub">1975-7700</issn>
		<publisher>
		<publisher-name>한국지식정보기술학회</publisher-name>
		<publisher-name xml:lang="en">Korea Knowledge Information Technology Society</publisher-name>
		</publisher>
	</journal-meta>
	<article-meta>
		<article-id pub-id-type="publisher-id">jkits_2020_15_02_185</article-id>
		<article-id pub-id-type="doi">10.34163/jkits.2020.15.2.004</article-id>
		<article-categories>
			<subj-group>
				<subject>Research Article</subject>
			</subj-group>
		</article-categories>
		<title-group>
			<article-title>호어 논리와 커리-하워드 대응관계 사이의 연관성 분석</article-title>
			<trans-title-group xml:lang="en">
				<trans-title>A Study on the Relationship Between Hoare Logic and Curry-Howard Correspondence</trans-title>
			</trans-title-group>
		</title-group>
		<contrib-group>
			<contrib contrib-type="author" xlink:type="simple">
				<name-alternatives>
					<name name-style="eastern">
						<surname>이</surname>
						<given-names>계식</given-names>
					</name>
					<name name-style="western" xml:lang="en">
						<surname>Lee</surname>
						<given-names>Gyesik</given-names>
					</name>
				</name-alternatives>
				<xref ref-type="fn" rid="fn001">*</xref>
					<xref ref-type="aff" rid="A1"><sup>1</sup></xref>
			</contrib>
			<contrib contrib-type="author" xlink:type="simple">
				<name-alternatives>
					<name name-style="eastern">
						<surname>김</surname>
						<given-names>화정</given-names>
					</name>
					<name name-style="western" xml:lang="en">
						<surname>Kim</surname>
						<given-names>Hwajeong</given-names>
					</name>
				</name-alternatives>
				<xref ref-type="aff" rid="A2"><sup>2</sup></xref>
			</contrib>
					</contrib-group>
		<aff-alternatives id="A1">
			<aff><sup>1</sup><italic>한경대학교 컴퓨터응용수학부 교수</italic></aff>
			<aff xml:lang="en"><italic>School of Computer Engineering&#x26;Applied Mathematics, Hankyong National University</italic></aff>
		</aff-alternatives>
		<aff-alternatives id="A2">
			<aff><sup>2</sup><italic>한남대학교 수학과 교수</italic></aff>
			<aff xml:lang="en"><italic>Department of Mathematics, Hannam University</italic></aff>
		</aff-alternatives>
		<author-notes>
			<fn id="fn001"><label>*</label><p>Corresponding author is with the School of Computer Engineering&#x26;Applied Mathematics, Hankyong National University, 327 Jungang-ro Anseong-si Gyeonggi-do, 17579, KOREA.</p><p><italic>E-mail address</italic>: <email>gslee@hknu.ac.kr</email></p></fn>
		</author-notes>
		<pub-date pub-type="ppub">
			<month>04</month>
			<year>2020</year>
		</pub-date>
		<volume>15</volume>
		<issue>2</issue>
		<fpage>185</fpage>
		<lpage>193</lpage>
		<history>
			<date date-type="received">
				<day>22</day>
				<month>03</month>
				<year>2020</year>
			</date>
			<date date-type="rev-recd">
				<day>07</day>
				<month>04</month>
				<year>2020</year>
			</date>
			<date date-type="accepted">
				<day>10</day>
				<month>04</month>
				<year>2020</year>
			</date>
		</history>
		<permissions>
			<copyright-statement>&#x00A9; 2020 KKITS All rights reserved</copyright-statement>
			<copyright-year>2020</copyright-year>
		</permissions>
		<abstract>
		<title>요약</title>
		<p>컴퓨터 프로그램과 논리와의 관계는 널리 알려져 있으며, 두 분야가 밀접하게 관련된다는 사실이 자주 언급된다. 반면에 컴퓨터 프로그램과 논리가 구체적으로 어떻게 연관되어 있는가를 배울 수 있는 기회는 많지 않다. 그럼에도 불구하고 컴퓨터 프로그램과 논리 사이의 연관성의 중요성은 매우 강조된다. 다만 그 강조가 한쪽이 다른 한쪽에 도움된다는 정도로 머무는 것이 일반적이다. 예를 들어, 컴퓨터 프로그래밍을 이용하여 논리적 사고를 높인다거나, 논리적 사고를 잘하면 컴퓨터 프로그래밍에 도움된다 등과 같은 주장들이다. 그런데 컴퓨터 프로그램과 논리의 관계는 그 이상이다. 본 논문에서는 컴퓨터 프로그램과 논리의 연관성에 대한 연구를 소개한 후 기존의 연구들 사이의 차이점과 공통점을 밝힌다. 보다 구체적으로는 명령형 프로그래밍 언어로 작성된 프로그램의 건전성을 논리적으로 검증하기 위해 사용되는 호어 논리 (Hoare logic)와 함수형 프로그래밍 언어의 기반을 제공한 커리-하워드 대응관계가 본질적으로 동일한 내용을 다른 방식으로 표현한다는 사실을 밝힌다. 논문의 결론에서 호어 논리와 커리-하워드 대응관계에 대한 몇 가지 성질을 언급한다. 또한 이어지는 프로그래밍 언어 교육과 관련된 몇 가지 연구 아이디어를 소개한다.</p>
		</abstract>
		<trans-abstract xml:lang="en">
		<title>ABSTRACT</title>
		<p>The relation between computer programs and mathematical logic is well known, Although one can easily find comments on the relationship when one reads books and articles about computer programming, it is difficult to find proper materials explaining the relationship in a scientific manner. Nevertheless, people used to mention how important the relationship between computer programs and mathematical logic is. The problem is that it is more focused on the fact that how helpful it is to learn one area in learning the other area. However, there is more than that between computer programs and mathematical logic. In this paper, we introduce some researches about the relationship and show different and common aspects of them. In particular, Hoare logic and Curry-Howard correspondence is compared. Hoare logic was invented for rigorous verification of programs in a C-like imperative programming language, while Curry-Howard correspondence explains the relationship between functional programming language like Haskell and mathematical logic. We show that Hoare logic and Curry-Howard correspondence are essentially the same in the sense that they represent the same things just in different manners. We close the paper with some remarks about Hoare logic and the Curry-Howard correspondence and ideas of further research with respect to teaching and learning programming languages in the university level based on the relationship between logic and programming.</p>
		</trans-abstract>
		<kwd-group kwd-group-type="author" xml:lang="en">
<title>K E Y W O R D S</title>
			<kwd>Hoare logic</kwd>
			<kwd>Curry-Howard correspondence</kwd>
			<kwd>Correctness proof</kwd>
			<kwd>Mathematical logic</kwd>
			<kwd>Lambda calculus</kwd>
		</kwd-group>
	</article-meta>
</front>
<body>
<sec id="sec001" sec-type="intro">
	<title>1. 서 론</title>
	<p>컴퓨터 프로그램과 논리와의 관계는 널리 알려져 있으며, 두 분야가 밀접하게 관련된다는 사실이 자주 언급된다. 반면에 컴퓨터 프로그램과 논리가 구체적으로 어떻게 연관되어 있는가를 배울 수 있는 기회는 많지 않다. 실제로 컴퓨터 공학 분야의 학과에서 전산 논리를 전공 교과목으로 수강할 기회가 매우 적다. 국내 대학에서뿐만 아니라 국외 대학의 경우도 크게 다르지 않다. 컴퓨터 공학 분야 내에서 전산논리 관련 학회와 관련된 전문가들은 소수에 불과하다는 사실이 이를 반증한다.</p>
	<p>그럼에도 불구하고 컴퓨터 프로그램과 논리 사이의 연관성의 중요성은 매우 강조된다. 다만 그 강조가 한쪽이 다른 한쪽에 도움된다는 정도로 머무는 것이 일반적이다. 예를 들어, 컴퓨터 프로그래밍을 이용하여 논리적 사고를 높인다거나, 논리적 사고를 잘하면 컴퓨터 프로그래밍에 도움된다 등과 같은 주장들이다. 그런데 컴퓨터 프로그램과 논리의 관계는 그 이상이다.</p>
	<p>본 논문에서는 컴퓨터 프로그램과 논리의 연관성에 대한 기존의 연구들 사이의 차이점과 공통점을 밝힌다. 보다 구체적으로는 명령형 프로그래밍 언어로 작성된 프로그램의 건전성(soundness)을 논리적으로 검증하기 위해 사용되는 호어 논리(Hoare logic)와 함수형 프로그래밍 언어의 기반을 제공한 커리-하워드 대응관계(Curry-Howard correspondence)가 본질적으로 동일한 내용을 다른 방식으로 표현한다는 사실을 밝힌다.</p>
	<p>논문의 구성은 다음과 같다. 2장은 일상에서의 프로그램과 컴퓨터 프로그램의 차이점과 공통점을 살펴본다. 3장은 컴퓨터 프로그래밍의 핵심 요소를 살펴본다. 4장은 명령형 프로그램의 건전성을 호어 논리로 검증하는 방법을 간략하게 소개한다. 5장은 커리-하워드 대응관계를 다루며, 6장에서 호어 논리와 커리-하워드 대응관계가 사실상 동일함을 밝힌다. 7장은 본문에서 다룬 내용을 정리 요약한 후 남겨진 과제들을 설명한다.</p>
</sec>
<sec id="sec002">
	<title>2. 프로그램 vs. 컴퓨터 프로그램</title>
	<p>일반적으로 언급되는 ‘프로그램’이란 단어는 아래와 같이 이해된다.</p>
<p>　</p>
	<p>&#8226; 시간관리: 계획적인 시간 배분을 통한 관리 또는 프로젝트 진행계획 및 관리 등.</p>
	<p>&#8226; 일정(스케줄): 예정된 일, 사건 등을 발생 시간 순서대로 나열한 시간목록, 버스/기차/비행기 시간표, 음악 콘서트/ 스포츠 프로그램 등.</p>
	<p>&#8226; 계획(planning): 특정 목표를 달성하기 위해 요구되는 활동에 대한 사고 처리과정 또는 사고 과정과 관련된 뇌의 연속처리기능 등.</p>
<p>　</p>
	<p>프로그램을 사용하는 목적은 보통 (1) 특정 목표를 달성학기 위한 처리과정 명시, (2) 출발점에서 도착지까지의 여정 묘사, (3) 현재 준비된 것을 이용하여 원하는 결과를 이뤄내는 과정, (4) 전제로부터 결론을 유도하는 과정 등으로 이해된다.</p>
	<p>반면에 컴퓨터 프로그램은 컴퓨터가 수행해야 할 작업들을 모아 놓은 명령문들의 모음이다. 즉, 특정 문제를 해결하기 위한 일련의 명령문 집합체이다. 또한 특정 프로그래밍 언어를 이용하여 컴퓨터 프로그래머가 작성한다.</p>
	<p>일반 프로그램과 컴퓨터 프로그램 사이의 주요 차이점은 사용되는 언어이다. 일반 프로그램은 한국어, 영어, 중국어, 스페인어 등 자연어를 사용하며, 컴퓨터 프로그램은 C, 자바, 파이썬, 자바스크립트, 하스켈 등 컴퓨터 프로그래밍 언어로 작성된다. 이외에 다른 근본적인 차이점은 없다.</p>
	<p>실제로 컴퓨터 프로그래밍은 특정 목적을 달성하기 위해 컴퓨터가 실행할 수 있는 프로그램을 디자인하는 과정이며, 프로그램 디자인은 목적 및 과제 분석, 알고리즘 작성, 알고리즘 정확도 및 시간/공간 복잡도 분석, 알고리즘 구현 등을 포함한다. 또한 컴퓨터 프로그램은 특정 프로그래밍 언어로 작성된 소스코드로 제시되는데 이는 시간 관리, 일정, 계획 등을 보여주는 프로그램 안내책자와 동일한 기능을 갖는다.</p>
</sec>
<sec id="sec003">
	<title>3. 프로그래밍 언어</title>
	<p>컴퓨터 프로그래밍 언어는 컴퓨터 프로그램 작성을 위해 사용되는 언어이며, 컴퓨터가 수행해야 할 명령문들을 작성할 수 있도록 도와주는 기호와 문법으로 구성된다. 또한 자연어와 다음 두 가지 측면에서 구별된다.</p>
	<p>첫째, 구문(syntax)에 엄격하다. 즉, 컴퓨터가 수행해야 할 명령문을 작성할 때 작성문법을 철저하게 지켜야 한다. 둘째, 의미(semantics)에 엄격하다. 상황과 문맥에 따라 다른 의미를 가질 수 있는 자연어 문장과는 달리 명령문 수행방식 또한 지정되어서 명령문의 의미는 변하지 않는다.</p>
	<p>프로그래밍 언어는 일반 언어와 다른 구조와 형식을 갖는다. 처음 프로그래밍 언어를 접하는 사람들의 경우 한국인이 러시아어, 아랍어 등을 처음 접할 때의 느낌을 받을 것이다. 하지만 문법과 어휘를 학습하면 자연어보다 쉽게 프로그래밍 언어에 익숙해진다.</p>
	<p>가장 오래된 프로그래밍 언어이면서도 현재 가장 많이 사용되는 언어 중 하나인 C 프로그래밍 언어와 유사한 미니 명령형 언어를 이용하여 프로그래밍의 구문과 의미를 소개한다. 예를 들어, 아래 코드를 살펴보자.&#x003C;<xref ref-type="table" rid="t001">표 1</xref>&#x003E;의 프로그램은 콜라츠추측(Collatz conjecure)을 구현한 간단한 프로그램이다. 임의의 양의 정수에 대해 짝수이면 2로 나누고, 홀수이면 세 배 더하기 1을 하는 과정을 결과가 0이 될 때까지 반복적용하며, 최종적으로 0에 다다를 때까지 적용된 횟수(count)를 내준다.</p>
	<table-wrap id="t001">
		<label>표 1.</label>
		<caption>
			<title>콜라츠 추측 프로그램</title>
			<p>Table 1. Collatz conjecture program</p>
		</caption>
		<table frame="box" rules="all" width="100%">
			<tbody>
				<tr>
<td>
　input  n:<break/>
　　count    =  0<break/>
　　while  (n&gt;0){<break/>
　　　if    n%2  ==  0    then<break/>
　　　　n  =  n/2<break/>
　　　else<break/>
　　　　n  =  3*n+1;<break/>
　　　count  = count+1<break/>
　　}<break/>
　return count</td></tr>
			</tbody>
		</table>
	</table-wrap>
	<p>콜라츠 추측은 위 프로그램이 임의의 양의 정수 n에 대해 항상 종료한다는 주장이다.<xref ref-type="fn" rid="fb001">*</xref> 위 프로그램에 사용된 프로그래밍 요소는 변수 선언, 조건 제어문, while 반복문 등 몇 되지 않는다. 하지만 언급된 요소들만으로 충분히 강력한 프로그래밍 언어<xref ref-type="fn" rid="fb002">**</xref>를 구현할 수 있다. &#x003C;<xref ref-type="table" rid="t001">표 1</xref>&#x003E;의 프로그램 작성을 가능하게 하는 미니 명령형 언어의 구문은 다음과 같다.</p>
	<table-wrap id="t002">
		<label>표 2.</label>
   		<caption>
			<title>미니 명령형 언어 구문</title>
			<p>Table 2. Mini imperative language syntax</p>
   		</caption>
   		<table frame="box" rules="all" width="100%">
   			<tbody>
      				<tr><td>
　Prog　::= input x1, …, xn:<break/>
　　　　　　C<break/>
　　　　　return E<break/>
　<break/>
　C　::=　skip<break/>
　　　　|  V  =    E<break/>
　　　　|  if  E    then  S  else    S<break/>
　　　　|    while  E  {    C  }<break/>
　　　　|  C  ;    C<break/>
　<break/>
　E　::= N  |    V  |  (    E  O  E  )   <break/>
　O　::= + |  -    |  &lt;  |  = 
</td></tr>
			</tbody>
		</table>
	</table-wrap>
	<p>&#x003C;<xref ref-type="table" rid="t002">표 2</xref>&#x003E;의 미니 명령형 언어에 사용된 구문은 다음과 같다.</p>
<p>　</p>
	<p>Prog : 프로그램 집합</p>
	<p>C : 명령문 집합</p>
	<p>V : 변수 집합</p>
	<p>E : 표현식 집합</p>
	<p>N : 정수 집합</p>
	<p>O : 연산자 집합</p>
<p>　</p>
	<p>위 구문에 포함된 요소들의 의미(semantics)하는 바는 일반적인 의미와 동일하다. 예를 들어, 표현식은 정수와 변수, 그리고 연산자들을 조합하여 생성한다. 명령문은 변수 선언, 조건 제어문, while 반복문 등의 조합으로 생성되며, 프로그램은 입력값을 받아 명령문을 실행하여 생성된 값을 내주도록 정의되었다. 미니 명령형 프로그래밍 언어를 이용하여 콜라츠 추측 프로그램을 구현할 수 있음을 쉽게 확인할 수 있다.<xref ref-type="fn" rid="fb003">*</xref></p>
</sec>
<sec id="sec004">
	<title>4. 프로그래밍과 논리의 관계</title>
	<p>컴퓨터 프로그램의 건전성 증명, 즉, 구현된 프로그램이 원하는 성질을 갖는다는 것을 확인해주는 수학적 증명의 중요성이 점점 커져 왔다. 관련된 연구가 1960년대부터 이루어져 왔으며, 컴퓨터 프로그램의 건전성을 확인하는 다양한 기법과 도구들이 개발되었다.</p>
	<p>알려진 많은 기법과 도구들이 수학적 증명 보다는 테스팅에 중점을 둔다. 하지만 테스팅과 증명은 엄연히 다르다. 테스팅은 구현된 프로그램이 의도한 대로 작동하는가를 관찰한다. 하지만 테스팅 결과가 완전하다는 보장을 절대 할 수 없다. 반면에</p>
	<p>증명은 구현된 프로그램이 의도된 성질을 갖는다는 것을 수학적으로 완전하게 보장한다. 테스팅에 비해 상대적으로 어렵고 많은 비용을 요구하지만 산업적 중요성이 점차 증가하고 있다.</p>
	<sec id="sec004-1">
		<title>4.1 호어 논리</title>
		<p>프로그램 검증은 1969년에 호어(C.A.R. Hoare)가 발표한 호어 논리[<xref ref-type="bibr" rid="B005">5</xref>,<xref ref-type="bibr" rid="B007">7</xref>,<xref ref-type="bibr" rid="B008">8</xref>]의 발표와 함께 본격적으로 시작하였다. 호어 논리는 명령형 프로그래밍 언어로 작성된 컴퓨터 프로그램의 건전성을 증명하기 위한 형식 체계(formal system)이다.</p>
		<p>호어 논리에 포함된 호어 규칙(Hoare rules)은 호어 트리플(Hoare triples)을 기본 논리식으로 사용하며, 연속되는 명령문을 호어 트리플 사이의 추론관계로 묘사한다. 호어 트리플의 기본 형식은 다음과 같다.</p>
		<p>{P} C {Q}</p>
		<p>C는 명령문을 가리킨다. P와 Q는 1계 논리식(first-order formula)이며 메모리의 상태를 묘사한다. 위 논리식이 의미하는 바는 다음과 같다. P가 참인 상태에서 명령문 C 실행한 후, C의 실행이 멈추면 Q가 참인 상태가 된다.</p>
		<p>호어 논리를 구성하는 호어 규칙들은 &#x003C;<xref ref-type="table" rid="t003">표 3</xref>&#x003E;에 모아놓았다</p>
		<p> &#x003C;<xref ref-type="table" rid="t003">표 3</xref>&#x003E;에 포함된 규칙들 중에서 마지막 규칙은 while 반복문에 대한 호어 트리플 규칙이다. 이를 위해 반복 과정에서 항상 참이어야 하는 불변식 I를 사용하였으며, B 는 조건식을 나타낸다.</p>
		<p>적절한 불변식을 찾는 일은 일반적으로 매우 어렵다. 앞서  &#x003C;<xref ref-type="table" rid="t001">표 1</xref>&#x003E;에서 구현된 콜라츠 함수가 임의의 정수에 대해 실행을 멈춘다에 대한 증명이 아직도 알려지지 않았다. 또한 불변식을 찾는 일은 괴델의 불완전성 정리와 밀접하게 연관된다.</p>
<table-wrap id="t003">
	<label>표 3.</label>
	<caption>
		<title>호어 규칙</title>
		<p>Table 3. Hoare rules</p>
	</caption>
	<table frame="box" rules="all" width="100%">
	<tbody>
		<tr><td><mml:math id="dm3-1"><mml:menclose notation="top"><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>Q</mml:mi><mml:mfenced open="[" close="]"><mml:mrow><mml:mi>E</mml:mi><mml:mo>/</mml:mo><mml:mi>x</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>x</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mo>:</mml:mo><mml:mo>=</mml:mo><mml:mi>E</mml:mi><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:menclose><mml:mspace linebreak="newline"/><mml:mfrac><mml:mrow><mml:mfenced open="{" close="}"><mml:mi>P</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>1</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>R</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mo>&#xA0;</mml:mo><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>R</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>2</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:mrow><mml:mrow><mml:mfenced open="{" close="}"><mml:mi>P</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>1</mml:mn></mml:msub><mml:mo>;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>2</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:mrow></mml:mfrac><mml:mspace linebreak="newline"/><mml:mfrac><mml:mrow><mml:mi>P</mml:mi><mml:mo>&#x21D2;</mml:mo><mml:msup><mml:mi>P</mml:mi><mml:mo>'</mml:mo></mml:msup><mml:mo>&#xA0;</mml:mo><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:msup><mml:mi>P</mml:mi><mml:mo>'</mml:mo></mml:msup></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>S</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:msup><mml:mi>Q</mml:mi><mml:mo>'</mml:mo></mml:msup></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mo>&#xA0;</mml:mo><mml:msup><mml:mi>Q</mml:mi><mml:mo>'</mml:mo></mml:msup><mml:mo>&#x21D2;</mml:mo><mml:mi>Q</mml:mi></mml:mrow><mml:mrow><mml:mfenced open="{" close="}"><mml:mi>P</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>S</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:mrow></mml:mfrac><mml:mspace linebreak="newline"/><mml:mfrac><mml:mrow><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>P</mml:mi><mml:mo>&#x2227;</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>1</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>P</mml:mi><mml:mo>&#x2227;</mml:mo><mml:mo>&#xAC;</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>2</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:mrow><mml:mrow><mml:mfenced open="{" close="}"><mml:mi>P</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>i</mml:mi><mml:mi>f</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mi>B</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mi>t</mml:mi><mml:mi>h</mml:mi><mml:mi>e</mml:mi><mml:mi>n</mml:mi><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>1</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mi>e</mml:mi><mml:mi>l</mml:mi><mml:mi>s</mml:mi><mml:mi>e</mml:mi><mml:mo>&#xA0;</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:mn>2</mml:mn></mml:msub><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>Q</mml:mi></mml:mfenced></mml:mrow></mml:mfrac><mml:mspace linebreak="newline"/><mml:mfrac><mml:mrow><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>I</mml:mi><mml:mo>&#x2227;</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>S</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mi>I</mml:mi></mml:mfenced></mml:mrow><mml:mrow><mml:mfenced open="{" close="}"><mml:mi>I</mml:mi></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>w</mml:mi><mml:mi>h</mml:mi><mml:mi>i</mml:mi><mml:mi>l</mml:mi><mml:mi>e</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mi>B</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mi>S</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>I</mml:mi><mml:mo>&#x2227;</mml:mo><mml:mo>&#xAC;</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mfrac></mml:math></td></tr>
	</tbody>
	</table>
</table-wrap>
		<p>아래 표는 호어 트리플 예제를 소개한다.</p>
	<table-wrap id="t004">
		<label>표 4.</label>
   		<caption>
			<title>호어 트리플 예제</title>
			<p>Table 4. Hoare triple examples</p>
   		</caption>
   		<table frame="box" rules="all" width="100%">
   			<tbody align="center">
<tr><td>선행조건 </td>
<td>명령문 </td>
<td>후행조건 </td>
</tr>
<tr><td>{true} </td>
<td>x  =  5 </td>
<td>{x=5} </td>
</tr>
<tr><td>{x=y} </td>
<td>x  =  x    +  3 </td>
<td>{x=y+3} </td>
</tr>
<tr><td>{x&gt;-1} </td>
<td>x  =  x*2    +  3 </td>
<td>{x&gt;1} </td>
</tr>
<tr><td>{x=a} </td>
<td>if  (x  &lt;    0)  then  x    =  -xelse    x  =  x </td>
<td>{x=|a|} </td>
</tr>
<tr><td>{false} </td>
<td>x  =  3 </td>
<td>{x=8} </td>
</tr>
<tr><td>{x&lt;0} </td>
<td>while  (x  !=    0){ x  =  x    -  1} </td>
<td>{?} </td>
</tr>
			</tbody>
		</table>
	</table-wrap>
		<p>명령문에서 사용되는 등호 기호는 변수 할당을 가리키고, 논리식에서 사용되는 등호 기호는 양변의 값이 동일함을 의미한다. 예를 들어, 아래 호어트리플</p>
		<p>{true} x = 5 {x=5}</p>
		<p>의 의미는 다음과 같다.</p>
<p>　</p>
		<p>&#8226; ‘true’는 메모리가 초기상태, 즉, 아무런 정보도 포함하지 않는 상태임을 의미한다. 이 상태에서 변수 할당 명령문 ‘x = 5’를 실행한다.</p>
		<p>&#8226; 변수 할당문을 실행한 결과 메모리 상에 변수 x가 정수 5를 가리키는 내용이 추가되었다. 따라서 논리식 ‘x=5’이 참이된다.</p>
<p>　</p>
	</sec>
	<sec id="sec004-2">
		<title>4.2 프로그램 검증 예제</title>
		<p>호어 논리를 이용하여 프로그램을 검증하는 방법을 살펴본다. 호어 논리의 실용성을 확인하기 위해 미니 명령형 언어 대신에 C 언어로 구현된 프로그램을 살펴본다.</p>
		<table-wrap id="t005">
			<label>표 5.</label>
   			<caption>
				<title>틀린 배열 항목들의 합</title>
				<p>Table 5. Sum of array elements with errors</p>
   			</caption>
   			<table frame="box" rules="all" width="100%">
   				<tbody>
      					<tr><td>
　float  sum(float    *arr)  {<break/>
　　int  N  =  len(arr);<break/>
　　float  total    =  0;<break/>
　　int    j  =  0;<break/>
　　while    (j  &lt;  N)    {<break/>
　　　j  =  j    +  1;<break/>
　　　total    =  total  +    arr[j]<break/>
　　}<break/>
　　return    total<break/>
　}
</td></tr>
				</tbody>
			</table>
		</table-wrap>
		<p>&#x003C;<xref ref-type="table" rid="t005">표 5</xref>&#x003E;에서 정의된 sum 함수는 실수들의 배열 가리키는 포인터를 인자로 입력받아, 배열에 포함된 실수들의 합을 계산하여 내주도록 함수로 구현되었다. sum 함수가 의도한 성질을 갖는다는 사실을 아래 호어 트리플로 표현할 수 있다.</p>
		<p><mml:math id="m4-2-1"><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>N</mml:mi><mml:mo>=</mml:mo><mml:mi>l</mml:mi><mml:mi>e</mml:mi><mml:mi>n</mml:mi><mml:mfenced><mml:mrow><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>r</mml:mi></mml:mrow></mml:mfenced><mml:mo>&#x2265;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:mfenced><mml:mo>&#xA0;</mml:mo><mml:mi>C</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>t</mml:mi><mml:mi>o</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:munderover><mml:mo>&#x2211;</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>N</mml:mi><mml:mo>-</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:munderover><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>r</mml:mi><mml:mfenced open="[" close="]"><mml:mi>k</mml:mi></mml:mfenced></mml:mrow></mml:mfenced></mml:math></p>
		<p>단, C는 sum 함수의 본체를 나타낸다.</p>
		<p>위 식이 성립하려면 while 반복문에 대한 규칙 또한 적용가능해야 하며, 그러기 위해서는 아래 호어 트리플이 성립해야 한다.</p>
		<p>{P} D {Q}</p>
		<p>여기서 D는 while 반복문의 본체를 가리키며, 논리식 P와 Q는 다음과 같다.</p>
		<p><mml:math id="m4-2-2"><mml:mi>P</mml:mi><mml:mo>=</mml:mo><mml:mfenced><mml:mrow><mml:mn>0</mml:mn><mml:mo>&#x2264;</mml:mo><mml:mi>j</mml:mi><mml:mo>&#x2264;</mml:mo><mml:mi>N</mml:mi></mml:mrow></mml:mfenced><mml:mo>&#x2227;</mml:mo><mml:mfenced><mml:mrow><mml:mi>t</mml:mi><mml:mi>o</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:munderover><mml:mo>&#x2211;</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>j</mml:mi><mml:mo>-</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:munderover><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>r</mml:mi><mml:mfenced open="[" close="]"><mml:mi>k</mml:mi></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>&#x2227;</mml:mo><mml:mfenced><mml:mrow><mml:mi>j</mml:mi><mml:mo>&lt;</mml:mo><mml:mi>N</mml:mi></mml:mrow></mml:mfenced></mml:math></p>
		<p><mml:math id="m4-2-3"><mml:mi>Q</mml:mi><mml:mo>=</mml:mo><mml:mfenced><mml:mrow><mml:mn>0</mml:mn><mml:mo>&#x2264;</mml:mo><mml:mi>j</mml:mi><mml:mo>&#x2264;</mml:mo><mml:mi>N</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:mfenced><mml:mo>&#x2227;</mml:mo><mml:mfenced><mml:mrow><mml:mi>t</mml:mi><mml:mi>o</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi><mml:mo>+</mml:mo><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>r</mml:mi><mml:mfenced open="[" close="]"><mml:mrow><mml:mi>j</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:mfenced><mml:mo>=</mml:mo><mml:munderover><mml:mo>&#x2211;</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow><mml:mi>j</mml:mi></mml:munderover><mml:mi>a</mml:mi><mml:mi>r</mml:mi><mml:mi>r</mml:mi><mml:mfenced open="[" close="]"><mml:mi>k</mml:mi></mml:mfenced></mml:mrow></mml:mfenced></mml:math></p>
		<p>그런데 위 호어 트리플이 성립하려면 P가 성립한다고 가정했을 때 Q가 성립해야 하는데 그렇지 않기 때문이다. 위 호어 트리플이 성립하지 않는 실제 이유는 total = total + arr[j] 가 실행 되기 전에 j = j + 1을 먼저 실행되어 결국 arr[0]이 total에 추가되지 않기 때문이다. 아래 표는 수정된 sum 함수 구현 프로그램이다.</p>
		<table-wrap id="t006">
			<label>표 6.</label>
   			<caption>
				<title>수정된 배열 항목들의 합</title>
				<p>Table 6. Corrected sum of array elements</p>
   			</caption>
   			<table frame="box" rules="all" width="100%">
   				<tbody>
      					<tr><td>
　float  sum(float  *arr)    {<break/>
　　int  N  =    len(arr);<break/>
　　float  total  =    0;<break/>
　　int    j  =  0;<break/>
　　while    (j  &lt;  N)    {<break/>
　　　total    =  total  +    arr[j]<break/>
　　　j  =  j    +  1;<break/>
　　}<break/>
　　return    total<break/>
　}</td></tr>
				</tbody>
			</table>
		</table-wrap>
		<p>호어 논리를 활용한 다른 예제는 보안 프로토콜의 건전성 검증에 많이 사용된다. 관련된 예를 [lee]에서 찾아볼 수 있다.</p>
	</sec>
</sec>
<sec id="sec005">
	<title>5. 커리-하워드 대응관계</title>
	<p>커리-하워드 대응관계는 논리적 증명과 프로그램 사이의 대응관계를 묘사하며, 1934년 커리(H. Curry)[<xref ref-type="bibr" rid="B002">2</xref>,<xref ref-type="bibr" rid="B001">1</xref>]에 의해 처음으로 알려졌다.</p>
	<p>&#x003C;<xref ref-type="table" rid="t007">표 7</xref>&#x003E;은 명제논리와 람다대수(Lambda calculus) 사이의 대응관계를 묘사한다. 그리고 이 대응관계는 프로그래밍과 논리를 하나로 다룰 수 있는 시스템으로까지 발전하였다.</p>
<table-wrap id="t007">
			<label>표 7.</label>
			<caption>
				<title>명제논리와 람다대수</title>
				<p>Table 7. Propositional logic and Lmabda caculus</p>
			</caption>
	<table width="100%">
	<tbody>
		<tr><td>
			<graphic xlink:href="../ingestImageView?artiId=ART002581761&amp;imageName=jkits_2020_15_02_185_f002.jpg" position="float" orientation="portrait" xlink:type="simple"></graphic></td></tr>
	</tbody>
	</table>
</table-wrap>
	<p>컴퓨터와 수학을 하나의 시스템으로 다루는 시도는 드 브로인(de Bruijn)이 1967년에 발표한 Automath[<xref ref-type="bibr" rid="B003">3</xref>]이다. 이후 1980년을 전후에 모든 수학적 증명을 컴퓨터로 다룰 수 있는 시스템의 기초를 제공하는 마틴-뢰프(Martin-Löf) 유형론[<xref ref-type="bibr" rid="B011">11</xref>,<xref ref-type="bibr" rid="B012">12</xref>]이 발표되었다. 마틴-뢰프 유형론은 80년대 초반부터 본격적으로 발전하기 시작한 증명보조기, 정리증명기 등의 기초 이론을 제공하였다[<xref ref-type="bibr" rid="B004">4</xref>,<xref ref-type="bibr" rid="B006">6</xref>]. 대표적으로 Coq<xref ref-type="fn" rid="fb004">*</xref>, Agda<xref ref-type="fn" rid="fb005">**</xref>, Lean<xref ref-type="fn" rid="fb006">***</xref> 등이 대표적이다</p>
</sec>
<sec id="sec006">
	<title>6. 호어 논리 vs. 커리-하워드 대응관계</title>
	<p>호어 논리는 C언어 계의 명령형 프로그래밍 언어를 대상으로 작동한다. 반면에 커리-하워드 대응관계는 하스켈<xref ref-type="fn" rid="fb007">*</xref>과 같은 함수형 프로그래밍 언어와 밀접히 연관된다. 하지만 호어 논리와 커리-하워드 대응관계는 사실 동일하다.</p>
	<p>실제로 하스켈 프로그래밍 언어[<xref ref-type="bibr" rid="B010">10</xref>,<xref ref-type="bibr" rid="B013">13</xref>]는 명령형 프로그래밍 언어의 핵심인 메모리 상태를 제1종 객체(first-class object)로 지원한다. 이를 통해 명령형 프로그래밍과 함수형 프로그래밍의 가장 근본적인 차이점인 부수 효과(side effect)를 동반하는 프로그램을 하스켈에서 구현할 수 있다.</p>
	<p>반면에 호어 트리플 {P} C {Q}에서 C를 프로세서, 즉, 일종의 함수로 볼 수 있으며, P와 Q는 각각 P와 Q라는 성질을 만족하는 메모리 상태로 간주할 수 있다. 즉, C를 메모리 상태들의 집합에서 메모리 상태들의 집합으로 가는 함수로 본다. 보다 구체적인 설명은 다음과 같다.</p>
	<p>&#8226; State: 모든 메모리 상태들의 집합</p>
	<p>&#8226; <mml:math id="m6-1"><mml:mi>C</mml:mi><mml:mo>:</mml:mo><mml:mo>&#xA0;</mml:mo><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>&#x3C3;</mml:mi><mml:mo>&#x2208;</mml:mo><mml:mi>S</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>t</mml:mi><mml:mi>e</mml:mi><mml:mo>&#xA0;</mml:mo><mml:menclose notation="left"><mml:mo>&#xA0;</mml:mo><mml:mi>P</mml:mi><mml:mfenced><mml:mi>&#x3C3;</mml:mi></mml:mfenced></mml:menclose></mml:mrow></mml:mfenced><mml:mo>&#x2192;</mml:mo><mml:mfenced open="{" close="}"><mml:mrow><mml:mi>&#x3C3;</mml:mi><mml:mo>&#x2208;</mml:mo><mml:mi>S</mml:mi><mml:mi>t</mml:mi><mml:mi>a</mml:mi><mml:mi>t</mml:mi><mml:mi>e</mml:mi><mml:mo>&#xA0;</mml:mo><mml:menclose notation="left"><mml:mo>&#xA0;</mml:mo><mml:mi>Q</mml:mi><mml:mo>&#xA0;</mml:mo><mml:mfenced><mml:mi>&#x3C3;</mml:mi></mml:mfenced></mml:menclose></mml:mrow></mml:mfenced></mml:math></p>
</sec>
<sec id="sec007" sec-type="Conclusion">
	<title>7. 결 론</title>
	<p>프로그래밍과 논리는 서로 다른 모습을 갖지만 실제로는 동일한 뿌리에서 출발했다. 본 논문에서 컴퓨터 프로그램과 논리의 연관성에 대한 기존의 연구들 사이의 차이점과 공통점을 살펴 보았다.</p>
	<p>보다 구체적으로는 명령형 프로그래밍 언어로 작성된 프로그램의 건전성을 논리적으로 검증하기 위해 사용되는 호어 논리(Hoare logic)와 함수형 프로그래밍 언어의 기반을 제공한 커리-하워드 대응관계가 본질적으로 동일한 내용을 다른 방식으로 표현한다는 사실을 보였다.</p>
	<p>앞으로 남은 과제는 본 논문에서 확인된 결과를 컴퓨터 프로그래밍 교육법과 접목하는 일이다. 특히 계산적 사고의 중요성이 점차 커지면서 컴퓨터 프로그래밍 교육의 중요성 또한 증대하고 있다[<xref ref-type="bibr" rid="B014">14</xref>-<xref ref-type="bibr" rid="B017">17</xref>]. 바로 이 점에서 컴퓨터 프로그램과 논리사이의 관계가 중요한 역할을 수행할 수 밖에 없다. 하지만 이 부분에 대한 연구가 주로 경험에 기반하며, 컴퓨터 프로그래밍과 논리의 관계에 기반한 교육법에 대한 연구는 별로 알려지지 않았다. 이후 이 부분에 대한 보다 깊은 연구를 수행하고자 한다.</p>
</sec>
	
</body>
<back>
<fn-group><fn id="fb001"><label>*</label><p><uri>https://en.wikipedia.org/wiki/Collatz_conjecture</uri></p></fn>
	<fn id="fb002"><label>**</label><p>튜링-완전한 프로그래밍 언어를 의미한다.</p></fn>
	<fn id="fb003"><label>*</label><p>콜라츠 추측 프로그램에 사용된 *, /, %, >, == 등의 기호는 다른 연산자를 이용하여 정의될 수 있다.</p></fn>
	<fn id="fb004"><label>*</label><p><uri>https://coq.inria.fr</uri></p></fn>
	<fn id="fb005"><label>**</label><p><uri>https://wiki.portal.chalmers.se/agda/</uri></p></fn>
	<fn id="fb006"><label>***</label><p><uri>https://leanprover.github.io/</uri></p></fn>
	<fn id="fb007"><label>*</label><p><uri>https://www.haskell.org/</uri></p></fn></fn-group>
<ref-list>
<title>References</title>
<!--[1] G. Boolos, J. Burgees, and R. Jeffrey, Computability and logic, 5th Edition, Cambridge University Press, 2007.-->
<ref id="B001">
<label>[1]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Boolos</surname><given-names>G.</given-names></name>
<name><surname>Burgees</surname><given-names>J.</given-names></name>
<name><surname>Jeffrey</surname><given-names>R.</given-names></name>
</person-group>
<year>2007</year>
<source>Computability and logic</source>
<comment>5th Edition</comment>
<publisher-name>Cambridge University Press</publisher-name>
</element-citation>
</ref>
<!--[2] H. Curry, Functionality in combinatory logic, Proceedings of the National Academy of Science of the USA, Vol. 20, No. 11, pp. 584-50, 1934.-->
<ref id="B002">
<label>[2]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Curry</surname><given-names>H.</given-names></name>
</person-group>
<year>1934</year>
<article-title>Functionality in combinatory logic</article-title>
<source>Proceedings of the National Academy of Science of the USA</source>
<volume>20</volume><issue>11</issue>
<fpage>584</fpage><lpage>590</lpage>
<pub-id pub-id-type="doi">10.1073/pnas.20.11.584</pub-id>
</element-citation>
</ref>
<!--[3] N. G. de Bruijn, Verification of mathematical proofs by a computer, A preparatory study for a project AUTOMATH, Unpublished, 1967.-->
<ref id="B003">
<label>[3]</label>
<element-citation publication-type="other">
<person-group>
<name><surname>de Bruijn</surname><given-names>N. G.</given-names></name>
</person-group>
<year>1967</year>
<source>Verification of mathematical proofs by a computer, A preparatory study for a project AUTOMATH</source>
<comment>Unpublished</comment>
</element-citation>
</ref>
<!--[4] JR. J. G. B. de Queiroz, A. G. de Oliveira, and D. M. Gabbay, The functional interpretation of logical deduction, Advances in Logic 5, Imperial College Press/World Scientific, 2011.-->
<ref id="B004">
<label>[4]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>de Queiroz</surname><given-names>JR. J. G. B.</given-names></name>
<name><surname>de Oliveira</surname><given-names>A. G.</given-names></name>
<name><surname>Gabbay</surname><given-names>D. M.</given-names></name>
</person-group>
<year>2011</year>
<source>The functional interpretation of logical deduction</source>
<comment>Advances in Logic 5</comment>
<publisher-name>Imperial College Press/World Scientific</publisher-name>
</element-citation>
</ref>
<!--[5] R. W. Floyd, Assigning meanings to programs, Proceedings of the American Mathematical Society Symposia on Applied mathemaics, Vol. 19, pp. 19-31, 1967.-->
<ref id="B005">
<label>[5]</label>
<element-citation publication-type="paper">
<person-group>
<name><surname>Floyd</surname><given-names>R. W.</given-names></name>
</person-group>
<year>1967</year>
<article-title>Assigning meanings to programs</article-title>
<conf-name>Proceedings of the American Mathematical Society Symposia on Applied mathemaics</conf-name>
<comment>Vol. 19</comment>
<fpage>19</fpage><lpage>31</lpage>
</element-citation>
</ref>
<!--[6] J-Y. Girard, Proofs and Types, Translated and with appendices by Y. Lafont and P. Taylor, Cambridge University Press, 2007.-->
<ref id="B006">
<label>[6]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Girard</surname><given-names>J-Y.</given-names></name>
</person-group>
<person-group person-group-type="editor">
<name><surname>Lafont</surname><given-names>Y.</given-names></name>
<name><surname>Taylor</surname><given-names>P.</given-names></name>
</person-group>
<comment>Translated and with appendices by</comment>
<year>2007</year>
<source>Proofs and Types</source>
<publisher-name>Cambridge University Press</publisher-name>
</element-citation>
</ref>
<!--[7] C. A. R. Hoare, An axiomatic basis for computer programming, Communications of the ACM, Vol. 12, No. 10, pp. 576-580, 1969.-->
<ref id="B007">
<label>[7]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Hoare</surname><given-names>C. A. R.</given-names></name>
</person-group>
<year>1969</year>
<article-title>An axiomatic basis for computer programming</article-title>
<source>Communications of the ACM</source>
<volume>12</volume><issue>10</issue>
<fpage>576</fpage><lpage>580</lpage>
<pub-id pub-id-type="doi">10.1145/363235.363259</pub-id>
</element-citation>
</ref>
<!--[8] M. Huth, M. Ryan, Logic in Computer Science: Modelling and reasoning about systems, 2nd Edition, Cambridge University Press, 2004.-->
<ref id="B008">
<label>[8]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Huth</surname><given-names>M.</given-names></name>
<name><surname>Ryan</surname><given-names>M.</given-names></name>
</person-group>
<year>2004</year>
<source>Logic in Computer Science: Modelling and reasoning about systems</source>
<comment>2nd Edition</comment>
<publisher-name>Cambridge University Press</publisher-name>
</element-citation>
</ref>
<!--[9] G. Hutton, Programming in Haskell, 2nd Edition, Cambridge University Press, 2016.-->
<ref id="B009">
<label>[9]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Hutton</surname><given-names>G.</given-names></name>
</person-group>
<year>2016</year>
<source>Programming in Haskell</source>
<comment>2nd Edition</comment>
<publisher-name>Cambridge University Press</publisher-name>
</element-citation>
</ref>
<!--[10] G. Lee, Formal specification of cryptographic security protocols, Journal of Knowledge Information Technology and Systems, Vol. 14, No. 6, pp. 711-718, 2019.-->
<ref id="B010">
<label>[10]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Lee</surname><given-names>G.</given-names></name>
</person-group>
<year>2019</year>
<article-title>Formal specification of cryptographic security protocols</article-title>
<source>Journal of Knowledge Information Technology and Systems</source>
<volume>14</volume><issue>6</issue>
<fpage>711</fpage><lpage>718</lpage>
<pub-id pub-id-type="doi">10.34163/jkits.2019.14.6.014</pub-id>
</element-citation>
</ref>
<!--[11] P. Martin-Löf, Intuitionistic type theory: Notes by Giovanni Sambin of a series of lectures given in Padua, June 1980, Bibliopolis, 1984.-->
<ref id="B011">
<label>[11]</label>
<element-citation publication-type="other">
<person-group>
<name><surname>Martin-Löf</surname><given-names>P.</given-names></name>
</person-group>
<year>1980</year>
<month>June</month>
<source>Intuitionistic type theory: Notes by Giovanni Sambin of a series of lectures given in Padua</source>
<comment>Bibliopolis, 1984</comment>
</element-citation>
</ref>
<!--[12] B. Nordström, K. Petersson, and J. M. Smith, Programming in Martin-Löf’s type theory, Oxford University Press, 1901.-->
<ref id="B012">
<label>[12]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Nordström</surname><given-names>B.</given-names></name>
<name><surname>Petersson</surname><given-names>K.</given-names></name>
<name><surname>Smith</surname><given-names>J. M.</given-names></name>
</person-group>
<year>1901</year>
<source>Programming in Martin-Löf’s type theory</source>
<publisher-name>Oxford University Press</publisher-name>
</element-citation>
</ref>
<!--[13] S. Thompson, Type theory and functional programming, Addison-Wesley, 1991.-->
<ref id="B013">
<label>[13]</label>
<element-citation publication-type="book">
<person-group>
<name><surname>Thompson</surname><given-names>S.</given-names></name>
</person-group>
<year>1991</year>
<source>Type theory and functional programming</source>
<publisher-name>Addison-Wesley</publisher-name>
</element-citation>
</ref>
<!--[14] J. M. Wing, Computational thinking, Communications of the ACM, Vol. 49, No. 3, pp. 33-35, 2006.-->
<ref id="B014">
<label>[14]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Wing</surname><given-names>J. M.</given-names></name>
</person-group>
<year>2006</year>
<article-title>Computational thinking</article-title>
<source>Communications of the ACM</source>
<volume>49</volume><issue>3</issue>
<fpage>33</fpage><lpage>35</lpage>
</element-citation>
</ref>
<!--[15] J. M. Wing, Computational thinking and thinking about computing, Philosophical Transaction of the Royal Society A: Mathematical, Physical and Engineering Sciences, Vol. 366, pp. 3717-3725, 2008.-->
<ref id="B015">
<label>[15]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Wing</surname><given-names>J. M.</given-names></name>
</person-group>
<year>2008</year>
<article-title>Computational thinking and thinking about computing</article-title>
<source>Philosophical Transaction of the Royal Society A: Mathematical, Physical and Engineering Sciences</source>
<volume>366</volume>
<fpage>3717</fpage><lpage>3725</lpage>
<pub-id pub-id-type="doi">10.1098/rsta.2008.0118</pub-id>
</element-citation>
</ref>
<!--[16] J. M. Wing, Computational thinking’s 'influence on research and education for all, Italian Journal of Educational Technology, Vol. 25, No. 2, pp. 7-14, 2017.-->
<ref id="B016">
<label>[16]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Wing</surname><given-names>J. M.</given-names></name>
</person-group>
<year>2017</year>
<article-title>Computational thinking’s'influence on research and education for all</article-title>
<source>Italian Journal of Educational Technology</source>
<volume>25</volume><issue>2</issue>
<fpage>7</fpage><lpage>14</lpage>
<pub-id pub-id-type="doi">10.17471/2499-4324/922</pub-id>
</element-citation>
</ref>
<!--[17] G. Yang, The effect of software education using pair programming on learning motivation and academic achievement, Journal of Knowledge Information Technology and Systems, Vol. 15, No. 1, pp. 57-65, 2020-->
<ref id="B017">
<label>[17]</label>
<element-citation publication-type="journal">
<person-group>
<name><surname>Yang</surname><given-names>G.</given-names></name>
</person-group>
<year>2020</year>
<article-title>The effect of software education using pair programming on learning motivation and academic achievement</article-title>
<source>Journal of Knowledge Information Technology and Systems</source>
<volume>15</volume><issue>1</issue>
<fpage>57</fpage><lpage>65</lpage>
</element-citation>
</ref>
</ref-list>
<ack>
	<title>감사의 글</title>
	<p>제1저자의 연구는 2018학년도 한경대학교 연구년 경비의 지원에 의한 것임. 제2저자의 연구는 2019학년도 한남대학교 연구지원에 의한 것임.</p>
</ack>
<bio>
	<p><graphic xlink:href="../ingestImageView?artiId=ART002581761&amp;imageName=jkits_2020_15_02_185_f003.jpg"></graphic><bold>Gyesik Lee</bold> received his bachelor degree in the Dept. of Mathematics from Seoul National University in 1992. He received his M.S. degree and the Ph.D. degree in the Dept. of Mathematics and Computer Science from University of Muenster in 1996 and 2005, respectively. He had research positions at INRIA, AIST, and Seoul National University. He is currently a professor in the School of Computer Engineering &#x26; and Applied Mathematics at Hankyong National University. His research interests include logic in computer science, data analysis.</p>
	<p><italic>E-mail address</italic>: <email>gslee@hknu.ac.kr</email></p>
	<p><graphic xlink:href="../ingestImageView?artiId=ART002581761&amp;imageName=jkits_2020_15_02_185_f004.jpg"></graphic><bold>Hwajeong Kim</bold> received her bachelor and M.S. degrees in the Department of Mathematics from Seoul National University in 1993 and 1996, respectively. She received her Ph.D. degree in the Department of Mathematics from Saarland University in 2004. She had research positions at Humboldt University and Seoul National University. She is currently a professor in the Department of Mathematics at Hannam University. Her research interests include differential geometry and manifold theory.</p>
	<p><italic>E-mail address</italic>: <email>hwajkim@hnu.kr</email></p>
</bio>
</back>
</article>
