русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


КОНСТАНТА


Дата додавання: 2013-12-24; переглядів: 1594.


ТЕРМИ

ФАКТИ

Твердження, що, за умовою задачі, завжди істинні, називаються безумовними твердженнями- фактами. Факт записується за допомогою предикату: першим вказують ім'я предикату, в дужках - аргументи предикату через коми. Факт завжди закінчується крапкою.

Для нашої задачі ім’я предикату вказує на відношення між людьми, а аргументи на людей. В предикатній формі факти запишуться:

father (“Дмитро”, ”Володимир”).

father (“Дмитро”, ”Олександр”).

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

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

Задача2. Відомі такі відомості про пасажирів літаку: місце, кількість речей, вага речей пасажира. Вивести відомості про пасажира на екран.

Ім’ям предикату зручно обрати baggage, а аргументами - властивості багажу. Наприклад, факт, що описує багаж запишеться: baggage (1, 2, 24.6).

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

Опис дії do можна подати умовним твердженням, де умови кожна з вказаних дій.

Тоді опис дії задачі буде описано:

Do:-baggage(N, Kol, Ves), write(N,’ ‘,Kol,’ ‘,Ves,’ ‘),nl,fail.

Де:

Ø baggage(N, Kol, Ves) – у змінні N, Kol, Ves одержуються № місця, кількість речей і вага речей відповідно для певного пасажира;

Ø write(N,’ ‘,Kol,’ ‘,Ves,’ ‘),nl – вивід відомостей і перевод курсору на новий рядок;

Ø fail – стандартний предикат, який завжди повертає неправду. Ним вказується, що дії ще не виконані, і треба знайти інший розв’язок.

У деяких задачах зручно властивість об’єкту подавати як ім’я предикату, а об’єкти з цією властивістю аргументами предикату. Наприклад, книга, газета, журнал – друкований матеріал: drukovan(“книга”, “журнал”, “газета”).

Ім'я предикату називається функтором. У прикладах функтори: father, baggage. Функтор предиката можна писати як з маленької, так і з великої букви.

Предикат може не мати аргументів. Тому може існувати факт:go.

2.3. ЦІЛЬОВЕ ТВЕРДЖЕННЯ

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

Ø одиночна ціль;

Ø кон’юнкція цілей, цілі поєднуються логічною операцією AND. Логічна операція AND позначається комою.

Цільове твердження закінчується точкою.

У нашій задачі цільове твердження можна подати, як одиночну ціль: brother (X, Y). Знайти братів в родині.

Цільове твердження можна також подати, як кон’юнкцію цілей:

brother (X, Y), write(X,’ ‘, Y). Знайти братів в родині і вивести на екран їх імена.

Цільове твердження може бути також подано як діз’юнкція цілей:

brother (X, Y);

sister(X,Y).

Знаходження розв’язку задачі в Пролозі виконується через доведення істинності цілі. Для доведення істинності цільового твердження використовують умовні твердження.

2.4. УМОВНІ ТВЕРДЖЕННЯ

Третій тип твердження – умовне. Умовне твердження записується разом з умовами. Такий запис називають правилом. За допомогою правила визначають істинність умовного твердження.

Умовне твердження і умови записуються за допомогою предикатів.

Розглянемо приклад правила для нашої задачі:

brother (X, Y):- father (Z, X), father (Z, Y), X<>Y. (1)

Правило читається: X та Y брати, якщо Z батько X і Z батько Y і X<>Y. Умова 3 виключає випадок, щоб людина була братом сама собі.

В прикладі умовне твердження - brother (X, Y) .

Умовами будуть:

Ø father (Z, X) 1 умова ;

Ø father (Z, Y) 2 умова;

Ø X<>Y 3 умова.

Символи „:-” відокремлюють умовне твердження від умов. Замість вказаних символів можна писати „IF”. Умовне твердження називають головою правила, а умови тілом правила.

Умови правила поєднуються у складне твердження за допомогою коми, яка означає логічну операцію„AND” (кон’юнкцію цілей). Замість коми можна писати логічну операцію „AND”. Правилозакінчується точкою.

Правило (1) можна записати у формі:

brother (X, Y) if father (Z, X) and father (Z, Y) and X<>Y.

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

Аргументи предикату, за допомогою якого подають умовне твердження, мають змінні. Кожна змінна може приймати певну множину значень. Щоб сформулювати умовне твердження істинне для цих множин об’єктів, змінні умовного твердження, пов’язують операцією - квантором загальності -.

Тобто умовне твердження буде істинним для будь-яких X та Y, для яких виконуються умови. Змінні умов пов’язані квантором існування - . Тобто умовне твердження істинно, якщо існують такі значення змінних Z, X, Y для яких умови істинні.

Використовуючи квантори, умовне твердження формулюється:

(X, Y) брати, якщо Z батько X та Y.

Умовне твердження може мати кілька наборів умов.Набори умов поєднуються в одне складне твердження логічною операцією “OR”(діз’юнкція цілей). Замість вказаного символу пишуть „ ; ”.

Наприклад:

brother (X, Y):-father (Z, X), father (Z, Y), X<>Y;

mother (Z1,X), mother (Z1,Y), X<>Y.

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

Наприклад, правило з декількома умовами:

brother (X, Y):-father (Z, X),father (Z, Y), X<>Y; (2)

mother (Z, X),mother (Z, Y), X<>Y.

Пролог розглядає як два правила:

brother (X, Y):-father (Z, X),father (Z, Y), X<>Y. (3)

brother (X, Y):-mother (Z, X),mother (Z,Y), X<>Y. (4)

Тому змінна Z з першого набору умов правила (2) і змінна Z з другого набору умов правила (2) – різні змінні.

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

Тоді процедура brother (X, Y) шукає братів в родині. Для цього треба: знайти батька для члена родини чоловічої статі, знайти іншого сина у цього батька, перевірити, що він не брат сам собі.

2.4. ПРИКЛАД ПРОГРАМИ НА ПРОЛОЗІ

 

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

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

Секцію Predicates розміщують перед секцією Clauses.

Ціль вказують у секції Goal. Секція може розміщуватися як перед секцією Clauses так і після неї. Проте для написання програми краще розміщувати секцію Goal перед секцією Clauses.

Взагалі, секції розміщують за принципом: те, що використовують, описують раніше.

Напишемо програму для нашого завдання:

Predicates

father (string, string)

brother (string, string)

Clauses

father (“Дмитро”, ”Володимир”).

father (“Дмитро”, ”Олександр”).

brother (X, Y):- father (Z, X), father (Z, Y), X<>Y.

Goal

brother (X, Y), write(X, ’ ’, Y).

В програмі використано стандартні предикати: <>, write.

2.6. ВИКОНАННЯ ПРОГРАМИ НА ПРОЛОЗІ

 

Виконання програми неможливо без цілі. Пролог вважає назву секції Goal стандартним предикатом і виконання програми починає з нього.

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

На рисунку 2 відображено дерево цілей для вище показаної програми:

РИС.2

Програма виконується в такій послідовності:

1. Обирається ціль з секції Goal. Складна ціль проглядається зліва на право. Тобто спочатку доводиться істинність поточної цілі brother (X, Y) і, якщо ціль істинна, поточною ціллю стає предикат write(X,’ ‘,Y).

2. Пролог шукає в секції Clauses твердження, яке записано з таким же предикатом як поточна ціль з секції Goal. Пошук кожного предикату завжди проводиться від початку секції. Для цілі brother (X, Y) із секції Goal знайдеться умовне твердження brother (X, Y). Між аргументами, що стоять на відповідних місцях цілі і умовного твердження, встановлюється зв’язок. Через такий зв’язок змінні цілі одержать свої значення. Якщо буде доведено, що умовне твердження істинно, то і ціль буде істиною.

3. Умовне твердження буде істинним при істинних умовах. Тому з’являються три нові поточні цілі father( Z, X ), father (Z, Y) та X<>Y істинність яких треба довести. Ще до роботи програми, компілятор проставляє для кожної поточної цілі маркери на твердженнях з якими ця ціль може бути зіставлена. У прикладі дві перші цілі мають по два маркери на фактах і можуть бути зіставлені кожна з двома фактами.

4. Вибирається перший факт для поточної цілі father ( Z, X ). Змінна Z конкретизується значенням „Дмитро”, а змінна X конкретизується значенням „Володимир”. Витирається маркер на першому факті для цієї цілі, як для використаної.

5. Значення змінної Z передається в другу поточну ціль і вона прийме вид father („Дмитро”, Y). Друга поточна ціль зіставляється з першим свої фактом. Змінна Y теж конкретизується значенням „Володимир”, а маркер на першому факті витирається.

6. Але третя ціль X<>Y вимагає, щоб імена не були однаковими. Ця умова вводиться, щоб хлопець не був братом сам собі. В нашому випадку X=Y. Тому X<>Y буде невірним твердженням. Якщо одна з умов невірна, то і умовне твердження буде невірним.

7. Для пошуку іншого розв’язку включається механізм звороту. Керування передається на найближчий зліва предикат, що має декілька розв’язків. Змінна Y звільнюється і для другої цілі father („Дмитро”, Y) вибирається наступний факт

father (“Дмитро”, ”Олександр”). Змінна Y одержує нове значення „Олександр”.

8. В цьому випадку твердження X<>Y вірне, отже умовне твердження теж вірне. Умовне твердження істинно при X = „Володимир”, Y= „Олександр” і тому ціль brother (X, Y) з секції Goal одержує ці значення і теж вірна.

9. Одержані значення змінних виводяться на екран стандартним предикатом write (X, ’ ’, Y).

 

2.7. Статична та динамічна бази даних

Факти і правила, які описано в секції Predicates, називають статичною базою даних. Такі твердження компілюються в бінарний код і їх не можна змінювати під час роботи програми.

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

Факти внутрішньої бази даних описують в секції Facts. Ці факти використовуються так само, як факти статичної бази даних.

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

2.8. Підготовка фактів для внутрішньої бази даних

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

Ø Кожний факт розташовується в окремому рядку. Факти повинні відображуватися тільки в тому форматі, в якому записує в файл предикат Save.

Ø Факти, що утворені одним предикатом, повинні розміщатися підряд.

Ø Факти можуть мати великі букви тільки усередині рядкових даних.

Ø Факти можуть мати пропуски тільки усередині рядкових даних.

Ø Факти не можуть мати константи типу symbol.

Ø В файлі не можна розміщувати коментарії.

Ø Файл не може мати порожніх рядків.

 

Наприкінці факту крапка не обов’язкова.

2.9. Опис фактів внутрішньої бази даних

Факти, що завантажуються динамічно, описуються в секціях Facts. У програмі на Visual Prolog може бути одна неіменована секція Facts і декілька іменованих секцій Facts. Ідентифікатори іменованих секцій обирає програміст. По замовчанню ім’я неіменованої секції Facts dbasedom.

Опис фактів в секції Facts має такий же синтаксис як в секції Predicates. Секції Facts розташовують за принципом: опис об’єкту записується перед застосуванням об’єкту.

 

Розглянемо приклади опису фактів.

 

Приклад неіменованої секції Facts:

Domains

nazva = char

koord_x, koord_y = integer

 

Facts

koord(nazva, koord_x, koord_y)

rast(real)

 

Приклад іменованої секції Facts:

Facts – figura

Krug(integer, real)

Kvadrat(integer)

 

Ім’я іменованої секції записується за правилом ідентифікатору.

В одній і тій же секції Facts може бути об’явлено скільки завгодно предикатів. Факти, що об’явлені в секції Facts, можуть розміщуватися в одному файлі або різних файлах.

На роботу стандартних предикатів, які працюють з динамічною базою даних впливають ключеві слова nondeterm, determ, single.

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

Якщо користувач бажає вказати, що для предикату буде існувати не більше одного факту (0 або 1), то вказують:

Facts

determ sum (real)

Пролог контролює такі факти і не дозволяє заносити другий такий факт.

Для вказівки, що з предикатом буде існувати один і тільки один факт, то вказують:

Facts

single dobutok (real)

Факт з ознакою singl не можна вилучати. Пролог контролює цю помилку на етапі компіляції, тому факт розташовують в секції Clauses при написанні програми(ініціалізація факту). Виклик такого факту завжди істинний, якщо його аргументи вільні змінні. Такий факт можна змінювати за допомогою предикатів assert, assertz, asserta, consult. Вказані предикати вилучають предикат і вставляють новий.

Функтори предикатів в межах одного модуля не повинні повторюватися. Тобто, в двох різних секціях Facts не можна вказувати один функтор. Не можна також вказувати один функтор в секціях Predicates i Facts.

Якщо програма складається з декількох модулів, то неіменована секція Facts повинна бути глобальною: Global Facts. Ця вимога не потрібна при застосовуванні під час компіляції утиліти Test Goal.

2.10. Предикати роботи з внутрішньою базою даних

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

Consult(“Ім'я_файлу”, Ім'я_Facts) -

(string, symbol) завантажує факти, що описані в іменованій секції.

Consult(“Ім'я_файлу”) - завантажує файли,

(string) що описані в неіменованій секції.

 

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

Факти можна вставляти в кінець групи фактів з вказаним предикатом за допомогою стандартного предикату Assertzі в початок групи фактів з вказаним предикатом за допомогою стандартного предикатом Asserta.

 

Assertz (факт)

Приклад: assertz ( vlast (“дерево”, ”зелене”))

 

Assertz (факт, ім’я_facts)

Приклад: assertz ( vlast (“дерево”, ”зелене”), flora)

Asserta (факт)

Приклад: asserta (klass(”список”,”структура”))

 

Asserta (факт, ім’я_facts)

Приклад: asserta (klass (”список”,”структура” ), dani)

 

Для сполучення з більш ранніми версіями у Пролозі існує предикат assert, який тотожний з assertz.

Розглянемо приклад, що додає факт в кінець динамічної бази даних, яку завантажено з файлу :

Facts

Kub(string, string, real)

Predicates

do

Goal

Consult (”F.dat”), do, save(“F.dat”).

Clauses

do: - write (“Ведіть матеріал, колір, довжину ребра ”), readln(Mat), readln(Color), readreal(Dl), assertz (kub (Mat, Color, Dl)).

 

Предикат Consult завантажує факти з файлу F.dat.

Файл F.dat має такі факти:

kub(“дерево”,”білий”,3.5) (1)

kub(“дерево”,”зелений”,3.4) (2)

Введені з клавіатури дані розміщуються у факті з функтором kub і заносяться в динамічну базу даних після факту (2).

Аналогічно можна додати факт в кінець динамічної бази даних, яка розміщена в секції Clauses. Розглянемо приклад програми.

Facts

Kub(string, string, real)

Predicates

do

Goal

do, save(“F.dat”).

Clauses

kub(“дерево”,”білий”,3.5).

kub(“дерево”,”зелений”,3.4).

 

do: - write (“Ведіть матеріал, колір, довжину ребра ”), readln(Mat), readln(Color), readreal(Dl), assertz (kub (Mat, Color, Dl)).

Після роботи програми у файлі F.dat зберігаються факти з секції Clauses в кінці котрих розташовано новий факт.

Предикати retract таretractallвилучають факти з внутрішньої бази даних.

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

Наприклад:

retract (Kub (“дерево”, _, _)) - вилучає перший знайдений факт про кубики, що зроблені з дерева.

retract (Kub (_, _, _)) - вилучає перший знайдений факт про кубики.

retract ( _ ) – вилучає перший факт з будь-яким функтором внутрішньої бази даних.

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

retract (Kub (“дерево”, _, _), igrushki) - вилучає перший знайдений факт про кубики, що зроблені з дерева з бази даних igrushki.

retractall (факт)

retractall (факт, ім’я_Facts) – вилучає усі факти з внутрішньої бази даних(неіменованої або іменованої) із вказаним предикатом і значеннями його аргументів. Дії, які виконує предикат, еквівалентні дії предикату retract, що використовують при роботі механізму звороту.

Предикат retractall завжди істинний.

Наприклад,

retractall (Kub (“дерево”, _, _)) - вилучає всі знайдені факти про кубики, що зроблені з дерева.

Порівняйте: do:- retract(Kub (“дерево”, _, _)), fail.

Використання вільної змінної в предикаті не має сенсу. Тому в предикаті застосовують анонімну змінну.

retractall (Kub (_, _, _)) вилучає всі знайдені факти про кубики.

retractall ( _ ) вилучає всі факти з будь-яким функтором із внутрішньої бази даних.

retractall ( _, flora ) вилучає всі факти з будь-яким функтором з внутрішньої бази даних flora.

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

Якщо зберігати базу даних з тим же ім’ям, то нова база замінить стару.

save(“F.dat”) – зберегти базу даних з неіменованої секції.

save (“F.dat”, figura) – зберегти базу даних з іменованої секції.

2.11. Приклади використання внутрішньої бази даних

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

Завдання1. Дано факти з відомостями про книжки бібліотеки. Вивести всю інформацію про книжки і кількість книжок у бібліотеці.

Facts

Single Kol(integer)

Predicates

Kniga(string, string)

do

Goal

Do, kol(K), write(“Кількість книжок”, K).

Clauses

kol(0).

Kniga(“Деникен”, “Колесника богов” ).

Kniga(“Бердник”, “Пути титанов” ).

Kniga(“Ролинг”, “Философский камень” ).

Do:- Kniga(A, N), write(A,N),nl, kol(K),K1=K+1,assertz(kol(K1),fail.

Do.

Кожен раз, одержуючи відомості про книгу, програма включає поточну кількість книжок. Предикат kol має властивість Single і тому в програмі повинен бути рівно один такий факт. Тому при додаванні іншого факту з таким предикатом він заміщується.

Завдання2. Відсортувати факти по кількості речей у пасажирів (у порядку зростання)

Facts-nosort

mesto(integer,integer)

Facts-sort

mesto1(integer, integer)

Predicates

sort

min(integer)

Goal

consult ("F.dat",nosort),sort,save("F.dat",sort).

 

Clauses

sort:-mesto(_,Kol),min(Kol),sort.

sort.

min(Kol):- mesto(_,Kol1), Kol1 < Kol, min (Kol1).

min(Kol):-mesto(N,Kol),

assertz(mesto1(N,Kol),sort), retract(mesto(N,Kol),nosort).

Файл F.dat містить факти:

mesto(1,5)

mesto(2,1)

mesto(3,4)

mesto(4,6)

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

Далі дії повторюються для фактів, що залишилися. Дії виконуються до тих пір, поки область з ім’ям nosort не стане порожньою, а область з ім’ям sort буде містить відсортовані факти.

На Пролозі просто утворювати експертні системи. Експертна система містить базу знань, механізм виводу та інтерфейс. Механізм логічного виводу розміщується в виконавчій системі Прологу, а базу знань легко утворити засобами динамічної бази даних. Інтерфейс експертної системи легко утворюється візуальними засобами Visual Prolog.

 

 

3. ОСНОВНІ ПОНЯТТЯ VISUAL-PROLOG

3.1. ЗАГАЛЬНІ ВІДОМОСТІ

Мова Visual-Prolog використовує англійські букви, цифри і спеціальні символи.

З вказаних символів складаються зарезервовані слова Visual-Prolog та ідентифікатори, що використовує програміст.

До зарезервованих слів Visual-Prolog відносять назви секцій програми, імена стандартних предикатів, ідентифікатори стандартних доменів Visual Prolog, константи, директиви компілятору.

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

Ідентифікатори на Пролозі записують за правилами:

Ø довжина імені менше 250 символів;

Ø ім'я може складатися з англійських букв, цифр, знаків підкреслення;

Ø ім'я повинне починатися з букви.

Ім’я змінної починається з великої букви. Виключення – анонімна змінна, її ім'я складається тільки з ‘_’.

 

3.3. ДОМЕНИ ЕЛЕМЕНТАРНИХ ОБ’ЄКТІВ

Стандартні домени використовують для об’яви типів аргументів предикату користувача.

Прості стандартні типи відомі Прологу, їх не описують. В таблиці №1 подано прості стандартні домени, їх діапазон і приклади констант цих доменів.

 

Домен Визначення елементів домену Діапазон Приклад константи
Real Дійсне число ±1e-307 ≤ X ≤ ±1e-308 2.4 або 0.3e+2=30
Char Символ ASCII 1 байт ‘a’ або ‘\97’
Symbol Символічна константа. Записується за правилами ідентифікатору. Починається з малої букви 1-250символів Prolog
String Рядки Рядки можуть подаватися як символи. Для цього в опціях компілятору обирають Place Strings in Sym File Довжина рядку <= 64 Кб "Пролог" або “\48\49\50”
File Символічне ім’я файлу 1-250 f1 записується за правилом ідентифікатору
Binary Бінарна константа Подається списком цілих значень перед котрим стоїть ознака $. Кожне ціле число переводиться в бінарний вигляд. Результат розміщується групою бінарних байтів Ціле значення <= 255. $[‘s’, 240,0xA1] 0x - шістнадцятирічний запис 0o – восьмирічний запис
Short Коротке ціле зі знаком Для всіх платформ 16 біт 32768 ≤ N ≤ 32767   -30940
Ushort Коротке ціле без знаку Для всіх платформ 16 біт 0-65535 39 434
Long Довге ціле зі знаком Для всіх платформ 32 біта: -2 147 483 648 до 2 147 483 647 +300 000 000
Ulong Довге ціле без знаку Для всіх платформ 32 біта 0 - 4 294 967 295 3 234 556 765
Integer Знакове ціле.   Діапазон залежить від платформи. Для платформи 16 біт: 32768 ≤ N ≤ 32767 Для платформи 32 біта: -2 147 483 648 до 2 147 483 647 +1 256 543 000 -355667
Unsigned Ціле без знаку Діапазон залежить від платформи. Для платформи 16 біт: 0-65535 Для платформи 32 біта 0 - 4 294 967 295 64 000 000
Byte Бінарний запис Для всіх платформ 8 біт 0-255 А = 065
Word Бінарний запис Для всіх платформ 16 біт 0-65535
Dword Бінарний запис Для всіх платформ 32 біт 0 - 4 294 967 295 065 065 065
Предикатне значення Ім’я предикату, що належить предикатному домену   pas
Об’єктне предикатне значення Ім’я предикату, який об’явлено у класі, що належить об’єктному предикатному домену.   Book

ТАБЛИЦЯ №1

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

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

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

Прості типи користувача описують в секції Domains:

Domains

fath = string

son = string

Predicates

father (fath, son)

 

Структура – складний тип даних.

Структури описують в секції Domains. Розглянемо приклад опису списку з символів.

Domains

List=char*

 

Структури користувача визначаються за допомогою функтору. Функтор указує на ознаку, за якою збираються об'єкти в структуру.

Наприклад: структура, що задає адресу людини визначається:

Domains

Ad = adress (string, string, integer)

(місто, вулиця, будинок)

Будь-який елемент програми на Пролозі називають термом. До термів відносять: змінні, константи, об’єкти, функтори, предикати.

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

Неіменовані константи записуються прямо у виразі в програмі.

Наприклад, Col (X, Y):- Y=X+10 , де 10 не іменована константа.

Іменовані константи записуються в секції Constants.

Тип константи визначається з форми її запису.

Наприклад: Constants

N=14.

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

Константи можуть бути стандартними. Стандартні константи використовують стандартні предикати.

 

3.4.2 ЗМІННА

Змінна може змінювати своє значення під час роботи програми. Тобто змінна може набувати будь-яких значень, визначених контекстом програми.

Проводжуючи аналогію між твердженням на Пролозі і реченням на природній мові, можна сказати, що змінній в твердженні на Пролозі відповідає займенник в реченні на природній мові. Значення займенника теж визначається контекстом речення. Наприклад: Книгу „Господар обручок” написав Р. Толкієн. Він був професором університету. Займенником „Він” означає Р. Толкієн.

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

Щоб відрізняти змінну від константи, змінну пишуть з великої букви.

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

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

Змінна може бути вільною або конкретизованою значенням. Розглянемо приклад програми, де є змінні вказаних доменів.

Завдання: Вивести на екран прізвище студента з № залікової книжки 2034.

Predicates

reader (string, integer )


<== попередня лекція | наступна лекція ==>
Visual Prolog | СТРУКТУРИ


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн