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

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

    Рассмотрим, как определяются составные домены. После компиляции программы, которая содержит следующие отношения:

   owns(john,book("From Here to Eternity","James  Jones")).
и
   owns(john,horse(blacky)).
вы должны послать системе запрос в следующем виде:
   owns(john,X).

    Переменная X может быть связана с различными типами объектов: книга, лошадь и, возможно, другими объектами, которые вы определите. Отметим, что теперь вы не можете более использовать старое определение предиката owns:

   owns(symbol,symbol)

    Второй элемент более не является объектом типа symbol. Вместо этого вы можете дать новое определение этого предиката:

   owns(name,articles)

    Домен articles в разделе domains можно описать так:

   domains
      articles=book(title,author); 
      horse(name)% Articles - это books или horses
      title,author,name=symbol

    Точка с запятой читается как "или". В этом случае возможны два варианта: книга будет определяться своим заглавием и автором, а лошадь будет распознаваться своим именем. Домены title, author и name имеют стандартный тип symbol.

    К определению домена легко могут быть добавлены другие варианты. Например, articles может также включать лодку, дом, чековую книжку. Лодку можно определить функтором без присоединенных к нему аргументов. С другой стороны, вы можете включить платежный баланс, как часть чековой книжки. Определение домена articles расширится до:

  Articles=book(title,author); 
                horse(name);
                boat;
                bankbook(balance)
  title,author,name=symbol 
  balance=real

    Ниже приведена полная программа pro36_1.pro, которая показывает, как составные объекты из домена articles могут использоваться в фактах, которые определяют предикат owns.

   domains
      articles=book(title,author);
      horse(name);
      boat;
      bankbook(balance)
      title,author,name=symbol 
      balance=real
   predicates
      owns(name,articles)
   clauses
      owns(john,book("A friend of the  family","Irwin Shaw")).
      owns(john,horse(blacky)).
      owns(john,boat).
      owns(john,bankbook(1000)).
    Текст этой программы можно взять здесь.

    А теперь загрузите программу в Пролог и запустите ее, задав цель:

   owns(john,Thing).
    Пролог ответит:
   Thing=book("A friend ot the family","Irwin Shaw")
   Thing=horse("blacky") 
   Thing=boat
   Thing=bankbook(1000) 
    4 решения

    Ниже дано общее представление о том, как декларировать домены для составных объектов:

    domain=alternative1 (D Name,D Name, ...); alternative2(D Name,D Name, ...); ...

    Здесь alternative1 и aiternative2 - допустимые (но различные) функторы. Запись (D, D, ...) представляет список имен доменов, которые объявлены где-то в программе или являются стандартными типами доменов (такими как symbol, integer, real и др.). Необязательные параметры Name могут использоваться для комментария имен аргументов; они будут игнорироваться компилятором.


    Замечания:

Многоуровневые составные объекты

    Пролог позволяет конструировать составные объекты на нескольких уровнях. Например, в:

   book("The Ugly Duckling","Andersen")
вместо фамилии автора вы можете использовать новую структуру, которая описывает автора более детально, включая имя и фамилию. Вызывая функтор для нового объекта author (автор), вы можете изменить описание книги на:

   book("The Ugly Duckling", author("Hans Christian", "Andersen"))

    В старом определении домена

   book(title,author)
вторым аргументом функтора book был author. Но старое определение
   author=symbol
может включать только одно имя, а этого уже недостаточно. Определим теперь author, как составной объект, состоящий из имени и фамилии автора.

    Это достигается с помощью декларации следующего домена:

   author=author(first_name,last_name)
что приводит к следующим определениям:
   domains
      articles=book(title,author);         % Первый уровень
      author=author(first_name,last_name)	% Второй уровень
      title,first_name,last_name=symbol	% Третий уровень

    При использовании составных объектов со многими уровнями часто помогает такое "дерево" (рис.1):


Рис.1. Дерево многоуровневого составного объекта

    Декларация домена объявляет только один уровень дерева, а не целое дерево. Например, book не может быть описана таким предложением:
   domains
      book=book(title,author(first_name,last_name)) %  Неправильно

    Рассмотрим в качестве еще одного примера составных объектов грамматический разбор структуры предложения:

    У Элен есть книга.

    Наиболее простая структура английского предложения состоит из существительного и группы сказуемого:

    предложение =предложение(существительное,группа_сказуемого)

    Существительное - это просто слово:

    существительное=существительное(слово)

    А группа сказуемого состоит из глагола и группы существительного или из одного глагола.

    группа_сказуемого=группа_сказуемого(глагол,существительное);
    глагол = глагол(слово)

    Используя эти определения доменов (предложение, существительное, сказуемое и глагол), предложение у Элен есть книга будет записано:

    предложение(существительное(Элен),группа_сказуемого(глагол(имеет),существительное(книга)))


Рис.2. Дерево предложения

    Соотнетствующее дерево представлено на рис. 2.

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




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