Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Новые_лекции_СИИ.doc
Скачиваний:
390
Добавлен:
16.03.2015
Размер:
1.11 Mб
Скачать

3.2.9 Использование составных термов

В Прологе функциональный терм или предикат можно рассматривать как структуру данных, подобную записи в языке Паскаль. Терм, представляющий совокупность термов, называется составным термом или структурой. Составные структуры данных в Прологе объявляются в разделе 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)).

%q1(Y):- collection (C, book( T,_, _, Y), write(C,’ ‘,T,’ ‘, Y), nl, fail.

q1(Y):- dq1(C, T, Y), write(‘*’,C,’ ‘,T,’ ‘, Y), nl, fail.

q1(Y):- not(dq1(_,_,Y)), collection (C, book( T,_, _, Y), assert(dq1(C,T.Y)), write(X,’ ‘,T,’ ‘, Y), nl, fail.

max_year(a, b, 0).

q2:- collection (_, book(T,A, _, Y), max_year(T1,A1,Y1),Y>Y1, retract(max_year(T1,A1,Y1)), assert(max_year(T,A,Y)), fail.

Goal

%q1(1990).

%q1(1990);q1(1990).

q2;(max_year(T,A,Y).

В данном случае переменная 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 позволяет конструировать многоуровневые составные термы. Например, в терме recordElton John», «Ice Fair», «popular») вместо фамилии артиста можно использовать новую структуру, которая будет описывать артиста более детально:

artist=art(family,name),

family,name=symbol,

при этом терм будет выглядеть следующим образом: record (art(“Elton”,”John”),«Ice Fair», «popular»).