Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог =).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.69 Mб
Скачать

13.2. Раскрашивание плоской карты

С ледующая задача состоит в раскрашивании плоской карты так, чтобы никакие две смежные области на ней не были раскрашены в одинаковый цвет. Эта знаменитая задача, известная уже сотни лет, была решена в 1976 году, когда было доказано, что для раскрашивания любой плоской достаточно использовать четыре краски. На рисунке показана простая карта, для корректного раскрашивания которой требуется четыре цвета. Это можно доказать путем перечисления всех возможных вариантов раскраски. Следовательно, для решения для решения задачи использование четырех красок является необходимым и достаточным.

color_map([Region|Regions],Colors) :- color_region(Region,Colors), color_map(Regions,Colors). color_map([],Colors).   color_region(region(Name,Color,Neighbors),Colors) :- select(Color,Colors,Colors1), members(Neighbors,Colors1).   select(X,[X|Xs],Xs). select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs).   members([X|Xs],Ys) :- member(X,Ys), members(Xs,Ys). members([],Ys).   test_color(Name,Map) :- map(Name,Map), colors(Name,Colors), color_map(Map,Colors).   map(test,[region(a,A,[B,C,D]), region(b,B,[A,C,E]), region(c,C,[A,B,D,E,F]), region(d,D,[A,C,F]), region(e,E,[B,C,F]), region(f,F,[C,D,E])]).   map(west_europe, [ region(portugal,P,[E]), region(spain,E,[F,P]), region(france,F,[E,I,S,B,WG,L]), region(belgium,B,[F,H,L,WG]), region(holland,H,[B,WG]), region(west_germany,WG,[F,A,S,H,B,L]), region(luxembourg,L,[F,B,WG]), region(italy,I,[F,A,S]), region(switzerland,S,[F,I,A,WG]), region(austria,A,[I,S,WG])]).   colors(X,[red,yellow,blue,white]).

В программе , предназначенной для решения задачи о раскрашивании карты, также использован принцип "образовать и проверить". Программа реализует следующий недетерминированный алгоритм:

для каждой области карты

- выбрать цвет,

- выбрать из оставшихся цветов (или проверить) цвета соседних областей

Для реализации алгоритма необходимо выбрать подходящие структуры данных. Карта представляется списком областей, каждая из которых имеет имя, цвет и список цветов, в которые окрашены смежные области. Например Карта изображенная на рисунке представляется списком

region(a, A, [B, C, D]), region(b, B, [A, C, E]), region(c, C, [A, B, D, E, F]), region(d, D, [A, C, F]), region(e, E, [B, C, F]), region(f, F, [C, D, E]).

Для того чтобы избежать раскраски одной и той же области в разные цвета на разных интерпретациях алгоритма, используются общие переменные.

Отношение верхнего уровня рассматриваемой программы является color_map(Map,Color), где Map - карта, представляемая описанным выше способом, Colors - список цветов, используемых для раскрашивания карты. Выберем цвета: красный, желтый, голубой и белый. Ядро алгоритма - определение отношения color_region(Region, Colors):

color_region(region(Name, Color, Neighbors), Colors)

select(Color, Coors, Colors1),

member(Neighbors, Colors1).

Цели select и members в зависимости от того, конкретизированы или нет их аргументы, могут либо производить генерацию вариантов, либо выполнять проверку.

Итогом выполнения программы о раскрашивании карты является конкретизация структуры данных - карты. Вызовы предикатов select и members могут рассматриваться как описания локальных ограничений. Предикаты либо генерируют предполагаемое решение посредством конкретизации элементов структуры, либо проверяют, удовлетворяют ли конкретизированные значения локальным ограничениям.

68