logo search
TurboProlog / Документация / TOM_1

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

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

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

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

типа возраст, который может иметь тип 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.