반응형

프롤로그(프로그래밍 언어)는 논리형 프로그래밍 언어이다. 이는 우리가 자주 배우는 절차형, 객체지향형, 더 나아가 함수형, 하이브리드형 언어와는 완전히 형태가 다르다. 함수형도 앞의 두 개와는 많이 다르지만 논리형 언어만큼 차이나지 않는다. (다양한 프로그래밍 패러다임) 프롤로그는 소스코드에 지식(명제)과 규칙(명제 간의 관계)을 넣는다. 그리고 쿼리(궁금한 명제)를 질의하면 해당 쿼리의 참, 거짓을 판별해서 답한다.

대학교 수업 시 프로그래밍 언어론을 배우면 무조건 배우고 넘어가는 개념이지만 실제로 코드로 구현해보는 이들은 적을 것이다. 나조차도 배우고 나서 한참 있다가 직접 실행해보았고 한국어로 된 자료가 별로 없어 이에 대한 과정을 아래에 적어두어 도움이 되고자 한다. 목차는 아래와 같다.

목차

설치
지식 베이스(Knowledge Base) 삽입
질의


설치

1. SWI-prolog를 다운로드 받는다.

링크는 아래에 있다.

 

SWI-Prolog

 

www.swi-prolog.org

 

2. 설치를 진행한다.

기본적으로 학습용이기 때문에 system PATH에 경로를 따로 추가해주지는 않았다. 다음만 계속 누르면 된다.


윈도우 검색에서 swi를 검색해보면 잘 설치된 것을 확인할 수 있다.

 

3. SWI-Prolog를 실행한다.


설치는 끝났다. 이제 예제를 다뤄보겠다.


지식 베이스(Knowledge Base) 삽입

1. 'File'에서 'New'를 눌러 pl 파일을 생성한다.

 

2. 지식과 규칙에 관련된 코드를 작성 후 저장한다.

prolog는 지식과 규칙을 넣어주면 된다. 그러면 해당 지식과 규칙을 바탕으로 우리의 질문이 맞으면 true를, 틀리면 false를 리턴한다. 'Ctrl+s' 키를 눌러 저장한다.

아래는 본인이 작성한 코드이다.

child(son1, lee). child(son2, lee). child(dau1, lee). child(dau2, yoo). male(lee). male(son1). male(son2). female(yoo). female(dau1). female(dau2). couple(lee,yoo). couple(yoo,lee). parent(Y,X) :- child(X,Y); child(X,Z), couple(Y,Z). father(Y,X) :- child(X,Y), male(Y); child(X,Z), couple(Y,Z), male(Y). mother(Y,X) :- child(X,Y), female(Y); child(X,Z), couple(Y,Z), female(Y). son(X,Y) :- child(X,Y), male(X); child(X,Z), couple(Y,Z), male(X). daughter(X,Y) :- child(X,Y), female(X); child(X,Z), couple(Y,Z), female(X).

아래는 위 코드의 주석이다.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %지식 선언부 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% child(son1, lee). %son1은 lee의 child이다. child(son2, lee). %son2은 lee의 child이다. child(dau1, lee). %dau1은 lee의 child이다. child(dau2, yoo). %dau2은 yoo의 child이다. male(lee). %lee은 male이다. male(son1). %son1은 male이다. male(son2). %son2은 male이다. female(yoo). %yoo은 female이다. female(dau1). %dau1은 female이다. female(dau2). %dau2은 female이다. couple(lee,yoo). %lee은 yoo의 couple이다. couple(yoo,lee). %yoo은 lee의 couple이다. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %규칙 선언부 %;는 or 연산자이고 %,는 and 연산자이다. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* 아래의 조건을 만족할 때 Y은 X의 parent이다. child(X,Y) %X는 Y의 child이다. 또는 (child(X,Z) %X는 Z의 child이다. 그리고 couple(Y,Z)) %Y는 Z의 couple이다. */ parent(Y,X) :- child(X,Y); child(X,Z), couple(Y,Z). /* 아래의 조건을 만족할 때 Y은 X의 father이다. (child(X,Y) %X는 Y의 child이다. 그리고 male(Y)) %Y는 male이다. 또는 (child(X,Z) %X는 Z의 child이다. 그리고 couple(Y,Z) %Y는 Z의 couple이다. 그리고 male(Y)) %Y는 male이다. */ father(Y,X) :- child(X,Y), male(Y); child(X,Z), couple(Y,Z), male(Y). /* 아래의 조건을 만족할 때 Y은 X의 mother이다. (child(X,Y) %X는 Y의 child이다. 그리고 female(Y)) %Y는 female이다. 또는 (child(X,Z) %X는 Z의 child이다. 그리고 couple(Y,Z) %Y는 Z의 couple이다. 그리고 female(Y)) %Y는 female이다. */ mother(Y,X) :- child(X,Y), female(Y); child(X,Z), couple(Y,Z), female(Y). /* 아래의 조건을 만족할 때 X는 Y의 son이다. (child(X,Y) %X는 Y의 child이다. 그리고 male(X)) %X는 male이다. 또는 (child(X,Z) %X는 Z의 child이다. 그리고 couple(Y,Z) %Y는 Z의 couple이다. 그리고 male(X)) %X는 male이다. */ son(X,Y) :- child(X,Y), male(X); child(X,Z), couple(Y,Z), male(X). /* 아래의 조건을 만족할 때 X는 Y의 daughter이다. (child(X,Y) %X는 Y의 child이다. 그리고 female(X)) %X는 female이다. 또는 (child(X,Z) %X는 Z의 child이다. 그리고 couple(Y,Z) %Y는 Z의 couple이다. 그리고 female(X)) %X는 female이다. */ daughter(X,Y) :- child(X,Y), female(X); child(X,Z), couple(Y,Z), female(X).

 

3. 'File'에서 'Consult'를 눌러 저장한 코드를 불러온다.

성공적으로 불러왔다면 아래와 같은 화면이 나온다.

이렇게 준비는 끝났다.
이제 실제로 쿼리를 진행해보자.


질의

내가 Knowledge Base에 넣은 지식의 시나리오는 다음과 같다.

lee는 남자이다.
son1, son2는 lee의 child이다.
dau1은 lee의 child이다.
yoo는 여자이다.
dau2는 yoo의 child이다.
lee와 yoo는 커플이다.
그리고 이에 맞는 parent, father, mother, daughter, son에 대한 규칙을 정의하였다. 주석에 상세히 적어두었다.

이런 식으로 정의한 이유는 아래와 같은 퀴즈에서 착안했기 때문이다.

더보기
부자지간인 두 남자가 차을 타고 가고 있었습니다.
그런데 중앙선 넘어에서 트럭 한대가갑자기 넘어 와서 충돌하는 사고가 났습니다.
운전을 하고 있던 아버지는 그 자리에서 즉사를 하고아들은 큰 부상을 당한 상태 입니다.
급히 119 가 와서 아들을 병원으로 후송을 했는데
응급실로 실려온 아들을 의사가 보면서 한 말이...
"이 사람은 내 아들이니 반드시 살리겠다."
라고 했습니다.

그럼 이 의사와 아들의 관계는 무슨 관계일까요???

정답: 모자관계


여기서부터 물어볼 질문은 아래와 같다.
1. lee는 son1의 parent인가? (참)
2. lee는 son2의 father인가? (참)
3. lee는 son2의 mother인가? (거짓)
4. yoo는 dau2의 mother인가? (참)
5. son1은 lee의 son인가? (참)
6. son1은 lee의 daughter인가? (거짓)
---------------------------------
여기까지는 제대로 데이터가 입력되었는지, 규칙이 제대로 적용되었는지 확인하기 위한 질문이다. 각각의 자식과 부모의 관계에 대한 질문이다. 아래는 이에 대한 출력이다.

parent, father, mother, son, daughter에 대한 지식을 정의해주지 않았지만 규칙으로부터 추론하여 예상에 맞게 결과를 제대로 출력하였다.

아래의 질문은 조금 더 복잡하다. 위의 질문은 lee와 yoo 각자에게 정의된 child 관계로부터 추론한 것이지만 아래는 couple을 거치기 때문이다.
1. yoo는 dau1의 parent인가? (참)
2. lee는 dau2의 father인가? (참)
3. yoo는 son1의 mother인가? (참)
4. son1은 yoo의 son인가? (참)
5. dau2은 lee의 daughter인가? (참)
6. dau1은 dau2의 mother인가? (거짓)

아래는 이에 대한 출력이다.


예상대로 잘 출력하는 것을 알 수 있다.

이렇게 프롤로그를 설치해보고 예제를 실행해보았다. 개념을 훑어보는 것과 실제로 구현해보는 것은 많이 다르다는 것을 이번에 또 느꼈다. 그리고 이를 C나 자바, 파이썬 등으로 구현해볼 수 있을까 했는데 쉽사리 구현할 수 있을 것 같지 않다는 생각이 들었다. 비록 프롤로그 공부는 예제로 그쳤지만 흥미가 확실히 생기긴 했다. 논리학을 공부할 때 쓰면 요긴할 것 같다.

이 글이 도움이 되었기를 바랍니다.

반응형

'CS > Languages' 카테고리의 다른 글

[SPIM] PCspim 설치 및 실행하는 법(예제 포함)  (1) 2021.05.31

+ Recent posts