Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Составные объекты данных и функторы

Составные объекты данных позволяют рассматривать некоторые части ин-

формации как единое целое таким образом, чтобы можно было легко рассмат-

ривать их и раздельно. Рассмотрим, например, дату Апрель 2,1988. Она сос-

тоит из трех частей информации - месяц, день и год - но было бы полезным

рассматривать все это как древовидную стуктуру :

ДАТА

/ | \

Апрель 2 1988

Вы можете сделать это, записав составной объект следующим образом:

дата("Апрель",2,1988)

Такая запись выглядит как факт Пролога, но это не так - это объект

данных который вы можете обрабатывать наряду с символами и числами. Он

начинается с имени, или функтора (в данном случае дата), за которым сле-

дуют три аргумента.

Обратите внимание, что функтор в Турбо Прологе не то же самое, что

функция в других языках программирования. Функтор не обозначает, что бу-

дут выполнены какие-либо вычисления. Это просто имя, которое определяет

вид составного объекта данных, и объединяет вместе свои аргументы.

Аргументы составного объекта данных могут сами быть составными объ-

ектами. Например, вы можете рассматривать чей-нибудь день рождения, как

информацию со следующей структурой:

ДЕНЬ РОЖДЕНИЯ

/ \

/ \

человек дата

/ \ / | \

"Джо" "Джонс" "Авг." 20 1918

На Прологе вам придется записать это следующим образом:

день_рождения(человек("Джо","Джонс"),дата("Авг.",2,1918))

У составного объекта в этом примере есть две части: объект чело-

век("Джо","Джонс") и объект дата("Авг.",20,1918). Функторами для этих об-

ъектов будут человек и дата.

Унификация составных объектов.

Составной объект может быть унифицирован с простой переменной, или с

составным объектом, который соответствует ему (возможно содержащим пере-

менные в качестве частей во внутренней структуре). Это означает, что мож-

но использовать составной объект для того, чтобы передавать целый набор

значений как единый объект, и затем использовать унификацию для их разде-

ления. Например :

дата("Апрель",2,1988)

сопоставляется с Х и присваивает Х значение дата("Апрель", 2, 1988).

Также,

дата("Апрель",2,1988)

сопоставляется с дата(Мес,Чис,Год) и присваивает переменным Мес "Апрель"

Чис 2 и Год 1988. Некоторые примеры программ с составными объектами при-

ведены в следующем разделе.

Использование знака равенства для унификации составных объектов.

Турбо Пролог осуществляет унификацию в двух случаях. Первое - при

вызове цель сопоставляется с заголовком предложений. Второе - через знак

равенства, который является инфиксным предикатом (предикатом, который

расположен между своими аргументами, а не перед ними).

Турбо Пролог делает необходимым присваивание для унификации объектов

по разные стороны знака равенства. Это свойство полезно для нахождения

значений аргументов составного объекта. Например, следующая программа

проверяет совпадают ли фамилии у двух людей, и затем дает второму челове-

ку тот же адрес, что и у первого.

/* Программа CH06EX01.PRO */

domains

человек =человек(фио,адрес)

имя =фио(имя,фамилия)

адрес =адрес(улица,город,штат)

улица =(номер,название)

город,страна,название =string

имя,фамилия =string

номер =string

goal

P1 = человек(фио(джим,мос),адрес(улица(5,"Восточная"),igo,

"Калифорния")),

P2 = человек(имя(_,мос),Адрес),

P2 = человек(имя(жанна,мос),Адрес),write(P2).

Соседние файлы в папке Документация