
- •1.1 Пример программы: родственные отношения.
- •1.2 Факты.
- •1.3 Вопросы.
- •1.4 Переменные.
- •1.5 Конъюнкция целей.
- •1.6 Правила.
- •1.7 Конъюнкция в правилах.
- •1.8 Переменные в теле правила.
- •1.9 Cтруктура пролог-программы.
- •2.1 Синтаксис пролога.
- •2.1.1 Константы.
- •2.1.2 Переменные.
- •2.1.3 Структуры.
- •2.1.4 Операторы - тоже функторы.
- •2.2 Арифметика.
- •2.3 Операции сравнения.
- •2.4 Сопоставление.
- •2.6 Примеры сопоставления структур.
- •3.1 Декларативная семантика Пролог-программ
- •3.2 Дизъюнкция целей
- •3.3 Процедурная семантика
- •3.3.1 Пример вычисления
- •3.3.2 Формальное описание процедуры вычисления целей.
- •3.4 Соотношение между процедурным и декларативным смыслом
- •4.1 Списки
- •4.1.1 Представление списка диаграммой.
- •4.1.2 Выделение головы и хвоста списка
- •4.1.3 Шаблоны списков.
- •4.1.4 Определения отношений через cons форму списка
- •4.1.4 Определения отношений через cons форму списка
- •4.2 Процедуры обработки списков
- •4.2.3 Применение append
- •4.2.5 Длина списка
- •4.3 Встроенные предикаты
- •4.3.1 Простые встроенные предикаты ввода-вывода.
- •4.3.2 Процедурный смысл встроенных предикатов ввода-вывода.
- •4.4 Ввод-вывод списков.
- •4.4.1 Ввод-вывод списка как терма.
- •4.4.2 Поэлементный ввод-вывод списка.
- •5.1 Отсечение.
- •5.1.1 Графическая иллюстрация действия cut.
- •5.1.2 Пример действия cut.
- •5.1.3 Применение cut при выборе альтернатив.
- •5.1.4 Формальное описание действия отсечения.
- •5.2 Применение отсечения.
- •5.2.2 Добавление элемента без дублирования.
- •5.2.3 Классификация.
- •5.2.4 Отсечение в численной рекурсии.
- •5.2.5 Замечания при использовании отсечения.
- •5.3 Сортировка списков.
- •5.3.1 Метод наивной сортировки.
- •5.3.2 Метод пузырька.
- •5.3.3 Mетод вставки.
- •5.3.4 Быстрая сортировка quick.
- •6.1 Отрицание как неудача. (not as failure)
- •6.2 Алгоритм поиска на Прологе. ( Логический подход к задаче о фермере, волке, козе и капусте.)
- •6.3 Чтение и запись информации с файлов.
- •6.3.1 Обработка входных потоков.
- •6.3.2 Обработка выходных потоков.
- •6.4 Обработка символов.
- •7.1 Встроенные предикаты
- •7.1.2 Проверка типа терма
- •7.2 Метапредикаты.(Встроенные предикаты обработки термов.)
- •7.2.1 Создание и декомпозиция термов.
- •7.2.2 Предикаты работы с базой данных
- •7.3 Поиск в лабиринте
- •7.4 Сравнительная характеристика языков программирования.
- •8.1. Операции (Операторы).
- •8.1.1 Приоритет оператора.
- •8.1.2. Тип оператора.
- •8.1.3 Объявление операций.
- •8.2. Поиск.
- •8.2. Поиск.
- •8.2.1 Поиск в Прологе.
- •8.2.2 Поиск в глубину.
- •8.2.3 Поиск в ширину.
- •8.2.4 Резюме Поиска.
- •9.1. Введение
- •9.2 Поиск с предпрочтением.
- •10.1. Постановка задачи
- •10.2. Пример грамматики
- •10.3. Пример разбора вручную.
- •10.4. Реализация грамматического разбора на Прологе.
- •Как должны выглядеть утверждения Пролога ?
- •Запоминание состояния в Прологе.
- •Аналогично для dcg проводится
- •11.1. Постановка задачи
- •Две емкости
- •11.2. Решение задачи
- •12.1. Постановка задачи
- •12.2. Решение
- •13.1. Введение
- •Метод "образовать и проверить"
- •13.2. Раскрашивание плоской карты
8.2. Поиск.
Напомним что:
Пролог использует быстрый, но глупый (неэффективный) метод поиска. Написание программы своего поиска не так сложно.
Семейное Дерево.
% - parent ( A, B) истина, если A является родителем B
parent( p1, p2 ).
parent ( p3, p2 ).
parent ( p2, p4 ).
parent ( p4, p5 ).
8.2. Поиск.
Напомним что:
Пролог использует быстрый, но глупый(неэффективный) метод поиска. Написание программы своего поиска не так сложно.
Семейное Дерево.
% - parent ( A, B) истина, если A является родителем B
parent( p1, p2 ).
parent ( p3, p2 ).
parent ( p2, p4 ).
parent ( p4, p5 ).
8.2.1 Поиск в Прологе.
Основные стратегии поиска:
Поиск в глубину ( исследуется первый путь до конца перед переходом на следующий путь )
Поиск в ширину ( исследуются сначала все самые близкие пути)
Наиболее лучшего ( использует величину "оценки")
8.2.2 Поиск в глубину.
Отслеживайте узлы, которые еще не исследовались (т.н " " открытые " " узлы ).
search(X, X, T).
search(X, Y, T) :- (edge(X, Z); edge(Z, X)),
not(member(Z, T)),
search(Z, Y, [Z|T]).
member(X, [X|_]) :- !.
member(X, [_|Y]) :- member(X, Y).
edge(a,b).
edge(a,c).
edge(a,d).
edge(b,e).
edge(e,f).
edge(e,g).
edge(d,h).
edge(d,i).
edge(i,j).
Другой вариант
depth_first(Start, Answer ) :-
depth_star(/*Open*/ [Start], Answer ),!.
depth_star( [X|_], X ).
depth_star( [X|Open1], Y ) :-
children(X, Children),
append( Children, Open1, Open2 ),
depth_star( Open2, Y ).
/*children(A,Bs) is true if A*/
/*is parent of each child in Bs*/
children(a, [b,c,d]).
children(b, [e]).
children(e, [f,g]).
children(d, [h,i]).
children(i, [j]).
/* a f */
Обратите Внимание: открытый список хранится ,как стек.
Обратите Внимание на представление:
То есть мы можем представлять граф, как
%-- children(A,Bs) истина если A
%-- является родителем каждого ребенка в Bs
children(p1, [p2]).
children(p3, [p2]).
children(p2, [p4]).
children(p4, [p5]).
Мы можем также представить обратное отношение
parents(p2, [p1, p3]).
parents(p4, [p2]).
parents(p5, [p4]).
8.2.3 Поиск в ширину.
Подобен поиску в глубину , но хранит открытый список, как очередь.
breadth_first( Start,Answer ) :-
breadth_star(/*Open*/ [Start],
Answer ).
breadth_star( [X|_], X ).
breadth_star( [X|Open1], Y ) :-
children(X, Children),
append( Open1, Children, Open2 ),
breadth_star( Open2, Y ).
children(a, [b,c,d]).
children(b, [e]).
children(e, [f,g]).
children(d, [h,i]).
children(i, [j]).
8.2.4 Резюме Поиска.
Поиск в Прологе использует самую простую (самый дешевую) стратегию.
Другие алгоритмы поиска можно написать на Прологе.
Эффективность - частая проблема в поиске .
Чем меньше узлов Вы посетите,тем лучше.
9.1. Введение
Поиск в графах при решении задач, как правило, невозможен без решения проблемы комбинаторной сложности , возникающей из-за быстрого роста числа альтернатив. Эффективным средством борьбы с этим служит эвристический поиск. Один из путей использования эвристической информации о задаче - это получение численных эвристических оценок для вершин пространства состояний. Оценка вершины указывает нам, насколько данная вершина перспективна с точки зрения достижения цели. Идея состоит в том, чтобы всегда продолжать поиск, начиная с наиболее перспективной вершины, выбранной из всего множества кандидатов. Именно на этом принципе основана программа поиска с предпочтением.