Студопедия

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

Разделы сайта

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






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






    Функторы представляют собой составные объекты программы на Прологе. Они позволяют структурировать данные для удобства их представления и обработки. Функторы объявляются в разделе 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).






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.