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