Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекція_3_5_6_7_основи_мови.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
375.3 Кб
Скачать

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

add_em_up(sum,sum,sum)

multіply_em(product,product,product)

clauses

add_em_up(X, Y, Sum):-Sum=X+Y.

multіply_em(X,Y,Product):-Product=X*Y.

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

add_em_up(32, 54, Sum).

Vіsual Prolog відповість:

Sum=86