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')

Solutions

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

 

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'))

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