На этом шаге мы рассмотрим объявление составных доменов.
Рассмотрим, как определяются составные домены. После компиляции программы, которая содержит следующие отношения:
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")
book("The Ugly Duckling", author("Hans Christian", "Andersen"))
В старом определении домена
book(title,author)
author=symbol
Это достигается с помощью декларации следующего домена:
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. Дерево многоуровневого составного объекта
domains
book=book(title,author(first_name,last_name)) % Неправильно
Рассмотрим в качестве еще одного примера составных объектов грамматический разбор структуры предложения:
У Элен есть книга.
Наиболее простая структура английского предложения состоит из существительного и группы сказуемого:
предложение =предложение(существительное,группа_сказуемого)
Существительное - это просто слово:
существительное=существительное(слово)
А группа сказуемого состоит из глагола и группы существительного или из одного глагола.
группа_сказуемого=группа_сказуемого(глагол,существительное);
глагол = глагол(слово)
Используя эти определения доменов (предложение, существительное, сказуемое и глагол), предложение у Элен есть книга будет записано:
предложение(существительное(Элен),группа_сказуемого(глагол(имеет),существительное(книга)))
Рис.2. Дерево предложения
На следующем шаге мы рассмотрим определение составных смешанных доменов.