%% 知識情報処理実習 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).