Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р...

Preview:

Citation preview

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

БлагодаряЗа

Вниманието

Recommended