Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Izd_INF_b_Ml_SMP_2016.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
695.81 Кб
Скачать

МIНIСТЕРСТВО ОСВIТИ І НАУКИ УКРАЇНИ

ХАРКIВСЬКИЙ НАЦІОНАЛЬНИЙ

УНIВЕРСИТЕТ РАДIОЕЛЕКТРОНIКИ

Методичні вказівки

до лабораторних робіт з дисципліни

«СПЕЦІАЛЬНІ МОВИ ПРОГРАМУВАННЯ»

для студентів денної форми навчання

напряму 6.040302  «Інформатика»

Затверджено

кафедрою інформатики.

Протокол № 1 від 30.08.2015.

Харкiв 2016

Прямоугольник 134

Методичні вказівки до лабораторних робіт з дисципліни «Спеціальні мови програмування» для студентів денної форми навчання напряму 6.040302  «Інформатика» / Упоряд. О.Я. Кузьомін. – Харків: ХНУРЕ, 2016. – 72 с.

Упорядник О.Я. Кузьомін

Рецензент проф. І.Ю. Шубін, професор кафедри ПІ

Прямоугольник 135

ЗМІСТ

Лабораторна робота № 1. Факти і правила на Пролозі. Основні прийоми роботи в Visual Prolog......................................................................................

Лабораторна робота № 2. Використання предикатів fail, not, cut (невдача, заперечення і відсікання)................................................................

Лабораторна робота № 3 Повтори і рекурсії.................................................

Лабораторна робота № 4 Списки...................................................................

Лабораторна робота № 5 Дерева....................................................................

4

20

35

51

58

ЛАБОРАТОРНА РОБОТА №1. ФАКТИ І ПРАВИЛА НА ПРОЛОЗІ. ОСНОВНІ ПРИЙОМИ РОБОТИ В VISUAL PROLOG

    1. Мета роботи

Навчитись провідним засадам програмування Visual Prolog.

1.2 Методичні вказівки з організації самостійної роботи студентів

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

Пролог використовує спрощену версію синтаксису логіки предикатів, тому він є простим для розуміння і дуже близький до природної мови.

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

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

1.2.1 Основні відомості

1. Програма на Пролозі складається з пропозицій, які можуть бути фразами двох типів: фактами або правилами.

#Факти  це зв'язки або властивості, про які програміст твердо знає, що вони істинні.

# Правила  це залежні зв'язки (відношення); які дозволяють Прологу виводити один фрагмент інформації з іншого.

2. Факти можуть мати вигляд:

property (object, object,..., object). або

relation (object, object,..., object).

де property  це властивість об'єктів, а relation  зв'язок між об'єктами. Відмінності між цими поняттями несуттєві, надалі використовуватимемо термін "зв'язок".

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

likes (tom, baseball).

Зв'язок  це likes (подобається), а об'єкти,  tom (Том) і baseball (бейсбол): Тому подобається бейсбол.

В іншому факті

left_hauded (benjamin).

left_hauded (лівий крайній) є властивістю об'єкта benjamin; іншими словами: Бенджамін – лівий крайній.

4. У загальному вигляді правила мають заголовок і тіло, які виглядають так:

relation (object, object, ..., object) if

relation (object, ..., object) and

...

...

relation (object, ..., object).

5. Погодившись з наступними обмеженнями, можна встановлювати будь-які імена для зв'язків і об'єктів у своїй програмі:

# Ім'я об'єкта має починатися з малої літери, за якою може бути будь-яке число символів. Цими символами можуть бути: літери верхнього та нижнього регістрів, цифри та символи підкреслення.

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

6. Предикат  це символічне ім'я (ідентифікатор) зв'язку з по-послідовністю аргументів.

Програма на Пролозі – це послідовність пропозицій і директив, а процедура  це послідовність пропозицій, що описують предикат. Пропозиції, що належать одному предикату, мають іти один за одним.

7. Змінні дозволяють вам записувати загальні факти і правила та задавати загальні питання.

# Ім'я змінної в Пролозі має починатися з великої літери або символу підкреслення (_), після якої ви можете використовувати будь-яке число букв (верхнього і нижнього регістра), цифр і символів підкреслення.

# Змінні в Пролозі отримують свої значення в результаті зіставлення констант у фактах або правилах. До отримання значення змінна є вільною, після – стає зв'язаною.

# Ви не можете довго зберігати інформацію за допомогою "зв'язування" змінної зі значенням, тому змінна є пов'язаною тільки в межах пропозиції.

8. Якщо в запиті вас цікавить тільки певна інформація, то для ігнорування не потрібних вам значень ви можете використовувати анонімні змінні. У Пролозі анонімні змінні позначаються поодиноким символом підкреслення (_).

Анонімна змінна може бути використана замість будь-якої іншої змінної; вона зіставляється з чим завгодно. Анонімна змінна ніколи не приймає жодного значення.

9. Завдання Прологу питань про факти у вашій програмі називається запитами до системи Прологу; більш загальним терміном для запиту є "мета". Пролог намагається вирішити мету (відповісти на запитання), починаючи з першого факту і переглядаючи всі факти до досягнення останнього з них.

10. Складова мета  це мета, що містить дві або більше частин; кожна частина складової мети називається підціль. Складова мета може бути кон'юктивною (підціль A and підціль B) або диз'юктивною (підціль A or підціль  B).

11. Коментарі роблять вашу програму більш зручною для читання. Ви можете укладати коментарі і розділювачі / * як тут * / або випереджати їх одним символом відсотка, % як тут.

12. У Пролозі є кілька способів співвідношення одного з іншим:

# Ідентичні структури зіставляються один з одним.

# Вільна змінна зіставляється з константою або з раніше пов'язаною змінною (і стає пов'язаною з відповідним значенням).

# Дві вільні змінні можуть зіставлятися (і зв'язуватися) один з одним. З моменту зв'язування вони трактуються як одна змінна: якщо одна з них приймає якесь значення, то друга негайно приймає те ж значення.

13. Для забезпечення ще більш легкого читання програм на Пролозі такі символи і слова в ньому є попарно замінюваними: "if" та ": -", "and" і ",", "or" і ";". Отже, наступні два фрагменти програми ідентичні:

is_older (Person1, Person2) if is_older (Person1, Person2): -

age (Person1, Age1) and age (Person1, Age1),

age (Person2, Age2) and age (Person2, Age2),

Age1 > Age2. Age1 > Age2.

14. Зазвичай програма на Пролозі складається з трьох або чотирьох ос- новних програмних секцій. До них належать: секція "clauses" (пропозицій), секція "predicates" (предикатів), секція "domains" (доменів) та іноді секція "goal".

15. Програма на Пролозі має таку узагальнену структуру:

domains

/ * ...

оголошення доменів

... * /

predicates

/ * ...

оголошення предикатів

... * /

goal

/ * ...

підціль_1,

підціль_2,

та ін.

... * /

clauses

/ * ...

пропозиції (факти і правила)

... * /

16. Секція clauses – це та, у якій ви розміщуєте факти і правила, з якими працюватиме Пролог, намагаючись розв'язати мету програми.

17. Секція predicates  це та, у якій ви оголошуєте свої предикати і типи (домени) аргументів цих предикатів. Імена предикатів мають починатися з літери (бажано рядкової), за якою іде послідовність літер, цифр і символів підкреслення (до 250 знаків). В іменах предикатів не можна використовувати символи пробілу, мінусу, зірочки, зворотної (і прямої) риски. Оголошення предиката має таку форму:

predicates

predicateName (argument_type1, argument_type2, ...,

argument_typeN)

Тут argument_type1, ..., argument_typeN  або стандартні домени, або домени, оголошені вами в секції domains. Оголошення домену аргументу і опис типу аргументу  одне і те саме.

18. Секція domains  це та, у якій ви оголошуєте будь-які нестандартні домени, використовувані вами для аргументів ваших предикатів. Домени в Пролозі є аналогами типів в інших мовах. Основними стандартними доменами Прологу є  char, integer, real, string і symbol; Основна форма оголошення доменів має такий вигляд:

domains

argument_type1, ..., argument_typeN = <стандартний домен>

argument_1, ..., argument_N = <складовою домен 1>;

<складовою домен 2>;

<...>;

<складовою домен N>;

19. Секція goal – це та, у якій ви задаєте мету своєї програми; Пролог шукає всі рішення і виводить на екран всі значення, що зв'язуються із змінними.

20. У Пролог включено більше 200 вбудованих стандартних предикатів і більше дюжини стандартних доменів: у разі використання цих предикатів і доменів у вас не має необхідності оголошувати їх.

21. Арності (розмірність) предиката  це число прийнятих ним аргументів; два предиката з одним ім'ям можуть мати різну арність. Предикати з різними версіями арності мають збиратися разом, причому, і в секції predicates, і в секції clauses; однак предикати з різною арністю розглядаються як абсолютно різні.

22. Правила мають форму:

ЗАГОЛОВОК: – <Підціль1>, <Підціль2>, ..., <ПідцільN>.

Для дозволу правила Пролог має вирішити всі його підцілі, створивши при цьому відповідну множину пов'язаних змінних. Якщо ж одна з підцілей помилкова, Пролог повернеться назад і прогляне альтернативні рішення попередніх підцелей, а потім знову піде вперед, але з іншими значеннями змінних. Цей процес називається "пошук з поверненням".

23. Символ Прологу "if" відрізняється від "IF", що використовуються в інших мовах: правило Прологу працює відповідно до умовної форми then / if, тоді як оператор інших мов IF працює відповідно до умовної форми if / then.

24. Менш використовуваними секціями програм на Пролозі є секції database і constants, а також різні глобальні (global) секції. Крім цього, ви можете задавати компілятору (у формі директив) особливі інструкції, розташовуючи їх на початку вихідного тексту вашої програми.

25. Уніфікація

Одним з найбільш важливих аспектів програмування на Пролозі є поняття уніфікації (ототожнення) і конкретизації змінних.

Пролог намагається ототожнити терми під час доказу, або узгодження, цільового затвердження. Наприклад, у програмі є факт собака (рекс). Для узгодження запиту?  Собака (Х) цільове твердження собака (X) буде ототожнене з фактом собака (рекс), у результаті чого змінна Х стане конкретизованою: Х = рекc.

Змінні, що входять в твердження, ототожнюються особливим чином  зіставляються. Факт доводиться для всіх значень змінної (змінних). Правило доводиться для всіх значень змінних у головному цільовому затвердженні за умови, що хвостові цільові затвердження доведені. Передбачається, що змінні у фактах і головних цільових твердженнях пов'язані квантором загальності. Змінні приймають конкретні значення на час доказу цільового затвердження.

У тому випадку, коли змінні містяться тільки у хвостових цільових твердженнях, правило вважається доведеним, якщо хвостове цільове твердження істинне для одного або більше значень змінних. Змінні, що містяться тільки в хвостових цільових твердженнях, пов'язані квантором існування. Отже вони приймають конкретні значення на той час, коли цільове твердження, у якому змінні були узгоджені, залишається доведеним.

Терм Х зіставляється з термом Y за такими правилами. Якщо Х і Y  константи, то вони порівняні, тільки якщо вони однакові. Якщо Х є константою або структурою, а Y  неконкретизованою змінною, то Х і Y порівняні і Y приймає значення Х (і навпаки). Якщо Х і Y  структури, то вони порівняні тоді і тільки тоді, коли у них однакові головний функтор і арність і кожна з їх відповідних компонент порівняна. Якщо Х і Y  неконкретизовані (вільні) змінні, то вони порівняні, в цьому випадку говорять, що вони зчеплені. Наведені приклади ототожнювних і неототожнюваних термів.

Ілюстрація уніфікації.

left_hauded (лівий крайній) є властивістію об’єкта benjamin; іншими словами: Бенджамін  лівий крайній.

Ілюстрація уніфікації.

Терм1

Терм2

Ототожнювані

джек(Х)

джек (особа)

джек(Х,Х)

джек(Х.Х)

джек( . )

f(Y,Z)

Х

джек(людина)

джек(людина)

джек(23,23)

джек(12,23)

джек(12,23)

Х

Z

так: Х = людина

ні

так: Х = 23

ні

так

так: X = f(Y,Z)

так: X = Z

    1. Опис лабораторної установки (програмного забезпечення).

Для виконання лабораторної роботи необхідно встановити trial версію середовища Visual Prolog 7.4.

1.4 Порядок виконання роботи і методичні вказівки з її виконання.

Для запуску прикладів необхідно використовувати Test Goal  утиліту середовища візуальної обробки. Ця утиліта може бути активізована за допомогою команди Project | Test Goal або комбінацією клавіш Ctrl + G. Для коректного виконання прикладів з утилітою Test Goal середовище візуальної обробки використовує спеціальні настройки завантаження проектів. Для роботи в неграфічному режимі рекомендується створити і завжди використовувати наступний Test Goal-проект, тобто визначити деякі опції компілятора Visual Prolog. Для цього потрібно виконати такі дії:

1. Запустіть середовище візуальної розробки Пуск – Програми Visual Prolog VIP32. При першому запуску проект не буде завантажений, з'явиться вільне вікно Visual Prolog.

2. Створіть новий проект: виберіть команду Project | New Project, активізується вікно Application Expert.

3. Визначте базовий каталог та ім'я проекту: приклади слід встановлювати в підкаталог \ DOC \ Examples кореневого каталогу Visual Prolog. Тобто ім'я в поле Base Directory рекомендується задати таким чином: C: \ VIP \ DOC \ Examples \ TestGoal.

Це визначення використовуватиметься для майбутнього завантаження прикладів.

Ім'я в поле Project Name слід визначити як TestGoal.

Встановіть прапорець Multiprogrammer Mode і натисніть мишкою всередині поля Name of.PRJ File. У результаті з'явиться таке вікно (рис. 1.1).

Рисунок 1.1  Загальні установки діалогового вікна Application Expert

Визначте мету проекту: на вкладці Target слід вибрати такі параметри. Тепер натисніть Create для того, щоб створити файли проекту за замовчуванням (рис. 1.2).

Рисунок 1.2  Установки на вкладці Target

4. Установіть необхідні опції компілятора для створення TestGoal-проекту: для активізації вікна Compiler Options виберіть команду Options | Project | Compiler Options. Відкрийте вкладку Warning. Виконайте такі дії:

• установіть перемикач Nondeterm. Це потрібно для того, щоб компілятор Visual Prolog брав за замовчуванням, що всі визначені користувачем предикати  недетерміновані (можуть породити більше одного рішення);

• зніміть прапорці Non Quoted Symbols, Strong Type Conversion Check і Check Type of Predicates. Це запобігання деяким можливим попередженням компілятора, які для програм цього розділу не важливі;

• натисніть OK, щоб зберегти установки опцій компілятора.

У результаті діалогове вікно Compiler Options виглядатиме так (рис. 1.3):

Рисунок 1.3  Установки опцій компілятора

Для створення нового вікна редагування можна використовувати команду меню File | New. У результаті з'явиться нове вікно редагування без імені. Завантажте у свій комп'ютер програму Lab1_1.PRO і для її запуску виберіть з меню Project | Test Goal.

/ * Програма Lab1_1.PRO * /

predicates

likes (symbol, symbol)

clauses

likes (ellen, tennis).

likes (john, football).

likes (tom, baseball).

likes (eric, swimming).

likes (mark, tennis).

likes (bill, Activity) if likes (tom, Activity).

Goal / * (Мета) запит: * /

likes (bill, baseball).

Система відповість: Yes (Так)

Для визначення того, щоб likes (bill, baseball) виконала комбіноване правило система

likes (bill, Activity) if likes (tom, Activity).

  і факт

likes (tom, baseball).

 

На підставі цього вона підтвердила істинність запиту.

  Введіть новий запит: likes (bill, tennis).

Система відповість: No (Ні)

На останній запит ("Подобається Біллу теніс?") Пролог відповів немає через те, що:

а. немає фактів, які говорять про любов Білла до тенісу.

б. зв'язок між Біллом і тенісом не виводиться із заданого правила і наявних фактів.

Завантажте ще один приклад і проаналізуйте його

    / * Програма Lab1_2.PRO * /

predicates

    type (symbol, symbol)

    is_a (symbol, symbol)

    lives (symbol, symbol)

    can_swim (symbol)

clauses

    type (ungulate, animal).

    type (fish, animal).

    is_a (zebra, ungulate).

    is_a (herring, fish).

    is_a (shark, fish).

    lives (zebra, on_land).

    lives (frog, on_land).

    lives (frog, in_water).

    lives (shark, in_water).

    can_swim (Y): -

     type (X, animal),

     is_a (Y, X),

     lives (Y, in_water).

goal

    can_swim (What),

    write ("A", What, "can swim.").

1. Пролог забезпечує стандартні предикати для запису:

a. nl (для генерації нового рядка); b. write (для простого висновку);

2. Базові стандартні предикати Прологу для читання:

a. readln (для читання повністю рядка символів);

b. readint, readreal, readchar (для читання цілих, речових та символьних значень відповідно);

3. Інші, більш спеціалізовані предикати читання:

       a. file_str (для читання повністю текстового файла в рядок);

       b. inkey (для читання символу з клавіатури, якщо клавіша натиснута);

       c. keypressed (для визначення, чи була натиснута яка-небудь клавіша);

       d. unreadchar (для посилки символів назад до буферу клавіатури).

1.4.1 Використання анонімних змінних

Анонімна змінна може бути використана замість будь-якої іншої змінної. Відмінність в тому, що анонімні змінні ніколи не приймуть будь-якого значення.

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

Goal: likes (Who, _).

Отримавши такий запит, Пролог відповість:

Who = ellen

Who = john

Who = tom

Who = eric

Who = mark

5 Solutions

Крім цього, анонімні змінні можуть бути використані у фактах. Наступні факти Прологу

owns (_, shoes).

eats (_).

можуть бути використані в таких пропозиціях природної мови: У кожного є (owns) черевики (shoess). Всі їдять (eats).

Анонімні змінні зіставляються з чим завгодно.

1.5 Контрольні запитання та завдання

1. Напишіть пропозиції природною мовою, що відповідають тому, що можуть означати ці Прологівські факти (для комп'ютера ці факти є просто окремими "шматками" інформації, які можуть бути використані для отримання відповідей на запити.)

1. Любить (Джек, малювання).

2. Чоловік (Джон).

3. Будівля ("Будівельна імперія", Нью-Йорк).

4. Людина (Іванов, Вася, "111000 Москва", "ул. Разіна", 4445566).

2. Запишіть факти Прологу, що відповідають таким пропозиціям природної мови:

1. Еллін подобаються макарони.

2. Сан-Франциско знаходиться в Каліфорнії.

3. Номер телефону Ані  476-02-99.

4. Батька Олени звати Альфонс Гренальді.

3. Напишіть пропозиції природної мови, інтерпретуючи такі правила Прологу:

а) їсть (Хто, Що) if

їжа (Що) and любить (Хто, Що).

б) завершує_курс (Хто) if

виконує завдання (Хто) and

нормально_відвідує (Хто).

в) не_їсть (тобі, Речовина) if

їжа (Речовина) and

сальний (Речовина).

г) власник (Хто, Що) if

купив (Хто, Що).

4. Напишіть правила Прологу, відповідно до змісту наступних речень, що написані природною мовою:

а) Людина голодна, якщо її шлунок порожній.

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

в) Володіють машиною ті, хто її купив, заплатив за неї і має її.

5. Напишіть програму, яка б, маючи факти (предикати)

чоловік (хто).

жінка (хто).

батько (хто, чий).

визначала би:

1. Хто чий батько і мати.

2. Хто кому доводиться братом, сестрою.

3. Хто кому доводиться двоюрідним братом, двоюрідною сестрою.

4. Хто кому доводиться тіткою, дядьком.

5. Хто кому доводиться племінником, племінницею.

6. Хто кому доводиться дідусем, бабусею.

7. Хто кому доводиться прадідом, прабабусею.

8. Хто кому доводиться двоюрідним дідусем, бабусею.

9. Хто кому доводиться внучатим племінником, племінницею.

6. Додавши до умови завдання 5 предикат чоловік (хто, чий), визначити:

1. Хто кому доводиться чоловіком, дружиною.

2. Хто кому доводиться тестем, тещею.

3. Хто кому доводиться свекром, свекрухою.

4. Хто кому доводиться невісткою, зятем.

5. Хто кому доводиться шваґром, зовицею.

6. Хто кому доводиться невісткою, дівером.

Про родинні зв'язки є така інформація (стрілки задають відношення батько (хто, чий)):

Группа 5

Liza

Рисунок 1.4  Родинні зв’язки

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

Ідентифікатори зберігаються в таблиці пошуку, а для зображення об'єктів використовуються лише їх адреси, а не самі ідентифікатори. Це означає, що зіставлення ідентифікаторів виконується дуже швидко, а у випадку, якщо вони зустрічаються в програмі кілька разів, то і зберігання їх виконується дуже компактно.

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

Таблиця 1.1  Основні стандартні домени (типи)

Домен

Опис

Long

Ulong

unsigned

Char

Символ, укладений між двома одиночними лапками (наприклад: 'a').

integer

Ціле число від -32,768 до 32,767.

real

Числа з необов'язковим знаком (+ чи ), за яким іде декілька цифр DDDDDDD, потім – необов'язкова десяткова крапка (.) І ще цифри DDDDDDD, за якими необов'язкова експоненціальна частина (e (+ чи -) DDD):

      <+ | -> DDDDD <.> DDDDDDD <e <+ | -> DDD>

     Приклади дійсних (real) чисел:

     42705 9999 86.72

     9111.929437 521e238 79.83e + 21

     Тут 79.83e + 21 означає 79.83 * 10 ^ 21 (аналогічно Фортрану, Бейсіку і Паскалю).

     Допустимий діапазон дійсних чисел: від 1 * 10 ^ -307 до 1 * 10 ^ 308 від 1e-3 до 1e + 3). За необхідності, цілі автоматично перетворюються в дійсні.

String

Рядок  будь-яка послідовність символів, записаних між парою символів подвоєних лапок. Наприклад: "книга Марка". Рядки, які ви пишете в програмі, можуть досягати довжини в 255 символів, убудовує всередині себе,  можуть досягати 64 К.

symbol

Для ідентифікаторів (symbol) допускається два формати:

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

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

               Приклади ідентифікаторів.

telephone_number "railway ticket" "Dorid Inc", "Петров Іван Іванович"

Арифметичні вирази складаються з операндів (чисел і змінних), операторів (+, -, *, /, div та mod) і дужок. Ідентифікатори в правій частині від знака рівняння (який є предикатом =) становлять арифметичний вираз.

      A = 1 + 6 / (11 + 3) * Z

Шістнадцяткові числа можуть бути представлені числом зі знаком долара попереду, наприклад:

      $ FFF = 4095

      86 = $ 4A + 12

Значення виразу може бути обчислено, тільки якщо всі змінні в момент обчислення визначені. При цьому обчислення проводяться в установленому порядку, що визначається пріоритетом операції. Операції з важливим пріоритетом виконуються першими.

Таблиця 1.2  Арифметичні операції

Операнд 1

Оператор

Операнд 2

Результат

Ціле

+,,*

Ціле

ціле

Речовий

+,,*

Ціле

речовий

Ціле

+,,*

речовий

речовий

Речовий

+,,*

речовий

речовий

ціле або речовий

/

ціле або речовий

речовий

Ціле

div

Ціле

ціле

Ціле

mod

Ціле

ціле

Пріоритет операції:

  1.  + (unary)

  2. * / mod div

  3. + 

Оператори відношення:

< менше

<= менше або дорівнює

= дорівнює

> більше

>= більше або дорівнює

<> або >< не дорівнює

Таблиця 1.3  Арифметичні предикати і функції

Функціональний предикат

Опис

X mod Y

Повертає залишок від ділення (модуль) X, діленого на Y.

X div Y

Повертає частку X, поділеного на Y

abs(X)

Повертає абсолютну величину

cos(X)

sin(X)

tan(X)

Тригонометричні функції, потребують, щоб X був величиною, представленою в радіанах

arctan(X)

Повертає значення речового X.

exp(X)

Підносити e до степеня X.

sqrt(X)

Корінь квадратній з X.

log(X)

Логарифм із X за основою 10.

ln(X)

Логарифм із X за основою e.

random(X)

Ставить у відповідність X випадкове речове число; 0 <= X < 1.

random(X,Y)

Ставить у відповідність Y випадкове ціле число; 0 <= Y < X.

round(X)

Округлює значення X

trunc(X)

Усікає X (відкидає молодші розряди).

ЛАБОРАТОРНА РОБОТА № 2. ВИКОРИСТАННЯ ПРЕДИКАТІВ FAIL, NOT, CUT (НЕВДАЧА, ЗАПЕРЕЧЕННЯ І ВІДСІКАННЯ)

2.1 Мета роботи

Навчитись провідним засадам програмування Visual Prolog.

2.2 Методичні вказівки з організації самостійної роботи студентів

Предикат cut (або!) відсікання  його основне призначення в обмеженні простору пошуку при обчисленні за рахунок динамічного скорочення дерева пошуку. Відсікання можна використовувати для відкидання безплідних шляхів обчислень, якими не можна прийти до рішення.

2.2.1 Запобігання пошуку з поверненням: відсікання

Visual Prolog містить відсікання, яке використовується, щоб запобігти пошуку з поверненнями; відсікання позначається знаком оклику (!). Діє відсікання просто: через нього не можна зробити відкіт (пошук з поверненням).

Відсікання поміщається в програму тим самим способом, як Ви ставите підціль в тіло правила. Коли процес проходить через відсікання, негайно задовольняється звернення до cut і виконується звернення до чергової підцілі (якщо така є). Пройшовши через відсікання, вже неможливо зробити відкіт до підцілей, розташованих в оброблюваному реченні перед відсіканням, також неможливо повернутися до інших пропозицій, визначальним є предикат (предикат, що містить відсікання).

Існують два основних використання відсікання:

  1. Якщо Ви знаєте заздалегідь, що певні посилки ніколи не матимуть осмислених рішень (пошук рішень у цьому випадку буде зайвою тратою часу), слід застосувати відсікання,  програма виконається швидше і використовує меншу кількість пам'яті. Таке відсікання називається зеленим.

  2. Якщо відсікання вимагає сама логіка програми для виключення з розгляду альтернативних підцілей. Це  червоне відсікання.

2.2.2 Використання відсікань

Розглянемо кілька схематичних правил Visual Prolog (r1, r2, і r3), які опи-сують один і той самий предикат r, плюс кілька підцілей (a, b, с і т.д.).

2.2.2.1 Запобігання пошуку з поверненням до попередньої підцілі в правилі

r1: - a, b,!, c.

Це  спосіб повідомлення Visual Prolog, що Ви задоволені першим рішенням, знайденим для а і b. Хоча Visual Prolog здатний знайти множинні рішення для звертання до шляху пошуку з поверненнями, Visual Prolog при цьому не може зробити відкіт через відсікання і знайти альтернативне рішення для звернень а і b. Він також не може п до неї повернутися з пропозицією, яка визначає предикат r1.

Приклад 1: Програма Lab2_1.pro

predicates

buy_car(symbol,symbol)

nondeterm car (symbol,symbol,integer)

colors (symbol,symbol)

clauses

buy_car (Model,Color):-

car (Model,Color,Price),

colors (Color,sexy),

!,

Price > 25000.

car(maserati,green,25000).

car(corvette,black,24000).

car(corvette,red,26000).

car(porsche,red,24000).

colors(red,sexy).

colors(black,mean).

colors(green,preppy).

goal

buy_car(corvette, Y).

У цьому прикладі мета полягає в тому, щоб знайти Corvette з приємним кольором і доцільною ціною. Відсікання в правилі buy_car означає, що, оскільки тільки один Corvette з приємним кольором у базі даних, хоч і з дуже високою ціною, то немає потреби шукати інший автомобіль.

Отримавши цільове твердження

buy_car (corvette, Y)

програма відпрацює такі кроки:

1. Visual Prolog звертається до car, першої підцілі для предиката buy_car.

2. Виконує перевірку для першої машини Maserati, яка зазнає невдачі.

3. Потім перевіряє наступну пропозицію car і знаходить відповідність, пов'язуючи змінну Color зі значенням black.

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

5. Виконує пошук з поверненням до обігу car і ще раз шукає Corvette, що задовольняє цей критерій.

6. Знаходить відповідність і знову перевіряє колір. Цього разу колір  приємний, і Visual Prolog переходить до наступної підцілі в правилі: відсікання. Відсікання негайно виконується, "заморожуючи" всі змінні, раніше пов'язані в цьому реченні.

7. Переходить до наступної (останньої) підцілі в правилі: до порівняння

Price <25000.

8. Перевірка завершується невдало, і Visual Prolog намагається вчинити пошук зі зворотом, щоб знайти інший автомобіль для перевірки. Оскільки відсікання запобігає спробі вирішити останню підціль, мета завершується невдало.

2.2.3 Запобігання пошуку з поверненням до наступної пропозиції

Відсікання може використовуватися як спосіб повідомити Visual Prolog, що він вибрав правильну пропозицію для певного предиката. Розглянемо такий фрагмент:

r (1): -! , a, b, c.

r (2): -! , d.

r (3): -! , c.

r (_): - write ("this is a catchall clause.").

Використання відсікання робить предикат r детермінованим. Тут Visual Prolog викликає r з одним цілочисловим параметром. Припустимо, що вироблено звернення  r (1). Visual Prolog переглядає програму в пошуках відповідності для обігу; він знаходить його з першим реченням, визначальним r. Оскільки є більше ніж одне можливе рішення для звернення, Visual Prolog поміщає точку повернення відповідно до цієї пропозиції.

Нарешті Visual Prolog починає обробку тіла правила, проходить через відсікання і виключає можливість повернення до іншої пропозиції r. Це усуває точки пошуку з поверненням, збільшуючи ефективність під час виконання, також гарантує, що пошукова пропозиція помилки буде виконана тільки тоді, якщо жодна з умов не відповідатиме зверненню до r.

Зверніть увагу, що цей тип структури  дуже схожий на структуру case, написану іншими мовами програмування. Можна написати пропозиції подібно цьому:

r (x): - x = 1,! , a, b, c.

r (x): - x = 2,! , d.

r (x): - x = 3,! , c.

r (_): - write ("this is a catchall clause").

Однак слід, по можливості, поміщати перевірну умову саме в заголовок правила. Це підвищує ефективність програми і спрощує її читання.

Приклад 2: Програма Lab2_2.pro

predicates

friend(symbol,symbol)

girl(symbol)

likes(symbol,symbol)

clauses

friend(bill,jane):-

girl(jane),

likes(bill,jane),!.

friend(bill,jim):-

likes(jim,baseball),!.

friend(bill,sue):-

girl(sue).

girl(mary).

girl(jane).

girl(sue).

likes(jim,baseball).

likes(bill,sue).

goal

friend(bill,Who).

Без відсікання Visual Prolog запропонував би два рішення: Білл є другом і Джейн і Сью. Однак відсікання в першому реченні, визначальному friend, повідомляє Visual Prolog, що якщо цю пропозицію задоволено, то один друг Білла вже знайдений, і немає сенсу продовжувати шукати інших друзів.

Пошук з поверненням може мати місце всередині пропозицій у спробі задовольнити звернення, але, одного разу виявивши рішення, Visual Prolog проходить через відсікання. Пропозиції friend, написані так, як показано вище, повернуть одного і тільки одного друга Білла (за умови, що друг може бути знайдений).

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

  • Відсікання відкидає всі розташовані після нього пропозиції (правила). Якщо мета р уніфікована з пропозицією, що містить відсікання, і відсікання виконано, то ця мета не може бути використана для побудови рішень за допомогою пропозицій, розташованих нижче даного.

  • Відсікання відкидає всі альтернативні рішення кон'юнкції цілей, розташованих у реченні ліворуч відсікання, тобто кон'юнкція цілей, що стоять перед відсіканням, призводить до не більш як одного рішення.

  • З іншого боку, відсікання не впливає на цілі, розташовані праворуч його. У разі повернення вони можуть породжувати більше одного рішення. Але, якщо ця кон'юнкція не виконається, то пошук переходить до останнього вибору, зробленого перед вибором пропозиції, що містить відсікання.

Приклад 3: Обчислити

Варіант 1.

Програма Lab2_3_1.pro

domains

argument =real

result =real

predicates

func(argument, result)

clauses

func(X,0):- X<3,!.

func(X,2):- X>=3,X<6,!.

func(X,4) .

goal

X=-2,

func(X, Y).

Варіант 2.

Програма Lab2_3_2.pro

domains

argument =real

result =real

predicates

func(argument, result)

clauses

func(X,0):- X<3,!.

func(X,2):- X<6,!.

func(X,4) .

goal

X=-2,

func(X, Y).

За допомогою відсікання можна описати взаємовиключні правила, тому є можливість запрограмувати твердження «Якщо Р, то Q, інакше R»

Увага !!!: Вплив положення відсікання на зміст твердження:

1) p:-a, b. p якщо (а і b) або с.

p:-c.

  1. p:- a,!,b. p якщо (a ііі b ) або (не a і с)

p:-c.

  1. p:-c. p якщо с або (a і b)

p:- a,!,b.

Предикат fail і true. Вказує на Пролозі, що щось не є істиною, можна за допомогою спеціальної мети fail (невдача), яка завжди зазнає невдачі, зазнати потерпіти невдачі і ту мету, яка стоїть у заголовку правила (мета-батько). Враховуючи вбудований механізм пошуку з поверненням, fail примушує систему не припиняти пошук, а шукати усі можливі рішення.

Аналогічно, спеціальна мета true (успіх), завжди успішна, істинна.

Приклад 4: Програма Lab2_4.pro

predicates

age (symbol, integer) % вік кандидата в призовники

man (symbol) % стать кандидата в призовники

army (symbol) % призовник

clauses

age (petr, 18).

age (dima, 17).

age (nik, 18).

man (petr).

man (dima).

man (nik).

army (X): - man (X), age (X, Y), Y> = 18.

goal

army (X).

Ставлячи мету «Хто може бути покликаний в армію?» (Army (X)), система відповість:

X = petr

X = nik

Приклад 5: Програма Lab2_5.pro

domains

name, addr = string

predicates

person (name, addr)

print_all ()

clauses

person (tom, city1).

person (jim, city2).

person (ann, city3).

person (lize, city1).

person (tata, city4).

person (kat, city5).

print_all (): -

person (Name, Addr),

write ("\ nName =", Name, ", Address =", Addr),

fail.

goal

print_all.

(Який буде результат виконання програми?)

Предикат not можна визначити так:

якщо Мета успішна, то not (Мета) неуспішна,

інакше not (Мета) успішна.

Необхідно врахувати, що not, визначений за допомогою невдачі, які не повністю відповідає запереченню not у математичній логіці. Ця відмінність може призвести до несподіванок у поведінці програми, якщо предикатом not користуватися недбало.

Not також можна використовувати як відсікання, наприклад. Зіна любить усіх тварин, за винятком змій.

любить (Зіна, Х): - любить (Зіна, Х): -

змія (Х),!, fail. тварина (Х),

любить (Зіна, Х): - not (змія (Х)).

тварина (Х).

Або розглянемо різне співвідношення (X, Y), яке виконується, коли X і Y НЕ співпадають в сенсі:

X і Y не збігаються буквально;

арифметично X = Y;

X і Y непорівнянні.

Якщо X і Y порівнянні, то мета для різних (X, Y) зазнає невдачі, інакше мета для (X, Y) успішна.

Використовуючи ! і fail, отримуємо: Використовуючи not, отримуємо:

різні (X, Х): - !, fail. різні (X, Y): - not (X = Y).

різні (X, Y).