59
05/11/06 доц. д-р Стоян Бонев 1 Технология на Програмирането ТУ, кат. КС, летен семестър 2005/06 Лекция 14 Тема: Логическо Програмиране (Пролог)

Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

  • Upload
    others

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 1

Технология на ПрограмиранетоТУ, кат. КС, летен семестър 2005/06

Лекция 14

Тема:

Логическо Програмиране(Пролог)

Page 2: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 2

Съдържание:

• Стилове на Програмиране• Логическо Програмиране• Част 1• Основни понятия• Част 2• Въведение в Пролог

Page 3: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 3

Стилове на Програмиране

Дейностите в програмирането не се подчиняват на единни водещи принципи. Съществуват стилове на програмиране, които могат да се класифицират така:

• Процедурно програмиране (procedure based programming);

• Логическо програмиране (logic programming);• Функционално програмиране (functional

programming).

Page 4: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 4

Процедурно програмиране

Красноречиво пояснение на този стил представлява заглавието на книгата на Никлаус Вирт

Алгоритми + Структури от Данни = ПрограмиПрограмистът съставя програма и указва на

компютъра как на базата на избран алгоритъм и възприети структури от данни да се намери решение на поставената задача. Типични процедурни ПЕ са Fortran, Algol, PL/1, Basic, Pascal, C/C++, Java.

Page 5: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 5

Логическо програмиранеВодещият принцип в този стил гласиПравила + Факти = ПрограмиИзпълнението на една програма от ЛП се свежда до

доказателство или извод на определен факт, правило или твърдение чрез сканиране на предварително изградена БД, съдържаща правила и факти от определена предметна област. Алгоритмичният въпрос от процедурното програмиране как да се реши една задача се измества от въпроса какво (каква задача) има да се решава и как да се опише тя. Този стил е известен и като декларативно програмиране. Език за ЛП е Пролог (Prolog – Programming in logic).

Page 6: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 6

Функционално програмиране

Водещият принцип в този стил гласиПрограма = Композиция от ФункцииНаименованието на стила подсказава важността

на обекта функция. Системите за ФП предоставят на програмиста множество от базови функции, както и средства за дефиниране на нови функции от базовите, с което се постига решаване на поставения проблем. Този стил е известен още и като апликативно програмиране. Език за ФП е Лисп (Lisp – List programming).

Page 7: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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

Page 8: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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

Page 9: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 9

Част 1

Основни понятия

Page 10: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 10

Съдържание:

• Предикатно смятане– Предикат– Клауза (клаузна форма)– Резолвента– Метод на резолюцията

Page 11: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 11

Основни понятия

В своята същност логическото програмиране се основава на принципите на формалната логика и предикатното смятане. Съществен смисъл в този аспект имат понятията за предикат, клаузна форма, резолвента, метод на резолюцията.

Page 12: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 12

ПредикатПредикат (съждение, твърдение, proposition) е

логическа категория, която може да бъде истина или да не бъде истина. Предикатите се описват с обекти и отношения между тях. Обектите представят като прости терми – константи и променливи. Най-простите предикати, наричани атомарни се състоят от един съставен терм. Съставният терм се представя във функционален запис и съдържа: а/ функтор, който изразява отношението между обектите; б/ списък от параметри, разделени със запетаи и обградени в скоби. Пример за примитивен предикат, изразен като съставен терм, е твърдението: Петров е офицер.

офицер(петров)В означения предикат участват функтор офицер и

константа петров.

Page 13: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 13

ПредикатДва или повече атомарни предиката (съставни терми) се

композират с логически връзки/операции и формират съставни предикати по правлиата за конструиране на логически изрази в процедурните ПЕ. Пет логически връзки намират приложение в предикатното смятане. Те са показани в намаляващ приоритет заедно със знаците за означаване.

Отрицание ~ или ¬Конюнкция & или ∩Дизюнкция V или ∪Еквивалентност ( тогава и само тогава ) ⇔ или ≡Импликация ( ако … то ) ⇒ или ⊃

⇐ или ⊂Пример за съставен предикат е твърдението: Петров е

офицер и работи в Бургас.офицер(петров) ∩ работи(петров,бургас)

Page 14: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 14

ПредикатВ предикатното смятане се ползват и два специални

символа, квантор за общност и квантор за съществуване. С тяхна помощ в предикатите се означават и променливи. Двата квантора са с по-висок приоритет в сравнение с логическите връзки. В означенията X е променлива, а P е предикат.

Означение СмисълКвантор за общност ∀X.P За всяко X предикатът P е верен

Пример:∀X.(офицер(X) ∩ има(X,пагони))Всеки офицер има пагони.

Квантор за съществуване ∃X.PСъществува поне едно X, за което предикатът P е верен

Пример:∃X.(офицер(X) ∩ роден(X,софия))Има офицери, родени в София.

Page 15: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 15

Клаузна формаВ предикатното смятане се допуска един и същ

съставен предикат да се запише в различни тъждествени форми. Известни са преобразувания, при които например импликация и еквивалентност се изразяват с отрицание, дизюнкция и конюнкция.

С цел опростяване, унификация и постигане на еднозначност при записване на твърденията в предикатното смятане се въвежда стандартизирана форма за означаване на съставни предикати, известна като клаузна форма, която се представя в следния общ вид

Page 16: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 16

B1 ∪ B2 ∪…∪ Bn ⊂ A1 ∩ A2 ∩…∩ AmОзначенията Ai и Bj са прости или съставни терми,

а клаузната форма за представяне на предикати има следния смисъл. Ако всички терми A1 A2 … Am са верни, то най-малко един от термите B1 B2 … Bn е верен. За клаузната форма е характерно, че се прилагат само дизюнкция, импликация и конюнкция в посочения ред: отляво последователно дизюнкция, отдясно последователно конюнкция, в средата една импликация. Дясната страна на клаузната форма се нарича антецедент (antecedent) а лявата страна се нарича консеквент (consequent),Консеквентът е следствие (последица) от верността на антецедента. Доказва се, че всички твърдения в предикатното смятане могат да се приведат в клаузна форма.

Page 17: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 17

Метод на резолюцията

Представянето на множество предикати в унифицирана клаузна форма позволява да се развие процес на извеждане (доказване) на нови твърдения (факти) от наличните предикати.

Този процес е известен като метод на резолюцията. Датира от 60-те години на XX век и е дал силен тласък за развитие на направлението автоматично доказателство на теореми.

Page 18: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 18

РезолвентаРезолюцията е правило за извод, приложимо над

предикати, записани в клаузна форма. Като елементарна илюстрация са показани два предиката.

A ⊂ B1B2 ⊂ A

Представените предикати означават, че от верността на B1 следва верността на А и че от верността на А следва верността на B2. Очевидно, от веригата предикати може да бъде направено заключението, че от верността на B1 следва и верността на B2, т.е. може да се формулира ново твърдение (факт), записано като предикат

B2 ⊂ B1Клаузата (новият факт), която се получава като

резултат, се нарича резолвента.

Page 19: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 19

Метод на резолюциятаОбобщението на горното правило по същество

представлява методът на резолюцията. Според него клаузата резолвента се получава чрез обединяване на левите и десните страни на наличните клаузи, след което общите терми в лявата и дясната част на новополучената клауза се елиминират. Следният пример илюстрира казаното в по-общ вид.

Налични клаузи:A1 ∪ B ∪ A2 ⊂ C1 ∩ C2D1 ∪ D2 ⊂ E1 ∩ B ∩ E2След обединяване на левите и десните страни и

елиминиране на общия терм B се получава клаузата резолвента в следния вид:

A1 ∪ A2 ∪ D1 ∪ D2 ⊂ C1 ∩ C2 ∩ E1 ∩ E2

Page 20: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 20

Метод на резолюцията

Резолюцията се усложнява при условие, че термите в клаузите съдържат променливи. В този случай еднаквостта на изключваните терми може да не е буквална, както бе показано.

Резолюцията следва да включва определяне (замяна, субституция) на променливи с такива стойности (терми), така че да се постигне успешно съпоставяне и последващо елиминиране. Този процес на замяна се наричаунификация.

Page 21: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 21

Част 2

Въведение в Пролог

Page 22: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 22

Съдържание:

• Увод• Факти• Цели (въпроси)• Променливи в Пролог• Конюнкции, дизюнкции и отрицание• Правила• Рекурсия в Пролог

Page 23: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 23

УводСъщината на ЛП е в деклариране (задаване) на

факти и правила, които описват определена предметна област. Фактите и правилата формират БД. Към базата данни се задават въпроси. Няма програмиране с избор на алгоритъм и структури данни. Една Prolog-програма е съвкупност от данни (факти) за обекти и отношения между обекти. Изпълнението на една програма Prolog се състои в това потребителят да формулира цел (goal) – въпрос относно фактите и правилата в БД. Целта се задава и системата се опитва да я удовлетвори.

Page 24: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 24

Въведение

Доколкото програмите тук не съдържат алгоритми и структури данни, специалистите по ЛП не са класически програмисти. Те са специалисти по знания в определена област (knowledge engineers), които проектират и реализират практически системи за логическо програмиране.

Page 25: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 25

Въведение

Съставянето на една програма на Prologвключва:

• задаване на факти за обекти и отношения,• дефиниране на правила за множество факти и

отношения.• изпълнението на една програма Prolog

включва задаване на въпроси относно описаните факти и дефинираните правила.

Page 26: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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.

Page 27: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 27

Факти

Фактите в Пролог служат за задаване на безусловно верни същности – свойства и отношения. Пролог възприема един факт за верен независимо дали той е верен в реалния свят. Фактът се счита за верен, т.к. Програмистът е заявил така и това е в сила за БД, която е съставена и се управлява от системата за ЛП.

Page 28: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 28

Факти. Примери

Ето факт като изречение на естествен език:John likes Mary.

Това е факт с два обекта: John, Mary и едно отношение: likes

Същият факт представен на Пролог:likes( john, mary).

likes се нарича предикат. john, mary се наричат аргументи. Пишат се с малки букви и завършват с точка.

Page 29: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 29

Факти. Примери

Изречение на естествен език: John is a student.обект: Johnотношение: статус на студент

Факт на Пролог: student(john).

Фраза на естествен език: Nature0 обекти, 1 отношение

Факт на Пролог: nature.

Page 30: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 30

Факти. Примери

Налице са вградени предикати за рутинни процедурни действия като В/И, комуникация с ОС и други.

Например, предикатът write служи за извеждане на екран.

write('Hello').извежда текста 'Hello' на екрана.

Page 31: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 31

Как се пишат факти?

• Отношения и обекти с малки букви.• Всеки факт завършва с точка.• Отношенията се наричат предикати.• Обектите се наричат аргументи.• Допуска се произволен брой аргументи.• Факти се интерпретират от

програмиста.• Колекция (съвкупност) от факти е БД.

Page 32: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 32

Цели (въпроси)

Прцесът на извод (доказателство) в Пролог = Изпълнение на една ЛП програма;

Процесът на извод в Прлог включва:удовлетворяване на цел (подцел);

пре-удовлетворяване на цел (подцел);механизъм на възврат (backtracking).

Page 33: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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 значи невярно или недоказуемо (неизводимо) при сканиране на БД.

Page 34: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 34

Факт и въпрос (goal) съвпадат (are unified), ако:

• Имената на предикатите са еднакви;

• Съответните аргументи също са еднакви.

Page 35: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 35

Променливи

Променивите служат за задаване на абстрактни (по-общи въпроси). Прилагат се, когато не можем или не искме да назовем даден обект.

Въпрос на естествен език: Who is a student?Цел на Пролог: goal:- student(X). X = johnПролог сканира фактите в БД, за да намери

обект, който да бъде съпоставен на променливата Х.

Page 36: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 36

Променливи

Въпрос на ест. език: Кого харесва Джон?Who does John like?

Цел на Пролог: goal:- likes(john, X). X = maryПролог сканира фактите в БД, за да

намери обект, който да бъде съпоставен на променливата Х.

Page 37: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 37

• X е променлива.• Променливите се пишат с голяма буква.• Променливитв могат да имат две

състояния:– Свободна– Свързана

Page 38: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 38

Факт и въпрос (goal) съвпадат (are unified), ако:

• Имената на предикатите са еднакви;

• Съответните аргументи също са еднакви, или поне един от неидентичните аргументи е свободна променлива.

Page 39: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 39

• Пролог отговаря No, ако факт и въпрос не

съвпадат.• В случай на успех, Прoлог отговаря подобно

на X = mary.• След такъв отговор има две възможности:A/ CR (carriage return или Enter). Това значи –

отговорът удовлетврява.B/ ;CR. Това значи – отговорът не

удовлетворява, търсенето в БД следва да продължи от текущата позиция, като всички свързани променливи стават свободни.

Казва се, че Пролог пробва да пре-удовлетвори целта.

Page 40: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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 забравя обекта, с който е бил свързан.

Page 41: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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

Page 42: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).Въпросът е конюнкция от цели. Пролог опитва да

удовлетвори всички цели от ляво на дясно.Ако всички цели са удовлетворени, конюнкцията

успява. В противен случай, тя пропада.

Page 43: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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

Page 44: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 44

Правила

Правила се ползват, когато един факт зависи от друг факт или от група факти.

Пример: John likes anyone who likes coke.likes(john,X) :- likes(X,coke).

Общ формат на правило: ‘:-’ значи ‘ако’заглавие :- тяло

Лява част :- дясна част

Page 45: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 46: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 47: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 47

Правила се ползват за дефиниции.

Пример 3:Лампата свети, ако ел е включено. Light is ON, if it is switched ON.

light(on) :- switch(on).

Page 48: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 48

Summary 2• Пролог клаузите са от 3 типа: факти, правила

и въпроси-цели (goals).• Фактите декларират свойства и отношения,

които винаги са верни.• Правилата декларират същности, които

зависят от други условия• Задавайки въпроси, потребителят проверява

дадена същност дали е вярна.• Commas, разделящи под цели, са конюнкции. • Semicolons, разделящи под цели, са

дизюнкции.

Page 49: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 49

Рекурсия в Пролог

Правилата служат за създаване на дефиниции, които се базират на други съществуващи факти.

Рекурсивните правила се прилагат, когато се дефинират нови отношения на основата на същия тип отношения.

Page 50: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 51: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 52: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 53: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 53

Рекурсивни правила - примери

Най-примитивен е подходът да се дефинира кула чреа релацията is_over само.

Така се описват само конкретни конфигурации на кули като предишните два слайда.

По-добър и ефективен подход е да се опише (дефинира) кула по абстрактен начин като се приложи рекурсивен тип дефиниция.

Page 54: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 55: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

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).

Page 56: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 56

Цели (въпроси)

goal:- tower(k2, k1). Yes goal:- tower(k6, k3). Yes goal:- tower(k1, k6). No

Page 57: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 57

Цели (въпроси)

goal:- tower(X, k3). X = k4 ;cr X = k5 ;cr X = k6 ;cr No

Page 58: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 58

Цели (въпроси)

goal:- tower(k6, X). X = k5 ;cr X = k4 ;cr X = k3 ;cr No

Page 59: Тема: Логическо Програмиране (Пролог) · 05/11/06 доц. д-р Стоян Бонев 3 Стилове на Програмиране Дейностите

05/11/06 доц. д-р Стоян Бонев 59

БлагодаряЗа

Вниманието