[AI] Prolog 를 파헤쳐 봅시닷!?!? - 2. Prolog 문법은?
Programming/인공지능 / 2009. 4. 3. 01:56
이제 실행해볼 환경도 마련했으니 간단하게 프로그램을 작성해 보겠습니다.
1: father(paul, tom). father(alex, tom).
2: mother(paul, alice). mother(alex, alice).
3:
4: parent(Person, Parent) :-
5: father(Person, Parent);
6: mother(Person, Parent).
7:
8: sibling(Person, Sibling) :-
9: Person \== Sibling,
10: father(Person, Father), father(Sibling, Father),
11: mother(Person, Mother), mother(Sibling, Mother).
2: mother(paul, alice). mother(alex, alice).
3:
4: parent(Person, Parent) :-
5: father(Person, Parent);
6: mother(Person, Parent).
7:
8: sibling(Person, Sibling) :-
9: Person \== Sibling,
10: father(Person, Father), father(Sibling, Father),
11: mother(Person, Mother), mother(Sibling, Mother).
1~2 라인에서는 facts 를 정의하였습니다.
1: father(paul, tom). father(alex, tom). % paul 의 아버지는 tom, alex 의 아버지는 tom.
2: mother(paul, alice). mother(alex, alice). % paul 의 어머니는 alice, alex 의 어머니는 alice.
2: mother(paul, alice). mother(alex, alice). % paul 의 어머니는 alice, alex 의 어머니는 alice.
4~6 라인에서는 부모 - parent/2 라는 룰을 정의하였습니다.
('/' 뒤에 숫자는 인자의 개수를 말합니다. 여기서는 parent 의 rule 의 인자는 2개라는 뜻)
4: parent(Person, Parent) :-
5: father(Person, Parent);
6: mother(Person, Parent).
':-' 라는 연산자는 rule 을 정의할 때 사용하며 세미콜론(;) 은 or 연산을 의미합니다.5: father(Person, Parent);
6: mother(Person, Parent).
위의 내용은 parent/2 라는 룰은 father/2 나 mother/2 의 facts 를 확인한다는 뜻 입니다.
8 ~ 11 라인은 형제 - sibling/2 라는 룰을 정의하였습니다.
8: sibling(Person, Sibling) :-
9: Person \== Sibling,
10: father(Person, Father), father(Sibling, Father),
11: mother(Person, Mother), mother(Sibling, Mother).
형제를 확인할 경우 본인이 아닌 것을 확인해야 하므로 9 라인의 '\==' 연산자를 통하여 같지 않음을 확인합니다.9: Person \== Sibling,
10: father(Person, Father), father(Sibling, Father),
11: mother(Person, Mother), mother(Sibling, Mother).
콤마(,)의 경우에는 and 연산을 의미합니다.
위의 내용은 인자들이 서로 같지 않고 아버지와 어머니가 같은 경우의 Person 과 Sibling 을 확인할 수 있는 rule 입니다.
이제 맞게 프로그래밍이 되었는지 질의를 해보겠습니다.
?- parent(paul, WHO).
WHO = tom ;
WHO = alice.
paul 의 parent 를 확인하는 질의입니다. 명령을 실행하면 WHO = tom 이라는 결과가 나오는데 Enter 를 치게 되면WHO = tom ;
WHO = alice.
다음 대상에 대한 출력을 하게됩니다.
sibling(paul, alex). sibling(paul, paul). 과 같은 질의를 해보면 올바르게(?) 프로그래밍이 된 것을 확인할 수 있을 것입니다.
Prolog 작성시 주의사항
facts 작성시 인자의 첫 글자는 소문자로 작성을 합니다. 첫 글자가 대문자일 경우 Singleton variable 로 인식을 하게됩니다.
rules 작성시에 rules 의 이름의 첫글자는 소문자로 작성하며, 인자의 첫글자는 대문자로 작성합니다.
(해보시면 알겠지만 이름의 첫글자를 대문자로 하게되면 컴파일 오류가 나며, 인자를 소문자로 할 경우 올바른 결과를 확인할 수 없습니다.)
이정도만 알면 간단한 Prolog 프로그래밍을 할 수 있겠죠???