Шаг 37.
Основы логического программирования.
Определение составных смешанных доменов

    На этом шаге мы рассмотрим определение составных смешанных доменов.

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

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

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

    В следующем примере предложение уо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*
    Звездочка (*) обозначает, что classes - это список идентификаторов. Так же просто объявить список целых:
   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 обратите внимание, что список может вообще не иметь элементов.

    На следующем шаге мы рассмотрим повтор.




Предыдущий шаг Содержание Следующий шаг