другий аргумент функтору 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))
5.6.Приклад, який ілюструє задання структури речення англійської мови.
Розглянемо приклад задання граматичної структури речення, використовуючи складний об'єкт. Найбільш просте речення має підмет і присудкову частину:
sentence = sentence(noun,verbphrase)
Де підмет є простим словом:
noun=noun(word),
а присудкова частина може мати або ж дієслово з пояснюючою частиною, або ж просто дієслово
verbphase=verbphrase(verb,noun);
Verb(word)
verb = verb(word)
Використовуючи такий опис, речення 'Еllen owns the book.' може бути представлене
Sentence(noun(ellen),verbphrase(verb(owns),noun(book)))
Відповідне дерево прийме вигляд
Sentence
/ \
/ \
Noun verbphrase
/ / \
/ verb noun
| | |
Ellen owns the book
Подібний підхід може бути використаний при написанні блоку синтаксичного аналізу компілятора.
5.7.Опис змішаних складних об'єктів.
В цьому розділі ми розглянемо три різні типи опису доменів, які ви можете використовувати у ваших програмах. Ці описи дозволяють вам використовувати предикати, які:
мають аргумент, який може бути різного типу;
мають змінну кількість аргументів, кожний з яких окремого типу;
мають змінну кількість аргументів, деякі з яких можуть бути різного типу.
5.7.1.Аргументи, які можуть мати різний тип.
Для того, щоб дозволити предикату допустити аргументи різного типу, ви повинні додати опис функтору. Наприклад, в наступному прикладі фраза your_age, буде допускати аргумент типу age, який може бути стрічковим, цілим, дійсним.
Predicates
Your_age(age)
Clauses
your_age(i(AGE)):-write(AGE)
your_age(r(AGE)):-write(AGE)
your_age(s(AGE)):-write(AGE)
тоді домен повинен бути наступним:
domains age = i(integer);
R(real);
S(string)
Predicates your_age(age)
Поряд з тим Пролог не дозволяє наступні описи доменів:
Domain
age = integer, real, string