210 likes | 351 Vues
Логическое программировыание. Презентация 6 Операторы в Прологе. Содержание. Определение оператора Понятие структуры Представление структур Формат определения операторов Встроенные операторы Приоритеты, типы Арифметические, логические операторы Примеры определения новых операторов
E N D
Логическое программировыание Презентация 6 Операторы в Прологе
Содержание • Определение оператора • Понятие структуры • Представление структур • Формат определения операторов • Встроенные операторы • Приоритеты, типы • Арифметические, логические операторы • Примеры определения новых операторов • Сопоставления • Общие выводы
Понятие структуры • в Прологе основной формой представления являются структуры. • Структура состоит из функтора (имени структуры) и набора компонент (составных частей структуры). • Число аргументов функтора называется арностью. • Для структур удобно использовать графическое представление в виде дерева, корнем дерева является функтор, а ветвями - компоненты. • Компоненты могут быть также переменными или структурами. (а) представление в виде дерева; (б) запись на Прологе.
Древовидное представление выражений (структур) • Пример: запишем арифметическое выражение: 2 * a + b / c~+(*(2,a), /(b,c)) % альтернативная запись Вычисления в Прологе: ?- A = 3, B=9, C=3, X is 2*A+B/C. ~ ?- A = 3, B=9, C=3, X is +(*(2,A),/(B,C)). A = 3 B = 9 C = 3 X = 9 + * / c 2 a b
Определение новых операторов в Прологе • Пролог позволяет определить функторы как операторы с нужными свойствами (приоритетом, позицией и ассоциативностью) и использовать привычную форму записи арифметических выражений и предикатов. Для этого используется команда: :-ор(приоритет, тип, функтор). • где: • Приоритет - задает относительный порядок выполнения оператора • Тип – показатель ассоциативности оператора и его позиции. • Функтор – символьное обозначение оператора • При необходимости программист может ввести свои операторы или переопределить существующие.
Типы (ассоциативность) операторов • если оператор инфиксный, то указывается тип xfx, xfy(правоассоциативный) или yfx(левоассоциативный). • для постфиксного оператора указывается тип xfили yf • для префиксного - fxили fy. • fуказывает расположение функтора, • хуказывает на аргумент, чей приоритет должен быть строго выше оператора, • у обозначает аргумент с приоритетом выше или равным приоритету оператора.
Примеры ассоциативности • Левая ассоциативность: • оператор сложения + определен какop( 500, yfx, +).+ обладает левой ассоциативностью.A + B + C + D выполняется как: +(+(+(A,B),C),D) Правая ассоциативность: Оператор коньюнкции целейопределен:op( 1100, xfy, ,)., обладает правой ассоциативностью.A , B , C , D выполняется как ,(A, ,(B, ,(C,D)))
Приоритет оператора должен быть в диапазоне от 1 до 1200, самый высокий приоритет - 1, самый низкий - 1200. Тип оператора определяет его позицию и ассоциативность. Типы и приоритеты встроенных операторов Приоритет оператора должен быть в диапазоне от 1 до 1200, самый высокий приоритет - 1, самый низкий - 1200. Операторы с более низким приоритетом выполняются раньше остальных. ?- X is 3 + 2 * 8. X = 19
Пример определения нового оператора • Пример оператора: Определив оператор «нравится» как: :-op(600, xfx, likes) можно записать факт того, что Мэри нравится кино likes(mary, cinema). в более естественном виде: mary likes cinema. Т.о., введение новых операторов позволяет записывать правила, факты и т.п. в более привычном (естественном) виде, удобном для восприятия и интерпретации (например, в записи математических формул и теорем).
Определения встроенных операторов Множество заранее определенных операций: :-ор(1200, xfx, [:-,-->]). :-op(1200, fx, [:-,?-]). :-op(1100, xfy, ';'). :-ор(1050, xfy, ->). :-ор(1000, xfy, ','). :-ор(900, fy, [not, '\+']). :-op(700, xfx, [=, \=, ==, \==, =..]). :-op(700, xfx, [is, =:=, =\=, <, =<, >, >=, @<, @=<, @>,@>=]). :-op(500, yfx, [+, -]). :-op(400, yfx, [*, /, //, mod]). :-op(200, xfx, **). :-op(200, xfy, ^). :-op(200, fy, -).
Основные встроенные арифметические операторы • В Прологе выполняются следующие арифметические операции: + - сложение - - вычитание * - умножение / - деление mod - остаток от целочисленного деления. // - целочисленное деление ^ - возведение в степень • Примеры: f(X, Y, Z):-Z is X*X + Y*Y. ?- f(3,4,X). X=25;
Операции сравнения • К операциям сравнения относятся следующие предикаты: =:= - проверка на равенство =\= - проверка на неравенство > - отношение «больше» < - отношение «меньше» =< - отношение «меньше либо равно» (запомнить порядок!) >= - отношение «больше либо равно» • Примеры: ?- 2+2=2*2.?- 2+2=:=2*2. ?- 5>=6. No Yes No
Логические выражения • Пролог позволяет формировать сложные логические выражения. Простейшими логическими предикатами являются true (истина) и fail (ложь, неудача) • Согласование цели true всегда успешно. Согласование цели fail всегда неудачно. • Для конъюнкции целей используется предикат "," (X,Y), а для дизъюнкции - предикат ";" (X;Y) • Приоритет у оператора дизъюнкции ";" выше, чем у оператора конъюнкции ",", поэтому лишние скобки в логических выражениях часто можно опускать. ?- true;(fail,fail). ?- true;fail,fail.?-(true;fail),fail). Yes Yes No • Для отрицания используется предикат not(X). • Так как запятая служит как для конъюнкции целей, так и для разделения аргументов, требуются дополнительные скобки, если аргумент not не является элементарным выражением. • Например, нужно писать not((true,fail)). а не not(true,fail).
Примеры определения логических операторов • Пример 1: Конструкция "если А то В иначе С" на языке Пролог может быть записана как (A,B;not(A),С)или (А,В;С), а конструкция "если А то В" - как (A,B,true) ?- 5>6,X=1;not(5>6),X=2. ?- 5>4,X=1,true. ?- 5>6,X=1;X=2. X = 1 X = 2 Yes • Пример 2: Зададим условные операторы и запишем с их помощью определение предиката «max» :-op(1160, fx, if). :-op(1150, xfx, then). :-op(1155, xfx, else). if A then B else C :- A, B; not(A), C. max(X,Y,Z) :- if X>Y then Z is X else Z is Y. ?- max(1,2,X). X = 2
Примеры определения логических операторов • Пример 3: Теорема эквивалентности / правило де-Моргана: Условная запись: ~( A & B) <==> ~ A V ~B «Отрицание конъюнкции эквивалентно дизъюнкции отрицаний» • Можем запись правило в форме предиката на Прологе: equiv((not(A,B)), (not(A);not(B))). Но удобней представить запись в более естественной матем. форме. Подходящий набор операций для данного назначения: :-ор(800, xfx, <===>). :-op(700, xfy, v). :-op(600, xfy, &). :-op(500, fy, ~). • Теперь теорему де Моргана можно записать как следующий факт: ~(А&В)<===>~А V ~В.
Понятие сопоставления • Сопоставление (унификация) является наиболее важной операцией в Прологе. Оно выполняет сравнение двух термов на равенство, при этом неконкретизированные переменные получают значения, при которых термы становятся идентичными. Выполнение сопоставления может производиться либо явно, в теле правила с помощью встроенного предиката X=Y, либо неявно, при сопоставлении цели с фактом или головой правила. • Сопоставление реализует основные операции обработки данных в логическом программировании • однократное присваивание, • передача параметров, • создание структурных объектов, • доступ к полям структурных объектов с возможностью одновременного чтения/записи.
Правило выполнения сопоставлений • Сопоставление выполняется согласно следующим правилам • Неконкретизированная переменная сопоставима с любым объектом и этот объект становится значением переменной («конкретизацией»). • Если S переменная, а Т -произвольный объект, то ни сопоставимы и S приписывается значение T. • Наоборот, если Т -переменная, а S -произвольный объект, то T приписывается значение S: «T конкретизируется значением S». • Числа и атомы сопоставимы только с идентичными числами и атомами. • Сопоставление структур: • Структуры сопоставимы только, если они имеют одинаковый функтор одинаковое число компонентов, и соответствующие компоненты сопоставимы друг с другом. • Если S и Т - структуры, то они сопоставимы, если S и Т имеют одинаковый главный функтор и все их соответствующие компоненты сопоставимы. Результирующая конкретизация определяется сопоставлением компонент.
Примеры сопоставлений • Конкретизация переменных при сопоставлении. ?- data(M, D, 1992)=data(may, 3, Y). M = may D = 3 Y = 1992; • Сопоставление идентичных атомов. ?- bob=bob. • Сопоставление структур. ?- triangle(point(2, 5), A, point(B, 8)) = triangle(X, point(2, 8), point(5, 8)). A = point(2, 8); B = 5; X = point(2, 5); • Сопоставление двух структур, содержащих неконкретизированные перемененные. ?- triangle(point(X, 5), point(X, 8), point(5, Z))= triangle(point(2, 5), point(Y, 8), point(5, A)). X = 2; Z = _G777; Y = 2; A = _G777 ;
Отрицательные сопоставления • Итак, в Прологе операцияX=Yкроме сравнения выполняет сопоставление двух термов, с конкретизацией переменных. • Также в Прологе существует противоположный предикат X\=Y, который истинен только в случае, если терм X не сопоставим с термом Y. • При использовании этого предиката в программе рекомендуется, чтобы все переменные в термах X и Y на момент согласования цели были конкретизированными, иначе результат будет зависеть от порядка целей в программе • Пример: зависимость результата от порядка конкретизации. ?- X=a, Y=b, X\=Y. ?- X=a, X\=Y,Y=b. YesNo
Сопоставление выраженийна идентичность • Иногда требуется проверить точное равенство двух термов, включая соответствие расположения и идентичность неконкретизированных переменных. Это осуществляется с помощью встроенного предиката равенства (идентичности) X==Y. • Этот предикат не выполняет конкретизации переменных, неконкретизированная переменная не равна никакому объекту кроме другой неконкретизированной переменной, уже сцепленной с ней. • Предикат равенства остается истинным, какое бы значение не получила в ходе дальнейшего вывода неконкретизированная переменная, входящая в терм. • Пример: Проверка двух термов на равенство, без конкретизации. ?- f(2,3)==f(2,X). No • Противоположный предикат X\==Y истинен только в случае, если терм X не равен терму Y • Пример: Проверка двух термов на равенство, без конкретизации. ?- f(2,3)\==f(2,3). No
Выводы На основании изложенного можно сделать заключения: • Удобство программ для чтения часто можно повысить с помощью записи операторной форме. • Операции могут быть инфиксными, префиксными илипостфиксными. • Со знаками операций не связаны какие-либо операции над данными, если не считать некоторых частных случаев. Определения операций не определяют конкретные действия; они лишь вводят новые обозначения. • Знаки операций (функторы) применяются для соединения компонентов структур. • Программист может определять свои собственные операции. • В определении каждой операции необходимо указать: • приоритет (число в диапазоне от 1 до 1200), • тип (символьное представление отношения функтора и операндов), • знак (может состоять из одного или нескольких символов). • Для сравнения двух термов на равенство выполняется операция сопоставления, выполняющая конкретизацию их переменных.