본문 바로가기
Computer Science

[Programming] Prolog: Family Tree Example

by Henry Cho 2021. 8. 5.
728x90

Prolog: Family Tree Example


프롤로그(Prolog)를 공부하는 있어서 대표적으로 많이 나오는 문제가 Famil Tree에 대한 예제이다. 한국말로 하면 가족 관계도에 해당하며 프롤로그를 통해서 Family Tree를 만들고 이에 대한 원하는 결괏값을 바로바로 확인이 가능하다. 아래의 링크를 들어가면 SWISH에서 Family tree example code를 제공해주고 있으니 참고하고 직접 실행해보는 것도 좋다. 

 

SWISH -- SWI-Prolog for SHaring

% KNOWLEDGE BASE % FACTS: % MALES male(abraham). male(clancy). male(mr_burns). male(homero). male(seymur_skinner). male(bart). male(milhouse). male(kang). male(santas_little_helper). male(snowball). % FEMALES female(mona). female(jacqueline). female(marge)

swish.swi-prolog.org


 

 

 parent(X, Y) :- father_of(X, Y); mother_of(X, Y).
		
        child_of(X, Y) :- parent(Y, X).
        son_of(X, Y) :- child_of(X, Y), male(X).
        daughter_of(X, Y) :- child_of(X, Y), female(X).
		
		siblings(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y.
		brother_of(X, Y) :- siblings(X, Y), male(X).
		sister_of(X, Y) :- siblings(X, Y), female(X).
		
		grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
		grandpa(X, Y) :- grandparent(X, Y), male(X).
		grandma(X, Y) :- grandparent(X, Y), female(X).
		
		grandchild(X, Y) :- grandparent(Y, X).
		grandson(X, Y) :- grandchild(X, Y), male(X).
		granddaughter(X, Y) :- grandchild(X, Y), female(X).
		
		parent_siblings(X, Y) :- parent(Z, Y), siblings(Z, X), X \= Y.
		uncle_of(X, Y) :- parent_siblings(X, Y), male(X).
		aunt_of(X, Y) :- parent_siblings(X, Y), female(X).

 

코드블럭 안에 있는 프롤로그 코드는 SWISH 예제 코드에서 제공하는 가족 조건 코드에 해당한다. 코드를 살펴보면 siblings, grandparent, grandchild, parent siblings 까지만 나와있다. 이외에도 Family tree에서 활용할 수 있는 가족 관계 조건들을 필자가 추가로 만들어보았다. 아래 조건 code를 추가하여 사용이 가능하다.

#neice, nephew

neice(X, Y) :-
	daughter(X, Z),
	siblings(Z, Y),
	dif(Y, Z).	

nephew(X, Y) :-
	son(X, Z),
	siblings(Z, Y),
	dif(Y, Z).

조카에 대한 조건 코드이다. nephew는 남자 조카, neice는 여자 조카를 의미한다.

 

#grandparent, cousin

grandparent(X, Y) :-
    parent(X, Z),
    parent(Z, Y).

cousin(X, Y) :-
    grandparent(Z, X),
    grandparent(Z, Y),
    \+sibling(X, Y),
    X \= Y.

cousin, 사촌을 구하기 위해서는 gandparent에 대한 정보가 필요하다. 따라서 cousin을 family tree에서 찾고 싶다면 grandparent 조건을 잊지 말고 첨부해야 한다.

 

#greatgrandparent, secondcousin

greatgrandparent(A, D) :-
    parent(C, D), 
    parent(B, C), 
    parent(A, B).

secondcousin(X, Y) :-
    greatgrandparent(Z, X),
    greatgrandparent(Z, Y),
    \+sibling(X, Y),
    \+cousin(X, Y),
    X \= Y.

Secondcousin이라고 불리는 재종 형제 또는 재종 자매를 의미한다. 여기까지 물어보는 경우는 드물지만 예제 코드가 필요할 수 있으니 작성해놓았다. 재종 관계는 증조부, greatgrandparent에 정보가 필요하기 해당 조건 코드가 같이 포함되어 있어야 한다.

해당 코드들은 완성된 코드가 아니며 가족 관계 조건 코드만 작성되어 있다. 따라서 전체 코드에 추가해서 사용하면 된다. Prolog에 대한 추가적인 설명이나 예제코드가 필요하다면 다음 포스트에서 살펴보도록 하겠다.


In conlusion, 3 줄 요약

1. Prolog example code로 Family tree가 많이 나온다.

2. SWISH에서 제공하는 예제코드를 통해 famil tree를 살펴볼 수 있다.

3. 추가적인 가족 관계 조건은 필자가 작성해두었다.


 

728x90

댓글