Skip to content

Map coloring (CLP(FD))

Color adjacent regions differently using small integer domains.

% Australia map adjacency
adj(sa, wa). adj(sa, nt). adj(sa, q). adj(sa, nsw). adj(sa, v).
adj(wa, nt). adj(nt, q). adj(q, nsw). adj(nsw, v).

coloring(Colors) :-
    Colors = [wa, nt, sa, q, nsw, v, t],
    WA in 1..3, NT in 1..3, SA in 1..3, Q in 1..3, NSW in 1..3, V in 1..3, T in 1..3,
    all_different_neighbors([wa-WA, nt-NT, sa-SA, q-Q, nsw-NSW, v-V, t-T]),
    label([WA,NT,SA,Q,NSW,V,T]).

all_different_neighbors(Pairs) :-
    \+ ( member(A-CA, Pairs), member(B-CB, Pairs), A @< B, adj(A,B), CA #= CB ).

% member/2
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
?- coloring(Cs).
Cs = [wa, nt, sa, q, nsw, v, t].  % with assigned numbers for each variable

Note: Region variables (WA, NT, …) take values 1..3 (3‑coloring). Increase to 1..4 to allow more flexibility.