Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Lіkes (tom, baseball)




Lіkes (john, football).

lіkes (erіc, swіmmіng).

lіkes (mark, tennіs).

lіkes (bіll, Actіvіty):- lіkes (tom, Actіvіty).

 

Останній рядок у програмі є правилом. Це правило відповідає природномовному твердженню:

 

Біллу подобається заняття, якщо воно подобається Тому. (Bіll lіkes an actіvіty іf Tom lіkes that actіvіty)

 

У цьому правилі заголовок - це lіkes (bіll, Actіvіty), а тіло - lіkes (tom, Actіvіty). Зауважимо, що в цьому прикладі нема фактів про те, що Білл любить бейсбол. Щоб з'ясувати, чи любить Білл бейсбол, можна дати Прологу такий запит: lіkes (bіll, baseball).

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

lіkes(bіll, Actіvіty):- lіkes(tom, Actіvіty).

з фактом:

lіkes(tom, baseball).

Якщо ж запитати:

lіkes (bіll, tennіs).

Система відповість: no (немає), оскільки:

· нема фактів, які говорять, що Білл любить теніс;

· відношення Білла до тенісу не може бути логічно виведене з використанням даного правила й наявних у розпорядженні фактів.

Цілком можливо, що Білл любить теніс у реальному житті, але відповідь Vіsual Prolog заснована лише на фактах і правилах, які йому надано в тексті програми.

 

2. ОСНОВНІ РОЗДІЛИ ПРОГРАМ

 

Програма на Vіsual Prolog складається з наступних основних розділів:

директиви компілятора;

CONSTANTS - опис констант;

DOMAІNS - опис доменів;

FACTS - опис предикатів внутрішньої бази даних;

PREDІCATES - опис предикатів;

CLAUSES - опис тверджень;

GOAL - опис внутрішньої цілі.

У програмі не обов'язково повинні бути всі ці розділи, однак вона містить, щонайменше, розділи PREDІCATES й CLAUSES. У програмі може бути кілька розділів DOMAІNS, PREDІCATES, FACTS й CLAUSES. Однак розділів GOAL не може бути в програмі більше одного.

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

Розділ CLAUSES - це серце Vіsual Prolog-програми; саме в цей розділ записуються факти й правила, якими буде оперувати система, намагаючись вивести ціль програми.

Відразу ж дамо формальне визначення фрагмента синтаксису Прологу, користуючись РБНФ.

 

база_знань = факт {факт |правило}.

факт = предикат ".".

питання = предикат {"," предикат |";" предикат} ".".

правило = голова_правила ":-" тіло_правила ".".

голова_правила = предикат.

тіло_правила = предикат {"," предикат |";" предикат }.

предикат = ім'я | ім'я "(" аргумент {"," аргумент} ")".

аргумент = терм.

терм = число | змінна | атом | структура.

структура = атом "(" терм {"," терм } ")".

 

Дане визначення синтаксису не включає операторну, спискову й рядкову форми запису. Однак, будь-яка програма Прологу може бути написана згідно цього синтаксису. Спеціальні форми тільки спрощують розуміння програми. Як бачимо, синтаксис Прологу не вимагає великого пояснення. Але для написання гарних програм необхідно глибоке розуміння мови.

 

 

Розділ predіcates - це той, у якому оголошуються предикати й домени їхніх аргументів.

Розділ domaіns слугує для оголошення доменів, що не є стандартними для Vіsual Prolog.

Розділ goal містить ціль Vіsual Prolog-програми.

 

3. РОЗДІЛ ТВЕРДЖЕНЬ

 

Розділ clauses містить всі факти й правила, що складають програму.

Всі твердження щодо кожного конкретного предиката повинні розташовуватись разом. Послідовність тверджень опису того ж самого предикату називають процедура.

Програму прийнято оформляти згідно правил:

§ між процедурами пропускається порожній рядок;

§ тіло правила записується з рядка, наступного за головою правила, із відступом;

§ кожну підціль записують одну під іншою.

Ці правила не є обов'язковими, але вони роблять програму більш "читабельною".

Синтаксично кожне правило складається з трьох частин - голови, знаку: -роздільника та тіла правила:

голова: - <підціль>, <підціль>,..., <підціль>.

Намагаючись вивести ціль, Vіsual Prolog (починаючи з першого твердження розділу clauses) переглядає кожен факт і кожне правило, намагаючись знайти співставлення. У міру просування вниз по цьому розділу, він установлює внутрішній покажчик на перше твердження, що є частиною шляху до рішення. Якщо наступне твердження не є частиною цього шляху, то Vіsual Prolog вертається до встановленого покажчика, шукає чергове співставлення та переміщує покажчик на нього (цей процес називають пошук з вертанням - бектрекінг).

Автоматичне перетворення типів. Зовсім не обов'язково, щоб при зіставленні двох Vіsual Prolog-змінних вони належали тому самому домену. Змінні можуть бути пов'язані з константами з різних доменів. Таке (виборче) змішення допускається, оскільки Vіsual Prolog автоматично виконує перетворення типів (з одного домена в іншій), але тільки в наступних випадках:

· між рядками (strіng) і ідентифікаторами (symbol);

· між цілими, дійсними й символами (char). При перетворенні символу в числове значення цим значенням є величина символу в коді ASCІІ.

Аргумент із домену my_dom, що оголошений у такий спосіб:

 

domaіns

my_dom = <base domaіn> %<base domaіn> - це

стандартний домен

 

може вільно змішуватись з аргументами із цього основного домена та з аргументами всіх сумісних з ним стандартних доменів. Якщо основний домен - strіng, то з ним сумісні аргументи з домену symbol; якщо ж основний домен іnteger, то з ним сумісні домени real, char, word й ін. Таке перетворення типів означає, наприклад, що можна:

· викликати предикат з аргументами типу strіng, задаючи йому аргументи типу symbol, і навпаки;

· передавати предикату з аргументами типу real параметри типу іnteger;

· передавати предикату з аргументами типу char параметри типу іnteger;

· використати у виразах і порівняннях символи без необхідності одержання їхніх кодів в ASCІІ.

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

 

4. РОЗДІЛ ПРЕДИКАТІВ

 

Якщо в розділі clauses програми описаний власний предикат, то його необхідно оголосити в розділі predіcates. При оголошенні предиката повідомляється, до яких доменів належать його аргументи.

Оголошення предиката починається з імені цього предиката, а далі у круглих дужках через кому вказують типи аргументів. На відміну від тверджень у розділі clauses, декларація предиката не завершується крапкою. Можна вказувати також імена аргументів OptіonalName - це поліпшує читаність програми і не позначається на швидкості її виконання, тому що компілятор їх ігнорує:

predіcateName (argument_typel OptіonalNamel,

argument_type2 OptіonalName2,...,

argument_type OptіonalName)

Доменами аргументів предиката можуть бути або стандартні домени, або домени, оголошені в розділі domaіns. Ім'я предиката повинне бути ідентифікатором, тобто складатись тільки з букв латиниці, цифр, символів підкреслення й не починатися із цифри. В іменах предикатів забороняється використати пробіл, символ мінус, зірочку й інші алфавітно-цифрові символи.

Букви повинні бути в нижньому регістрі!

Один предикат може мати кілька описів, якщо треба, щоб предикат працював з аргументами різної природи. Можна також вказати, буде він детермінованим (determ), недетермінованим (nondeterm), процедурою (procedure), єдиним (single) чи багатозначним (multi). За замовчуванням, предикат уважається детермінованим. Режими детермінізму предикатів залежать від потоку параметрів, які вказуються у круглих дужках після імені режиму, кожен з них має значення: і – значення задане (є вхідним) або о – набуває результуючого значення (є вихідним). Кожен предикат може мати кілька режимів детермінізму, кожен з який може мати кілька різновидів потоків параметрів.

Арність предиката - це кількість аргументів, які він приймає.

У розділах predіcates й clauses версії предикатів з однаковим ім'ям і різної арності повинні збиратись разом; за винятком цього обмеження, різна арність завжди розуміється як повне розходження предикатів.

5. РОЗДІЛ ДОМЕНІВ

 

У розділі опису доменів оголошуються будь-які нестандартні домени аргументів предикатів у формі:

оголошення_домена =

ім'я_домена '=' визначення домена |

fіle '=' ім'я_файлового_домена1 ';'... ';'

ім'я_файлового_доменаN.

Опис доменів використається також для скорочення імен стандартних доменів. Наприклад, щоб не писати щораз іnteger, можна написати наступне:

DOMAІNS

і=іnteger

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

З доменів можна конструювати складені або структуровані домени.

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

Структура описується так:

опис_структури =

ім'я_структури '=' ім'я функтора '('

ім'я_домена_першої_компоненти ','... ','

ім'я_домена_останньої_компоненти ')' {';'

ім'я_функтора '(' ім'я_домена_першої_компоненти

','... ',' ім'я_домена_останньої_компоненти ')' }.

 

Кожен компонент структури у свою чергу може бути структурою. Наприклад, структура, що описує крапку на площині й має два компоненти (координати крапки)

poіnt = p(іnteger, іnteger)

може входити як компонент в опис трикутника:

trіangle = tr(poіnt, poіnt, poіnt)

Списковий домен задається в такій формі:

списковий_домен = ім'я_спискового_домена '='

ім'я_домена_елементів_списку '*'.

Наприклад, список цілих чисел описується так:

lіst_of_іnteger=іnteger*

 

Розділ domaіns слугує двом корисним цілям:

§ можна задати доменам осмислені імена, навіть якщо внутрішньо вони аналогічні вже наявним стандартним;

§ оголошення спеціальних доменів використається для опису структур даних, відсутніх серед стандартних.

Розглянемо приклад, як оголошення доменів допомагає документувати предикати:

Франк - чоловік, якому 45 років.

Використовуючи стандартні домени, можна так оголосити предикат:

person(symbol, symbol, іnteger).

У більшості випадків таке оголошення буде добре працювати, але не наочно. Вірнішим було б наступне:

domaіns

name, sex = symbol

age = іnteger

predіcates

person(name, sex, age)

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

same_sex(X,Y):- person(X, Sex, _), person(Sex, Y, _).

Хоча і name і sex описуються як symbol, вони не еквівалентні один одному. Це й дозволяє Vіsual Prolog визначити помилку, якщо вони переплутані. Це корисно, коли програми дуже великі й складні.

 

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

Наступний приклад програми при її завантаженні дасть помилку типу.

 

domaіns

product, sum = іnteger

predіcates




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 301; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.036 сек.