Основы построения и функционирования интеллектуальных информационных систем. Былкин В.Д - 131 стр.

UptoLike

131
Рис. 8.1
Заметим, что каждое ребро мы описываем дважды: как путь от вершины i к вершине j, и
наоборот. Решение задачи описывается процедурой «найти_ путь»:
найти_ путь (Текущая, Пройденные)
:- длина (Пройденные, 8),
write (Пройденные).
найти_ путь (Текущая, Пройденные) :-
ребро (Ребро, Текущая, Новая),
не_ является элементом (Ребро, Пройденные),
найти_ путь (Новая, (Ребро 1 Пройденные).
Процедура имеет два параметра: «Текущая» вершина и список «Пройденные», хранящий номера
пройденных в процессе поиска ребер. Используются две вспомогательные процедуры: «длина», рас-
смотренная ранее, и «не_ является_ элементом», аналогичная приведенной выше процедуре «является_
элементом». Write - это так называемый встроенный предикат языка Пролог, который выводит на
дисплей значение своего аргумента, в данном случае списка. Первое правило этой процедуры гласит,
что если найден путь, длина которого равна общему количеству ребер графа (в данном случае восьми),
то искомый путь найден и его надо распечатать. Второе правило срабатывает, когда длина найденного
отрезка пути меньше общего количества ребер, т, е. остались еще не пройденные ребра. В этом случае
надо взять ребро, исходящее из текущей вершины и не включенное в список пройденных. Это ребро
соединяет текущую вершину и вершину «Новая». Затеи следует найти путь от новой вершины к
конечной, добавив номер ребра к списку пройденных.
Как видим, эта процедура также имеет весьма простой вид, по крайней мере с первого взгляда. Но
за этой простотой скрывается алгоритм логического вывода языка Пролог, который и обеспечи-
                                                        Рис. 8.1


     Заметим, что каждое ребро мы описываем дважды: как путь от вершины i к вершине j, и
наоборот. Решение задачи описывается процедурой «найти_ путь»:

              найти_ путь (Текущая, Пройденные)
              :- длина (Пройденные, 8),
              write (Пройденные).
              найти_ путь (Текущая, Пройденные) :-
              ребро (Ребро, Текущая, Новая),
              не_ является элементом (Ребро, Пройденные),
              найти_ путь (Новая, (Ребро 1 Пройденные).

     Процедура имеет два параметра: «Текущая» вершина и список «Пройденные», хранящий номера
пройденных в процессе поиска ребер. Используются две вспомогательные процедуры: «длина», рас-
смотренная ранее, и «не_ является_ элементом», аналогичная приведенной выше процедуре «является_
элементом». Write - это так называемый встроенный предикат языка Пролог, который выводит на
дисплей значение своего аргумента, в данном случае списка. Первое правило этой процедуры гласит,
что если найден путь, длина которого равна общему количеству ребер графа (в данном случае восьми),
то искомый путь найден и его надо распечатать. Второе правило срабатывает, когда длина найденного
отрезка пути меньше общего количества ребер, т, е. остались еще не пройденные ребра. В этом случае
надо взять ребро, исходящее из текущей вершины и не включенное в список пройденных. Это ребро
соединяет текущую вершину и вершину «Новая». Затеи следует найти путь от новой вершины к
конечной, добавив номер ребра к списку пройденных.
      Как видим, эта процедура также имеет весьма простой вид, по крайней мере с первого взгляда. Но
за этой простотой скрывается алгоритм логического вывода языка Пролог, который и обеспечи-




                                                131