Опубликован: 12.02.2014 | Доступ: свободный | Студентов: 818 / 236 | Длительность: 11:22:00
Специальности: Программист
Лекция 7:

Списки. Предикаты высших порядков

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Аннотация: В классе list языка Visual Prolog определено большое количество предикатов обработки списков. Среди них имеются предикаты высших порядков. В данной лекции обсуждаются предикаты класса list. Вводятся анонимные предикаты. Рассматриваются алгоритмы сортировки. Списки используются для моделирования множеств и операций над ними.
Ключевые слова: visual

В классе list языка Visual Prolog определено большое количество предикатов обработки списков. Это предикаты, вычисляющие длину списка, максимальный и минимальный элементы списка, предикаты удаления дубликатов из списка, предикаты обращения списка, предикаты сортировки списка и многие другие. Среди них имеются предикаты высших порядков.

В данной главе обсуждаются предикаты класса list. Вводятся анонимные предикаты. Рассматриваются алгоритмы сортировки. Кроме этого, списки используются для моделирования множеств и операций над ними.

7.1. Анонимные предикаты

Анонимные предикаты соответствуют \lambda-выражениям. Определение анонимного предиката заключается в фигурные скобки. Это определение должно состоять только из одного предложения, при этом в заголовке правила отсутствует имя предиката, пишутся только его аргументы. Заголовок может быть пустым.

Например, \lambda-функции \{(X)=X + 1\} соответствует анонимный предикат \{(X) = X + 1\}, а \lambda-выражению \lambda x\lambda y.x > y — анонимный предикат \{(X, Y):- X > Y\}. Выражение в фигурных скобках может использоваться непосредственно, в виде \{(X, Y):- X > Y}(2, 3), а также может быть присвоено переменной:

run():-
    write({(X) = X + 1}(3)), nl,
    F = {(X, Y):- X > Y},
    if F(2^10, 3^7) then write("yes") else write("no") end if,
    _ = readLine().

Анонимные предикаты можно определять как в функциональном стиле, так и в предикатном стиле, как это было показано выше. Они могут быть как детерминированными, так и недетерминированными. Их особенность заключается в том, что все их аргументы должны быть входными.

Анонимные предикаты принадлежат соответствующим предикатным доменам и могут использоваться в аргументах предикатов высших порядков. Например:

domains
   op = (real, real) -> real.
class predicates
    fun: (string) -> op.
clauses
    fun("+") = {(X, Y) = X + Y}:- !.
    fun("*") = {(X, Y) = X * Y}:- !.
    fun(_) = {(X, _) = X}.

    run():-
        write(fun("+")(3, 6) / fun("*")(1.5, 3)), 
    _ = readLine().

Функция pred возвращает функции, определенные на множестве элементов домена real. Анонимные предикаты могут быть вложенными (подробнее об анонимных предикатах и их использовании см. [18]).

7.2. Предикаты высших порядков

Предикаты высших порядков — это предикаты, среди аргументов которых имеются другие предикаты. Например, ниже используются предикаты второго порядка, определенные в классе list:

run():-
    write(list::map([1, 2, 3, 4, 5], {(X) = X + 2})), nl,
    write(list::filter([1, 2, 3, 4, 5], {(X):- X mod 2 = 0})), 
    _ = readLine().

Предикат map преобразует список поэлементно, в данном случае он увеличивает значение каждого элемента списка на 2. Предикат filter/2 оставляет в списке элементы, удовлетворяющие некоторому критерию. В данном случае он оставляет в списке только четные элементы. В каждом случае создается новый список, который возвращает предикат. Анонимный предикат, определение которого находится прямо в аргументе каждого из этих предикатов, в первом случае является процедурным (он определен в виде функции), а во втором — детерминированным.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Жаныл Айкын
Жаныл Айкын
Rustam Inatov
Rustam Inatov

Доброго времени суток, подскажите пожалуйста, visual prolog examples, pie, vip7.5 - это все, где я могу скачать? (в смысле) может быть на сайте есть какой-то архив? Увы я не нашел его.

Подскажите, пожалуйста.

С уважением, Рустам.