ми можемо системі задати запит 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'))
В старому описі об'єкту: