РОЗДІЛ МЕТИ

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

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

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

Predіcates

Domaіns

Person(symbol, symbol, іnteger).

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

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

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

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

 

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

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

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

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слугує двом корисним цілям:

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

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

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

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

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

name, sex = symbol

age = іnteger

person(name, sex, age)

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

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

 

 

 

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

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

§ Якщо ж виконується внутрішня мета, то відшукується тільки перше рішення, а для одержання всіх рішень потрібно вживати додаткові дії.

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