- •Аннотация
- •Лабораторная работа № 1 «Логическое программирование задачи поиска пути на конечных графах пространства состояний»
- •1.1.1. Прямой поиск (от исходной вершины до целевой вершины).
- •Самостоятельная часть работы
- •1.1.2. Обратный поиск (от целевой вершины к исходной).
- •Самостоятельная часть работы.
- •Самостоятельная часть работы
- •Задание №1.3. Поиск пути в неориентированном графе.
- •Самостоятельная часть работы
- •Задание №1.4. Поиск в псевдо бинарном дереве.
- •Самостоятельная часть работы
- •Самостоятельная часть работы
- •Задание 1.6. Поиск пути в ориентированном ациклическом графе с обходом вершин «в ширину».
- •I j k
- •Самостоятельная часть работы.
- •Задание № 1.7. Программирование поиска в глубину на конечном графе пространства состояний на языке clips
- •Самостоятельная часть работы
Самостоятельная часть работы
Составьте протокол работы правила memberс какой-нибудь целью, например,member(c, [a,b,c,d]) .
Введите транзитивное ребро, убедитесь, что программа отыскивает все альтернативные варианты пути. Что происходит со списком посещенных вершин при поиске с участием транзитивных ребер?
Задание №1.3. Поиск пути в неориентированном графе.
Примером подобной постановки задачи может служить поиск различных вариантов маршрутов между двумя заданными пунктами на карте дорог. Рассмотрим неориентированный граф и соответствующий список фактов.
x
edge(y,z).
edge(y,x).
y
u
edge(y,v).
v
edge(z,v).
z
edge(x,v).
edge(x,u).
edge(v,u).
В неориентированном (циклическом по природе) графе отношения между вершинами симметричны, т.е. если из вершины x можно попасть в v, то и из v можно попасть в x.
Расширять вдвое список фактов симметричными фактами не самое хорошее решение. Лучше дополнить предыдущую программу правилом con, устанавливающим симметрию отношений связанных вершин:
con(A,B):-edge(A,B).
сon(A,B):-edge(B,A).
Правило con заменит собой правило edge в предыдущей программе.
Самостоятельная часть работы
Введите третьим аргументом в факты edgeвеса ребер. Измените программу таким образом, чтобы она выводила суммарный вес каждого из найденных альтернативных путей. Если не справитесь самостоятельно, объясните работу программы 1_3_mod.pro.
Задание №1.4. Поиск в псевдо бинарном дереве.
Псевдо бинарное дерево не является, в отличие от настоящего бинарного дерева, рекурсивной структурой. Его можно представить в виде совокупности фактов-предикатов с тремя аргументами, например, tree(X,L,R), где X - корневая вершина дерева (поддерева), L,R - поддерживающие её левая и правая вершины, являющиеся в свою очередь корневыми вершинами для нижележащих поддеревьев. Таким образом, псевдо бинарное дерево описано не как единая структура, а как набор фактов. Терминальные узлы отличаются тем, что L и R -пустые поддеревья. Их можно обозначить одним символом, например, v (void - пустой). Псевдо бинарное сбалансированное дерево с 15-ю вершинами потребует для своего отображения 7 фактов для внутренних вершин, и 8 фактов для терминальных вершин. Оно не поддерживает функцию вставки или удаления вершины дерева, как это делает рекурсивная структура, но поддерживает поиск заданной вершины или ускоренный поиск в случае индексации вершин (задание 1.5):
tree(a,b,c). tree(i,v,v).
tree(b,d,e). tree(h,v,v).
tree(c,f,g). tree(p,v,v).
tree(d,i,h). tree(n,v,v).
tree(e,p,n). tree(m,v,v).
tree(f,m,k). tree(k,v,v).
tree(g,l,s). tree(l,v,v).
tree(s,v,v).
Простейшей задачей является прямой поиск заданной вершины (Y) в дереве, начинающемся в вершине X (необязательно корневой). Рекурсивное правило поиска состоит из трёх предложений:
treemember(X, X):- tree(X,_,_).
treemember(X, Y):- tree(X, L,_), treemember(L, Y).
treemember(X, Y):- tree(X,_,R), treemember(R, Y).
Первое предложение - условие завершения рекурсии (вершина Xтождественно принадлежит дереву, начинающемуся отX). Второе и третье - рекурсивный поиск Y соответственно в левом и правом поддеревьях. Целевой предикат, например, treemember(a,i) приведёт к ответу «Да», если путь есть. Тот же предикат с аргументами (b,f) приведёт к ответу «Нет». Изобразите дерево, воспользовавшись приведенным списком фактов, и на примере написания протокола убедиться, что данное правило реализует метод прямого поиска и приводит к обходу части дерева в глубину. Поиск в бинарном дереве с помощью приведенных фактов и правил не дает преимуществ, в сравнении с представлением дерева фактамиedgeи правиломpathиз Задания 1.1. Преимущество можно получить, если немного изменить правило. Идея состоит в том, чтобы при каждом вызове второго предложения, которое будет реализовать обход дерева в глубину по левой ветви, проверять, не является ли соответствующая ей правая вершина целевой. Таким образом, это некоторая комбинация поиска в глубину и в ширину.