Структура програми, складеної мовою Visual Prolog 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структура програми, складеної мовою Visual Prolog



 

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

І. Розділ domains призначений для оголошення доменів, які не є стандартними доменами Прологу.

У традиційній мові Пролог є тільки один тип – домен. У Visual Prolog треба оголошувати домени аргументів предикатів. Розділ domains уможливлює досягнення двох цілей. По-перше, можна давати смислові імена доменам, навіть якщо вони за своєю суттю є стандартними доменами Прологу. По-друге, можна оголошувати структури даних, які не є стандартними доменами. Visual Prolog 5.2 підтримує нижчезазначені домени.

1. Базові стандартні домени:

char (символи) – окремий символ або символ після знака „\” розміщений в апострофах: ‘t’, ‘0’, ‘\\’ („\”), ‘\”’ (лапки ”), ‘\’’ (апостроф ’), ‘\n’ (перехід на наступний рядок), ‘\t’ (табуляція). Після знака „\” можна використовувати ASCIІ-код символу: ‘\65’ (символ А), ‘\10’ (символ пробілу);

real (дійсні числа) – довжина типу 8 байтів;

string (рядки) – послідовність символів у лапках, наприклад: “Bonny”, “1991”, “Київ”;

symbol (символічні імена) – послідовність літер, цифр і знаків підкреслювання, яка починається з літери нижнього регістру, наприклад: cat, uncle_aunt, sky5;

2. Інтегральні стандартні домени:

integer (цілі числа) – довжина типу залежить від платформи. Для 32-бітової платформи довжина складає 4 байти;

byte, sbyte, short, ushort, word, unsigned, dword, long, ulong (див. довідку Visual Prolog 5.2).

3. Бінарний домен – binary (див. довідку Visual Prolog 5.2).

4. Особливо оброблювані визначені домени (Specially Handled Predefined Domains) – accessmode, bgi_ilist, bt_selector, db_selector, dbasedom, denymode, file, place, ref and reg (див. довідку Visual Prolog 5.2).

ІІ. Розділ predicates призначений для оголошення предикатів та доменів аргументів предикатів.

Формат оголошення предиката такий:

predicateName(argument_type1, argument_type2,..., argument_typeN)

Ставити крапку в кінці оголошення не потрібно. Як тип аргументу використовують стандартні домени, або домени, оголошені в розділі domains. Ім’я предиката починають з літери, за якою розташовують літери, цифри або знаки підкреслювання „_”. Максимальна довжина імені предиката – 250 знаків.

ІІІ. Розділ clauses – „серце” програми, складеної мовою Пролог. У ньому розміщено факти і правила, використовувані, коли Пролог намагається задовольнити запит програми.

Речення для певного предиката слід поміщати в розділі clauses. Послідовність речень, які визначають предикат, називають процедурою.

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

IV. Розділ goal висвітлює стартову мету програми.

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

DOMAINS

author, name, publisher = symbol

price = byte

quantity = ulong

PREDICATES

Nondeterm book(author,name,publisher,price,quantity)

CLAUSES

book(alexander_abramov,riders_from_nowhere,raduga,15,200).

book(agatha_christie,selected_stories,progress,20,150).

book(jennifer_niederst,html,o_reilly,10,100).

GOAL

book(agatha_christie,selected_stories, _, _,X).

Ця програма знаходить у БД кількість книжок автора Агати Крісті з назвою „Вибрані оповідання”. Нас не цікавлять видавництво й ціна, тому вони позначені анонімними змінними – знаком підкреслювання. Значення анонімних змінних не виводяться під час відповіді системи на запит.

V. Розділ database (або facts) – динамічна БД. У ній розміщено факти, які можна змінювати, видаляти чи додавати в БД під час виконання програми.

VІ. Розділ constants містить оголошення символічних констант. Синтаксис оголошення такий:

<Id> = <Macro definition>

де <Id> –ім’я символічної константи; <Macro definition> – значення, яке присвоюють константі; наприклад:

CONSTANTS

zero = 0

ten = (1*(10–1)+1)

pi = 3.141592653

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

VІІ. Розділи global domains, global predicates і global facts дозволяють оголошувати глобальні домени, предикати та речення в програмі. Ці розділи розміщують на початку програми.

 

Предикати введення – виведення

 

Серед предикатів введення і виведення найчастіше використовують такі:

· readchar (CHAR CharVariable) – зчитує з клавіатури один символ;

· readint(INTEGER IntegerVariable) –зчитує з клавіатури ціле число;

· readln(STRING StringVariable) –зчитує з клавіатури рядок символів;

· readreal(REAL RealVariable) –зчитує з клавіатури дійсне число;

· readterm(<domainName>, <TERM> Term) –зчитує з клавіатури терм певного домену;

· nl –забезпечуєперехід на наступний рядок;

· write(e_1, e_2, e_3, …, e_N) –виводить декілька аргументів на екран;

· writef(STRING FormatString, Arg1, Arg2, Arg3, …) –здійснює форматоване виведення аргументів на екран (аналог функції printf() у мові Сі).

З іншими предикатами введення/виведення можна ознайомитись у розділі Input/Output standard predicates довідки Visual Prolog.

Об’єкти даних

Об’єкти даних можуть бути простими та складними (або структурами). Прості дані – це змінні і константи. Константа може бути символьною (char), числовою (integer, real) або атомарною (symbol, string).

Складні об’єкти (далі – структури) – це об’єкти, які складаються із декількох компонент. Ці компоненти також можуть бути структурами. Наприклад, дату можна розглядати як структуру, що складається з трьох компонентів: день, місяць та рік. Для об’єднання цих компонентів у структуру треба вибрати так званий функтор – ім'я складного об'єкта. У розглядуваному випадку можна використати функтор data:

Date(1, april, 2000).

Структури можна зображати у вигляді дерев. Корінь дерева – це функтор, а гілки – компоненти. Якщо компонент являє собою структуру, то його можна зобразити у вигляді піддерева. Наприклад, якщо об’єкт – комп’ютер, то він становить сукупність таких компонент, як процесор, обсяг оперативної пам’яті й монітор, у свою чергу процесор включає тип, тактову частоту, обсяг кеш-пам’яті. Структуру computer(processor(Pentium – 4, 3.0, 1024), 512, Samsung 913N) можна зобразити у вигляді дерева, показаного на рис. 7.

 

computer

/ | \

processor 512 Samsung 913N

/ | \

Pentium 4 3.0 1024

 

Рис.7. Структура computer, подана як дерево

 

Завдання 1

Використовуючи предикати parent(string parent, string son-daughter), women(symbol) і man(symbol), розробити предикати, що визначають такі поняття:

1. Правнучка.

2. Двоюрідний брат.

3. Внук.

4. Дівер.

5. Зять.

6. Тесть.

7. Свекруха.

8. Теща.

9. Свекор.

10. Прадід.

11. Племінник.

12. Прабабуся.

13. Племінниця.

14. Свояк.

15. Тітка.

16. Своячка.

17. Дядько.

18. Дідусь.

19. Правнук.

20. Внучка.

21. Бабуся.

Написати програму для пошуку й виведення на екран інформації про відповідного родича в БД.

 

Вбудовані механізми мови Пролог.

Керування бектрекінгом

 

В основі роботи Пролог-системи лежить два механізми – уніфікація та бектрекінг. Уніфікація – це процес перевірки на збіг двох об’єктів і конкретизація вільних змінних. Правила уніфікації такі:

1. Якщо два об’єкти – константи, то їх можна уніфікувати, якщо вони становлять один і той же об’єкт.

2. Якщо один об’єкт – змінна, а інший – довільний об’єкт, то їх можна уніфікувати, а змінній присвоїти значення довільного об’єкта.

3. Якщо два об’єкти – структури, їх можна уніфікувати за умови, якщо: а) обидва вони мають однаковий головний функтор; б) усі їх відповідні компоненти можна уніфікувати.

Наведемо приклади об’єктів, які можна уніфікувати: константи 2 і 2, ‘ s ’ і ‘ s ’; змінна X і структура data(12, May, 2004), у результаті змінній X буде присвоєне значення data(12, May, 2004); можна уніфікувати структури data(X, Y, 2004) та data(12, May, 2004), у результаті змінним X i Y будуть присвоєні значення 12 і May.

Бектрекінг – це механізм циклічного рекурсивного повернення для знаходження додаткових фактів і правил, необхідних для досягнення цілі, якщо поточна спроба її досягнення виявилася невдалою.

Таким чином, роботу Пролог-системи можна розглядати як рекурсивний циклічний процес уніфікації та досягнення підцілей.

Наведемо для пояснення такий приклад.

 

Domains

parent = symbol

son_daughter = symbol

Facts

parent(parent, son_daughter)

Women(symbol)

Man(symbol)

Predicates

nondeterm son_daughter(son_daughter, parent)

Clauses

parent(pam, bob).

Parent(bob, ann).

Women(pam).

Women(ann).

man(bob).

son_daughter(X, Y):- parent(Y, X), man(X).

son_daughter(X, Y):- parent(Y, X), women(X).

Goal

son_daughter(ann, bob).

Пролог-системі поставлено запитання, чи є Анн дочкою або сином Боба: son-daughter(ann, bob). Пролог-система починає з цілі й застосовуючи правила, замінює поточні цілі новими, допоки ці нові цілі не стануть простими фактами. Спочатку Пролог-система шукає таке речення в програмі, голову якого можна уніфікувати з ціллю, тобто із son-daughter(ann, bob). Такими реченнями є два речення, стосовні предиката son-daughter.

Спочатку Пролог-система вибирає речення, яке стоїть у програмі першим:



Поделиться:


Последнее изменение этой страницы: 2016-04-08; просмотров: 444; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.162.80 (0.02 с.)