%% file:    map.pl
%% author:  Robert Keller
%% purpose: coloring a map using Prolog


map([Algeria, Chad, Egypt, Libya, Mali, Mauritania, Morocco, Niger, Sudan,
     Tunisia, Western_Sahara], Colors) :-
    touches(Algeria, Libya, Colors),
    touches(Algeria, Mali, Colors),
    touches(Algeria, Mauritania, Colors),
    touches(Algeria, Morocco, Colors),
    touches(Algeria, Niger, Colors),
    touches(Algeria, Tunisia, Colors),
    touches(Algeria, Western_Sahara, Colors),
    touches(Chad, Libya, Colors),
    touches(Chad, Niger, Colors),
    touches(Chad, Sudan, Colors),
    touches(Egypt, Libya, Colors),
    touches(Egypt, Sudan, Colors),
    touches(Libya, Algeria, Colors),
    touches(Libya, Chad, Colors),
    touches(Libya, Egypt, Colors),
    touches(Libya, Niger, Colors),
    touches(Libya, Sudan, Colors),
    touches(Libya, Tunisia, Colors),
    touches(Mauritania, Algeria, Colors),
    touches(Mauritania, Mali, Colors),
    touches(Mauritania, Western_Sahara, Colors),
    touches(Morocco, Algeria, Colors),    
    touches(Morocco, Western_Sahara, Colors),
    touches(Niger, Algeria, Colors),
    touches(Niger, Chad, Colors),
    touches(Niger, Libya, Colors),
    touches(Niger, Mali, Colors),
    touches(Sudan, Chad, Colors),
    touches(Sudan, Egypt, Colors),
    touches(Sudan, Libya, Colors),
    touches(Algeria, Libya, Colors),
    touches(Tunisia, Libya, Colors).


touches(X, Y, Colors) :-   %% two adjacent regions are colored differently
    member(X, Colors), 
    member(Y, Colors), 
    X \== Y.

member(X, [X | _]).
member(X, [_ | Ys]) :- member(X, Ys).

test2 :-
    map(Solution, [red, blue]),
    write(Solution).

test3 :-
    map(Solution, [red, blue, green]),
    write(Solution).

