Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Функторы и альтернативные домены
Функторы представляют собой составные объекты программы на Прологе. Они позволяют структурировать данные для удобства их представления и обработки. Функторы объявляются в разделе 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).
|