Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab1_1hse.doc
Скачиваний:
5
Добавлен:
08.02.2015
Размер:
102.5 Кб
Скачать

Самостоятельная часть работы.

  • Объясните на примере с выбранной целевой вершиной работу программы с указанием значений переменных на каждом шаге;

  • Выпишите из текста программы правило append. Поставьте цель типаappend([a,b], [d,c],L) и составьте протокол работы правила.

Задание № 1.7. Программирование поиска в глубину на конечном графе пространства состояний на языке clips

Возможности среды и языка программирования CLIPSшире тех, которые принято рассматривать в технической документации и литературе по экспертным системам.CLIPS, в частности, может поддерживать модель поиска пути на графе пространства состояний, хотя и не является языком логического программирования, как Пролог. В отличие от Пролога, правила здесь логически не связаны между собой (независимы) и не образуют сети вывода. Любое из них может быть запущено на выполнение, если удовлетворены условия этого правила и оно имеет в данный момент высший приоритет. Как же обеспечить приоритет одного и того же правила поиска связи соседней вершины с только что найденной для поиска пути в графе, учитывая, что правило наCLIPS’е не может рекурсивно вызывать само себя или другое правило по имени? Для этого предусмотрена стратегияdepth(в глубину): из числа активизированных и имеющих равный приоритет правил выбирается то,условия которого удовлетворены самым “свежим” (с наибольшим индексом) фактомв списке фактов.CLIPSнумерует факты по мере поступления. При каждом своем помещении в список факт получает наивысший индекс, т.е. становится самым свежим. Теперь представим себе, что правило поиска пути само же обновляет факт связи текущей вершины с соседней, помещая в список с новым индексом. Тогда данное правило будет запускаться повторно этим свежим фактом, отыскивая следующую соседнюю вершину искомого пути. Произойдет обход графа в глубину. Такой способ можно назвать псевдо рекурсивным, поскольку управление осуществляется через данные. Для его реализации в менюExecution/Optionsдолжна быть установлена стратегияdepth(в глубину). Обычно она стоит по умолчанию. Однако этого еще не достаточно. Необходимо разработать правило возврата к предыдущей развилке графа, если поиск не успешен, т.е. реализовать процедуру, которая на Прологе называетсяbacktrackingи уже заложена в механизм логического вывода.

Рассмотрим пример программы (полный текст содержится в файле mypath.clp) поиска пути на графе, заданном множеством фактов связи двух соседних вершин (edge<имя_начальной_вершины> <имя_конечной_вершины>). Такие факты не симметричны, описывают направленный ориентированный граф (дерево).

(deffacts edges

(edge d j)

(edge a c)

(edge c g)

(edge f h)

(edge f i)

(edge c f)

(edge a d)

)

Факты в конструкторе deffactsс именемedgesспециально записаны в произвольном порядке. При загрузке программы и выполнении команды (reset) факты помещаются в список и каждый получает свой порядковый индексf-0, ….f-7.

Отметим, что в начале списка стоит факт с индексом f-0 (initial-fact), который всегда помещается в список по команде (reset) для возможности однократного запуска какого-либо стартового безусловного правила. Таким в данном случае является правилоinput. Условия-запросы остальных правил пока не удовлетворены из-за отсутствия в списке подходящих фактов. Правилоinputслужит для считывания с экрана имен начальной и конечной вершин поиска и помещения в список новых фактов с помощью функцииassert. Предположим, мы ввели в качестве начальной вершины “a”, конечной – “i”. В список будут добавлены факты (top-froma) и (top-toi) с индексами соответственноf-8 иf-9.

Разобраться в работе программы можно с помощью ее выполнения по шагам в режиме Step. Для этого запуститеCLIPS(файлCLIPSWin.exe). Выберите в менюExecutionкомаyдуWatchи в открывшейся панели пометьте окошкиFactsиRules. Затем выполните командыFile/Load/mypath.clp/Открыть. При отсутствии ошибок в программе на экране появится список всех конструкторов и приглашениеCLIPS>. Вновь зайдите в менюExecutionи выполните командуReset. Появится список всех исходных фактов с индексами (см. рис. выше). Вновь зайдите в менюExecutionи выполните командуStep. По приглашению введите с экрана начальную, а затем конечную вершины. Пусть это будут а иiсоответственно. Наблюдайте далее за выполнением программы с помощью командExecution/Step. На экране будет отображаться, какое правило активизировано (FIRE), от каких фактов, и какие изменения происходят в списке фактов при выполнении правила. Некоторые пояснения к работе программы даны ниже.

Интерпретатор (МЛВ) просматривает сверху вниз список всех правил, сопоставляя их левую часть (образцы) с фактами в списке, и пытаясь отыскать те правила, условия которых удовлетворены какими-либо фактами. Будет найдено одно такое правило start, которое при своем запуске поместит в текущий список факт (waya) с индексомf-10.

В следующем цикле может сработать только правило search, предназначенное для поиска пути. Запрос из его левой части (way?x) будет удовлетворен самым свежим фактомf-10 и переменная ?xполучит значение “a”. Следующие логические подзапросы получат значениеTRUE, так как нет фактов с именемout, а запрос (edgea?z) будет удовлетворен фактом (edgead), имеющим индексf-7, а не аналогичным фактом (edgeac) с меньшим индексомf-2. Таким образом ?zполучит значениеd, и с помощью функцииassertв список будет помещен факт (wayd), который получит индексf-11. Тем самым будет совершен шаг ‘в глубину’ на пути к целевой вершине.

На следующем шаге опять может активизироваться только правило search. Правилоstep-back, предназначенное для возврата, не может быть активизировано, поскольку не выполнено ни одно из условийor. Итак, правилоsearchактивизируется самым свежим фактом (wayd), запрос (edged?z) будет удовлетворен фактом (edgedj), и в список будет помещен факт (wayj) с индексомf-12. Тем самым будет сделан второй шаг поиска. Следующая попытка запустить то же правилоsearchокажется неудачной, поскольку в списке нет фактов связиjсо следующей вершиной. Поиск не успешен и надо совершить возврат. Посмотрим на условия правилаstep-back. Запрос (way?x) удовлетворяется свежим фактом (wayj) и переменная ?xполучит значениеj. В подзапросеorудовлетворяется первая строка, а в подзапросе (edge?z?x) переменная ?zполучит значениеdпо фактуf-1 ( поскольку ?x=j). Далее в условной части правила факты (wayd) и (wayj) связываются каждый (с помощью левой стрелки) соответственно с указателями адресовf1 иf2 для возможности последующего своего удаления. В правой части правила выполняются следующие действия. В список помещается факт, исключающий повторное обращение к вершинеj(outj) с индексомf-13, удаляются из списка факты (wayj) и (wayd)cиндексами соответственноf-12 иf-11, и вновь добавляется факт (wayd), но уже с индексомf-14. Тем самым будет выполнен один шаг назад к вершинеd.

При следующем сопоставлении условий правил с фактами опять оказываются удовлетворены условия только правила step-backЗапрос (way?x) будет удовлетворен самым свежим фактом (wayd) и переменная ?xполучит значениеd. В подзапросеorокажутся удовлетворены условия строкиand: подзапрос (edge?x?y) будет удовлетворен фактом (edgedj) и тем, что в списке есть факт (outj)cиндексомf-13. В следующем подзапросе (edge?z?x) сработает факт (edgead) и переменная ?zполучит значение “a”. Далее факты (waya) и (wayd) готовятся к удалению, связываясь с указателями их адресовf1 иf2. В правой части правила выполняются следующие действия. В список добавляется факт (outd), чтобы программа не возвращалась к вершинеd, удаляются факты (wayd) и (waya) с индексамиf-14 иf-10 соответственно, и добавляется факт (waya) с новым индексомf-16. Как мы видим, программа вернулась к исходной вершине а. Теперь условия правилаstep-backокажутся не выполнены, так как вершина “a” связана с “с” и нет факта (outc). Но теперь окажутся выполнены условия правилаsearch. Запрос (way?x) будет удовлетворен свежим фактом (waya) с индексомf-16 и переменная ?xполучит значение “а”. Факта (outa) нет, в подзапросе (edgea?z) переменная ?zполучит значение “с” по сопоставлению с фактом (edgeac), и факта (outc) нет в списке. В правой части правила будет добавлен факт (wayc) с индексомf-17. Как видим, поиск продолжился по другой ветви графа.

Далее вновь будет выбрано правило search, которое в запросе (edgec?z) из двух возможных вариантов использует факт с большим индексом (edgecf). В список будет помещен факт (wayf) с индексомf-18. Этот факт вновь активизирует правилоsearch, которое из двух фактов (edgefh) или (edgefi) выберет последний как имеющий больший индексf-5. Но вершинаiявляется целевой. В списке уже имеется факт (top-toi) и теперь появился факт (wayi) с индексомf-19. Окажутся удовлетворены условия правилstopиprint, но правилоprintимеет более высокий приоритет по свойствуsalienceи поэтому будет запущено на выполнение. В этом правиле запрос (way?x) будет удовлетворен фактомcнаибольшим индексом, т.е. (wayi). В правой части будет выполнена печать этого факта: (wayi). Но правилоprintбудет вызвано еще раз и запрос (way?x) будет удовлетворен следующим по “свежести” фактомf-18: (wayf). На печать будет выведен факт (wayf). Аналогичным образом на следующем этапе на печать будут последовательно выведены факты с индексомf-17: (wayc) и с индексомf-16: (waya). Больше правилоprintзапускаться не будет, так как остальные факты (way) либо удалены в ходе поиска, либо содержатся в списке (out), что не допускается одним из условий правилаprint. Но оно уже вывело вершины пути изiв а в виде фактов (wayi) (wayf) (wayc) (waya).

Теперь появилась возможность активизации правила stop, которое по командеhaltостанавливает поиск. Решение уже выведено на печать. Но если дать команду (run) или (step), то дальнейший, теперь уже бессмысленный, поиск будет продолжен с полным обходом оставшихся ветвей дерева и выводом сообщения “Noway”. Это сделает правилоfail, предусмотренное на тот случай, если искомого пути в графе нет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]