- •1. Введение в декларативные языки.
- •Прозрачность по ссылкам.
- •Логическое программирование
- •Правила
- •Примеры
- •Рекурсивные определения
- •Литература
- •Синтаксис пролога.
- •Структуры
- •Предикаты
- •Семантика пролога
- •Как происходит сопоставление
- •Алгоритм Эрбрана
- •Алгоритм вычисления целей(работы пролог машины).
- •Процедурный смысл правил
- •Использование списков и
- •Использование накапливающего параметра(прием)
- •Операторная запись
- •Управление перебором
- •Алгоритмы сортировки
- •1 Пузырьковая сортировка
- •Сортировка вставками
- •Быстрая сортировка.
- •Использование предикатов, анализирующих типы или структуру термов
- •Применение подстановки к структурированному терму
- •Недетерминированное программирование
- •Метод «породить и проверить»
- •Алгоритм сортировки
- •Программирование второго порядка
- •Рассмотрим, как работать с базой данный
- •Поиск в глубину
- •Темы кр
- •Использование формальных языков
- •Недетерминированный конечный автомат
- •Ввод и вывод
- •Рассмотрим ввод вывод алфавитно – цифровых символов
- •Функциональное программирование
- •Базовый язык
- •Рекурсивное определение функций
- •Функции высших порядков
- •Отображение списков
- •Декартово произведение множеств
- •Композиция функций.
- •Бесконечные списки
- •Рассмотрим как можно исп беск списки.
- •Метод породить и проверить
- •Сети связанных процессов
- •Определение ф чисел фибоначи
- •Задача хэмминга
- •Решето Эратосфена
- •Язык типов
- •Рассмотрим алгебраические типы данных.
- •Деревья – рекурсивные типы данных
- •Сделать дерево плоским
- •Удаление элемента дерева
- •Извлечение самого правого элемента
- •Функция форматирования числа
- •Законы функциональных программ
- •Наиболее важные законы функц программ доказываются по индукции
- •Закон map через foldr
- •Закон: композиция
- •Коммутативна
- •Дистрибутивность map относительно композиции:
- •Преобразование программ
- •Пример1
- •Стратегия для композиции
- •Приведение рекурсивной формы к итеративной форме
- •Введение в лямбда исчисление
- •Синтаксис лямбда исчисления
- •Множество связанных переменных
- •Множество свободных переменных
- •Подстановка
- •Конфликт имен(захват переменных)
- •Преобразование термов
- •Вторая теорема Черча – Россера “Теорема о стандартизации”
- •Комбинатор y
- •Вычислим fact 3
- •Вычислим fact 0
- •(Рассказ про y комбинатор – сразу зачёт)
Темы кр
Моделирование машины Тьюринга
Стр 320,
Книга 3. Логический подход к ИИ:от классической логики к классическмоу программированию.
Использование формальных языков
На прологе очень удобно разрабатывать новые языки, определять их лексику, синтаксис, семантику.
Мы рассмотрим что такое недетерминированный конечный автомат, как с его помощью распознаются строки на эмуляторном языке, это все исп для построения лексических анализаторов.
Недетерминированный конечный автомат
Многие задачи решаются представлением их терминов состояний и переходов в их состояниях.
Абстракция такого подхода отражена в идее конечного автомата. Автоматы легко представлять графически.
Пример ниже
Кружки – состояния автомата. Епсилон – переход.
Начальным состоянием явл то, в котрое входит стрелка ниоткуда.
Финальное состояние обозначается двойными кружками.
Переходы между состояниями обозначаются направленными дугами. Около дуги показан входной символ по которому переходит этот автомат.
По символу А из состояния0 можно перейти в 0 а можно и в первое состояние…
Из нулевого состояния по символу А можно перейти либо в первое состояние либо остаться в нулевом. Поэтому автомат недетерминированный.
В этом автомате есть переходы, помеченные символом ε. Он обозначает спонтанный переход. Автомат может сам по себе перейти из нулевого во второе состояние. Он может там побыть и вернуться назад в 0 состояние. Эти ε переходы тоже явл источником недетерминизма. Автомат может вести себя так или иначе. Каждый такой переход это возможность поступить двояка.
Как автомат распознает строки?
Если для данной строки есть путь по дугам, переходам автомата из каждого состояния финальное такое что последовательность меток дуг будет образовывать входную последовательность.
Если взять последовательность
aabab
Она принимается автоматом.
Из нулевого состояния по символу а мы переходим тоже в 0 состояние, по след а в ервое состояние, по b во второе. Далее спонтанно через эпсилон опять в нулевое по а в первое и по символу b во второе, он явл финальным. Эпсилон пустой символ который никак не влияет на последовательность.
Этот автомат можно писать фактами, представленными ниже.
Переход/3 для перехода по входному символу.
ε - переход /2, спонтанны переход.
переход(s0,a,s0).
переход(s0,a,s1).
переход(s1,b,s2).
ε-переход(s2,s0).
ε-переход(s0,s2).
начальное(s0).
конечное(s2).
Рассмотрим процедуру которая проверяет принимается цепочка или нет.
%баз случай, пустая строка допускается из конечного состояния
допускается(S,[]):-
конечное(S).
%общ случ L допуск из состо S если есть ε-переход из S в Sn, из этого сост допуск заданная строка L
допускается(S,L):-
ε-переход(S,Sn),
допускается(Sn,L).
%общ случай
допускается(S,[X|Xs]):-
переход(S,X,Sn),
допускается(Sn,Xs).
В прологе уже заложен недетрминизм…
допускается(X):-
начальное(S), допускается(S,X).
Из какого состояния допускается цепочка «ab»?
?- допускается(S,[a,b]).
S = s0
Какие цепочки, состоящие из трёх символов, допускаются из состояния s1?
?- допускается(s1,[X1,X2,X3]).
X1 = b
X2 = a
X3 = a
Перейдем к синтаксическому анализу на прологе, рассмотрим вопрос использования грамматических правил.
Для того чтобы задать грамматику языка нужно задать алфавит или множество слов языка. Конкретные слова мы будем называть терминалами.
Множество всех терминалов обозначим через сигма ∑
Есть синтаксические категории N, которыми можно определять множество раз, последовательности слов языка.
∑ {человек, несет,…}
N {подлежащее, сказуемое}
Это всё синтаксические категории.
Синтаксические категории определяются продукциями (множество P).
n::= // определяется один нетерминал
n::= v1,v2,vn
n принадл N
Vi принадл N объед сигма
Один нетерминал нужно выбрать в качестве стартового. С него будет начинаться разбор предложения.
Нетерминалы ниже заключены в угловые скобки
<Предложение> ::= <Подлежащее> <Сказуемое>
<Подлежащее> ::= <Существительное>
<Подлежащее> ::= <Прилагательное> <Существительное>
<Сказуемое> ::= <Глагол-неперех.>
<Сказуемое> ::= <Глагол-перех.> <Дополнение>
<Прилагательное> ::= большой
<Прилагательное> ::= маленький
<Существительное> ::= кот
<Существительное> ::= человек
<Глагол-неперех.> ::= ходит
<Глагол-неперех.> ::= стоит
<Глагол-перех.> ::= несёт
<Глагол-перех.> ::= ест
<Дополнение> ::= яблоко
<Дополнение> ::= ведро
Такие деревья нужно строить в процессе синтаксического разбора. Они называются деревьями разбора.
Как этот разбор можно выполнить на прологе? Ниже
предложение(S) :- подлежащее(S1), сказуемое (S2), append(S1,S2,S).
подлежащее(S):- существительное(S).
подлежащее(S):- прилагательное(S1),
существительное(S2). append(S1,S2,S).
прилагательное([большой]).
прилагательное([маленький]).
append – основной предикат, сцепление строк (конкатенация).
Пользуясь предикатом предложение можно проверить явл заданная последовательность слов предложением языка.
Задача синтаксического разбора – основанная выч нагрузка ложится на процедуру append. А эта процедура будет постоянно заново строить новый список.
Для того чтобы списки сцеплять эффективно нужно использовать разностные представления списков.
Разностный список – это пара списков L1 - L2, обозначающая список L.
L = [a,b,c]
L1 = [a,b,c,d,e]
L2 = [d,e]
Варианты представления списка L:
[a,b,c] – []
[a,b,c,d|T] – [d|T]
[a,b,c|T] – T % разностный список, который можно продолжить
Пустой список:
X – X
Посмотрим как работает append для разностных список
appendr(A1-Z1,Z1-Z2,A1-Z2).
L1 = [a,b,c,d,e]
L2 = [d,e]
Чтобы сцепить два списка [a,b,c] и [d,e] нужно представить их в виде [a,b,c|T1] – T1 и [d,e|T2] – T2
и выполнить запрос:
appendr([a,b,c|T1] – T1, [d,e|T2] – T2, L-[]).
T1 = [d,e]
T2 = []
L = [a,b,c,d,e]
Она ничего не делает кроме сопоставления своих параметров.
предложение(S-S0) :- подлежащее(S1-S2), сказуемое (S3-S4), appendr(S1-S2,S3-S4,S-S0).
Равенства будут взяты из append. Эти равенства можно сразу включить в продукцию не пользуясь append.
В прологе есть синтаксическое расширение, пользуясь которым можно продукции грамматики записывать в более удобной форме.
Есть оператор….
Параметры не записывается явно, они подозреваются
Если мы введем такую продукцию, то это соответствует правилу (можно обойтись без структуры)
Если в продукции исп терминал, то термин заключ в квадратные скобки(это список из одного атома).
Для того чтобы описать синтаксис какого либо языка достаточно его перепечатать в таком виде…
В синтаксических правилах можно исп дополнительные аргументы и дополнительные условия подцель.
Эти возможности позв исп атрибутные грамматики или транслирующие… т.е. с помощью грамматики можно построить результат трансляции.
Дополнительные параметры записываются обычным образом перечислением в круглых скобках.
Основные параметры скрыты…
Дополнительные условия заключаются в фигурные скобки. Для того чтобы их не спутать с нетерминалами.