LabsSIILisp
.pdf41
3.6.13.Какие с помощью функции LIST создать список из символов-ключей
иих значений?
3.6.14.Что такое функционал?
3.6.15.Что такое функция с функциональным значением?
3.6.16.Что такое функции высших порядков?
3.6.17.Назовите и объясните использование применяющих функционалов?
3.6.18.Объясните синтаксис передачи функционального аргумента?
3.6.19.Объясните отображающий функционал MAPCAR?
3.6.20.Объясните отображающий функционал MAPLIST?
3.6.21.Объясните отображающий функционал MAP?
3.6.22.Объясните функционал REMOVE-IF(–NOT)?
3.6.23.Что называют функциональной блокировкой?
3.6.24.Что такое лексическое замыкание? Приведите пример.
42
4. ЛАБОРАТОРНАЯ РАБОТА № 4 «ЕЯ ДОСТУП К БАЗЕ ДАННЫХ НА ОСНОВЕ АЛГОРИТМА
СОПОСТАВЛЕНИЯ С ОБРАЗЦОМ»
4.1. Цель работы
Исследование алгоритма сопоставления с образцом и особенностей его применения для формирования запросов к базам данных, а также для организации доступа к базам данных на ограниченном подмножестве естественного языка.
4.2. Краткие теоретические сведения
4.2.1. Общие правила сопоставления с образцом
Сопоставление с образцом является важнейшей операцией, выполняемой во многих системах искусственного интеллекта. Под сопоставлением с образцом (pattern matching) понимается процедура, при которой с известной символьной структурой (образцом) сопоставляется некоторая другая структура (факт, данные) с целью выявления единообразия или подобия структур.
Процедура сопоставление с образцом — неотъемлемая часть многих СИИ. Например, она широко используется в экспертных системах, базирующихся на продукционной модели представления знаний. В этом случае предпосылки продукционных правил выступают в качестве образцов, а факты, хранящиеся в рабочей памяти (базе данных), выступают в роли распознаваемых образов. Если предпосылка правила сопоставима с одним из фактов в рабочей памяти, то активизируется соответствующее правило и в базу данных добавляется новый факт. Таким образом, осуществляется прямой логический вывод [1].
Рассмотрим сопоставление с образцом, представляя образец и сопоставляемые с ним факты (данные) в виде списков языка Лисп. Простейшие возможности сопоставления реализуются встроенными предикатами Лиспа, например EQ, EQL,
EQUAL.
Для большей гибкости при сопоставлении в образце применяются условные обозначения в виде символов ? и $. Символу ? из образца можно поставить в соответствие любой элемент из списка данных, находящийся на том же месте, но только один; символу $ можно поставить в соответствие один или несколько элементов из списка данных, в том числе и пустой элемент. Ниже приведен пример, когда образец и данные сопоставимы:
ОБРАЗЕЦ — (? позволяет распознавать $)
ДАННЫЕ — (сопоставление позволяет распознавать ситуации или причины)
Обозначим сопоставимость символьных структур знаком :=:, и сформулируем основные правила сопоставления:
ОБРАЗЕЦ :=: ДАННЫЕ если ; правило 1 , пример: ( ):=: ( )
ДАННЫЕ = NIL и ОБРАЗЕЦ = NIL
43
или |
; правило 2 , пример: ($ ):=: ( ) |
|
ДАННЫЕ = NIL и (CAR ОБРАЗЕЦ) = $ |
|
и (CDR ОБРАЗЕЦ) = NIL |
или |
; правило 3 , пример: (a b c d ):=: (a b c d ) |
|
(ДАННЫЕ NIL) и (ОБРАЗЕЦ) NIL |
|
и (CAR ОБРАЗЕЦ) = (CAR ДАННЫЕ) |
|
и (CDR ОБРАЗЕЦ) :=: (CDR ДАННЫЕ) |
или |
; правило 4 , пример: (? b c d ):=: (a b c d ) |
|
(ДАННЫЕ NIL) и (ОБРАЗЕЦ NIL) |
|
и (CAR ОБРАЗЕЦ) = ? |
|
и (CDR ОБРАЗЕЦ) :=: (CDR ДАННЫЕ) |
или |
; правило 5, пример: ($ b c d ):=: (b c d ) |
|
(ДАННЫЕ NIL) и (ОБРАЗЕЦ NIL) |
|
и (CAR ОБРАЗЕЦ) = $ |
|
и (CDR ОБРАЗЕЦ) :=: ДАННЫЕ |
или |
; правило 6, пример: ($ d ):=: (a b c d ) |
|
(ДАННЫЕ NIL) и (ОБРАЗЕЦ NIL) |
|
и (CAR ОБРАЗЕЦ) = $ |
|
и ОБРАЗЕЦ :=: (CDR ДАННЫЕ) |
Обратите внимание, что введенные правила определяют понятие “сопоставимость” рекурсивно. Назначение каждого из правил видно из примеров, записанных рядом с номером правила.
4.2.2. Базовая функция сопоставления с образцом
Определим функцию (MATCH P D), выполняющую сопоставление образца P и данных D с помощью введенных выше правил (полный листинг функции приведен в приложении А):
; функция сопоставления образца p и данных d (defun match (p d)
(cond
;правило 1
((and (null p)(null d)) t)
;правило 2
((and (null d)
(eq (car p) ’$) (null (cdr p))) t)
; один из списков исчерпан
((or (null p)(null d)) nil)
;правило 3 и правило 4
((or (equal (car p) ’?) (equal (car p) (car d)))
(match (cdr p)(cdr d)))
;правило 5 и 6
((eq (car p) ’$)
(cond ((match (cdr p) d) t) ((match p (cdr d)) t))) ))
44
Функцию MATCH можно легко расширить, чтобы она могла сопоставлять списки с вложенными подсписками. Для этого достаточно добавить в текст функции следующее правило:
;правило 7 - сопоставление списков, включающих подсписки
((and (not (atom (car p))) (not (atom (car d))) (match (car p)(car d)))
(match (cdr p) (cdr d)) )
В этом случае функция MATCH будет обеспечивать сопоставление более сложных символьных структур. Например,
(match ’( (a |
b) ? (? |
d) |
$) |
’( (a |
b) c (c |
d) |
1 2 3 4 5)) |
T
4.2.3.Применение функции сопоставления с образцом для формирования запросов к базе данных
Несмотря на то, что введенная функция MATCH реализует простейшую схему сопоставления, её уже можно использовать для решения практических задач, например, доступа к базе данных. Определим для этого функцию с двумя аргументами, представленными s-выражениями. Первый аргумент будет представлять собой запрос к базе данных, записываемый в виде образца, а второй
– список, соответствующий базе данных, в которой выполняется поиск. Функция возвращает в качестве результата записи базы данных, сопостави-
мые с запросом (образцом).
Пусть рассматривается база данных, содержащая сведения о служащих:
(setq *database*
’(((Иванов Сергей) 14000 1235) ((Абрамов Николай) 17500 3325) ((Гавриленко Ольга) 14000 3143) ((Денисенко Сергей) 22000 2528) ((Коль Татьяна) 18250 3133)
…))
Вбазе данных хранятся данные о годовых доходах служащих и их табельные номера. Определим функцию GET-MATCHES, используя рекурсию:
(defun get-matches (p db) ;db - база данных
;p - запрос (образец) (cond ((null db) nil)
((match p (car db))
(cons (car db) (get-matches p (cdr db)))) (t (get-matches p (cdr db)))))
45
С помощью функции GET-MATCHES, можно получать ответы на следующие запросы:
;проверка наличия конкретной записи
(get-matches ’((Денисенко Сергей) 22000 2528) *database*)(((Денисенко Сергей) 22000 2528))
;выдать сведения о всех сотрудниках с годовым доходом 14000 (get-matches ’(? 14000 ?) *database*)
((( Иванов Сергей) 14000 1235) ((Гавриленко Ольга) 14000 3143))
;выдать сведения о всех сотрудниках, которых зовут Сергей
(get-matches ’((? Сергей) ? ?) *database*)
(((Иванов Сергей) 14000 1235) ((Денисенко Сергей) 22000 2528))
Кстати, функция будет успешно работать и с базой данной, представленной в виде списков с символами-ключами без переписывания её кода:
(setq *database2* (list |
|
(list :FIO '(Иванов Сергей) |
:Z 14000 :N 1235) |
(list :FIO '(Абрамов Николай) |
:Z 17500 :N 3325) |
(list :FIO '(Гавриленко Ольга) :Z 14000 :N 3143) |
|
(list :FIO '(Денисенко Сергей) :Z 22000 :N 2528) |
|
(list :FIO '(Коль Татьяна) |
:Z 18250 :N 3133) |
))
;выдать сведения о всех сотрудниках с годовым доходом 14000 (get-matches '(:FIO ? :Z 14000 :N ?)*database2*)
((:FIO (Иванов Сергей) :Z 14000 :N 1235) (:FIO (Гавриленко Ольга) :Z 14000 :N 3143))
Единственное отличие заключается в форме записи образца при вызове функции GET-MATCHES.
4.2.4. Усовершенствование базовой функции сопоставления с образцом
Можно достигнуть еще большей универсальности приведенного выше алгоритма сопоставления, включив в него дополнительные параметры-переменные. Имена переменных в образце начинаются символом ‘?’ или ‘$’. Например, ?V или $V. В первом случае в переменную V будет подставляться произвольный символ данных, во втором — сегмент списка данных. Подстановка значений в переменные позволит получать ответы на запросы вида:
(match ’(AVTO ?MODEL ?YEAR) '(AVTO ford 1998)) T model ford
year 1998
Реализация соответствующих правил приведена в [1]. Функцию МАТСН можно совершенствовать и далее, используя ограничивающий параметр в образце
46
(restrict), который дает возможность накладывать определенные ограничения на сопоставляемое значение. Например,
(match ’((restrict ?V integerp evenp) b c) ’(36 b c)) T
(match ’((restrict ?V integerp evenp) b c) ’(36.0 b c)) NIL
В примере параметр ?V из подсписка ограничений сопоставляется с первым элементом списка данных. Если рассматриваемый элемент данных является целым четным числом, то сопоставление успешно. Использование переменных в образце позволяет запоминать сделанные подстановки и таким образом обрабатывать более сложные запросы к базе данных.
4.2.5. Обработка запросов к БД на естественном языке (ЕЯ)
Используя рассмотренную функцию сопоставления с образцом, можно написать простейшую программу, поддерживающую беседу на естественном языке. Такая программа основана на распознавании с помощью функции МАТСН ответа пользователя и формировании подходящего по смыслу вопроса для следующего шага диалога с пользователем [1]. Эту же идею можно использовать для формирования запросов к базе данных на естественном языке.
Существующие ЕЯ-интерфейсы баз данных используют различные подходы [1,3]: метод сопоставления с образцом, синтаксические грамматики, семантические грамматики, некоторый внутренний язык. Интерфейсы, основанные на методе сопоставления с образцом, являются наиболее простыми.
Приведем фрагмент программы возможной обработки ЕЯ-запросов к базе данных, представленной динамической переменной *database* (см. п.4.2.3) . Запросы вводятся в виде списка слов на естественном языке (ЕЯ). В программе примеры обрабатываемых ЕЯ-запросов представлены в виде комментариев:
(setq fact (read)) ; ввод ЕЯ запроса
; Запрос 1: (есть ли в базе запись о сотруднике Денисенко Сергей)
(cond
((match '( $ запись $ Денисенко Сергей $ ) fact) ; распознавание ЕЯ запроса
(princ (get-matches '((Денисенко Сергей) ? ?) *database*))) ; запрос к БД
; (((Денисенко Сергей) 22000 2528))
; Запрос 2: (выдать сведения о всех сотрудниках у которых годовой доход 14000)
((match '( $ всех $ годовой доход $ 14000 ) fact) (princ (get-matches '(? 14000 ?) *database*)))
; ((( Иванов Сергей) 14000 1235) ((Гавриленко Ольга) 14000 3143))
; Запрос 3: (выдать сведения о всех сотрудниках которых зовут Сергей)
((match '( $ всех $ зовут Сергей ) fact)
47
(princ (get-matches '((? Сергей) ? ?) *database*)))
; (((Иванов Сергей) 14000 1235) ((Денисенко Сергей) 22000 2528))
; Запрос 4: (как зовут сотрудника по фамилии Денисенко)
((match '( $ зовут $ фамилии Денисенко ) fact) (get-matches '((Денисенко ?V) ? ?) *database*) (princ V))…)
; Сергей
Поясним работу фрагмента программы на примере первого запроса. ЕЯзапрос, введенный с помощью функции READ, запоминается в переменой FACT. В форме COND введенный запрос сопоставляется с образцом, который подбирается так, чтобы описать распознаваемый запрос в общем виде. В примере вводится запрос «(есть ли в базе запись о сотруднике Денисенко Сергей)», который сопос-
тавляется с образцом «( $ запись $ Денисенко Сергей $ )». Так как ЕЯ-запрос сопоставим с образцом, то выполняется действие — вызывается функция MATCHES, которая выполняет поиск в базе данных нужной записи опять таки по образцу «((Денисенко Сергей) ? ?)» . Найденное значение выводится на экран с помощью функции PRINC.
Таким образом, каждый ЕЯ-запрос обрабатывается с помощью правила «образец — действие». Каждое из правил представляет клоз COND формы, которая легко дополняется новыми правилами.
ЕЯ-интерфейсы БД, построенные на основе метода сопоставления с образцом, могут приводить к ошибочным ответам, так как не учитывают семантических отношений между элементами запросов. Более гибкими являются ЕЯинтерфейсы, реализующие синтаксический разбор запросов к БД. При этом синтаксический анализ можно также выполнять на основе грамматических правил с использованием схемы сопоставления с образцом [1].
4.3. Варианты заданий
Для базы данных, созданной в лабораторной работе 3, необходимо написать на языке Лисп интерфейс, который позволяет выполнять ЕЯ-запросы с помощью алгоритма сопоставления с образцом. Ответ на запрос должен также представляться на естественном языке в виде списка слов предложения. Кроме запроса, заданного по варианту задания, предусмотреть 5-6 различных дополнительных запросов.
4.4. Порядок выполнения лабораторной работы
4.4.1.Изучить по лекционному материалу или учебному пособию [1] алгоритм сопоставления с образцом.
4.4.2.Написать функцию сопоставления с образцом в соответствии с примером, приведенным в [1]. Выполнить отладку функции по тестовым примерам.
4.4.3.Написать функцию обеспечивающую поиск записей в базе данных, по запросу, представленному в виде образца. В качестве аналога можно использовать
48
функцию GET-MATCHES. Рекомендуется переопределить её с использованием отображающего функционала MAPCAR.
4.4.4.Разработать запросы и соответствующие образцы к ним для тестирования разработанных функций. По результатам тестирования внести необходимые изменения (расширения) в разработанные функции.
4.4.5.Дополнить разработанную программу правилами обработки ЕЯзапросов. Для этого разработать соответствующие образцы, обеспечивающие распознавание ЕЯ-запросов и фрагменты кода, осуществляющего необходимые действия в случае успешного распознавания. Выполнить тестирование программы для всех разработанных запросов.
4.4.6.Написать функции, необходимые для преобразования результатов поиска в ЕЯ-форму, и дополнить ими правила из п.3.4.5. Выполнить окончательную отладку программы.
4.4.7.Выполнить анализ работы программы на разных запросах, определить ограничения программы и зафиксировать результаты её работы в виде экранных копий.
4.4.8.Факультативно предлагается расширить программу таким образом, чтобы она могла вести с пользователем диалог на естественном языке в рамках сведений, содержащихся в базе данных.
4.5.Содержание отчета
Цель работы, вариант задания, общие правила построения функции сопоставления с образцом, описание выполненных дополнений для функции сопоставления с образцом, описание разработанной функции поиска записей в БД по образцу, описание набора правил распознавания ЕЯ-запросов, описание тестовых ЕЯ-запросов и результатов их выполнения, оценка ограничений программы, выводы.
4.6. Контрольные вопросы
4.6.1.Объясните суть задачи сопоставления с образцом? Где встречается эта
задача?
4.6.2.Какие функции языка Лисп выполняют простейшее сопоставление с
образцом?
4.6.3.Какие специальные символы используют в образце и что они обозна-
чают?
4.6.4.Объясните общие правила сопоставления с образцом.
4.6.5.Напишите базовую функцию сопоставления с образцом.
4.6.6.Как расширить базовую функцию сопоставления с образцом, чтобы она могла сопоставлять списки, включающие подсписки?
4.6.7.Как выполнить доступ к базе данных по образцу? Определите необходимую функцию.
4.6.8.Как обозначают переменные в образце, если необходимо запоминать подстановки в ходе выполнения сопоставления?
49
4.6.9.Определите дополнительные правила для базовой функции сопоставления с образцом, если требуется запоминать подстановки.
4.6.10.Для чего вводится пакет ограничений образца?
4.6.11.Определите правила обработки пакета ограничений образца.
4.6.13.Объясните общий принцип построения программы, распознающей EЯ-запросы по образцу.
4.6.14.Приведите пример правил для распознавания ЕЯ-запроса по образцу.
4.6.15.Какие недостатки свойственны ЕЯ-интерфейсу, построенному на принципе сопоставления с образцом?
4.6.17. Что необходимо учитывать, чтобы улучшить обработку ЕЯзапросов?
50
5. ЛАБОРАТОРНАЯ РАБОТА № 5 «МЕТОДЫ ПОИСКА РЕШЕНИЙ ЗАДАЧ В ПРОСТРАНСТВЕ
СОСТОЯНИЙ»
5.1. Цель работы
Исследование методов поиска решений задач в пространстве состояний и овладение методологией решения логических задач с применением этих методов.
5.2. Краткие теоретические сведения
5.2.1. Формулировка задач в пространстве состояний
При решении любой задачи можно выделить два этапа: выбор способа представления задачи и собственно решение. Задача поиска в пространстве состояний, определяется совокупностью четырех составляющих
(S0, S, F, G), |
(5.1) |
где S — множество возможных состояний задачи; S0 — множество начальных состояний, S0 S; F — множество операторов, преобразующих одни состояния в другие; G — множество целевых состояний, G S [1].
Каждый оператор f F является функцией, отображающей одно состояние в другое — sj=f(si ) , где si, sj S. Решением задачи является последовательность операторов fi F, преобразующих начальные состояния в конечные, т.е. fn(fn-1(…(f2(f1(S0 )))…)) G . Если такая последовательность не одна и задан критерий оптимальности, то возможен поиск оптимальной последовательности.
Поиск решения в пространстве состояний представляют в виде графа состояний. Множество вершин графа соответствует состояниям задачи, а множество дуг (ребер) — операторам. Тогда решение задачи может интерпретироваться как поиск пути на графе.
Уточним сказанное на примере задачи игры в восемь. В игре используются фишки, пронумерованные от 1 до 8 (рисунок 5.1). Фишки располагаются в ячейках матрицы размером 3 3. Любая фишка, смежная с пустой ячейкой, может быть передвинута в позицию, соответствующую пустой ячейке. В игре ищут последовательность ходов, переводящих игру из начального состояния в конечное состояние, изображенное на рисунке 5.1 справа.
Формулировка этой задачи в пространстве состояний требует определения всех составляющих выражения (5.1).
Состояния. Описание состояния должно определять местонахождение каждой из восьми фишек и пустой ячейки.
Начальное состояние. В качестве начального состояния может быть выбрано любое состояние.
Целевое состояние. Показано на рисунке 5.1 справа.