adjacent(X,Y,Map) :- member([X,Y],Map) ; member([Y,X],Map). find_regions(Map,Regions):- flatten(Map,X), list_to_set(X,Regions). color(Map,Colors,Coloring) :- find_regions(Map,Regions), color_all(Regions,Colors,Coloring), not(conflict(Map,Coloring)). color_all([R|Rs],Colors,[[R,C]|A]) :- member(C,Colors), color_all(Rs,Colors,A). color_all([],_,[]). conflict(Map,Coloring) :- member([R1,C],Coloring), member([R2,C],Coloring), adjacent(R1,R2,Map). map1([[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]] ).