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

Упражнения.

1. Напишите подходящие определения доменов с использованием состав-

ных объектов которые могут быть использованы в каталоге музыкальных

пьес. Типичное содержимое каталога:

Пьеса : Вестсайдская история

Текст : Стефан Сондхейм

Музыка: Леонард Бернштейн

2. Используя составные объекты везде, где возможно, напишите прог-

рамму на Турбо Прологе, поддерживающую базу данных о сенаторах США.

Данные должны включать имя и фамилию сенатора, штат и партию, размер

представительства, дату выборов, и запись голосований на десять за-

конопроектов. Или (если вы не знакомы с сенаторами США) используйте

любую политическую (или любую другую) организацию, с которой вы зна-

комы.

Определения составных смешанных доменов.

В этом разделе мы обсудим различные типы определений доменов, кото-

рые можно добавлять к программам. Эти объявления позволят использовать

предикаты, которые:

1. Имеют возможность получать аргумент более чем одного типа.

2. Получать различное количество аргументов, все одного типа.

3. Получать различное количество аргументов, каждый из которых может

иметь свой тип.

Аргументы множественных типов.

Для того, чтобы позволить предикатам Турбо Пролога получать аргумен-

ты которые содержат информацию разных типов, вам нужно добавить описание

функтора. В следующем примере предложение ваш_возраст получает аргумент

типа возраст, который может иметь тип string, real или integer.

domains

age = i(integer); r(real); s(string)

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 = integer; real; string

Списки

Предположим, вы сохраняете различные предметы, которым может обучать

преподаватель. Вы можете написать следующую программу:

predicates

teacher(symbol,symbol,symbol) /* учитель(имя,фамилия,предмет)*/

domains

teacher(ed,willis,english1).

teacher(ed,willis,math1).

teacher(ed,willis,history1).

teacher(mary,maker,history2).

teacher(mary,maker,math2).

teacher(chris,grahm,geometry).

Здесь вы должны повторять имя учителя для каждого предмета, который

он или она ведет. Для каждого предмета вам приходится добавлять факт к

базе данных. Хотя это и совершенно правильно в такой ситуации, но можно

найти школу, где преподают сотни предметов; такой тип данных становится

слишком сложным. Здесь было бы полезным, если бы можно было создать аргу-

мент для предиката, который содержит одно или несколько значений.

Список в Прологе - это как раз то, что нужно. В следующей программе

аргумент класс имеет тип список. Мы покажем здесь, как список представля-

ется в Прологе, а предикаты, работающие со списками, опишем в Главе 8.

domains

classes = symbol* /* объявляем домен-список */

predicates

teacher(symbol,symbol,classes) /* имя фамилия предмет */

clauses

teacher(ed,willis, [ english1,math1,history1 ]).

teacher(mary,maker, [ history2,math2 ]).

teacher(chris,grahm, [ geometry ]).

В этом примере текст программы более краток и понятен, чем в преды-

дущем. Обратите внимание на определение домена:

domains

classes = symbol*

звездочка (*) обозначает, что classes-это список символов. Так же просто

можно объявить список целых:

domains

список_целых = integer*

После того, как домен определен, его очень просто использовать по-

местите его в качестве аргумента в предикат в секции predicates. Здесь

приведен пример использования списка целых:

domains

integer_list = integer*

predicates

test_scores(symbol,symbol,integer_list) /* первый, последний,

исходный список */

clauses

test_scores(lisa,lavender,[86, 91, 75]).

test_scores(libby,dazzner, [79, 75]).

test_scores(jeff,zheutlin, []).

В случае Jeff Zheutlin обратите внимание, что список может вообще не

иметь элементов.

Замечание: списки описаны более детально в Главе 8.

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