- •1. Введение в декларативные языки.
- •Прозрачность по ссылкам.
- •Логическое программирование
- •Правила
- •Примеры
- •Рекурсивные определения
- •Литература
- •Синтаксис пролога.
- •Структуры
- •Предикаты
- •Семантика пролога
- •Как происходит сопоставление
- •Алгоритм Эрбрана
- •Алгоритм вычисления целей(работы пролог машины).
- •Процедурный смысл правил
- •Использование списков и
- •Использование накапливающего параметра(прием)
- •Операторная запись
- •Управление перебором
- •Алгоритмы сортировки
- •1 Пузырьковая сортировка
- •Сортировка вставками
- •Быстрая сортировка.
- •Использование предикатов, анализирующих типы или структуру термов
- •Применение подстановки к структурированному терму
- •Недетерминированное программирование
- •Метод «породить и проверить»
- •Алгоритм сортировки
- •Программирование второго порядка
- •Рассмотрим, как работать с базой данный
- •Поиск в глубину
- •Темы кр
- •Использование формальных языков
- •Недетерминированный конечный автомат
- •Ввод и вывод
- •Рассмотрим ввод вывод алфавитно – цифровых символов
- •Функциональное программирование
- •Базовый язык
- •Рекурсивное определение функций
- •Функции высших порядков
- •Отображение списков
- •Декартово произведение множеств
- •Композиция функций.
- •Бесконечные списки
- •Рассмотрим как можно исп беск списки.
- •Метод породить и проверить
- •Сети связанных процессов
- •Определение ф чисел фибоначи
- •Задача хэмминга
- •Решето Эратосфена
- •Язык типов
- •Рассмотрим алгебраические типы данных.
- •Деревья – рекурсивные типы данных
- •Сделать дерево плоским
- •Удаление элемента дерева
- •Извлечение самого правого элемента
- •Функция форматирования числа
- •Законы функциональных программ
- •Наиболее важные законы функц программ доказываются по индукции
- •Закон map через foldr
- •Закон: композиция
- •Коммутативна
- •Дистрибутивность map относительно композиции:
- •Преобразование программ
- •Пример1
- •Стратегия для композиции
- •Приведение рекурсивной формы к итеративной форме
- •Введение в лямбда исчисление
- •Синтаксис лямбда исчисления
- •Множество связанных переменных
- •Множество свободных переменных
- •Подстановка
- •Конфликт имен(захват переменных)
- •Преобразование термов
- •Вторая теорема Черча – Россера “Теорема о стандартизации”
- •Комбинатор y
- •Вычислим fact 3
- •Вычислим fact 0
- •(Рассказ про y комбинатор – сразу зачёт)
Применение подстановки к структурированному терму
substitute(St1, T1, St2, T2)
?-substitute(sin(x), 2*sin(x)*f(sin(x)),t,F).
F=2*t*f(t).
St1 – подтерм, который нужно заменить в выражении, терме T1 на подтерм St2 и результатом будет терм T2.
Sinx меняем на Т и результат будет F.
Теперь определим рекурсивно эту процедуру.
Базовый случай. Первый аргумент такой же. Результат – терм на который нужно менять. Иначе (отрицание) если 1 и 2 арг не совпали, но выражение в котором мы делаем подстановку атомарно, оно возвращается без изменения. Результатом будет исх выр. Иначе нужно разобрать выр T1, получ фуктор и его аргумент, каждому аргументу применить подставновку, дляэтого еще одна функция substList (для списка подстановка) и далее из результатов и того же функтора F нужно собрать результат T2.
substitute(T1, T1, T2, T2):- !.
substitute(_, T, _, T):-
atomic(T), !.
substitute(ST1, T1, ST2, T2):- T1 =.. [F|Args],
substList(ST1,Args,ST2,Args2),
T2 =.. [F|Args2].
substList
Обр 2 аргумент список, каждому элементу списка применяет подстановку, и в рез – е получаем список термов к которым была применена подстановка. Когда список пуст – результат пустой список.
substList(St1,[T1|Ts1],St2,[T2|Ts2]):-
substitute(St1, T1, St2, T2),
substList(St1,Ts1,St2,Ts2).
substList(_,[],_,[]).
Можно решать задачи алгебры с помощью substitute ….
Есть и другие способы работы со структурами. Они исп когда нужно извлечь один функтор или один из компонентов структуры.
Встроенный предикат functor /3 позволяет вставлять или извлекать функтор.
Если мы вызовем цель
?- functor(Term, F,N).
То он будет истинен если F главный функтор Терма Term(самый внешний), а N арность этого терма.
?- functor( line(pnt(10,10), pnt(20,20)), F, N ).
F = line
N=2
Так мы можем извлечь функтор и его арность.
Есть еще предикат
?- arg(N, Term, A)
который позволяет работать с аргументами структуры. Он истинен если А явл Nным аргументом в терме Term. Мы можем к арг обр по номеру.
?- arg(2, f(x,t(a), t(b)), Y)
1 2 3
Аргументы считаются с единицы!
Y=t(a) – ответ.
Этими предикатами можно собрать структуру.
Рассмотрим как собрать структуру дата.
Переменная Д получает функтор …
?- functor(Д, Дата, 3),
Arg(1,Д,13),
Arg(2,Д,март),
Arg(3,Д,1999).
Когда выполнена первая цель
Д=дата( _5, _6, _7) (локальные переменные, переименованные)
Д=дата(13,6, _7).
Д=дата(13,март, _7).
Д=Дата(13,март,1999).
Есть еще возможность – термы, построенные рассмотренными нами способами можно вызывать как предикаты. Мы можем построить программу на прологе с помощью другой программы а потом выполнить (динамически построить).
Пример.
Программа строит цель а потом запускает ее на выполнение.
Выбрать(Функтор),
Вычислить(список аргументов),
Цель =.. [Функтор| список Arg],
Вызываем(Цель).
Для вызова цели есть встроенный предикат call /1.
В каестве примера рассмотрим процедуру Map, которая отображает список через любую функцию.
1 сточка – правило которое реализует функцию увеличение на единицу.
Map берет имя предиката, который моелирует функцию,функтор арности 2,берет список, и в рез-е троит новый список
Рассмотрим определение map,когда….
Если есть голова, к ней прим функцию. Строим цель. F-та функция, …будем применять. X- голова, Yрезульт голова, вызываем цель call, и далее продолж отображать хвост тобы получить хвост результата. Если список пуст то и результат пустой список.
Inc(X,Y):- Y is X+1.
map(F,[X|Xs],[Y|Ys]):-
Goal =..[F,X,Y],
Call(Goal),
map(F,[Xs],[Ys]).
map(_,[],[]).
?-map(inc,[1,2,3],X).
X=[2,3,4]