df3d5e47ffabc7561fb3ed2d54907166.ppt
- Количество слайдов: 34
Логическое программирование Поиск. Логические головоломки. Недетерминированное программирование. Лекция 17 Мар. ГТУ 2009 г. 1
ØПоиск в глубину. Поиск в ширину ØЛогические головоломки. ØНедетерминированное программирование. Мар. ГТУ 2009 г. 2
Поиск Мар. ГТУ 2009 г. 3
Стратегии поиска Поиск в глубину Ø Поиск в ширину Ø Поиск эвристический Ø Мар. ГТУ 2009 г. 4
Поиск в глубину 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). search(X, X, T). search(X, Y, T) : - (edge(X, Z); edge(Z, X)), not(member(Z, T)), search(Z, Y, [Z|T]). Мар. ГТУ 2009 г. 5
Поиск в глубину depth_first(Start, Answer ) : - depth_star(/*Open*/ [Start], Answer ), !. depth_star( [X|_], X ). depth_star( [X|Open 1], Y ) : children(X, Children), append( Children, Open 1, Open 2 ), depth_star( Open 2, 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 */ Мар. ГТУ 2009 г. 6
Поиск в глубину Ø Ø Ø Обратите Внимание: открытый список хранится , как стек. Обратите Внимание на представление: То есть мы можем представлять граф, как Ø Ø %-- children(A, Bs) истина если A %-- является родителем каждого ребенка в Bs children(p 1, [p 2]). children(p 3, [p 2]). children(p 2, [p 4]). children(p 4, [p 5]). Мы можем также представить обратное отношение parents(p 2, [p 1, p 3]). parents(p 4, [p 2]). parents(p 5, [p 4]). Мар. ГТУ 2009 г. 7
Поиск в ширину Подобен поиску в глубину , но хранит открытый список, как очередь. breadth_first( Start, Answer ) : - breadth_star(/*Open*/ [Start], Answer ). breadth_star( [X|_], X ). breadth_star( [X|Open 1], Y ) : children(X, Children), append(Open 1, Children, Open 2), breadth_star( Open 2, Y ). Ø children(a, [b, c, d]). children(b, [e]). children(e, [f, g]). children(d, [h, i]). children(i, [j]). Мар. ГТУ 2009 г. 8
Поиск с предпочтением Ø Ø Программу поиска с предпочтением можно получить как результат усовершенствования программы поиска в ширину. Подобно поиску в ширину, поиск с предпочтением начинается со стартовой вершины и использует множество путей-кандидатов. В то время, как поиск в ширину всегда выбирает для продолжения самый короткий путь (т. е. переходит в вершины наименьшей глубины), поиск с предпочтением вносит в этот принцип следующее усовершенствование: для каждого кандидата вычисляется оценка и для продолжения выбирается кандидат с наилучшей оценкой. Для каждой вершины вводится оценка (стоимость перехода из данной вершины к преемнику) Мар. ГТУ 2009 г. 9
Логические головоломки Мар. ГТУ 2009 г. 10
Постановка задачи Логическая головоломка состоит из нескольких фактов относительно небольшого числа объектов, которые имеют различные атрибуты. Ø Минимальное число фактов относительно объектов и атрибутов связано с желанием выдать единственный вариант назначения атрибутов объектам. Ø Мар. ГТУ 2009 г. 11
Постановка задачи. Пример головомки Ø Ø Ø Три друга заняли первое, второе и третье места в соревнованиях универсиады. Друзья разной национальности, зовут их по-разному, и любят они разные виды спорта. Майкл предпочитает баскетбол и играет лучше чем американец. Израильтянин Саймон играет лучше теннисиста. Игрок в крикет занял первое место. Кто является австралийцем? Каким спортом занимается Ричард? Мар. ГТУ 2009 г. 12
Решение конкретизации значений подходящей структуры данных Ø выделения значения, приводящего к решению Ø Предположим, что Friends – структура данных, подлежащая конкретизации Ø Мар. ГТУ 2009 г. 13
Решение ключ может быть выражен следующей конъюнкцией целей: (did_better(Man 1 Clue 1, Man 2 Clue 1, Friends) name_(Man 1 Clue 1, michael), sport(Man 1 Clue 1, basketball), nationality(Man 2 Clue 1, american) Ø второй ключ можно представить конъюнкцией целей: did_better(Man 1 Clue 2, Man 2 Clue 2, Friends) name_(Man 1 Clue 2, simon), nationality(Man 1 Clue 2, israeli), sport(Man 2 Clue 2, tennis)). Ø третий ключ к разгадке выразится следующим образом: first(Friends, Man. Clue 3), sport(Man. Clue 3, cricket) Ø Мар. ГТУ 2009 г. 14
Программа solve_puzzle(Clues, Queries, Solution) : solve(Clues), solve(Queries). solve([Clue|Clues]) : Clue, solve(Clues). solve([]). test_puzzle(Name, Solution) : structure(Name, Structure), clues(Name, Structure, Clues), queries(Name, Structure, Queries, Solution), solve_puzzle(Clues, Queries, Solution). Мар. ГТУ 2009 г. 15
Программа structure(test, [friend(N 1, C 1, S 1), friend(N 2, C 2, S 2), friend(N 3, C 3, S 3)]). clues(test, Friends, [(did_better(Man 1 Clue 1, Man 2 Clue 1, Friends), % Clue 1 name_(Man 1 Clue 1, michael), sport(Man 1 Clue 1, basketball), nationality(Man 2 Clue 1, american)), (did_better(Man 1 Clue 2, Man 2 Clue 2, Friends), % Clue 2 name_(Man 1 Clue 2, simon), nationality(Man 1 Clue 2, israeli), sport(Man 2 Clue 2, tennis)), (first(Friends, Man. Clue 3), sport(Man. Clue 3, cricket))]). Мар. ГТУ 2009 г. 16
Программа queries(test, Friends, [ member(Q 1, Friends), name_(Q 1, Name), nationality(Q 1, australian), % Query 1 member(Q 2, Friends), name_(Q 2, richard), sport(Q 2, Sport) % Query 2], [['The Australian is', Name], ['Richard plays ', Sport]]). Мар. ГТУ 2009 г. 17
Программа did_better(A, B, [A, B, C]). did_better(A, C, [A, B, C]). did_better(B, C, [A, B, C]). name_(friend(A, B, C), A). nationality(friend(A, B, C), B). sport(friend(A, B, C). first([X|Xs], X). Мар. ГТУ 2009 г. 18
Недетерминированное программирование. Мар. ГТУ 2009 г. 19
Введение Ø Ø Недетерминизм – это техническое понятие, используемое для сжатого определения абстрактных моделей вычислений. Недетерминированная машина, перед которой возникло несколько альтернативных путей решения, осуществляет корректный выбор очередного действия. Подлинно недетерминированную машину реализовать нельзя, однако ее можно моделировать или аппроксимировать. Мар. ГТУ 2009 г. 20
Введение Ø Пролог-интерпретатор аппроксимирует недетерминированное поведение интерпретатора абстрактных логических программ с применением механизма последовательного поиска и возвратов. Мар. ГТУ 2009 г. 21
Метод "образовать и проверить" Ø общий прием, используемый при проектировании алгоритмов и программ. Ø один процесс или программа генерирует множество предполагаемых решений задачи, а другой процесс или программа проверяет эти предполагаемые решения, пытаясь найти те из них, которые действительно являются решениями задачи. Мар. ГТУ 2009 г. 22
Оптимизация метода "образовать и проверить" Ø Стремление погрузить программу проверки в программу генерации предполагаемых решений настолько глубоко, насколько это возможно. Ø В пределе программа проверки полностью переплетается с программой генерации предполагаемых решений, которая начинает порождать только корректные решения. Мар. ГТУ 2009 г. 23
Пролог и метод "образовать и проверить" логические программы, реализующие данный метод, содержат конъюнкцию двух целей, одна из которых действует как генератор предполагаемых решений, а вторая проверяет, являются ли эти решения приемлемыми: find(X) : - generate(X), test (X). Ø Мар. ГТУ 2009 г. 24
Пример Предикат member ? -member(X, [a, b, c]) X=a X=b X=c Ø Таким образом, предикат member можно использовать в программах, реализующих метод "образовать и проверить" для недетерминированного выбора корректного элемента из некоторого списка. Ø Мар. ГТУ 2009 г. 25
Раскрашивание плоской карты Ø Раскрасить плоскую карту так, чтобы никакие две смежные области на ней не были раскрашены в одинаковый цвет. Эта знаменитая задача, известная уже сотни лет, была решена в 1976 году, когда было доказано, что для раскрашивания любой плоской достаточно использовать четыре краски. Мар. ГТУ 2009 г. 26
Решение Ø На рисунке показана простая карта, для корректного раскрашивания которой требуется четыре цвета. Это можно доказать путем перечисления всех возможных вариантов раски. Следовательно, для решения задачи использование четырех красок является необходимым и достаточным. Мар. ГТУ 2009 г. 27
Недетерминированный алгоритм Используется принцип "образовать и проверить". Программа реализует следующий недетерминированный алгоритм: Ø для каждой области карты Ø выбрать цвет, Ø выбрать из оставшихся цветов (или проверить) цвета соседних областей Ø Мар. ГТУ 2009 г. 28
Структуры данных. Карта представляется списком областей, каждая из которых имеет имя, цвет и список цветов, в которые окрашены смежные области. Например, Карта, изображенная на рисунке, представляется списком region(a, A, [B, C, D]), region(b, B, [A, C, E]), region(c, C, [A, B, D, E, F]), region(d, D, [A, C, F]), region(e, E, [B, C, F]), region(f, F, [C, D, E]). Ø Для того чтобы избежать раски одной и той же области в разные цвета на разных интерпретациях алгоритма, используются общие переменные. Ø Мар. ГТУ 2009 г. 29
Программа color_map([Region|Regions], Colors) : color_region(Region, Colors), color_map(Regions, Colors). color_map([], Colors). color_region(Name, Color, Neighbors), Colors) : select(Color, Colors 1), members(Neighbors, Colors 1). select(X, [X|Xs], Xs). select(X, [Y|Ys], [Y|Zs]) : - select(X, Ys, Zs). Мар. ГТУ 2009 г. 30
Программа members([X|Xs], Ys) : - member(X, Ys), members(Xs, Ys). members([], Ys). test_color(Name, Map) : map(Name, Map), colors(Name, Colors), color_map(Map, Colors). map(test, [region(a, A, [B, C, D]), region(b, B, [A, C, E]), region(c, C, [A, B, D, E, F]), region(d, D, [A, C, F]), region(e, E, [B, C, F]), region(f, F, [C, D, E])]). Мар. ГТУ 2009 г. 31
Программа map(west_europe, [ region(portugal, P, [E]), region(spain, E, [F, P]), region(france, F, [E, I, S, B, WG, L]), region(belgium, B, [F, H, L, WG]), region(holland, H, [B, WG]), region(west_germany, WG, [F, A, S, H, B, L]), region(luxembourg, L, [F, B, WG]), region(italy, I, [F, A, S]), region(switzerland, S, [F, I, A, WG]), region(austria, A, [I, S, WG])]). colors(X, [red, yellow, blue, white]). Мар. ГТУ 2009 г. 32
Программа Отношение верхнего уровня рассматриваемой программы является color_map(Map, Color), где Map – карта, представляемая описанным выше способом, Colors - список цветов, используемых для раскрашивания карты. Выберем цвета: красный, желтый, голубой и белый. Ядро алгоритма определение отношения color_region(Region, Colors): color_region(Name, Color, Neighbors), Colors) ╛ select(Color, Coors, Colors 1), member(Neighbors, Colors 1). Ø Цели select и members в зависимости от того, конкретизированы или нет их аргументы, могут либо производить генерацию вариантов, либо выполнять проверку. Ø Итогом выполнения программы о раскрашивании карты является конкретизация структуры данных – карты. Вызовы предикатов select и members могут рассматриваться как описания локальных ограничений. Ø Мар. ГТУ 2009 г. 33
Спасибо за внимание! Вопросы? Мар. ГТУ 2009 г. 34


