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(保土ケ谷, 緑).
coloring([]).
coloring([区-色 | 残り]) :-
color(色),
coloring(残り),
forall(member(隣-色2, 残り),
((adjacent
(区
, 隣
); adjacent
(隣
, 区
)) -> 色 \
= 色
2 ; true)).
print_colors([]).
print_colors([区-色 | 残り]) :-
print_colors(残り).
main :-
配置 = [
鶴見-_, 神奈川-_, 西-_, 中-_, 南-_, 港南-_,
磯子-_, 金沢-_, 栄-_, 保土ケ谷-_, 旭-_, 瀬谷-_,
泉-_, 戸塚-_, 都筑-_, 港北-_, 緑-_, 青葉-_
],
coloring(配置),
print_colors(配置).
Y29sb3IocmVkKS4KY29sb3IoZ3JlZW4pLgpjb2xvcihibHVlKS4KY29sb3IoeWVsbG93KS4KCmFkamFjZW50KOm2tOimiywg56We5aWI5bedKS4KYWRqYWNlbnQo56We5aWI5bedLCDopb8pLgphZGphY2VudCjopb8sIOS4rSkuCmFkamFjZW50KOS4rSwg5Y2XKS4KYWRqYWNlbnQo5Y2XLCDmuK/ljZcpLgphZGphY2VudCjmuK/ljZcsIOejr+WtkCkuCmFkamFjZW50KOejr+WtkCwg6YeR5rKiKS4KYWRqYWNlbnQo6YeR5rKiLCDmoIQpLgphZGphY2VudCjmoIQsIOa4r+WNlykuCmFkamFjZW50KOS4rSwg5L+d5Zyf44Kx6LC3KS4KYWRqYWNlbnQo5L+d5Zyf44Kx6LC3LCDopb8pLgphZGphY2VudCjkv53lnJ/jgrHosLcsIOaXrSkuCmFkamFjZW50KOaXrSwg54Cs6LC3KS4KYWRqYWNlbnQo54Cs6LC3LCDms4kpLgphZGphY2VudCjms4ksIOaIuOWhmikuCmFkamFjZW50KOaIuOWhmiwg5qCEKS4KYWRqYWNlbnQo6YO9562RLCDmuK/ljJcpLgphZGphY2VudCjpg73nrZEsIOmdkuiRiSkuCmFkamFjZW50KOmDveetkSwg57eRKS4KYWRqYWNlbnQo5riv5YyXLCDnpZ7lpYjlt50pLgphZGphY2VudCjnt5EsIOmdkuiRiSkuCmFkamFjZW50KOa4r+WMlywg6ba06KaLKS4KYWRqYWNlbnQo5L+d5Zyf44Kx6LC3LCDnt5EpLgoKY29sb3JpbmcoW10pLgpjb2xvcmluZyhb5Yy6LeiJsiB8IOaui+OCil0pIDotCiAgICBjb2xvcijoibIpLAogICAgY29sb3Jpbmco5q6L44KKKSwKICAgIGZvcmFsbChtZW1iZXIo6ZqjLeiJsjIsIOaui+OCiiksCiAgICAgICAgICAgKChhZGphY2VudCjljLosIOmaoyk7IGFkamFjZW50KOmaoywg5Yy6KSkgLT4g6ImyIFw9IOiJsjIgOyB0cnVlKSkuCgpwcmludF9jb2xvcnMoW10pLgpwcmludF9jb2xvcnMoW+WMui3oibIgfCDmrovjgopdKSA6LQogICAgd3JpdGUo5Yy6KSwgd3JpdGUoJyAtPiAnKSwgd3JpdGUo6ImyKSwgbmwsCiAgICBwcmludF9jb2xvcnMo5q6L44KKKS4KCm1haW4gOi0KICAgIOmFjee9riA9IFsKICAgICAgICDptrTopostXywg56We5aWI5bedLV8sIOilvy1fLCDkuK0tXywg5Y2XLV8sIOa4r+WNly1fLAogICAgICAgIOejr+WtkC1fLCDph5HmsqItXywg5qCELV8sIOS/neWcn+OCseiwty1fLCDml60tXywg54Cs6LC3LV8sCiAgICAgICAg5rOJLV8sIOaIuOWhmi1fLCDpg73nrZEtXywg5riv5YyXLV8sIOe3kS1fLCDpnZLokYktXwogICAgXSwKICAgIGNvbG9yaW5nKOmFjee9riksCiAgICB3cml0ZSgnNOiJsuOBp+Whl+OCiuWIhuOBkeWPr+iDvScpLCBubCwKICAgIHByaW50X2NvbG9ycyjphY3nva4pLgo=