
c5e85df2333f3cb7c625eb9781d94c31.ppt
- Количество слайдов: 36
Логическое программирование Встроенные предикаты обработки термов. Операции в Прологе. Поиск. Тема 7 Мар. ГТУ 2012 г. 1
Ø Встроенные предикаты. Ø Метапредикаты (встроенные предикаты обработки термов). Ø Операции (Операторы). Приоритет, тип оператора. Объявление операций Ø Поиск в лабиринте. Ø Сравнительная характеристика языков программирования. Мар. ГТУ 2012 г. 2
Встроенные предикаты Мар. ГТУ 2012 г. 3
repeat Ø repeat – цель, которая всегда успешна. Ø Ее особое свойство состоит в том, что она всегда находит альтернативу. Ø Поэтому всякий раз, когда до нее доходит перебор, она порождает новую ветвь вычислений. Мар. ГТУ 2012 г. 4
Пример Ø Процедура sq, которая читает последовательность чисел и выдает их квадраты. Ø Последовательность чисел заканчивается атомом stop. Ø sq : - repeat, write('Number: '), read(X), (X=stop, !; Y is X*X, write(Y), nl, fail). Мар. ГТУ 2012 г. 5
Проверка типа терма Ø atom(X) – да, если X – атом. Ø integer(X) – да, если X – целое. Ø atomic(X) – да, если X – целое или атом. Ø var(X) – да, если X – не конкретизированная переменная. Ø nonvar(X) – да, если X – терм, отличный от переменной, или уже конкретизированная переменная. Мар. ГТУ 2012 г. 6
Пример универсального предиката суммирования: plus 1(X, Y, Z): -integer(X), integer(Y), integer(Z), S is X + Y, S=Z. plus 1(X, Y, Z): -integer(X), integer(Y), var(Z), Z is X + Y. plus 1(X, Y, Z): -var(X), integer(Y), integer(Z), X is Z – Y. plus 1(X, Y, Z): -integer(X), var(Y), integer(Z), Y is Z – X. ? -plus 1(1, 2, Z). Z=3. ? -plus 1(X, 2, 4). X=2. ? -plus 1(1, Y, 2). Y=1. ? -plus 1(1, 2, 3). yes. Мар. ГТУ 2012 г. 7
Метапредикаты (встроенные предикаты обработки термов) Мар. ГТУ 2012 г. 8
Создание и декомпозиция термов: Т=. . L Ø Т=. . L (читается "univ") истина, если L – список, начинается с главного функтора терма T, вслед за которым идут его аргументы. ? -f(a, b)=. . L. L=[f, a, b] ? -T=. . (like, tom, mary). T=like(tom, mary). Ø Позволяет из списка получать структуру и наоборот. Мар. ГТУ 2012 г. 9
Создание и декомпозиция термов: functor. Ø 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(_, _, _, _). Мар. ГТУ 2012 г. 10
Создание и декомпозиция термов: 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 Мар. ГТУ 2012 г. 11
Предикаты работы с базой данных Ø Программа в прологе – база данных. Ø Можно добавлять к базе данных новые предложения и удалять предложения. Ø Аналогично, в ходе выполнения программы ее можно изменять. Ø Для этого используются специальные предикаты: Ø assert(C) Ø retract(C) Мар. ГТУ 2012 г. 12
assert(C) Ø добавляет к базе данных предложение С. ? -assert(a(b)). ? -listing. a(b). ? -asserta(a(a)). ; ; добавляет в начало списка ? -assertz(a(c)). ; ; добавляет в конец списка ? -listing. a(a). a(b). a(c). Мар. ГТУ 2012 г. 13
assert(C) assert((a(X): -X>0)) ? -F=. . [a, b, c], assert(F). a(b, c). Ø assert используется иногда для сохранения промежуточных результатов. Ø Может служить для передачи значений переменных между предложениями. Ø Использование лучше ограничивать из-за усложнения понимания программы. Мар. ГТУ 2012 г. 14
retract(C) Ø удаляет предложения, согласуемые с C. Мар. ГТУ 2012 г. 15
Операции (Операторы). Приоритет, тип оператора. Объявление операций Мар. ГТУ 2012 г. 16
Операции (Операторы). Ø +(1, 2) 1 + 2 Ø Пролог предоставляет возможность использовать наряду с встроенными операторами и дополнительные операторы для структур с арностью /2 и /1. Ø op(Приоритет, Тип, Имя). Ø Имя оператора любой атом. Мар. ГТУ 2012 г. 17
Приоритет оператора Ø Приоритет оператора задает порядок выполнения операций в выражениях, содержащих более одного оператора. Ø Вычисления начинаются с оператора имеющего наименьший номер и заканчиваются наибольшим номером. Øx + y * 2 Мар. ГТУ 2012 г. 18
Тип оператора Ø Тип задает позицию и ассоциативность оператора. Ø Позиция оператора указывает, где он записывается по отношению к своим аргументам. Ø Ассоциативность оператора показывает, какая операция выполняется первой в выражении, содержащем два или более оператора с одинаковым приоритетом. Мар. ГТУ 2012 г. 19
Тип оператора Тип может принимать одно из следующих значений: Ø xfx xfy yfx для инфиксных операций Ø fy fx для префиксных операций Ø xf yf для постфиксных операций Ø f – функтор Ø x – выражение Ø y – выражение Мар. ГТУ 2012 г. 20
Тип оператора Ø Для простоты следует запомнить что yfx имеет левую ассоциативность. Ø Например + определен как op(500, yfx, +). + обладает левой ассоциативностью. Ø A + B + C + D выполняется как +(+(+(A, B), C), D) Представляется как дерево растущее в низ и налево: Мар. ГТУ 2012 г. 21
Тип оператора Ø Наоборот xfy имеет правую ассоциативность. Ø Например, определен как op(1100, xfy, , ). , обладает правой ассоциативностью. Ø A , B , C , D выполняется как , (A, , (B, , (C, D))) Представляется как дерево растущее в низ и направо: Мар. ГТУ 2012 г. 22
Тип оператора Ø xfx – инфиксная операция, не обладающая свойством ассоциативности Ø Поэтому Ø ? - X is 120 f 5 является недопустимой. Мар. ГТУ 2012 г. 23
Встроенные операторы для SWI-prolog Ø 1200 fx : -, ? Ø 1150 fx dynamic , multifile, module_transparent, discontiguous, volatile, initialization Ø xfy ; , | Ø 1050 xf Ø 1000 xfy , Ø 954 xfy \ Ø 900 fy +, not Ø 900 fx ~ Ø 700 xfx <, =, =. . , =@=, =: =, =<, ==, ==, >, >=, @<, @=<, Ø @>, @>=, ==, is Ø 600 xfy : Ø 500 yfx +, -, /, /, xor Ø 500 fx +, -, ? , Ø 400 yfx *, /, //, <<, >>, mod, rem Ø 200 xfx ** Ø 200 xfy ^ Мар. ГТУ 2012 г. 24
Объявление операций. : -op(500, xfx, love). bob love mary. pam love sam. ? - bob love Y. Y = mary. ? - X=join(a, b), write(X), nl, op(500, yfx, join), write(X). Дает join(a, b) a join b X = a join b Мар. ГТУ 2012 г. 25
Поиск в лабиринте Мар. ГТУ 2012 г. 26
Поиск в лабиринте Ø Рассмотрим следующую задачу: Существует дом с комнатами b, c, d, e, f, g. Между некоторыми комнатами есть двери. В одной из комнат (g) находится клад. Требуется пройти через комнаты к кладу. Мар. ГТУ 2012 г. 27
База данных door(a, b). door(b, c). door(b, e). door(d, c). door(e, g). door(e, f). Мар. ГТУ 2012 г. 28
Алгоритм поиска: терминальное условие Ø Переход из комнаты в комнату производится через предикат: Ø path(X, Y, T) Ø X – исходная комната; Ø Y – конечная комната; Ø T – список пройденных комнат. Он необходим, чтобы не проходить дважды через одну комнату. Ø Терминальное условие path(Y, Y, T) Ø Т. е. мы находимся в нужной комнате. Мар. ГТУ 2012 г. 29
Алгоритм поиска: рекурсивное правило path(X, Y, T): -door(X, Z), not(member(Z, T)), path(Z, Y, [Z|T]). Ø Характер рекурсии другой. Один аргумент всегда увеличивается. В этой программе каждая дверь в одну сторону. Чтобы избежать этого, есть два варианта: Ø добавить к door(b, c) факт door(c, b) Ø ввести еще одно правило: Мар. ГТУ 2012 г. 30
Алгоритм поиска: рекурсивное правило 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, []). Мар. ГТУ 2012 г. 31
Поиск клада в комнатах Ø money(g). – факт о кладе Ø Тогда найдем путь к комнате с кладом. Ø ? -path(a, X, []), money(X). Ø Это вопрос типа "создать и проверить" находит достижимые комнаты, а затем проверяет наличие в них клада. Мар. ГТУ 2012 г. 32
Поиск клада в комнатах money(X), path(a, X, []). Ø Здесь требуется сначала найти комнату, а затем путь к ней. Ø Интересные задачи: ØКак вывести путь T? ØКак найти самый короткий путь? Мар. ГТУ 2012 г. 33
Сравнительная характеристика языков программирования Мар. ГТУ 2012 г. 34
Характеристика тип языка типы данных обработка PASCAL, C процедурный скаляры, структуры присвоение LISP функциональный атомы, списки значение функции данных передача по значению, передача по ссылке последовательное ветвление, циклы, рекурсия передача по значению через унификацию, по ссылке Блоки процедуры глобальные локальные компилятор Функции LET-блоки локальные свободные интерпретатор, компилятор 3 правила факты область одно предложение интерпретатор, компилятор 1 2 символьная обработка, ИИ 5 ЭС, ИИ, прототипы управление программой структуры программы действия переменных транслятор длина программы 5 скорость область 1 программы общего назначения PROLOG логический атомы, структуры связь переменных вычисление функций рекурсия вычисления рекурсии, бэктрекинг условные циклы 35
Спасибо за внимание! Вопросы? Мар. ГТУ 2012 г. 36
c5e85df2333f3cb7c625eb9781d94c31.ppt