Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Логическое программирование1 / 1-5_LR_4KSM_Logichne_progr_2014-15

.pdf
Скачиваний:
16
Добавлен:
07.02.2016
Размер:
498.87 Кб
Скачать

21

Програма "Словник-2" (лістинг 2) є дещо ускладненою версією програми "Словник" (удосконаленим прикладом електронного словника), де: предикат synonym містить чотири об`єкти (слово та три його

синоніми); додатково введено предикат antonym із такою ж кількістю об`єктів; внутрішню ціль скомпоновано з двох підцілей (видача трьох синонімів слова brave; видача трьох антонімів слова rare).

У запису цільового твердження присутнє ключове слово and, яке використовується в якості розділювача (відіграє ту ж роль, що й кома у конструкції цілі попередньої програми).

/* Лістинг 2. Програма: Словник-2 */ /* Призначення: Демонстрація асоціацій слів */

/* за допомогою розширеного словника синонімів та антонімів */ domains

word, syn1, syn2, syn3, ant1, ant2, ant3 = symbol predicates

synonym(word,syn1,syn2,syn3)

antonym(word,ant1,ant2,ant3)

goal

synonym(brave,S1,S2,S3) and

write("The synonyms for 'brave' are ") and nl and write(S1,",",S2,",",S3,".") and nl and antonym(rare,A1,A2,A3) and

write("The antonyms for 'rare' are") and nl and write(A1,",",A2,",",A3,".") and nl.

clauses synonym(brave,daring,defiant,courages). synonym(honest,truthful,open,sincere). synonym(modern,new,novel,recent).

22

synonym(rare,uncommon,scarce,infrequent). antonym(brave,cowardly,fearful,timid). antonym(honest,dishonest,crooked,deceithful). antonym(modern,ancient,old,obsolete). antonym(rare,common,ordinary,ubiqutious).

/***** кінець програми *****/

2.2.Використання правил у запитах до Пролог-програм

Упопередніх прикладах Пролог-програм ви використовували цілі, що містили твердження, подібні до тих, які зустрічалися в програмі.

Але зазначені цільові твердження забепечують тільки одну з багатьох можливостей здійснення запитів до програми. Зокрема:

– оскільки запити будуються з предикатів, які містять умови для обмеження шляхів пошуку бажаних результатів, і найчастіше виникає необхідність повторювати запити декілька разів, то розумно передбачити можливість не задавати кожного разу одні й ті ж умови, що є втомлюючим;

– у процесі отримання відповідей на запити до бази даних, вважається за доцільне не використовувати фактів із цієї бази даних для формування запитів.

УПролозі поставлена вище задача розв`язується конструюванням

правил, які не містять у собі даних (правил нульової арності), тобто зводиться до написання скороченого варіанту запиту.

Розглянемо програму "Родичі" (лістинг 3) в якості прикладу, що наявно демонструє доцільність застосування правил, які не містять у собі даних.

Ціллю програми "Родичі" є предикат who_is_the_sister.

Оскільки ціль who_is_the_sister задаєтся у вигляді правила, то точка входу розділу goal являє собою єдине цільове твердження без підцілей.

23

Для підтримки реалізації цілі, програма "Родичі" містить правило, що задає предикат who_is_the_sister. Указане правило визначається в розділі тверджень (тобто в розділі clauses) програми.

Тіло правила who_is_the_sister складається з двох частин: 1) першою частиною є правило sister; 2) другою частиною (передпосилкою) є предикат write, що виводить результати, отримані правилом sister.

Трьох предикатів передпосилки правила sister повністю достатньо для отримання потрібного результату: наявність предикату female дозволяє вибрати дитину жіночої статі; подвійне використання предикату parents встанавлює логічний зв`язок між змінними Sister і Brother, які є аргументами двох різних реалізацій даного предикату.

/* Лістинг 3 */ /* Програма: “Родичі” */

domains /* ДОМЕНИ (ОПИСИ ТИПІВ ОБ`ЄКТІВ) */ person = symbol

predicates /* ПРЕДИКАТИ (ОГОЛОШЕННЯ ВІДНОСИН МІЖ ОБ`ЄКТАМИ) */ male(person)

female(person) parents(person, person, person) sister(person, person) who_is_the_sister

goal /* ЦІЛЬ – ФОРМУЛЮВАННЯ ЗАДАЧІ

*/

/* НА ОТРИМАННЯ ІНФОРМАЦІЇ З БАЗИ ЗНАНЬ,

*/

/* ЯКУ ПОВИННА РОЗВ`ЯЗАТИ ПРОЛОГ-ПРОГРАМА

*/

who_is_the_sister.

 

 

24

clauses /* ТВЕРДЖЕННЯ (ФАКТИ ТА ПРАВИЛА) */

/* ФАКТИ */

 

male("Frank").

/* Френк – чоловічої статі */

male("Sam").

/* Сем – чоловічої статі */

female("Mary").

/* Мері – жіночої статі */

female("Debbie").

/* Дебі – жіночої статі */

parents("Sam", "Frank", "Mary").

/* Батьками Сема є Френк і Мері */

parents("Debbie", "Frank", "Mary").

/* Батьками Дебі є Френк і Мері */

/* ПРАВИЛА */

/* правило, що задає предикат who_is_the_sister */

who_is_the_sister if sister(Sister, Brother),

write(Sister, " is the sister of ", Brother, "."), nl.

/* правило, що задає відносину «брат-сестра» */ /* (у формулюванні правила нема жодних даних про конкретну сім`ю: */

/* об`єкти Sister, Brother, Father і Mother є змінними) */

sister(Sister,Brother) if female(Sister),

parents(Sister, Father, Mother), parents(Brother, Father, Mother).

/***** кінець програми *****/

25

2.3.Розміщення предикату not

уконструкціях правил Пролог-програм

Логічне заперечення деякого предикату задаєтся за допомогою вбудованого предикату not.

При програмуванні на Пролозі, використання заперечення буває зручним для логічного виведення нових фактів із уже наявних в базі даних фактів.

У цілому, використання предикату not у конструкції правила часто дає можливість ввести до програми додаткові елементи логіки.

Наприклад, можна використати питання з запереченням для визначення того, чи є сусідами дві вибрані країни.

Замість того, щоб видавати на екран список усіх пар країн із загальним кордоном, а потім візуально шукати всі ті пари країн, які не потрапили до списку, можна скористатися простішим та ефективнішим засобом – запереченням (not).

Так, предикат not(border(Country1,Country2)) видає всі пари країн, які не межують одна з одною.

Припустимо, ви хочете знати, чи не межують між собою Германія та Іспанія.

Запит формулюється наступним чином: not (border("Germany", "Spain")).

Програма "Пари країн Європи" (лістинг 4) є завершеною програмою на Пролозі для розв`язування поставленої вище задачі.

26

/* Лістинг 4 */ /* Програма "Пари країн Європи" */ domains

country = symbol predicates

euro_pair(country,country) border(country,country) find_non_border_pair

goal

find_non_border_pair.

clauses

/* факти */ euro_pair("France","Germany"). euro_pair("France","Spain"). euro_pair("France","Italy"). euro_pair("Germany","Spain"). euro_pair("Germany","Italy"). euro_pair("Spain","Italy"). border("France","Germany"). border("France","Spain"). border("France","Italy").

/* правила */ find_non_border_pair :-

euro_pair(X,Y), not(border(X,Y)), write(X," - ",Y),nl.

/***** кінець програми *****/

27

2.4. Робота зі складеними об'єктами у Пролог-програмах

Об`єкти тверджень являють собою дані, що можуть мати як просту, так і складну структуру.

Тип простих об`єктів і структур обмежений шістьма вбудованими типами доменів Прологу.

Складеними структурами називають такі предикати, що були скомпоновані зі складених об`єктів.

При цьому під складеним об`єктом розуміють такий об`єкт, який

представляє деякий інший об`єкт або певну сукупність об`єктів.

Ті прості об`єкти, що представляють складені об'єкти, поміщають у

дужки.

Наприклад, можна ввести складений об`єкт fruits, який робить більш наочним опис відносини likes: likes("Tom",fruits(apples,orange,banana)).

Перший терм складеного об`єту називється функтором та є предикатом, хоча він і розташований усередині іншого предикату.

У наведеному вище прикладі, функтором є fruits.

Для полегшення написання тверджень і предикатів у формі складених об`єктів і структур, Пролог надає можливість оголошувати складені об`єкти

в розділі domains.

Якщо структура містить об`єкти різних типів, то вона називається багатодо-

менною структурою.

Складений об`єкт є певною структурою доменів, де кожна підструктура передбачає особливе подання фактів у базі даних і забезпечує конкретний засіб сортування об`єктів за категоріями.

Посилання на доменну структуру здійснюються за іменем функтору. Програма "Бібліотека" (лістинг 5) демонструє використання доменної

структури з ім`ям personal_library, що містить відомості про книжки з особистих колекцій.

28

Функтор структури personal_library має ім`я book.

Предикат, що використовує структуру personal_library, визначається наступним чином:

collection(collector,personal_library)

Опис предикату collection містить два імені об`єктів:

ім`я collector відноситься до звичайного об`єкту;

ім`я personal_library відноситься до структури з декількох об`єктів. Програма «Бібліотека» використовує зовнішню ціль, яка полягає в

знаходженні всіх книг колекціонера Сміта.

Для того, щоб дізнатися, які книги належать Сміту, необхідно ввести цільове твердження, в якому об`єкт smith є окремим значенням із домену collector, а Books – вільною змінною:

collection(smith,Books).

Припустимо, що ви також бажаєте знати імена власників і назви книг, надрукованих у 1967 році.

Ціль для пошуку вказаної інформації буде містити дві вільні змінні

(Сollector і Title) та дві анонімні змінні (підкреслювання «_» буде означати, що вас не цікавлять об`єкти з родовими іменами author і publisher, тобто кожне таке підкреслювання буде заміняти анонімну змінну):

collection(Collector,book(Title,_,_,1967)).

Відзначимо, що застосування доменної структури значно спрощує

розуміння та практичне використання структури предикату.

У підсумку, застосування структур суттєво підвищує зручність користування створеною базою даних.

При цьому, чим більше було введено функторів, тим більш визначені запити можна адресувати до бази даних, а саме такі запити являють собою найбільший інтерес.

29

/* Лістинг 5. Програма “Бібліотека” */ domains

personal_library = book(title, author, publisher, year)

/* персональна бібліотека = книга(назва,автор,видавництво,рік видання) */ collector,title,author,publisher = symbol

year = integer

predicates

collection(collector, personal_library)

/* колекція (ім`я колекціонеру, бібліотека) */

clauses

collection(kahn,

book("The Computer and the Brain", "von Neumann","Yale University Press", 1958)).

collection(kahn,

book("Symbolic Logic", "Lewis Carroll", "Dower Publications",1958)). collection(johnson,

book("Database: A Primer", "C.J.Date", "Addison-Wesley",1983)). collection(johnson,

book("Problem-Solving Methods in AI", "Nils Nilsson", "McGraw Hill",1971)). collection(smith,

book("Alice in Wonderland", "Lewis Carroll", "The New American Library",1960)). collection(smith,

book("Fables of Aesop", "Aesop-Calder", "Dover Publications",1967)).

/***** кінець програми *****/

30

Подання даних часто вимагає наявності великої кількості структур, які в Пролозі повинні бути описані в розділі domains.

Більше того, виникають труднощі з тими предикатами, що працюють із об`єктами цих доменів.

Для усування даного недоліку, Пролог пропонує користувачу альтернативні описи доменів.

Програма "Предмети" (лістинг 6) демонструє наочний приклад застосування альтернативних описів доменів.

У програмі "Предмети" використовуються три доменних структури:

1)misc_thing, із одним об`єктом whatever;

2)book, із двома об`єктами author и title;

3)record, із трьома об`єктами artist, album і type.

Об`єкти всіх трьох структур належать до одного типу symbol та об`єднані під єдиним ім`ям thing.

Альтернативний опис домену thing має наступний вигляд: thing = misc_thing(whatever);

book(author,title);

record(artist,album,type)

Для розділу альтернативних доменів, застосовується символ «крапка з комою» («;»).

Для пов`язування персони з тим, чим вона володіє, введено простий предикат owns(person,things).

Використання альтернативних доменів дозволяє записувати в твердженнях один предикат owns у застосуванні до різних класів речей.

У разі відсутності зазначеної конструкції, вимагалося би ввести декілька предикатів замість одного, а саме – три предикати.