%%   知識情報処理実習 r1練習問題 解答例

(1)
parent(tom,bob).
parent(tom,liz).
parent(pam,bob).
parent(bob,pat).
parent(pat,jim).

male(tom).
male(bob).
male(jim).
female(pam).
female(liz).
female(pat).

% 以下はテスト用述語なので定義する必要はない
test1_1_1(X) :- parent(bob,X).  
test1_1_2(X) :- parent(X,bob).
test1_1_3(X,Y) :- parent(X,Y).
test1_1_4 :- male(bob).
test1_1_5 :- female(bob).


/* Prolog を立ち上げ、
  ?- parent(tom,X).  
と入力すると、
  X=bob
という解答が得られる。
ここで  を押すと単解のみが求まって終了。(注:は Enter-keyの意味)
別解を求めるには
  X=bob;
のように、セミコロン(;)を入力するとよい。
別解があればこれを繰り返すとすべての解が得られる。

プログラムの中に以下のようにテスト用の述語を定義しておくと
実行環境では
  ?- test1_1_1(X)
と入力するだけでよい。述語名や引数が複雑になった場合タイプミスを防ぐために有効。
*/      

% (2)
ok :- parent(tom,bob), parent(tom,liz).

test1_2 :- ok.

% (3)
father(X,Y) :- parent(X,Y), male(X).

test1_3_1(X) :- father(bob,X).
test1_3_2(X) :- father(X,bob).

% (4)
grandfather(X,Y) :- father(X,Z), parent(Z,Y).

test1_4_1 :- grandfather(bob,jim).
test1_4_2(X) :- grandfather(X,jim).

% (5)
ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).

test1_5(X) :- ancestor(X,jim).

% (6)
 X が Y の親で,かつ,X が男性ならば,X は Y の父である.