Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧКА_PROLOG_new.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
600.58 Кб
Скачать

5.4.Опис доменів складних об'єктів.

В цій секції ми покажемо як визначаються домени для складних об'єктів.

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

owns(john,book('From Here to Eternity','james Jones')).

і

owns(john,horse(blacky)).

ми можемо системі задати запит goal:owns(john,X).

Змінна X після цього може бути зв'язана з різними типами об'єктів: книгою, конем, або ж можливо іншим об'єктом, який ви визначили. Це випливає із нашого визначення предикату owns. Тому нам не бажане старе використання предикату:

owns (symbol,symbol).

Замість нього ми мусимо сформулювати нове визначення предикату, наприклад:

owns(name,articles)

Зараз, ми можемо описати об'єкт articles в секції domains наступним чином:

domains

articles=book(title,author);

horse(name)

title,author,name=symbol

Крапка з комою читається тут як "або". В цьому випадку можливі альтернативи: книга може ідентифікуватись назвою і автором; або ж кінь ідентифікується своєю кличкою. Всі об'єкти title , аuthor, name є стандартними, символьного типу.

До опису об'єктів може бути добавлено і більше альтернатив. Наприклад, articles може бути судновою книгою, або ж банківською книгою. У випадку суднової книги можемо використати функтор без аргументів, банківську книгу можемо описати як bankbook(balance). В цьому випадку об'єкт articles може бути описаний:

articles =book(title,author); horse(name); boat; bankbook(balance)

title,author,name = symbol

balance =real

Далі приведемо повну програму, яка демонструє використання в фактах, що описуються предикатом owns, складного об'єкту типу articles:

domain

articles = book(title, author) ;

horse(name) ;

boat ;

bankbook(balance)

title, author, name = symbol

balance = real

predicates

owns(name,articles)

clauses

owns(john, book("A friend of the family", "Irwin Shaw")).

owns(john, horse(blacky)).

owns(john, boat).

owns(john, bankbook(1000)).

Тепер відкомпілюємо нашу програму. Коли ми задамо системі запит:

goal: owns(john,Thihg).

Вона видасть чотири рішення:

Thing = book('A friend of the family','Irwin Shaw')

Thing = horse(blacky)

Thing = boat

Thing = bankbook(1000')

4Solutions

Таким чином, опис домену складного об'єкту в загальному має такий вигляд:

domain object= alter1(D,D,...);

alter2(D,D,...);

...

де alter1 і alter2 довільні, але різні функтори. Позначення (D,D,...) задає список імен доменів, які або ж описані десь в іншому допустимому місці, або ж мають один із стандартних типів. Відмітимо наступне:

1. Альтернативи розділяються крапкою з комою.

2. Кожна альтернатива має функтор і можливо список доменів для відповідних аргументів.

5.5.Багаторівневі складні об'єкти.

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

book('The Ugly Duckling'.'Andersen')

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

book('The Ugly Duckling',author('Hans Christian','Andersen'))

В старому описі об'єкту:

book(title,author)

другий аргумент функтору book є author. Але старий опис

author = symbol

може тільки включати просте ім'я, тому його не можна застосовувати.

Ми повинні зараз специфікувати, що author є складним об'єктом, який включає ім'я та прізвище:

author(first_name,last_name)

Котре вимагає наступний опис:

domains

articles = book(title, author) ;

horse(name) ;

boat ;

bankbook(balance)

author = author(first_name,last_name)

title, author, name = symbol

balance = real

Коли використовуються складні об'єкти різного рівня, їх зручно зображати у вигляді дерева.

book

/ \

title author

/ \

/ \

firstname lastname

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

book=book(title,author(firstname,lastname))