Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Функторы и альтернативные домены






Функторы представляют собой составные объекты программы на Прологе. Они позволяют структурировать данные для удобства их представления и обработки. Функторы объявляются в разделе domains следующим образом:

domains

имя_функтора=тип (типы аргументов)

Одна из наиболее важных задач, для которых применяются функции в программах на Прологе - объявление аргументов предикатов, которые в разных случаях могут принимать значения разных типов. В этом случае необходимо объявить набор функторов, называемых альтернативным доменом:

domains

альтернативный_домен = функтор_1 (типы аргументов);

функтор_2 (типы аргументов);

функтор_n (типы аргументов).

Если затем указать «альтернативный домен» в качестве типа аргумента при объявлении предиката (в разделе predicates), то в качестве аргумента предиката можно будет указывать любой из функторов «функтор_1»,..., «функтор_n».

Пример:

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

Предположим, что оплата по проектам П70 и П100 производится в долларах, а по проектам П20 и П120 - в рублях. Тогда факты базы данных, описывающие проекты, могут иметь следующий вид (рис. 8):

clauses

proekt (" P20", " Rubin", rub(700, “10.09.2011”)).

proekt (" P100", " Vektor ", doll(1400)).

proekt (" P70", " Gorizont", doll(500)).

proekt (" P120", " Kristall", rub(1100, “12.10.2011”)).

 

Рис. 8. Факты базы данных, описывающие проекты.

 

Здесь rub и doll - функторы. Конечно, можно использовать и любые другие имена. Альтернативный домен, включающий функторы rub и doll, должен быть объявлен следующим образом (рис. 9):

domains

oplata=rub (integer, string);

doll (integer)

 

Рис. 9. Альтернативный домен, включающий функторы rub и doll.

 

Здесь oplata - имя альтернативного домена (можно использовать и любое другое имя).

Предикат proekt, в котором используется альтернативный домен oplata, должен быть объявлен в разделе predicates следующим образом (рис. 10):

predicates

nondeterm proekt (string, string, oplata)

 

Рис. 10. Объявление предиката proekt.

 

Такое объявление означает, что третьим аргументом предиката proekt может быть любой функтор, входящий в альтернативный домен oplata, т.е. rub или doll.

Примечание. При работе с функторами важно не путать их с предикатами. Функтор - не предикат, а элемент данных; он является аргументом предиката. Объединение нескольких элементов данных с помощью функтора никогда не означает какой-либо операции над ними. Стандартных функторов, а также зарезервированных слов, связанных с функторами, в Прологе нет.

Ввод функтора может выполняться стандартным предикатом readterm (тип, имя_переменной). Здесь «тип» - альтернативный домен, указанный в разделе domains (для рассмотренного примера - oplata). «Имя_переменной» - переменная, с которой связывается функтор. Функтор вводится в точном соответствии с его объявлением: указывается имя функтора (в рассмотренном примере - rub или doll) и его аргументы.

Пример:

Программа для поиска всех проектов, оплачиваемых в рублях (с указанием заказчика и стоимости контракта) (рис. 11).

domains

oplata=rub (integer, string);

doll (integer)

 

predicates

nondeterm proekt (string, string, oplata)

nondeterm poisk

 

goal

poisk.

 

clauses

proekt (" P20", " Rubin", rub(700, “10.09.2011”)).

proekt (" P100", " Rubin", doll(1400)).

proekt (" P70", " Горизонт", doll(500)).

proekt (" P120", " Kristall", rub(1100, “12.10.2011”)).

 

poisk: - proekt (N, Naz, rub (Opl, _)),

write (N, " ", Naz, " ", Opl), nl, fail. poisk. % объявление переменных.

 

Рис. 11. Программа для поиска всех проектов, оплачиваемых в рублях.

 

При доказательстве целевого предиката poisk сопоставление предиката proekt (N, Naz, rub (Opl, _)) с фактами proekt выполняется успешно только в том случае, если третьим аргументом факта proekt является функтор rub. Для вывода всех желаемых проектов используется механизм искусственного возврата (fail).


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал