РОЗДІЛ МЕТИ
Якщо змінна твердження використається в кількох предикатах, її треба однаково оголосити в усіх з них.
Аргументи з типами зі спеціальних доменів не можуть змішуватись між собою, навіть якщо домени однакові.
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 починає розділ опису внутрішньої цілі програми. Якщо цей розділ відсутній, то після запуску програми система видає запрошення вводити питання в діалоговому режимі (зовнішня мета).
§ При виконанні зовнішньої мети Пролог-система шукає всі рішення, виводячи всі можливі значення для змінних, що беруть участь у питанні.
§ Якщо ж виконується внутрішня мета, то відшукується тільки перше рішення, а для одержання всіх рішень потрібно вживати додаткові дії.
Програма, що компілюється у виконуємий файл, який можна запускати незалежно від середовища розробки, обов'язково повинна мати внутрішню мету. Зовнішню мету звичайно використають на етапі налагодження програми.