Списковое представление множества кандидатов

В нашей первой реализации этой идеи мы будем использовать следующее представление для множества

        решить( Старт, Решение) :-

                вширину( [ [Старт] ], Решение).

        вширину( [ [Верш | Путь] | _ ], [Верш | Путь] ) :-

                цель( Верш).

        вширину( [ [В | Путь] | Пути], Решение ) :-

                bagof( [B1, В | Путь ],

                ( после( В, В1), not  принадлежит( В1, [В | Путь])),

                НовПути),

                        % НовПути - ациклические продолжения пути [В | Путь]

                конк( Пути, НовПути, Пути1),  !,

                вширину( Путь1, Решение);

                вширину( Пути, Решение).

                                % Случай, когда у В нет преемника

Рис. 11. 10.  Реализации поиска в ширину.

путей-кандидатов. Само множество будет списком путей, а каждый путь - списком вершин, перечисленных в обратном порядке, т. е. головой списка будет самая последняя из порожденных вершин, а последним элементом списка будет стартовая вершина. Поиск начинается с одноэлементного множества кандидатов

        [ [СтартВерш] ]

Общие принципы поиска в ширину таковы:

Для того, чтобы выполнить поиск в ширину при заданном множестве путей-кандидатов, нужно:

если голова первого пути - это целевая вершина, то взять этот путь в качестве решения, иначе

удалить первый путь из множества кандидатов и породить множество всех возможных продолжений этого пути на один шаг; множество продолжений добавить в конец множества кандидатов, а затем выполнить поиск в ширину с полученным новым множеством.

В случае примера рис.11.9 этот процесс будет развиваться следующим образом:

        решить( Старт, Решение) :-

                вширь( [ [Старт] | Z ]-Z, Решение).

        вширь( [ [Верш | Путь] | _ ]-_, [Верш | Путь] ) :-

                цель( Верш).

        вширь( [ [В | Путь] | Пути]-Z, Решение ) :-

                bagof( [B1, В | Путь ],

                            ( после( В, В1),

                               not принадлежит( В1, [В | Путь]) ),

                            Нов ),

                конк( Нов, ZZ, Z),  !,

                вширь( Пути-ZZ, Решение);

                Пути == Z,            % Множество кандидатов не пусто

                вширь( Пути-Z, Решение).

Рис. 11. 11.  Программа

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату