Introduction to
Prolog Programming

                                     2010.10.02
            박상혁(http://kazuya.springnote.com)
       아꿈사(http://cafe.naver.com/architect1.cafe)
Table of Contents
 •   시작하기 전에
 •   개발 환경 설정
 •   프롤로그 소개
 •   프롤로그 튜토리얼 with Demo
 •   예제 : 아인슈타인 퍼즐 풀이
시작하기 전에
• 프롤로그의 아주아주 기본 문법만 다룹니다.
 – 여기서 다루는건 극히~~~ 일부분
 – C 로 치면, 대입문(=), 제어문(if), 반복문(for) 이정도
 – 실제로는 훨씬 많은 피쳐들이 있고 할 수 있는 일도 많음
개발 환경 설정
• SWI Prolog for Windows
   – http://www.swi-prolog.org
   – 설치가 간단하다.




• 다양한 구현이 있다
   – http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementatio
     ns
프롤로그 소개
• prologue?
  – 아니다! Prolog. Programming in Logic 의 약자


• 범용 언어
  – 기본적으로 Prolog 는 어떤 알고리즘도 구현할 수 있는 범용 언어
  – 여러가지 패러다임을 지원한다


• 하지만
  – Symbolic Programming
  – Declarative Programming
  – Logic Programming
  에 다른 언어보다 더 적합하다.
프롤로그 소개
• Symbolic Programming
  – vs. Numeric Computation
  – 수치연산을 못하는 건 아니지만 취약한 것은 사실. 언어적 지원이 거의 없다
  – 심볼 연산 관련 구현에서 다른 언어라면 알아보기 힘든 수십 페이지의 코드
    가 프롤로그에서는 깔끔한 몇 페이지의 코드로 표현된다
• Declarative Programming
  – vs. Procedural Programming
  – 대부분의 절차적 언어와는 달리 프롤로그는 선언적 패러다임으로, 같은 문
    제에 대해 다른 문제 해결 방법을 강제하기 때문에, 프로그래밍 언어를 처
    음 시작할 때 같이 배우면 생각의 폭을 넓힐 수 있다
• Logic Programming
  – vs. Functional Programming
  – 말 그대로, 논리를 프로그래밍 언어로 표현한다
프롤로그 튜토리얼
• 오른쪽과 같은 가계도가 주어졌을 때,
                         pam         tom
• 다음 질문에 대한 답을 출력하는
  프로그램을 작성해 보자
  –   bob 의 부모는?
  –   pat 의 조부모는?              bob         liz
  –   ... 의 여자형제는?
  –   ... 의 자녀는?
  –   ... 의 손자는?         ann         pat
  –   ... 의 선조는?
  –   ... 의 후손은?
                               jim
프롤로그 튜토리얼
• 소스코드 #1
  parent(pam,bob). % pam is parent of bob. pam         tom
  parent(tom,bob).
  parent(tom,liz).
  parent(bob,ann).                               bob         liz
  parent(bob,pat).
  parent(pat,jim).
                                          ann          pat
• 질문?
  ?-   parent(bob,pat).
  ?-   parent(liz,pat).                          jim

  ?-   parent(tom,ben).
  ?-   parent(X,liz).
프롤로그 기본 문법
• clause
   – 마침표로 끝난다.
   – parent(pam,bob). % parent 를 relation 이라고 한다.
• atom
   – 소문자로 시작
   – parent, pam, bob
• variable
   – 대문자로 시작
   – X, Y
• goals
   – 시스템에 질의
   – 이미 입력된 clause 를 사용하여 goal을 만족하는 답을 찾는다.
프롤로그 튜토리얼
• 소스코드 #2
  –   female(pam). % pam is female.               pam         tom
  –   male(tom).
  –   male(bob).
  –   female(liz).                                      bob         liz
  –   female(ann).
  –   female(pat).
  –   male(jim).                                  ann         pat
  –   offstring(X,Y) :- parent(Y,X).
        % If Y is parent of X, X is offspring of Y.
                                                        jim
프롤로그 기본 문법
• rule
   – offspring(X,Y) :- parent(Y,X).
   – 'head' :- 'body'.

   – P :- Q, R. % If Q and R then P.
   – P :- Q; R. % If Q or R, then P.
프롤로그 튜토리얼
• 소스코드 #3
  – mother(X,Y) :-                        pam         tom
              parent(X,Y), female(X).
  – grandparent(X,Z) :-
              parent(X,Y), parent(Y,Z).         bob         liz
  – sister(X,Y) :-
              parent(Z,X),
              parent(Z,Y),                ann         pat
              female(X).


                                                jim
프롤로그 튜토리얼
• 소스코드 #4
  – predecessor(X,Z) :-
             parent(X,Z).
  – predecessor(X,Z) :-
             parent(X,Y),
             predecessor(Y,Z).
  – haschid(X) :- parent( X, _ ).
프롤로그 기본 문법
• List
   –   [   ]
   –   [   A ] = .( A, [] )
   –   [   A, B, C ] = .( A, .( B, .( C, [] ) ) )
   –   [   Head | Tail ]
   –   [   A, B, C ] = [ A | [ B, C ] ] = [ A, B | [C] ]
아인슈타인 퍼즐
• Facts
   – 5채의 모두 다른 색깔의 집이 있다
   – 각 집에는 다른 국적의 사람이 산다
   – 각 집주인들른 다른 음료수를 마시고, 다른 담배을 피며, 다른 애완동물을
     기른다
• Details
   –   영국인은 빨간 집에 산다
   –   스웨덴인은 개를 기른다
   –   덴마크인은 홍차를 마신다
   –   녹색집은 흰색집 바로 왼쪽에 있다
   –   녹색집 사람은 커피를 마신다
   –   폴몰 담배를 피는 사람은 새를 기른다
   –   노란색집 사람은 던힐 담배를 피운다
아인슈타인 퍼즐
• Details
   –   한가운데 사는 사람은 우유를 마신다
   –   노르웨이인은 첫번째 집에 산다
   –   블렌드 담배를 피우는 사람은 고양이를 기르는 사람 옆집에 산다
   –   말을 기르는 사람은 던힐 담배를 피우는 사람 옆집에 산다
   –   블루마스터 담배를 피우는 사람은 맥주를 마신다
   –   독일인은 프린스 담배를 피운다
   –   노르웨이인은 파란색집 옆집에 산다
   –   블렌드 담배를 피우는 사람은 물은 마시는 사람 옆집에 산다



• 문제. 금붕어를 기르는 사람은 누구일까?
   – 덜덜덜...
아인슈타인 퍼즐
• 데이터 표현
   – house( Color, Nationality, Beverage, Cigarette, Pet ).
   – [ House1, House2, ... , House5 ]


• Relation
   –   member( Item, [ Item | _ ] ).
   –   member( Item, [ _ | Rest ] ) :- member( Item, Rest).
   –   order( A, B, [ A, B | _ ] ).
   –   order( A, B, [ _ | Tail ] ) :- order( A, B, Tail ).
   –   near( A, B, List ) :- order( A, B, List) ; order( B, A, List ).
아인슈타인 퍼즐
• 위치 관련 힌트
  – 한가운데 사는 사람은 우유를 마신다
  – 노르웨이인은 첫번째 집에 산다
  – position(
     [ house(_, norway, _, _, _),
       house(_, _, _, _, _),
       house(_, _, milk, _, _),
       house(_, _, _, _, _),
       house(_, _, _, _, _) ] ).
아인슈타인 퍼즐
• 집의 속성에 대한 힌트
  –   영국인은 빨간 집에 산다
  –   member(house(red, england, _, _, _), HouseList).
  –   member(house(_, sweden, _, _, dog), HouseList).
  –   member(house(_, denmark, tea, _, _), HouseList).
  –   member(house(green, _, coffee, _, _), HouseList).
  –   member(house(_, _, _, pallmall, bird), HouseList).
  –   member(house(yellow, _, _, dunhill, _), HouseList).
  –   member(house(_, _, beer, bluemaster, _), HouseList).
  –   member(house(_, german, _, prince, _), HouseList).
아인슈타인 퍼즐
• 옆집 힌트
  –   order(house(green, _, _, _, _), house(white, _, _, _, _), List).
  –   near(house(_, _, _, blend, _), house(_, _, _, _, cat), List).
  –   near(house(_, _, _, _, horse), house(_, _, _, dunhill, _), List).
  –   near(house(_, norway, _, _, _), house(blue, _, _, _, _), List).
  –   near(house(_, _, _, blend, _), house(_, _, water, _, _), List).
아인슈타인 퍼즐
아인슈타인 퍼즐
• 정말 이렇게만 해서 될까요?
참고자료
• Prolog Programming for Artificial Intelligence

• http://nlp.kaist.ac.kr/~cs370/
   – Symbolic Programming Course


• http://en.wikipedia.org/wiki/Prolog
• http://en.wikipedia.org/wiki/Einstein's_Puzzle
   – a.k.a "Zebra Puzzle"
끝
QnA

Introduction to prolog

  • 1.
    Introduction to Prolog Programming 2010.10.02 박상혁(http://kazuya.springnote.com) 아꿈사(http://cafe.naver.com/architect1.cafe)
  • 2.
    Table of Contents • 시작하기 전에 • 개발 환경 설정 • 프롤로그 소개 • 프롤로그 튜토리얼 with Demo • 예제 : 아인슈타인 퍼즐 풀이
  • 3.
    시작하기 전에 • 프롤로그의아주아주 기본 문법만 다룹니다. – 여기서 다루는건 극히~~~ 일부분 – C 로 치면, 대입문(=), 제어문(if), 반복문(for) 이정도 – 실제로는 훨씬 많은 피쳐들이 있고 할 수 있는 일도 많음
  • 4.
    개발 환경 설정 •SWI Prolog for Windows – http://www.swi-prolog.org – 설치가 간단하다. • 다양한 구현이 있다 – http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementatio ns
  • 5.
    프롤로그 소개 • prologue? – 아니다! Prolog. Programming in Logic 의 약자 • 범용 언어 – 기본적으로 Prolog 는 어떤 알고리즘도 구현할 수 있는 범용 언어 – 여러가지 패러다임을 지원한다 • 하지만 – Symbolic Programming – Declarative Programming – Logic Programming 에 다른 언어보다 더 적합하다.
  • 6.
    프롤로그 소개 • SymbolicProgramming – vs. Numeric Computation – 수치연산을 못하는 건 아니지만 취약한 것은 사실. 언어적 지원이 거의 없다 – 심볼 연산 관련 구현에서 다른 언어라면 알아보기 힘든 수십 페이지의 코드 가 프롤로그에서는 깔끔한 몇 페이지의 코드로 표현된다 • Declarative Programming – vs. Procedural Programming – 대부분의 절차적 언어와는 달리 프롤로그는 선언적 패러다임으로, 같은 문 제에 대해 다른 문제 해결 방법을 강제하기 때문에, 프로그래밍 언어를 처 음 시작할 때 같이 배우면 생각의 폭을 넓힐 수 있다 • Logic Programming – vs. Functional Programming – 말 그대로, 논리를 프로그래밍 언어로 표현한다
  • 7.
    프롤로그 튜토리얼 • 오른쪽과같은 가계도가 주어졌을 때, pam tom • 다음 질문에 대한 답을 출력하는 프로그램을 작성해 보자 – bob 의 부모는? – pat 의 조부모는? bob liz – ... 의 여자형제는? – ... 의 자녀는? – ... 의 손자는? ann pat – ... 의 선조는? – ... 의 후손은? jim
  • 8.
    프롤로그 튜토리얼 • 소스코드#1 parent(pam,bob). % pam is parent of bob. pam tom parent(tom,bob). parent(tom,liz). parent(bob,ann). bob liz parent(bob,pat). parent(pat,jim). ann pat • 질문? ?- parent(bob,pat). ?- parent(liz,pat). jim ?- parent(tom,ben). ?- parent(X,liz).
  • 9.
    프롤로그 기본 문법 •clause – 마침표로 끝난다. – parent(pam,bob). % parent 를 relation 이라고 한다. • atom – 소문자로 시작 – parent, pam, bob • variable – 대문자로 시작 – X, Y • goals – 시스템에 질의 – 이미 입력된 clause 를 사용하여 goal을 만족하는 답을 찾는다.
  • 10.
    프롤로그 튜토리얼 • 소스코드#2 – female(pam). % pam is female. pam tom – male(tom). – male(bob). – female(liz). bob liz – female(ann). – female(pat). – male(jim). ann pat – offstring(X,Y) :- parent(Y,X). % If Y is parent of X, X is offspring of Y. jim
  • 11.
    프롤로그 기본 문법 •rule – offspring(X,Y) :- parent(Y,X). – 'head' :- 'body'. – P :- Q, R. % If Q and R then P. – P :- Q; R. % If Q or R, then P.
  • 12.
    프롤로그 튜토리얼 • 소스코드#3 – mother(X,Y) :- pam tom parent(X,Y), female(X). – grandparent(X,Z) :- parent(X,Y), parent(Y,Z). bob liz – sister(X,Y) :- parent(Z,X), parent(Z,Y), ann pat female(X). jim
  • 13.
    프롤로그 튜토리얼 • 소스코드#4 – predecessor(X,Z) :- parent(X,Z). – predecessor(X,Z) :- parent(X,Y), predecessor(Y,Z). – haschid(X) :- parent( X, _ ).
  • 14.
    프롤로그 기본 문법 •List – [ ] – [ A ] = .( A, [] ) – [ A, B, C ] = .( A, .( B, .( C, [] ) ) ) – [ Head | Tail ] – [ A, B, C ] = [ A | [ B, C ] ] = [ A, B | [C] ]
  • 15.
    아인슈타인 퍼즐 • Facts – 5채의 모두 다른 색깔의 집이 있다 – 각 집에는 다른 국적의 사람이 산다 – 각 집주인들른 다른 음료수를 마시고, 다른 담배을 피며, 다른 애완동물을 기른다 • Details – 영국인은 빨간 집에 산다 – 스웨덴인은 개를 기른다 – 덴마크인은 홍차를 마신다 – 녹색집은 흰색집 바로 왼쪽에 있다 – 녹색집 사람은 커피를 마신다 – 폴몰 담배를 피는 사람은 새를 기른다 – 노란색집 사람은 던힐 담배를 피운다
  • 16.
    아인슈타인 퍼즐 • Details – 한가운데 사는 사람은 우유를 마신다 – 노르웨이인은 첫번째 집에 산다 – 블렌드 담배를 피우는 사람은 고양이를 기르는 사람 옆집에 산다 – 말을 기르는 사람은 던힐 담배를 피우는 사람 옆집에 산다 – 블루마스터 담배를 피우는 사람은 맥주를 마신다 – 독일인은 프린스 담배를 피운다 – 노르웨이인은 파란색집 옆집에 산다 – 블렌드 담배를 피우는 사람은 물은 마시는 사람 옆집에 산다 • 문제. 금붕어를 기르는 사람은 누구일까? – 덜덜덜...
  • 17.
    아인슈타인 퍼즐 • 데이터표현 – house( Color, Nationality, Beverage, Cigarette, Pet ). – [ House1, House2, ... , House5 ] • Relation – member( Item, [ Item | _ ] ). – member( Item, [ _ | Rest ] ) :- member( Item, Rest). – order( A, B, [ A, B | _ ] ). – order( A, B, [ _ | Tail ] ) :- order( A, B, Tail ). – near( A, B, List ) :- order( A, B, List) ; order( B, A, List ).
  • 18.
    아인슈타인 퍼즐 • 위치관련 힌트 – 한가운데 사는 사람은 우유를 마신다 – 노르웨이인은 첫번째 집에 산다 – position( [ house(_, norway, _, _, _), house(_, _, _, _, _), house(_, _, milk, _, _), house(_, _, _, _, _), house(_, _, _, _, _) ] ).
  • 19.
    아인슈타인 퍼즐 • 집의속성에 대한 힌트 – 영국인은 빨간 집에 산다 – member(house(red, england, _, _, _), HouseList). – member(house(_, sweden, _, _, dog), HouseList). – member(house(_, denmark, tea, _, _), HouseList). – member(house(green, _, coffee, _, _), HouseList). – member(house(_, _, _, pallmall, bird), HouseList). – member(house(yellow, _, _, dunhill, _), HouseList). – member(house(_, _, beer, bluemaster, _), HouseList). – member(house(_, german, _, prince, _), HouseList).
  • 20.
    아인슈타인 퍼즐 • 옆집힌트 – order(house(green, _, _, _, _), house(white, _, _, _, _), List). – near(house(_, _, _, blend, _), house(_, _, _, _, cat), List). – near(house(_, _, _, _, horse), house(_, _, _, dunhill, _), List). – near(house(_, norway, _, _, _), house(blue, _, _, _, _), List). – near(house(_, _, _, blend, _), house(_, _, water, _, _), List).
  • 21.
  • 22.
    아인슈타인 퍼즐 • 정말이렇게만 해서 될까요?
  • 23.
    참고자료 • Prolog Programmingfor Artificial Intelligence • http://nlp.kaist.ac.kr/~cs370/ – Symbolic Programming Course • http://en.wikipedia.org/wiki/Prolog • http://en.wikipedia.org/wiki/Einstein's_Puzzle – a.k.a "Zebra Puzzle"
  • 24.