- •Лабораторная работа №4
- •Теоретическая часть
- •1. Простые объекты данных
- •1.1. Переменные как объекты данных
- •1.2. Константы как объекты данных
- •2. Составные объекты данных и структуры
- •2.1.Унификация составных объектов
- •2.2. Использование знака равенства для унификации составных объектов
- •2.3. Использование нескольких значений как единого целого
- •2.4. Объявление составных объектов
- •2.5. Многоуровневые составные объекты
- •Практическое задание
- •Контрольные вопросы
2.3. Использование нескольких значений как единого целого
Составные объекты могут рассматриваться в предложениях Пролога как единые объекты, что сильно упрощает написание программ. Рассмотрим, например факт:
owns(john, book(“From Here to Eternity”, “James Jones”)).
в котором утверждается, что у Джона есть книга “From Here to Eternity” («Отсюда в вечность»), написанная James Jones (Джеймсом Джонсом). Аналогично можно записать:
owns(john, horse(blacky)).
что означает:
John owns a horse named Blacky. (Y Джона есть лошадь Блэки).
Составными объектами в этих двух примерах являются:
book(“From Here to Eternity”, “James Jones”)
и
horse(blacky)
Если вместо этого описать только два факта:
owns(john, “From Here to Eternity”).
owns(john, blacky).
то нельзя было бы определить, является ли blacky названием книги или именем лошади. С другой стороны, можно использовать первый компонент составного объекта – функтор для распознавания различных объектов. Этот пример использует функторы book и horse для указания разницы между объектами.
Составные объекты состоят из функтора и объектов, принадлежащих этому функтору, например: functor(object1, object2, …, objectN).
2.4. Объявление составных объектов
После компиляции программы, которая содержит следующие отношения:
owns(john, book(“From Here to Eternity”, “James Jones”)).
owns(john, horse(blacky)).
задайте вопрос в следующем виде:
owns(john, X).
Переменная X может быть связана с различными типами объектов: книга, лошадь и, возможно, другими объектами, которые вы определите. Отметим, что теперь нельзя объявлять предикат owns в виде:
owns(symbol, symbol)
Второй объект не является объектом типа symbol. Вместо этого можно дать новое определение этого предиката:
owns(name, articles)
Домен articles и разделе domains можно описать так:
Domains
articles = book(title, author); horse(name)
% articles – это books или horses
title, author, name = symbol
Точка с запятой читается как «или». В этом случае возможны два варианта: книга будет определятся своим заглавием и автором, а лошадь будет распознаваться своим именем. Домены title, author и name имеют стандартный тип symbol.
К определению домена легко могут быть добавлены другие варианты. Например, articles может также включать лодку, дом, чековую книжку. Лодку можно определить определением функтора без присоединения к нему аргументов. С другой стороны, можно включить платежный баланс как часть чековой книжки. Определение домена articles расширится до:
articles = book(title, author); horse(name);
boat; bankbook(balance)
title, author, name = symbol
balance = real
Общий вид декларирования составных доменов можно представить следующим образом:
domain = alternative1(D Name, D Name, …);
alternative2(D Name, D Name, …);
… … …
Здесь alternative1 и alternative2 – допустимые (но различные) функторы. Запись (D, D, …) представляет список имен доменов, которые объявлены где-то в программе или являются стандартными типами доменов (таких как symbol, integer, real и др.). Необязательные параметры Name могут использоваться для комментария имен аргументов; они будут игнорироваться компилятором.
Замечание.
Альтернативы разделяются точкой с запятой.
Каждая альтернатива состоит из функтора и, возможно, списка доменов соответствующих аргументов.
Если функтор не имеет аргументов, можно записать в программе alternativeN или alternativeN().
