Программирование на языке ПРОЛОГ для искуственного интеллекта




Повышение эффективности программы раскраски карты - часть 2


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

        цвета( [ ]).

        цвета( [Страна/Цвет | Остальные] ) :-
        цвета( Остальные),
            принадлежит( Цвет, [желтый, синий, красный, зеленый]),
            not( принадлежит( Страна1/Цвет, Остальные),
                                                        сосед( Страна, Страна1) ).

        сосед( Страна, Страна1) :-
                соседи( Страна, Соседи),
                принадлежит( Страна1, Соседи).

Здесь принадлежит( X, L) - как всегда, отношение принадлежности к списку. Для простых карт с небольшим числом стран такая программа будет работать. Что же касается Европы, то здесь результат проблематичен. Если считать, что мы располагаем встроенным предикатом setof, то можно попытаться раскрасить карту Европы следующим образом. Определим сначала вспомогательное отношение:

        страна( С) :- соседи( С, _ ).

Тогда вопрос для раскраски карты Европы можно сформулировать так:

        ?-  sеtоf( Стр/Цвет, страна( Стр), СписЦветСтран),
             цвета( СписЦветСтран).

Цель setof - построить "шаблон" списка СписЦветСтран, в котором в элементах вида страна/ цвет вместо цветов будут стоять неконкретизированные переменные.


Содержание  Назад  Вперед