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

% 1.
male(tom).    
male(bob).    
male(jim).    
female(liz).
female(pat).

gather_men(Men) :- setof(X,male(X),Men).

number_of_men(N) :- gather_men(Men), list_length(Men,N).

list_length([],0).
list_length([_|L],N) :- list_length(L,N1), N is N1+1.

test9_1_1(Men) :- gather_men(Men).
test9_1_2(Men) :- number_of_men(Men).

% 2.
exist_path :- start(X), goal(Y), connected(X,Y).

goal(g).
start(s).

edge(s,a).
edge(s,b).
edge(a,c).
edge(a,d).
edge(b,e).
edge(b,g).
edge(c,g).
edge(d,g).
edge(e,g).

connected(N,N).
connected(N,M) :- edge(N,L), connected(L,M).

/*
以下の定義でもよいが同一ノードの場合の動きが異なる.
以後の問題に応用するためには上の定義の方がよい.
connected(N,M) :- edge(N,M).
connected(N,M) :- edge(N,L), connected(L,M).
*/

test9_2 :- exist_path.

% 3.
path(N,N,[N]).
path(N,M,[N|P]) :- edge(N,L), path(L,M,P).

test9_3(P) :- path(s,g,P).