Скачать презентацию Логическое программирование Встроенные предикаты Поиск на Прологе Лекция Скачать презентацию Логическое программирование Встроенные предикаты Поиск на Прологе Лекция

6c13da31b5063e41ab08c914731709be.ppt

  • Количество слайдов: 54

Логическое программирование Встроенные предикаты. Поиск на Прологе Лекция 5 Мар. ГТУ 2010 г. 1 Логическое программирование Встроенные предикаты. Поиск на Прологе Лекция 5 Мар. ГТУ 2010 г. 1

ØОтрицание как неудача. ØВстроенные предикаты. ØМетапредикаты (встроенные предикаты обработки термов). ØЧтение и запись информации ØОтрицание как неудача. ØВстроенные предикаты. ØМетапредикаты (встроенные предикаты обработки термов). ØЧтение и запись информации в файл. ØОбработка символов. ØТри предиката ARITY-prologa. ØАлгоритм поиска на Прологе. ØПоиск в лабиринте Мар. ГТУ 2010 г. 2

Отрицание как неудача Мар. ГТУ 2010 г. 3 Отрицание как неудача Мар. ГТУ 2010 г. 3

Отрицание как неудача. (not as failure) Пусть некоторая Мэри любит всех животных. likes(mary, X): Отрицание как неудача. (not as failure) Пусть некоторая Мэри любит всех животных. likes(mary, X): -animal(X). Мэри не любит змей: likes(mary, X): -snake(X), !, fail – специальная цель, встроенный предикат, который всегда терпит неудачу. Мар. ГТУ 2010 г. 4

Дизъюнкция целей likes(mary, X): -animal(X). likes(mary, X): -snake(X), !, fail; animal(X). Мар. ГТУ 2010 Дизъюнкция целей likes(mary, X): -animal(X). likes(mary, X): -snake(X), !, fail; animal(X). Мар. ГТУ 2010 г. 5

Пример Отношение different(X, Y) будет истина, если X и Y различны (не сопоставимы). different(X, Пример Отношение different(X, Y) будет истина, если X и Y различны (не сопоставимы). different(X, X): -!, fail. или different(X, Y): -X=Y, !, fail. different(X, Y). Если X и Y сопоставимы, то цель different терпит неудачу. Иначе X и Y различны, и цель different успешна. Или в одном предложении different(X, Y): -X=Y, !, fail; true. Здесь true – встроенный предикат, который всегда истина. Мар. ГТУ 2010 г. 6

Предикат not Отношение истинно, если цель ложна. not(Goal). Истина, если Goal – ложь, и Предикат not Отношение истинно, если цель ложна. not(Goal). Истина, если Goal – ложь, и наоборот. not(Goal): -Goal, !, fail; true. Мар. ГТУ 2010 г. 7

Через not likes(mary, X): -animal(X), not(snake(X)). Или different(X, Y): -not(X=Y). Использование not требует осторожности, Через not likes(mary, X): -animal(X), not(snake(X)). Или different(X, Y): -not(X=Y). Использование not требует осторожности, т. к. определяется через сечение. Мар. ГТУ 2010 г. 8

Пример r(a). g(b). p(X): -not(r(X)). ? -g(X), p(X). yes ? -p(X), g(X). no. Мар. Пример r(a). g(b). p(X): -not(r(X)). ? -g(X), p(X). yes ? -p(X), g(X). no. Мар. ГТУ 2010 г. 9

Встроенные предикаты Мар. ГТУ 2010 г. 10 Встроенные предикаты Мар. ГТУ 2010 г. 10

repeat – цель, которая всегда успешна. Ø Ее особое свойство состоит в том, что repeat – цель, которая всегда успешна. Ø Ее особое свойство состоит в том, что она всегда находит альтернативу. Ø Поэтому всякий раз, когда до нее доходит перебор, она порождает новую ветвь вычислений. Ø Мар. ГТУ 2010 г. 11

Пример Процедура sq, которая читает последовательность чисел и выдает их квадраты. Ø Последовательность чисел Пример Процедура sq, которая читает последовательность чисел и выдает их квадраты. Ø Последовательность чисел заканчивается атомом stop. Ø sq : - repeat, write('Number: '), read(X), (X=stop, !; Y is X*X, write(Y), nl, fail). Ø Мар. ГТУ 2010 г. 12

Проверка типа терма Ø Ø Ø atom(X) – да, если X – атом. integer(X) Проверка типа терма Ø Ø Ø atom(X) – да, если X – атом. integer(X) – да, если X – целое. atomic(X) – да, если X – целое или атом. var(X) – да, если X – не конкретизированная переменная. nonvar(X) – да, если X – терм, отличный от переменной, или уже конкретизированная переменная. Мар. ГТУ 2010 г. 13

Пример универсального предиката суммирования: plus(X, Y, Z): -integer(X), integer(Y), integer(Z), S is X + Пример универсального предиката суммирования: plus(X, Y, Z): -integer(X), integer(Y), integer(Z), S is X + Y, S=Z. plus(X, Y, Z): -integer(X), integer(Y), var(Z), Z is X + Y. plus(X, Y, Z): -var(X), integer(Y), integer(Z), X is Z – Y. plus(X, Y, Z): -integer(X), var(Y), integer(Z), Y is Z – X. ? -plus(1, 2, Z). Z=3. ? -plus(X, 2, 4). X=2. ? -plus(1, Y, 2). Y=1. ? -plus(1, 2, 3). no. Мар. ГТУ 2010 г. 14

Метапредикаты (встроенные предикаты обработки термов) Мар. ГТУ 2010 г. 15 Метапредикаты (встроенные предикаты обработки термов) Мар. ГТУ 2010 г. 15

Создание и декомпозиция термов: Т=. . L (читается Создание и декомпозиция термов: Т=. . L (читается "univ") истина, если L – список, начинается с главного функтора терма T, вслед за которым идут его аргументы. ? -f(a, b)=. . L. L=[f, a, b] Ø ? -T=. . (like, tom, mary). T=like(tom, mary). Ø Позволяет из списка получать структуру и наоборот. Мар. ГТУ 2010 г. 16

Создание и декомпозиция термов: functor(Term, F, N) Ø Будет истиной, если F – главный Создание и декомпозиция термов: functor(Term, F, N) Ø Будет истиной, если F – главный функтор терма Term, N – количество его аргументов. ? -functor(f(a, S), F, G). F=f G=2 Ø a ? -functor(b, F, G). F=b G=0 ? -functor(F, d, 4). F=d(_, _, _, _). Мар. ГТУ 2010 г. 17

Создание и декомпозиция термов: arg Ø Ø arg(N, T, A) – обеспечивает доступ к Создание и декомпозиция термов: arg Ø Ø arg(N, T, A) – обеспечивает доступ к конкретному аргументу структуры. N – номер аргумента, T – терм, A – значение аргумента. ? -arg(2, f(a, b), X) X=b ? -F=. . [a, 2, 3, 4, 5], arg(4, F, X). X=5 Мар. ГТУ 2010 г. 18

Предикаты работы с базой данных Ø Ø Программа в прологе – база данных. Можно Предикаты работы с базой данных Ø Ø Программа в прологе – база данных. Можно добавлять к базе данных новые предложения и удалять предложения. Аналогично, в ходе выполнения программы ее можно изменять. Для этого используются специальные предикаты: assert(C) Ø retract(C) Ø Мар. ГТУ 2010 г. 19

assert(C) добавляет к базе данных предложение С. ? -assert(a(b)). ? -listing. a(b). Ø ? assert(C) добавляет к базе данных предложение С. ? -assert(a(b)). ? -listing. a(b). Ø ? -asserta(a(a)). ; ; добавляет в начало списка ? -assertz(a(c)). ; ; добавляет в конец списка ? -listing. a(a). a(b). a(c). Мар. ГТУ 2010 г. 20

assert(C) assert((a(X): -X>0)) ? -F=. . [a, b, c], assert(F). a(b, c). Ø Ø assert(C) assert((a(X): -X>0)) ? -F=. . [a, b, c], assert(F). a(b, c). Ø Ø Ø assert используется иногда для сохранения промежуточных результатов. Может служить для передачи значений переменных между предложениями. Использование лучше ограничивать из-за усложнения понимания программы. Мар. ГТУ 2010 г. 21

retract(C) Ø удаляет предложения, согласуемые с C. Мар. ГТУ 2010 г. 22 retract(C) Ø удаляет предложения, согласуемые с C. Мар. ГТУ 2010 г. 22

Чтение и запись информации в файл Мар. ГТУ 2010 г. 23 Чтение и запись информации в файл Мар. ГТУ 2010 г. 23

Чтение и запись информации в файл Понятие потоков – для ввода и вывода информации. Чтение и запись информации в файл Понятие потоков – для ввода и вывода информации. Файлы для чтения – это входные потоки. Файлы для записи – это выходные потоки. В каждый момент времени активны два файла. Для пользователя определены два потока: Ø Информация, вводимая с клавиатуры – входной поток. Ø Информация, выводимая на монитор – выходной поток. Эти потоки являются псевдофайлами с именем user. Мар. ГТУ 2010 г. 24

Обработка входных потоков Входные потоки пролог Обработка входных потоков Входные потоки пролог "видит". Предикаты: Ø see(F) – открывает файл F (например, 'a. dat', он становится текущим входным потоком). Ø seeing(F) – связывает F с именем файла, являющегося текущим входным потоком. Ø seen – закрывает текущий входной поток и связывает его с user. Мар. ГТУ 2010 г. 25

Пример p 1: -see('a. dat'), read(X), write(X), seen. p 2: -see('a. dat'), seeing(F), write(F), Пример p 1: -see('a. dat'), read(X), write(X), seen. p 2: -see('a. dat'), seeing(F), write(F), seen, read(A), write(A). Ø seeing – получает имя файла Мар. ГТУ 2010 г. 26

Обработка выходных потоков В выходные потоки пролог Обработка выходных потоков В выходные потоки пролог "говорит". Ø tell(F) – открывает файл F как текущий выходной поток. Если файла нет, то создает его. Ø telling(F) – связывает F с именем файла, являющегося текущим выходным потоком. Ø told – закрывает файл, являющийся текущим выходным потоком. Текущим выходным потоком становится user. p 3: - tell('a. dat'), write(a), told, write(a). Мар. ГТУ 2010 г. 27

Обработка потоков Ø В каждый момент выполнения прологпрограммы лишь два файла являются Обработка потоков Ø В каждый момент выполнения прологпрограммы лишь два файла являются "активными": для ввода, Ø для вывода Ø Ø Файлы обрабатываются только последовательно end_of_file – ответ на конец файла Все файлы текстовые Мар. ГТУ 2010 г. 28

Обработка символов. Пролог имеет несколько предикатов для обработки символов. Мар. ГТУ 2010 г. 29 Обработка символов. Пролог имеет несколько предикатов для обработки символов. Мар. ГТУ 2010 г. 29

put(X) записывает символы в текущий выходной поток X – символ, который нужно вывести, представлен put(X) записывает символы в текущий выходной поток X – символ, который нужно вывести, представлен в кодировке ASCII (число от 0 до 127). p 4: -put(65), put(66), put(67). ? -p 4. ABC Мар. ГТУ 2010 г. 30

get(X) читает печатный символ (код по ASCII больше 31) Аргумент X принимает числовое значение. get(X) читает печатный символ (код по ASCII больше 31) Аргумент X принимает числовое значение. Непечатный символ игнорируется. Мар. ГТУ 2010 г. 31

get 0(X) читает любой символ Мар. ГТУ 2010 г. 32 get 0(X) читает любой символ Мар. ГТУ 2010 г. 32

Обработка файлов термов read – чтение терма из файла Ø write – запись терма Обработка файлов термов read – чтение терма из файла Ø write – запись терма в файл Ø Мар. ГТУ 2010 г. 33

Три предиката ARITY-prologa. для работы с курсором: Ø tget(Y, X) выдает текущие координаты курсора. Три предиката ARITY-prologa. для работы с курсором: Ø tget(Y, X) выдает текущие координаты курсора. Ø tmove(Y, X) перемещает курсор в заданные позиции. p 5: -write('+++++'), tget(Y, X), X 1 is X-4, tmove(Y, X 1), write('***'). ? -p 5. +***+ Ø cls очищает экран. Мар. ГТУ 2010 г. 34

Алгоритм поиска на Прологе Мар. ГТУ 2010 г. 35 Алгоритм поиска на Прологе Мар. ГТУ 2010 г. 35

Алгоритм поиска на Прологе. (Логический подход) Задача о фермере, волке, козе и капусте. Фермер Алгоритм поиска на Прологе. (Логический подход) Задача о фермере, волке, козе и капусте. Фермер (Farmer), волк (Wolf), козел (Goat) и капуста (Cabbidge) находятся на одном берегу. Надо перебраться на другой берег на лодке. Лодка перевозит только двоих. Нельзя оставлять на одном берегу козу и капусту, козу и волка. Мар. ГТУ 2010 г. 36

Главная проблема – формирование алгоритма – найти эффективное представление структурой данных информации о задаче. Главная проблема – формирование алгоритма – найти эффективное представление структурой данных информации о задаче. Мар. ГТУ 2010 г. 37

Решение Процесс перевозки – последовательность состояний. Состояние – отношение state c 4 аргументами, каждый Решение Процесс перевозки – последовательность состояний. Состояние – отношение state c 4 аргументами, каждый из которых отражает размещение объектов F, W, G, S state(e, w, e, w) F, G in east side (e – east); FWGC W, C in west side (w – west). Вся программа основывается на этих предикатах. Мар. ГТУ 2010 г. 38

Перемещение объектов Реализация возможных действий фермера, выраженных в перевозе фермера через реку: Ø Ø Перемещение объектов Реализация возможных действий фермера, выраженных в перевозе фермера через реку: Ø Ø F (самого себя) W G C move(state(X, X, G, C), state(Y, Y, G, C)): -opposite(X, Y). /* FARMER + WOLF */ move(state(X, W, X, C), state(Y, W, Y, C)): -opposite(X, Y). /* FARMER+GOAT */ move(state(X, W, G, X), state(Y, W, G, Y)): -opposite(X, Y). /*FARMER+CABBIDGE*/ move(state(X, W, G, C), state(Y, W, G, C)): -opposite(X, Y). /* только FARMER */ Мар. ГТУ 2010 г. 39

Функция изменения состояния Предикат opposite определяет новое размещение объектов, которые пересекли реку. opposite(east, west). Функция изменения состояния Предикат opposite определяет новое размещение объектов, которые пересекли реку. opposite(east, west). opposite(west, east). Мар. ГТУ 2010 г. 40

Проверка на опасные состояния Предикат unsafe определен для проверки двух опасных состояний: Ø F Проверка на опасные состояния Предикат unsafe определен для проверки двух опасных состояний: Ø F находится на противоположном берегу от W, G Ø F находится на противоположном берегу от G, C. unsafe( state(F, X, X, _) ): - opposite(F, X). /* The wolf eats the goat */ unsafe( state(F, _, X, X) ): - opposite(F, X). /* The goat eats the cabbage */ Мар. ГТУ 2010 г. 41

Процедура перевозки path(S, G, L, L 1): - move(S, S 1), not( unsafe(S 1) Процедура перевозки path(S, G, L, L 1): - move(S, S 1), not( unsafe(S 1) ), not( member(S 1, L) ), path( S 1, G, [S 1|L], L 1), !. path(G, G, T, T): -!. /* The final state is reached */ Мар. ГТУ 2010 г. 42

Решение go: - go(state(east, east), state(west, west)). go(S, G): - path(S, G, [S], L), Решение go: - go(state(east, east), state(west, west)). go(S, G): - path(S, G, [S], L), nl, write('A solution is: '), nl, write_path(L), fail. go(_, _). Мар. ГТУ 2010 г. 43

Для организации удобной формы вывода использованы: member(X, [X|_]). member(X, [_|L]): -member(X, L). Мар. ГТУ Для организации удобной формы вывода использованы: member(X, [X|_]). member(X, [_|L]): -member(X, L). Мар. ГТУ 2010 г. 44

write_move( state(X, W, G, C), state(Y, W, G, C) ) : !, write('The farmer write_move( state(X, W, G, C), state(Y, W, G, C) ) : !, write('The farmer crosses the river from '), write(X), write(' to '), write(Y), nl. write_move( state(X, X, G, C), state(Y, Y, G, C) ) : -!, write('The farmer takes the Wolf from '), write(X), write(' of the river to '), write(Y), nl. … Мар. ГТУ 2010 г. 45

Поиск в лабиринте Мар. ГТУ 2010 г. 46 Поиск в лабиринте Мар. ГТУ 2010 г. 46

Поиск в лабиринте Ø Рассмотрим следующую задачу: Существует дом с комнатами b, c, d, Поиск в лабиринте Ø Рассмотрим следующую задачу: Существует дом с комнатами b, c, d, e, f, g. Между некоторыми комнатами есть двери. В одной из комнат (g) находится клад. Требуется пройти через комнаты к кладу. Мар. ГТУ 2010 г. 47

База данных door(a, b). door(b, c). door(b, e). door(d, c). door(e, g). door(e, f). База данных door(a, b). door(b, c). door(b, e). door(d, c). door(e, g). door(e, f). Мар. ГТУ 2010 г. 48

Алгоритм поиска: терминальное условие Ø Ø Ø Ø Переход из комнаты в комнату производится Алгоритм поиска: терминальное условие Ø Ø Ø Ø Переход из комнаты в комнату производится через предикат: path(X, Y, T) X – исходная комната; Y – конечная комната; T – список пройденных комнат. Он необходим, чтобы не проходить дважды через одну комнату. Терминальное условие path(Y, Y, T) Т. е. мы находимся в нужной комнате. Мар. ГТУ 2010 г. 49

Алгоритм поиска: рекурсивное правило path(X, Y, T): -door(X, Z), not(member(Z, T)), path(Z, Y, [Z|T]). Алгоритм поиска: рекурсивное правило path(X, Y, T): -door(X, Z), not(member(Z, T)), path(Z, Y, [Z|T]). Ø Характер рекурсии другой. Один аргумент всегда увеличивается. В этой программе каждая дверь в одну сторону. Чтобы избежать этого, есть два варианта: добавить к door(b, c) факт door(c, b) Ø ввести еще одно правило: Ø Мар. ГТУ 2010 г. 50

Алгоритм поиска: рекурсивное правило path(X, Y, T): -door(Z, X), not(member(Z, T)), path(Z, Y, [Z|T]). Алгоритм поиска: рекурсивное правило path(X, Y, T): -door(Z, X), not(member(Z, T)), path(Z, Y, [Z|T]). Ø Можно записать, используя дизъюнкцию: path(X, Y, T): -(door(Z, X); door(X, Z)), not(member(Z, T)), path(Z, Y, [Z|T]). Поиск пути в комнату f ? -path(a, f, []). Ø Мар. ГТУ 2010 г. 51

Поиск клада в комнатах Ø Ø money(g). – факт о кладе Тогда найдем путь Поиск клада в комнатах Ø Ø money(g). – факт о кладе Тогда найдем путь к комнате с кладом. ? -path(a, X, []), money(X). Это вопрос типа "создать и проверить" находит достижимые комнаты, а затем проверяет наличие в них клада. Мар. ГТУ 2010 г. 52

Поиск клада в комнатах money(X), path(a, X, []). Здесь требуется сначала найти комнату, а Поиск клада в комнатах money(X), path(a, X, []). Здесь требуется сначала найти комнату, а затем путь к ней. Ø Интересные задачи: Ø Ø Как вывести путь T? Ø Как найти самый короткий путь? Мар. ГТУ 2010 г. 53

Спасибо за внимание! Вопросы? Мар. ГТУ 2010 г. 54 Спасибо за внимание! Вопросы? Мар. ГТУ 2010 г. 54