본문 바로가기

PROLOG

PROLOG

[PROLOG의 정의]

PROLOG(programming in logic) : 논리 기반 프로그래밍 언어로, 1차 서술 논리를 이용해 문제 해결에 필요한 지식을

                                                      표현한다

PROLOG 프로그램 : 1차 서술 논리로 표현한 사실과 규칙들로 이루어진 데이터베이스

 

[PROLOG의 구조]

PROLOG 프로그래밍은 다음과 같은 사항들로 되어 있다
   1) 대상과 그들간의 관계에 대한 사실(Facts) 선언
   2) 대상과 그들간의 관계에 대한 규칙(Rules)의 정의
   3) 대상과 그들간의 관계에 대한 질문(Questions)

사실(fact) : 객체 또는 객체들 사이의 객관적인 관계 선언

규칙(rule) : 객체들 간의 관계를 설명하는 규칙

질문(question) :  database에 관한 질문,  fact와 rule의 집합(prolog database)

=> prolog program은 fact와 rule의 집합이다

 

[서술 논리와 PROLOG]

 

[상수와 변수]

- 상수 :  atom이라 칭하며, 변할 수 없는 데이터다

   atom : 문자, 숫자, _, 공백으로 구성되며(' ' 로 감싸진 데이터도 가능) 첫 문자는 반드시 영문 소문자로 한다 

     -> ex) number, index ...

- 변수

   : atom과 같으나 첫 문자는 반드시 영문 대문자 또는 _로 한다. 

     -> ex) Number, _num ...

   : 변수는 instantiate 되거나 not instantiate 된다 (둘 다 된다는 뜻.. instantiate가 되었다는 것은 변수가 뜻하는

      대상이 존재한다는 의미다)

- 구조체(structure) : functor(obj1, obj2, ...)

  : 객체 또는 객체들의 구조적 표현

  : functor와 그 인자들로 구성된다

   -> ex) team(john, kim)

   -> ex2) owns(john, etc(kim, lee)) 의 경우, etc(kim, lee)는 하나의 객체처럼 간주한다

- 상수와 변수의 구분

   1) KIM123        =>       변수

   2) _kim123       =>       변수

   3) kim_123       =>       아톰

   4) _                   =>       변수

 

[Fact]

pred(arg-1, arg-2, ..., arg-n)

: 객체는 소문자로 시작하고, fact의 끝 표시는 마침표로 한다

: 관계를 쓴 후에는 대상들이 소괄호 안에 콤마(,)로 구분해서 열거된다

: 소괄호 안의 객체들은 순서에 따라 일관성 있게 의미를 부여한다

: 소괄호 앞의 관계는 술어(Predicate)라 칭하고, 소괄호 내의 대상들은 인수(Arguments)라 칭한다

: 관계(Relationship)는 임의의 개수의 인수를 가질 수 있다

   => play라는 술어를 정의하기 위해서는 2명 이상의 사람과 play할 것의 명칭, 도합 3개 이상의 인수가 필요하다

        예를 들어, play(kim, lee, game).   =해석=>  kim과 lee가 game을 play한다. 라고 표현할 수 있다.

-> ex) woman(kim) .            =해석=>  kim은 woman이다.

           man(lee) .                 =해석=>  lee는 man이다.

           owns(kim, book) .     =해석=>  kim이 book을 owns하다.

           wife(kim, lee) .          =해석=>  kim은 lee의 wife이다. 

 

[Rule]

head :- body

: 규칙은 어떤 사실이 다른 사실들의 집합에 의존적일 경우 또는 어떤 것을 정의하는 데에 사용되며, if를 사용한다

: 규칙은 대상과 그들간의 관계에 대한 일반적인 표현이다

: 규칙은 head와 body로 구성되며, ':-'로 연결된다

-> ex) likes(kim, X) :- likes(X, game).     =해석=>  만약 X가 game을 likes하면 kim은 X를 likes한다

: 규칙의 head 부분은 규칙이 정의하고 싶은 사실을 기술한다 (likes(kim, X) 부분)

: 규칙의 body 부분은 head가 참이기 위해서 만족시켜야할 목표를 기술하며, 목표는 여러 개가 될 수 있다. 다수의

  목표는 콤마(,)로 구분해서 열거된다 (likes(X, game) 부분)

-> ex) interesting(X) :- language(X), easy(X).  =해석=> X는 language고 easy할 때 intersting 하다.

-> ex2) sister(X, Y) :- woman(X), woman(Y), parents(X, M, F), parents(Y, M, F).

             =해석=> X와 Y가 여자고, X와  Y의 부모 M, F일 때 X, Y는 자매관계다.

: 규칙의 의미는 변수명과 무관하며, 변수에 아무런 의미가 없을 경우 해당 변수의 역할과 의미를 임의로 정할 수

  있다. 즉, 규칙의 해석에 있어 변수의 이름이나 열거된 순서는 중요하지 않다

-> play(kim, lee, game)은 kim과 lee가 game을 play한다.로 해석되지만 parents(X, M, F)은 M과 F는 X의 parents다로

    해석된다 (이해졸라안된다)

 

[Question]

?- fact

: 어떠한 fact에 대해 질문을 하면, PROLOG는 사실들을 모아 놓은 데이터베이스에서 질문의 사실 부분과 일치하는

  사실들을 찾는다. 이때 일치하는 사실을 찾으면 yes, 일치하는 사실이 없는 경우 no라고 답한다

: no는 false의 의미가 아닌 질문에 일치하는 사실이 없다는 것을 의미한다

     likes(kim, fish).

     likes(kim, lee).

     likes(lee, game).

     likes(lee, book). 와 같은 데이터베이스가 있다고 가정하고 설명 및 예시를 이어나가겠다

: not instantiate한 변수에 대한 질문 결과 탐색 과정

    0) ?- likes(kim, X). 라는 질문을 하면 PROLOG는 kim이 likes하는 것을 찾는다

    1) PROLOG는 데이터베이스의 처음부터 탐색을 시작해서 likes(kim, fish).를 찾게 되고, 이때 X는 fish를 의미하게

        된다(not instantiate했던 X가 instantiate 됐다)

    2) 데이터베이스에 일치하는 사실이 발견된 곳을 표시한다

    3) 이때 return 키를 치면 PROLOG는 탐색을 중단하고, ; 키와 return 키를 치면 가장 최근에 표시해둔 위치부터

         다시 탐색을 시작한다

    4) 다음으로 일치하는 사실은 likes(kim, lee).로, X는 lee를 의미하게 된다

    5) 2부터 반복하고, 더이상 일치하는 사실이 없으면 no라 답한다

-> ex) ?- likes(kim, fish). 

          yes

          ?- likes(lee, fish). 

          no

          ?- likes(kim, lee). 

          yes 

-> ex2) ?- likes(lee, X).

             X=game;

             X=book;

             no

 

[Conjunctions]

: 'A와 B는 서로 좋아합니까?'라는 질문은 'A는 B를 좋아합니까? 그리고 B는 A를 좋아합니까?'와 같은 의미로,

  두 개의 목표를 동시에 만족해야한다. 이는 목표 사이에 콤마(,)를 사용하여 표현한다 (rule파트에서 언급한 내용)

     likes(kim, lee).

     likes(kim, fish).

     likes(lee, fish).

     likes(lee, book). 와 같은 데이터베이스가 있다고 가정하고 설명 및 예시를 이어나가겠다

: 'kim과 lee는 서로 좋아합니까?'라는 질문은 ?- likes(kim, lee), likes(lee, kim).로 표현하고, 이에 대한 답은 no다

: 'kim과 lee가 모두 좋아하는 것은 무엇입니까?'라는 질문은 ?- likes(kim, X), likes(lee, X).로 표현할 수 있다

: ?- likes(kim, X), likes(lee, X). 질문에 대한 결과 탐색 과정

    0) 먼저 kim이 좋아하는 것을 찾고, 다음으로 lee가 좋아하는 것을 찾는다

    1) 첫 번째로 kim이 좋아하는 것은 lee로, X는 lee로 instantiate된다

    2) lee가 좋아하는 것 중 X와 일치하는 것을 찾는다

    3) 이때, 일치하는 것이 없으면 Backtracking(되돌림추적)이 실행되어 X의 가장 최근 값을 지우고, 다음으로 kim이

         좋아하는 것을 찾는다

    4) X는 fish로 instantiate 된다

    5) lee가 좋아하는 것 중 X와 동일한 fish가 있으므로 PROLOG는 X의 값을 알리고 다음 반응을 기다린다. 만약

       일치하는 것이 없다면 3-4-5 과정을 반복한다