В Прологе функциональный терм или предикат можно рассматривать как структуру данных, подобную записи в языке Паскаль. Терм, представляющий совокупность термов, называется составным термом или структурой. Составные структуры данных в Прологе объявляются в разделе domains. Если термы структуры относятся к одному и тому же типу доменов, то этот объект называется однодоменной структурой данных. Если термы структуры относятся к разным типам доменов, то такая структура данных называется многодоменной структурой данных. Использование доменной структуры упрощает структуру предиката.
Аргументами составного терма данных могут быть простые типы данных, составные термы или списки.
Синтаксически составной терм выглядит так же, как и предикат: у терма есть функтор и список аргументов, заключенных в круглые скобки.
Составной терм может быть унифицирован с простой переменной или составным объектом (при этом переменные могут быть использованы как часть внутренней структуры терма). Это означает, что составной объект можно использовать для того, чтобы передавать целый набор значений, как единый объект, а затем применять унификацию для их разделения.
Пример 24: Необходимо создать БД, содержащую сведения о книгах из личной библиотеки. Зададим составной терм с именем personal_library, имеющим следующую структуру: personal_library= book (title, author, publisher, year), и предикат collection (collector, personal_library). Терм book называется функтором структуры данных. Пример программы, использующей составные термы для описания личной библиотеки, и поиска информации о владельцах книг и книгах, напечатанных в 1990 году, а также книги, изданной позже всех остальных, выглядит следующим образом:
domains
collector, title, author, publisher = symbol
year = integer
personal_library = book (title, author, publisher, year)
predicates
collection (collector, personal_library)
q1(year)
q2
facts
dq1(collector, title, year)
max_year(title, author, year)
clauses
collection (irina, book («Using Turbo Prolog», «Yin with Solomon», «Moscow, World», 1993)).
collection (irina, book («Логическое программирование и Visual Prolog», «А.Адаменко, А.Кучуков», «Санкт-Петрбург, БХВ- Петрбург», 2003)).
collection (petr, book («The art of Prolog», «Sterling with Shapiro», »Moscow, World», 1990)).
collection (anna, book («Prolog: a relation language and its applications», «John Malpas», »Moscow, Science», 1990)).
В данном случае переменная Y используется для унификации части составного терма.Если цель задать в виде:
collection (X, Z),Z=book( Y,_, _, 1990), то простая переменная Z унифицируется с сотавным термом book.
Представление данных часто требует наличия большого числа структур. В Прологе эти структуры должны быть описаны. Для более компактного описания структур данных в Прологе предлагается использование альтернативных описаний доменов.
Пример 25: Необходимо создать БД, содержащую сведения о книгах и аудиозаписях из личной библиотеки.
domains
person, title, author, artist, album, type = symbol
thing = book (title, author); record (artist, album, type)
predicates
owns (person, thing)
clauses
owns (irina, book («Using Turbo Prolog», «Yin with Solomon»)).
owns (petr, book («The art of Prolog», «Sterling with Shapiro»)).
owns (anna, book («Prolog: a relation language and its applications», «John Malpas»)).
owns (irina, record («Elton John», «Ice Fair», «popular»)).
owns (petr, record («Benny Goodman», «The King of Swing», »jazz»)).
owns (anna record («Madonna», «Madonna», «popular»»)).
goal
owns (X, record(_, _, «jazz»)
Visual Prolog позволяет конструировать многоуровневые составные термы. Например, в терме record («Elton John», «Ice Fair», «popular») вместо фамилии артиста можно использовать новую структуру, которая будет описывать артиста более детально:
artist=art(family,name),
family,name=symbol,
при этом терм будет выглядеть следующим образом: record (art(“Elton”,”John”),«Ice Fair», «popular»).