Конечная переменная существует потому, что mem(Var,[Var|_])
связывает несвязанную переменную Coloring
с [Var|_]
.
Один из способов избежать этого - накопить раскраску карты, например (очень быстро и очень грязно):
col(Colors,Map,Coloring) :-
check(Colors,Map,[],Coloring).
check(Colors,[],Coloring,Coloring).
check(Colors,[Country1:Country2 | T],[],L) :-
member(Color1,Colors),
member(Color2,Colors),
Color1 \== Color2,
check(Colors,T,[Country1:Color1,Country2:Color2],L).
check(Colors,[Country1:Country2 | T],Coloring,L) :-
member(Country1:Color1,Coloring),
member(Country2:Color2,Coloring),!,
check(Colors,T,Coloring,L).
check(Colors,[Country1:Country2 | T],Coloring,L) :-
member(Country1:Color1,Coloring),!,
member(Color2,Colors),
not(member(_:Color2,Coloring)),
check(Colors,T,[Country2:Color2|Coloring],L).
check(Colors,[Country1:Country2 | T],Coloring,L) :-
member(Country2:Color2,Coloring),!,
member(Color1,Colors),
not(member(_:Color1,Coloring)),
check(Colors,T,[Country1:Color1|Coloring],L).
Это гораздо более "процедурный" подход, чем ваш, хотя :-(. Возможно, есть более элегантный способ ...