color(red).
color(green).
color(blue).
color(yellow).

adjacent(鶴見, 神奈川).
adjacent(神奈川, 西).
adjacent(西, 中).
adjacent(中, 南).
adjacent(南, 港南).
adjacent(港南, 磯子).
adjacent(磯子, 金沢).
adjacent(金沢, 栄).
adjacent(栄, 港南).
adjacent(中, 保土ケ谷).
adjacent(保土ケ谷, 西).
adjacent(保土ケ谷, 旭).
adjacent(旭, 瀬谷).
adjacent(瀬谷, 泉).
adjacent(泉, 戸塚).
adjacent(戸塚, 栄).
adjacent(都筑, 港北).
adjacent(都筑, 青葉).
adjacent(都筑, 緑).
adjacent(港北, 神奈川).
adjacent(緑, 青葉).
adjacent(港北, 鶴見).
adjacent(保土ケ谷, 緑).

% 出力用
print_colors([]).
print_colors([区-色 | 残り]) :-
    write(区), write(' -> '), write(色), nl,
    print_colors(残り).

% 実行ゴール
:- 
    Vars = [
        鶴見-A, 神奈川-B, 西-C, 中-D, 南-E, 港南-F,
        磯子-G, 金沢-H, 栄-I, 保土ケ谷-J, 旭-K, 瀬谷-L,
        泉-M, 戸塚-N, 都筑-O, 港北-P, 緑-Q, 青葉-R
    ],
    member(鶴見-A, Vars), color(A),
    member(神奈川-B, Vars), color(B),
    member(西-C, Vars), color(C),
    member(中-D, Vars), color(D),
    member(南-E, Vars), color(E),
    member(港南-F, Vars), color(F),
    member(磯子-G, Vars), color(G),
    member(金沢-H, Vars), color(H),
    member(栄-I, Vars), color(I),
    member(保土ケ谷-J, Vars), color(J),
    member(旭-K, Vars), color(K),
    member(瀬谷-L, Vars), color(L),
    member(泉-M, Vars), color(M),
    member(戸塚-N, Vars), color(N),
    member(都筑-O, Vars), color(O),
    member(港北-P, Vars), color(P),
    member(緑-Q, Vars), color(Q),
    member(青葉-R, Vars), color(R),

    % 隣接制約
    forall((adjacent(X, Y), member(X-C1, Vars), member(Y-C2, Vars)), C1 \= C2),

    write('4色で塗り分け可能'), nl,
    print_colors(Vars).
