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