Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р...
Transcript of Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р...
05/11/06 доц. д-р Стоян Бонев 1
Технология на ПрограмиранетоТУ, кат. КС, летен семестър 2005/06
Лекция 14
Тема:
Логическо Програмиране(Пролог)
05/11/06 доц. д-р Стоян Бонев 2
Съдържание:
• Стилове на Програмиране• Логическо Програмиране• Част 1• Основни понятия• Част 2• Въведение в Пролог
05/11/06 доц. д-р Стоян Бонев 3
Стилове на Програмиране
Дейностите в програмирането не се подчиняват на единни водещи принципи. Съществуват стилове на програмиране, които могат да се класифицират така:
• Процедурно програмиране (procedure based programming);
• Логическо програмиране (logic programming);• Функционално програмиране (functional
programming).
05/11/06 доц. д-р Стоян Бонев 4
Процедурно програмиране
Красноречиво пояснение на този стил представлява заглавието на книгата на Никлаус Вирт
Алгоритми + Структури от Данни = ПрограмиПрограмистът съставя програма и указва на
компютъра как на базата на избран алгоритъм и възприети структури от данни да се намери решение на поставената задача. Типични процедурни ПЕ са Fortran, Algol, PL/1, Basic, Pascal, C/C++, Java.
05/11/06 доц. д-р Стоян Бонев 5
Логическо програмиранеВодещият принцип в този стил гласиПравила + Факти = ПрограмиИзпълнението на една програма от ЛП се свежда до
доказателство или извод на определен факт, правило или твърдение чрез сканиране на предварително изградена БД, съдържаща правила и факти от определена предметна област. Алгоритмичният въпрос от процедурното програмиране как да се реши една задача се измества от въпроса какво (каква задача) има да се решава и как да се опише тя. Този стил е известен и като декларативно програмиране. Език за ЛП е Пролог (Prolog – Programming in logic).
05/11/06 доц. д-р Стоян Бонев 6
Функционално програмиране
Водещият принцип в този стил гласиПрограма = Композиция от ФункцииНаименованието на стила подсказава важността
на обекта функция. Системите за ФП предоставят на програмиста множество от базови функции, както и средства за дефиниране на нови функции от базовите, с което се постига решаване на поставения проблем. Този стил е известен още и като апликативно програмиране. Език за ФП е Лисп (Lisp – List programming).
05/11/06 доц. д-р Стоян Бонев 7
Стилове на Програмиране
Imperative (procedure driven) programmingAlgorithms + Data Structures = Programs
Structured Programming: Thinking in Functions!Classes + Objects = ProgramsOOP: Thinking in Objects!
Logic programmingRules + Facts = Programs
Functional programmingComposition of Functions = Programs
05/11/06 доц. д-р Стоян Бонев 8
Логическо Програмиране
Imperative programming vs. logic programming
The algorithmic task: HOW to solve a problem?
is being substituted (replaced) to more general task WHAT PROBLEM is to be solved?
The language applied to logic programming is ProLog – PROgramming in LOGic
05/11/06 доц. д-р Стоян Бонев 9
Част 1
Основни понятия
05/11/06 доц. д-р Стоян Бонев 10
Съдържание:
• Предикатно смятане– Предикат– Клауза (клаузна форма)– Резолвента– Метод на резолюцията
05/11/06 доц. д-р Стоян Бонев 11
Основни понятия
В своята същност логическото програмиране се основава на принципите на формалната логика и предикатното смятане. Съществен смисъл в този аспект имат понятията за предикат, клаузна форма, резолвента, метод на резолюцията.
05/11/06 доц. д-р Стоян Бонев 12
ПредикатПредикат (съждение, твърдение, proposition) е
логическа категория, която може да бъде истина или да не бъде истина. Предикатите се описват с обекти и отношения между тях. Обектите представят като прости терми – константи и променливи. Най-простите предикати, наричани атомарни се състоят от един съставен терм. Съставният терм се представя във функционален запис и съдържа: а/ функтор, който изразява отношението между обектите; б/ списък от параметри, разделени със запетаи и обградени в скоби. Пример за примитивен предикат, изразен като съставен терм, е твърдението: Петров е офицер.
офицер(петров)В означения предикат участват функтор офицер и
константа петров.
05/11/06 доц. д-р Стоян Бонев 13
ПредикатДва или повече атомарни предиката (съставни терми) се
композират с логически връзки/операции и формират съставни предикати по правлиата за конструиране на логически изрази в процедурните ПЕ. Пет логически връзки намират приложение в предикатното смятане. Те са показани в намаляващ приоритет заедно със знаците за означаване.
Отрицание ~ или ¬Конюнкция & или ∩Дизюнкция V или ∪Еквивалентност ( тогава и само тогава ) ⇔ или ≡Импликация ( ако … то ) ⇒ или ⊃
⇐ или ⊂Пример за съставен предикат е твърдението: Петров е
офицер и работи в Бургас.офицер(петров) ∩ работи(петров,бургас)
05/11/06 доц. д-р Стоян Бонев 14
ПредикатВ предикатното смятане се ползват и два специални
символа, квантор за общност и квантор за съществуване. С тяхна помощ в предикатите се означават и променливи. Двата квантора са с по-висок приоритет в сравнение с логическите връзки. В означенията X е променлива, а P е предикат.
Означение СмисълКвантор за общност ∀X.P За всяко X предикатът P е верен
Пример:∀X.(офицер(X) ∩ има(X,пагони))Всеки офицер има пагони.
Квантор за съществуване ∃X.PСъществува поне едно X, за което предикатът P е верен
Пример:∃X.(офицер(X) ∩ роден(X,софия))Има офицери, родени в София.
05/11/06 доц. д-р Стоян Бонев 15
Клаузна формаВ предикатното смятане се допуска един и същ
съставен предикат да се запише в различни тъждествени форми. Известни са преобразувания, при които например импликация и еквивалентност се изразяват с отрицание, дизюнкция и конюнкция.
С цел опростяване, унификация и постигане на еднозначност при записване на твърденията в предикатното смятане се въвежда стандартизирана форма за означаване на съставни предикати, известна като клаузна форма, която се представя в следния общ вид
05/11/06 доц. д-р Стоян Бонев 16
B1 ∪ B2 ∪…∪ Bn ⊂ A1 ∩ A2 ∩…∩ AmОзначенията Ai и Bj са прости или съставни терми,
а клаузната форма за представяне на предикати има следния смисъл. Ако всички терми A1 A2 … Am са верни, то най-малко един от термите B1 B2 … Bn е верен. За клаузната форма е характерно, че се прилагат само дизюнкция, импликация и конюнкция в посочения ред: отляво последователно дизюнкция, отдясно последователно конюнкция, в средата една импликация. Дясната страна на клаузната форма се нарича антецедент (antecedent) а лявата страна се нарича консеквент (consequent),Консеквентът е следствие (последица) от верността на антецедента. Доказва се, че всички твърдения в предикатното смятане могат да се приведат в клаузна форма.
05/11/06 доц. д-р Стоян Бонев 17
Метод на резолюцията
Представянето на множество предикати в унифицирана клаузна форма позволява да се развие процес на извеждане (доказване) на нови твърдения (факти) от наличните предикати.
Този процес е известен като метод на резолюцията. Датира от 60-те години на XX век и е дал силен тласък за развитие на направлението автоматично доказателство на теореми.
05/11/06 доц. д-р Стоян Бонев 18
РезолвентаРезолюцията е правило за извод, приложимо над
предикати, записани в клаузна форма. Като елементарна илюстрация са показани два предиката.
A ⊂ B1B2 ⊂ A
Представените предикати означават, че от верността на B1 следва верността на А и че от верността на А следва верността на B2. Очевидно, от веригата предикати може да бъде направено заключението, че от верността на B1 следва и верността на B2, т.е. може да се формулира ново твърдение (факт), записано като предикат
B2 ⊂ B1Клаузата (новият факт), която се получава като
резултат, се нарича резолвента.
05/11/06 доц. д-р Стоян Бонев 19
Метод на резолюциятаОбобщението на горното правило по същество
представлява методът на резолюцията. Според него клаузата резолвента се получава чрез обединяване на левите и десните страни на наличните клаузи, след което общите терми в лявата и дясната част на новополучената клауза се елиминират. Следният пример илюстрира казаното в по-общ вид.
Налични клаузи:A1 ∪ B ∪ A2 ⊂ C1 ∩ C2D1 ∪ D2 ⊂ E1 ∩ B ∩ E2След обединяване на левите и десните страни и
елиминиране на общия терм B се получава клаузата резолвента в следния вид:
A1 ∪ A2 ∪ D1 ∪ D2 ⊂ C1 ∩ C2 ∩ E1 ∩ E2
05/11/06 доц. д-р Стоян Бонев 20
Метод на резолюцията
Резолюцията се усложнява при условие, че термите в клаузите съдържат променливи. В този случай еднаквостта на изключваните терми може да не е буквална, както бе показано.
Резолюцията следва да включва определяне (замяна, субституция) на променливи с такива стойности (терми), така че да се постигне успешно съпоставяне и последващо елиминиране. Този процес на замяна се наричаунификация.
05/11/06 доц. д-р Стоян Бонев 21
Част 2
Въведение в Пролог
05/11/06 доц. д-р Стоян Бонев 22
Съдържание:
• Увод• Факти• Цели (въпроси)• Променливи в Пролог• Конюнкции, дизюнкции и отрицание• Правила• Рекурсия в Пролог
05/11/06 доц. д-р Стоян Бонев 23
УводСъщината на ЛП е в деклариране (задаване) на
факти и правила, които описват определена предметна област. Фактите и правилата формират БД. Към базата данни се задават въпроси. Няма програмиране с избор на алгоритъм и структури данни. Една Prolog-програма е съвкупност от данни (факти) за обекти и отношения между обекти. Изпълнението на една програма Prolog се състои в това потребителят да формулира цел (goal) – въпрос относно фактите и правилата в БД. Целта се задава и системата се опитва да я удовлетвори.
05/11/06 доц. д-р Стоян Бонев 24
Въведение
Доколкото програмите тук не съдържат алгоритми и структури данни, специалистите по ЛП не са класически програмисти. Те са специалисти по знания в определена област (knowledge engineers), които проектират и реализират практически системи за логическо програмиране.
05/11/06 доц. д-р Стоян Бонев 25
Въведение
Съставянето на една програма на Prologвключва:
• задаване на факти за обекти и отношения,• дефиниране на правила за множество факти и
отношения.• изпълнението на една програма Prolog
включва задаване на въпроси относно описаните факти и дефинираните правила.
05/11/06 доц. д-р Стоян Бонев 26
Summary 1
ProLog programming includes following activities:
• Declaring facts about objects and relationships;
• Defining some rules about facts and relationships;
• Asking questions related to the facts and rules.
05/11/06 доц. д-р Стоян Бонев 27
Факти
Фактите в Пролог служат за задаване на безусловно верни същности – свойства и отношения. Пролог възприема един факт за верен независимо дали той е верен в реалния свят. Фактът се счита за верен, т.к. Програмистът е заявил така и това е в сила за БД, която е съставена и се управлява от системата за ЛП.
05/11/06 доц. д-р Стоян Бонев 28
Факти. Примери
Ето факт като изречение на естествен език:John likes Mary.
Това е факт с два обекта: John, Mary и едно отношение: likes
Същият факт представен на Пролог:likes( john, mary).
likes се нарича предикат. john, mary се наричат аргументи. Пишат се с малки букви и завършват с точка.
05/11/06 доц. д-р Стоян Бонев 29
Факти. Примери
Изречение на естествен език: John is a student.обект: Johnотношение: статус на студент
Факт на Пролог: student(john).
Фраза на естествен език: Nature0 обекти, 1 отношение
Факт на Пролог: nature.
05/11/06 доц. д-р Стоян Бонев 30
Факти. Примери
Налице са вградени предикати за рутинни процедурни действия като В/И, комуникация с ОС и други.
Например, предикатът write служи за извеждане на екран.
write('Hello').извежда текста 'Hello' на екрана.
05/11/06 доц. д-р Стоян Бонев 31
Как се пишат факти?
• Отношения и обекти с малки букви.• Всеки факт завършва с точка.• Отношенията се наричат предикати.• Обектите се наричат аргументи.• Допуска се произволен брой аргументи.• Факти се интерпретират от
програмиста.• Колекция (съвкупност) от факти е БД.
05/11/06 доц. д-р Стоян Бонев 32
Цели (въпроси)
Прцесът на извод (доказателство) в Пролог = Изпълнение на една ЛП програма;
Процесът на извод в Прлог включва:удовлетворяване на цел (подцел);
пре-удовлетворяване на цел (подцел);механизъм на възврат (backtracking).
05/11/06 доц. д-р Стоян Бонев 33
След съставяне на БД с факти, потребителят може да задава въпроси, свързани с базата данни. Въпросите се наричат цели (goals) или заявки (queries). goal:- likes(john,mary). Yes goal:- likes(john,violet). No goal:- student(john). Yes goal:- student(peter). NoОтговор Yes значи вярно или доказуемо (изводимо) при сканиране на БД.Отговор No значи невярно или недоказуемо (неизводимо) при сканиране на БД.
05/11/06 доц. д-р Стоян Бонев 34
Факт и въпрос (goal) съвпадат (are unified), ако:
• Имената на предикатите са еднакви;
• Съответните аргументи също са еднакви.
05/11/06 доц. д-р Стоян Бонев 35
Променливи
Променивите служат за задаване на абстрактни (по-общи въпроси). Прилагат се, когато не можем или не искме да назовем даден обект.
Въпрос на естествен език: Who is a student?Цел на Пролог: goal:- student(X). X = johnПролог сканира фактите в БД, за да намери
обект, който да бъде съпоставен на променливата Х.
05/11/06 доц. д-р Стоян Бонев 36
Променливи
Въпрос на ест. език: Кого харесва Джон?Who does John like?
Цел на Пролог: goal:- likes(john, X). X = maryПролог сканира фактите в БД, за да
намери обект, който да бъде съпоставен на променливата Х.
05/11/06 доц. д-р Стоян Бонев 37
• X е променлива.• Променливите се пишат с голяма буква.• Променливитв могат да имат две
състояния:– Свободна– Свързана
05/11/06 доц. д-р Стоян Бонев 38
Факт и въпрос (goal) съвпадат (are unified), ако:
• Имената на предикатите са еднакви;
• Съответните аргументи също са еднакви, или поне един от неидентичните аргументи е свободна променлива.
05/11/06 доц. д-р Стоян Бонев 39
• Пролог отговаря No, ако факт и въпрос не
съвпадат.• В случай на успех, Прoлог отговаря подобно
на X = mary.• След такъв отговор има две възможности:A/ CR (carriage return или Enter). Това значи –
отговорът удовлетврява.B/ ;CR. Това значи – отговорът не
удовлетворява, търсенето в БД следва да продължи от текущата позиция, като всички свързани променливи стават свободни.
Казва се, че Пролог пробва да пре-удовлетвори целта.
05/11/06 доц. д-р Стоян Бонев 40
Други примери
Facts: Goals:student(peter). goal:-student(X).student(john). X = peter ;crstudent(mary). X = john ;cr
X = mary ;crNo
След ;cr Пролог освобождава свързаната променлива X. X се възстановява като свободна променлива. X забравя обекта, с който е бил свързан.
05/11/06 доц. д-р Стоян Бонев 41
Още един пример
Facts: Goals: lives_in(john,sofia). goal:-lives_in(Person,City). lives_in(peter,varna). Person = john lives_in(mary,plovdiv). City = sofia ;cr lives_in(dimo,rousse Person = peter
City = varna ;crPerson = maryCity = plovdiv ;crPerson = dimoCity = rousse ;crNo
05/11/06 доц. д-р Стоян Бонев 42
Конюнкции Въпроси за сложни отношения се задават като
последователност от цели, разделени с , (commas)Пример: Do John and Mary like each other? goal:likes(john,mary) , likes(mary,john).Пример: Is there anything that both John & Mary like? goal: likes(john,X) , likes(mary,X).Въпросът е конюнкция от цели. Пролог опитва да
удовлетвори всички цели от ляво на дясно.Ако всички цели са удовлетворени, конюнкцията
успява. В противен случай, тя пропада.
05/11/06 доц. д-р Стоян Бонев 43
факти: student(john).student(peter).student(mary).lives_in(peter,varna).lives_in(john,sofia).lives_in(mary,plovdiv).
Въпрос: goal:- student(X) , lives_in(X,varna)Два процеса са активни: пре-удовлетворяване на
първата подцел, и удовлетворяване на втората подцел.
Това е механизъм с възврат BACKTRACKING.Отговорът е: X = peter
05/11/06 доц. д-р Стоян Бонев 44
Правила
Правила се ползват, когато един факт зависи от друг факт или от група факти.
Пример: John likes anyone who likes coke.likes(john,X) :- likes(X,coke).
Общ формат на правило: ‘:-’ значи ‘ако’заглавие :- тяло
Лява част :- дясна част
05/11/06 доц. д-р Стоян Бонев 45
Правила се ползват за дефиниции.
Пример 1: птицата е животно с пера. A bird is an animal with feathers.
X е птица, ако X е животно и X има пера.X is a bird, if X is an animal and X has feathers.
bird(X) :- animal(X) , has(X,feathers).
05/11/06 доц. д-р Стоян Бонев 46
Правила се ползват за дефиниции.
Пример 2: X е брат на Y, ако X е мъж, и двамата X и Y имат общ родител
X is Y’s brother, if X is male and both X and Y have the same parent.
brother(X,Y) :- male(X),parent(Z,X),parent(Z,Y).
sister(X,Y) :- female(X),parent(Z,X),parent(Z,Y).
05/11/06 доц. д-р Стоян Бонев 47
Правила се ползват за дефиниции.
Пример 3:Лампата свети, ако ел е включено. Light is ON, if it is switched ON.
light(on) :- switch(on).
05/11/06 доц. д-р Стоян Бонев 48
Summary 2• Пролог клаузите са от 3 типа: факти, правила
и въпроси-цели (goals).• Фактите декларират свойства и отношения,
които винаги са верни.• Правилата декларират същности, които
зависят от други условия• Задавайки въпроси, потребителят проверява
дадена същност дали е вярна.• Commas, разделящи под цели, са конюнкции. • Semicolons, разделящи под цели, са
дизюнкции.
05/11/06 доц. д-р Стоян Бонев 49
Рекурсия в Пролог
Правилата служат за създаване на дефиниции, които се базират на други съществуващи факти.
Рекурсивните правила се прилагат, когато се дефинират нови отношения на основата на същия тип отношения.
05/11/06 доц. д-р Стоян Бонев 50
Рекурсивни правила - примери
Конфигурация кубове k1, k2, k3, k4, k5, k6Факти:
is_over(k2, k1).is_over(k4, k3).is_over(k5, k4).is_over(k6, k5).
05/11/06 доц. д-р Стоян Бонев 51
Рекурсивни правила - примери
Правило, описващо кула чрез релацията върху (is_over):
Кула с Връх k2, Основа k1tower(k2, k1) :- is_over(k2, k1).
Кула с Връх k4, Основа k3tower(k4, k3) :- is_over(k4, k3).
Кула с Връх k5, Основа k3tower(k5, k3) :- is_over(k5, k4) , is_over(k4, k3).
Кула с Връх k6, Основа k3tower(k6, k3) :- is_over(k6, k5) , is_over(k5, k4) , is_over(k4, k3).
05/11/06 доц. д-р Стоян Бонев 52
Рекурсивни правила - примери
Правило, описващо кула чрез релацията върху (is_over):
Кула с Връх Z, Основа Xtower(Z, X) :- is_over(Z, X).
Кула с Връх Z, куб Y1, Основа Xtower(Z, X) :- is_over(Z, Y1) , is_over(Y1, X).
Кула с Връх Z, кубове Y2, Y1, Основа Xtower(Z, X) :- is_over(Z, Y2) , is_over(Y2, Y1) , is_over(Y1, X).
Кула с Връх Z, кубове Y3, Y2, Y1, Основа Xtower(Z, X) :- is_over(Z, Y3) , is_over(Y3, Y2) , is_over(Y2, Y1) , is_over(Y1, X).
05/11/06 доц. д-р Стоян Бонев 53
Рекурсивни правила - примери
Най-примитивен е подходът да се дефинира кула чреа релацията is_over само.
Така се описват само конкретни конфигурации на кули като предишните два слайда.
По-добър и ефективен подход е да се опише (дефинира) кула по абстрактен начин като се приложи рекурсивен тип дефиниция.
05/11/06 доц. д-р Стоян Бонев 54
Рекурсивни правила - примери
Прост случай, гранично условиеКула с Връх Z, основа X
tower(Z, X) :- is_over(Z, X).
Общ случай, пре-дефиниране на кула с рекурсияКула с връх Z, куб Y, кубове . . ., Основа X
tower(Z, X) :- is_over(Z, Y) , tower(Y, X).
05/11/06 доц. д-р Стоян Бонев 55
Пролог БД
Факти: is_over(k2, k1).is_over(k4, k3).is_over(k5, k4).is_over(k6, k5).
Правила:tower(Z, X) :- is_over(Z, X). tower(Z, X) :- is_over(Z, Y) , tower(Y, X).
05/11/06 доц. д-р Стоян Бонев 56
Цели (въпроси)
goal:- tower(k2, k1). Yes goal:- tower(k6, k3). Yes goal:- tower(k1, k6). No
05/11/06 доц. д-р Стоян Бонев 57
Цели (въпроси)
goal:- tower(X, k3). X = k4 ;cr X = k5 ;cr X = k6 ;cr No
05/11/06 доц. д-р Стоян Бонев 58
Цели (въпроси)
goal:- tower(k6, X). X = k5 ;cr X = k4 ;cr X = k3 ;cr No
05/11/06 доц. д-р Стоян Бонев 59
БлагодаряЗа
Вниманието