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