На этом шаге мы рассмотрим определение составных смешанных доменов.
В этом разделе мы обсудим различные типы определений доменов, которые можно добавлять к программам. Эти объявления позволят использовать предикаты, которые имеют возможность:
Для того чтобы позволить предикатам получать аргументы, которые содержат информацию различных типов, вам нужно добавить описание функтора.
В следующем примере предложение уоur_age (ваш возраст) получает аргумент типа age (возраст), который может иметь тип 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% He разрешено
Предположим, вы хотите заполнить расписание занятий по различным предметам, которые могут проводить разные преподаватели. Вы можете написать следующую программу:
predicates
teacher(symbol First_name,symbol Last_name,symbol Class)
% учитель(имя,фамилия,класс)
clauses
teacher(ed,willis,englishl).
teacher(ed,willis,mathl).
teacher(ed,willis,historyl).
teacher(marу,maker,history2).
teacher(marу,maker,math2).
teacher(chris,grahm,geometry).
Здесь вы должны повторять имя учителя для каждого предмета, который он или она ведет. Для каждого предмета вам приходится добавлять факт к базе данных. Хотя это и совершенно правильно в такой ситуации, но можно найти школу, где преподают сотни предметов; такой тип данных становится слишком сложным. Здесь было бы удобно создать аргумент для предиката, который содержит одно или несколько значений.
Список в Прологе - это как раз то, что нужно. В следующей программе аргумент class (класс) имеет тип "список". Мы покажем здесь, как список представляется в Прологе, а предикаты, работающие со списками, опишем на шаге 42.
domains classes=symbol* % объявляем домен-список predicates teacher(symbol First,symbol Last,symbol Classes) % имя,фамилия,предметы clauses teacher(ed,willis,[englishl,mathl,historyl]). teacher(marу,maker,[history2,math2]). teacher(chris,grahm,[geometry]).
В этом примере текст программы более краток и понятен, чем в предыдущем. Обратите внимание на определение домена:
domains classes=symbol*
domains integer_list=integer*
После того, как домен определен, его очень просто использовать; поместите его в аргумента в предикат в разделе predicates. Ниже приведен пример использования списка целых:
domains
integer_list=integer*
predicates
test_scores(symbol First,symbol Last,integer_list Test_Scores)
/*список_результатов(имя,фамилия,список_результатов */
clauses
test_scores(lisa,lavender,[86,91,75]).
test_scores(libby,dazzner,[79,75]).
test_scores (jeff,zheutlin,[]).
В случае jeff zheutlin обратите внимание, что список может вообще не иметь элементов.
На следующем шаге мы рассмотрим повтор.