% 色の定義
color( red) .
color( green) .
color( blue) .
color( yellow) .
% 隣接関係(横浜18区の隣接を以下のように定義、実際は調整してください)
adjacent( 鶴見, 神奈川) .
adjacent( 鶴見, 港北) .
adjacent( 神奈川, 西) .
adjacent( 神奈川, 港北) .
adjacent( 西, 中) .
adjacent( 中, 南) .
adjacent( 南, 港南) .
adjacent( 港南, 磯子) .
adjacent( 磯子, 金沢) .
adjacent( 金沢, 栄) .
adjacent( 栄, 港南) .
adjacent( 中, 保土ケ谷) .
adjacent( 保土ケ谷, 西) .
adjacent( 保土ケ谷, 旭) .
adjacent( 旭, 瀬谷) .
adjacent( 瀬谷, 泉) .
adjacent( 泉, 戸塚) .
adjacent( 戸塚, 栄) .
adjacent( 都筑, 港北) .
adjacent( 都筑, 青葉) .
adjacent( 都筑, 緑) .
adjacent( 港北, 鶴見) .
adjacent( 緑, 青葉) .
adjacent( 保土ケ谷, 緑) .
% 隣接は双方向である
adjacent_undirected( X, Y) :- adjacent( X, Y) .
adjacent_undirected( X, Y) :- adjacent( Y, X) .
% 隣接区と色がかぶらないか確認
safe_color( _, _, [ ] ) .
safe_color( District, Color, [ OtherDistrict- OtherColor | Rest] ) :-
( adjacent_undirected
( District
, OtherDistrict
) - > Color \
= OtherColor
; true ) , safe_color( District, Color, Rest) .
% 順番に色を割り当てる
assign_colors( [ ] , Assigned, Assigned) .
assign_colors( [ D| Ds] , AssignedSoFar, Assigned) :-
color( Color) ,
safe_color( D, Color, AssignedSoFar) ,
assign_colors( Ds, [ D- Color| AssignedSoFar] , Assigned) .
% 18区リスト(順序固定)
districts( [ 鶴見, 神奈川, 西, 中, 南, 港南,
磯子, 金沢, 栄, 保土ケ谷, 旭, 瀬谷,
泉, 戸塚, 都筑, 港北, 緑, 青葉] ) .
% 結果表示
print_colors( [ ] ) .
print_colors( [ D- C| Rest] ) :-
print_colors( Rest) .
% 実行
run :-
districts( Ds) ,
assign_colors( Ds, [ ] , Assigned) ,
reverse( Assigned, AssignedReversed) ,
print_colors( AssignedReversed) .
JSDoibLjga7lrprnvqkKY29sb3IocmVkKS4KY29sb3IoZ3JlZW4pLgpjb2xvcihibHVlKS4KY29sb3IoeWVsbG93KS4KCiUg6Zqj5o6l6Zai5L+C77yI5qiq5rWcMTjljLrjga7pmqPmjqXjgpLku6XkuIvjga7jgojjgYbjgavlrprnvqnjgIHlrp/pmpvjga/oqr/mlbTjgZfjgabjgY/jgaDjgZXjgYTvvIkKYWRqYWNlbnQo6ba06KaLLCDnpZ7lpYjlt50pLgphZGphY2VudCjptrTopossIOa4r+WMlykuCmFkamFjZW50KOelnuWliOW3nSwg6KW/KS4KYWRqYWNlbnQo56We5aWI5bedLCDmuK/ljJcpLgphZGphY2VudCjopb8sIOS4rSkuCmFkamFjZW50KOS4rSwg5Y2XKS4KYWRqYWNlbnQo5Y2XLCDmuK/ljZcpLgphZGphY2VudCjmuK/ljZcsIOejr+WtkCkuCmFkamFjZW50KOejr+WtkCwg6YeR5rKiKS4KYWRqYWNlbnQo6YeR5rKiLCDmoIQpLgphZGphY2VudCjmoIQsIOa4r+WNlykuCmFkamFjZW50KOS4rSwg5L+d5Zyf44Kx6LC3KS4KYWRqYWNlbnQo5L+d5Zyf44Kx6LC3LCDopb8pLgphZGphY2VudCjkv53lnJ/jgrHosLcsIOaXrSkuCmFkamFjZW50KOaXrSwg54Cs6LC3KS4KYWRqYWNlbnQo54Cs6LC3LCDms4kpLgphZGphY2VudCjms4ksIOaIuOWhmikuCmFkamFjZW50KOaIuOWhmiwg5qCEKS4KYWRqYWNlbnQo6YO9562RLCDmuK/ljJcpLgphZGphY2VudCjpg73nrZEsIOmdkuiRiSkuCmFkamFjZW50KOmDveetkSwg57eRKS4KYWRqYWNlbnQo5riv5YyXLCDptrTopospLgphZGphY2VudCjnt5EsIOmdkuiRiSkuCmFkamFjZW50KOS/neWcn+OCseiwtywg57eRKS4KCiUg6Zqj5o6l44Gv5Y+M5pa55ZCR44Gn44GC44KLCmFkamFjZW50X3VuZGlyZWN0ZWQoWCxZKSA6LSBhZGphY2VudChYLFkpLgphZGphY2VudF91bmRpcmVjdGVkKFgsWSkgOi0gYWRqYWNlbnQoWSxYKS4KCiUg6Zqj5o6l5Yy644Go6Imy44GM44GL44G244KJ44Gq44GE44GL56K66KqNCnNhZmVfY29sb3IoXywgXywgW10pLgpzYWZlX2NvbG9yKERpc3RyaWN0LCBDb2xvciwgW090aGVyRGlzdHJpY3QtT3RoZXJDb2xvciB8IFJlc3RdKSA6LQogICAgKGFkamFjZW50X3VuZGlyZWN0ZWQoRGlzdHJpY3QsIE90aGVyRGlzdHJpY3QpIC0+IENvbG9yIFw9IE90aGVyQ29sb3IgOyB0cnVlKSwKICAgIHNhZmVfY29sb3IoRGlzdHJpY3QsIENvbG9yLCBSZXN0KS4KCiUg6aCG55Wq44Gr6Imy44KS5Ymy44KK5b2T44Gm44KLCmFzc2lnbl9jb2xvcnMoW10sIEFzc2lnbmVkLCBBc3NpZ25lZCkuCmFzc2lnbl9jb2xvcnMoW0R8RHNdLCBBc3NpZ25lZFNvRmFyLCBBc3NpZ25lZCkgOi0KICAgIGNvbG9yKENvbG9yKSwKICAgIHNhZmVfY29sb3IoRCwgQ29sb3IsIEFzc2lnbmVkU29GYXIpLAogICAgYXNzaWduX2NvbG9ycyhEcywgW0QtQ29sb3J8QXNzaWduZWRTb0Zhcl0sIEFzc2lnbmVkKS4KCiUgMTjljLrjg6rjgrnjg4jvvIjpoIbluo/lm7rlrprvvIkKZGlzdHJpY3RzKFvptrTopossIOelnuWliOW3nSwg6KW/LCDkuK0sIOWNlywg5riv5Y2XLAogICAgICAgICAgIOejr+WtkCwg6YeR5rKiLCDmoIQsIOS/neWcn+OCseiwtywg5petLCDngKzosLcsCiAgICAgICAgICAg5rOJLCDmiLjloZosIOmDveetkSwg5riv5YyXLCDnt5EsIOmdkuiRiV0pLgoKJSDntZDmnpzooajnpLoKcHJpbnRfY29sb3JzKFtdKS4KcHJpbnRfY29sb3JzKFtELUN8UmVzdF0pIDotCiAgICB3cml0ZShEKSwgd3JpdGUoJyAtPiAnKSwgd3JpdGUoQyksIG5sLAogICAgcHJpbnRfY29sb3JzKFJlc3QpLgoKJSDlrp/ooYwKcnVuIDotCiAgICBkaXN0cmljdHMoRHMpLAogICAgYXNzaWduX2NvbG9ycyhEcywgW10sIEFzc2lnbmVkKSwKICAgIHdyaXRlKCc06Imy44Gn5aGX44KK5YiG44GR5Y+v6IO944Gn44GZ44CCJyksIG5sLAogICAgcmV2ZXJzZShBc3NpZ25lZCwgQXNzaWduZWRSZXZlcnNlZCksCiAgICBwcmludF9jb2xvcnMoQXNzaWduZWRSZXZlcnNlZCkuCgo6LSBpbml0aWFsaXphdGlvbihydW4pLgo=