- •Данные и знания
- •При обработке на эвм, знания трансформируются алогично данным
- •Существует несколько способов получения слотов значений во
- •Формальные логические модели
- •Лекция №2
- •Вывод на знаниях
- •Стратегия управления выводом
- •Стандартные функции
- •Если мы определяем лисп – функцию
- •Символьные данные
- •Лекция №4 функции в языке лисп
- •Математическая логика в лисПе
- •Параметры
- •Функции для обработки списков
- •Предикаты
- •Лекция №5
- •Построение списков
- •Полный перебор
- •Направление поиска
- •Программирование методов поиска
- •Поиск в глубину, в ширину и по наилучшему варианту
- •Лекция №7 макросы
- •Макрос не вычисляет аргументы
- •Макрос вычисляется дважды
- •Контекст вычисления макроса
- •Пример отличия макроса от макроса
- •Рекурсивные макросы и продолжающиеся вычисления
- •Тестирование макросов
- •Обратная блокировка разрешает промежуточные вычисления
- •Лекция №8
- •Сопоставление с образцом и распознавание образцов
- •Распознавание списочных образцов
- •Условия сопоставимости
- •Использование переменных в образце
- •Сопоставление с переменной образца
- •Лекция № 9
Поиск в глубину, в ширину и по наилучшему варианту
Мы уже попытались определить функцию ПОИСК в гибком и, используя функциональную абстракцию, в весьма общем виде. Наиболее важные способы поиска, т.е. поиск в глубину (depth-first), поиск в ширину (breadth-first) и поиск по наилучшему варианту (best-first) отличаются друг от друга лишь тем, в каком порядке изучаются состояния пространства поиска.
Это свойство абстрагировано в функциональный аргумент ПОРЯДОК. Значением этой функции в каждой ситуации будет список анализируемых продукций (ПЛАН) в порядке, соответствующим способу поиска.
Порядок состояний при поиске в глубину определяется следующим образом:
(defun in-glub (plan)
(append (primenim (second (car plan)))
(cdr plan))
)
В процессе поиска сначала изучают состояния непосредственно следующие за первым состоянием. Таким образом, поиск осуществляется в пространстве поиска сначала в глубину, возврат происходит после иссле
д
(marsh ’stokgolm ’viborg
’in-glub) (stokgolm
helsinki tallinn leningrad viborg )
При поиске в ширину сначала изучаются все состояния каждого уровня и лишь после этого происходит переход на большую глубину. В функции упорядочивания это означает , что в каждом состоянии достижимые из первого состояния возможности помещаются в конец плана:
(defun in-shir (plan)
(append (cdr plan)
(primenim (second (car plan))))
)
(marsh ’stokgolm ’viborg
’in-shir) (stokgolm
helsinki tallinn leningrad viborg )
При поиске по наилучшему варианту вся последовательность состояний вновь упорядочивается по некоторому критерию так, что сначала в каждом состоянии всегда изучаются наилучшие варианты продолжения:
(defun best1 (plan)
(sort (append (primenim (second (car plan)))
(cdr plan))
#'kriter)
)
SORT – это общая функция упорядочивания Коммон Лиспа и КРИТЕРИЙ – некоторый двуместный предикат, определяющий порядок двух состояний.
Предположим, например, что мы предпочитаем сначала более северные маршруты и что географическая широта городов храниться в виде их свойства ШИРОТА. В этом случае КРИТЕРИЙ можно определить следующим образом:
(defun kriter (x y)
(>= (get (second x) 'shirot)
(get (second y) 'shirot)))
(setf (get 'helsinki 'shirot) 4)
(setf (get 'stokgolm 'shirot) 1)
(setf (get 'tallinn 'shirot) 2)
(setf (get 'leningrad 'shirot) 3)
(setf (get 'viborg 'shirot) 5)
(marsh ’stokgolm ’viborg
’best1) (stokgolm
helsinki leningrad viborg )
Использование этого способа поиска дает результат, отличный от результата, полученного при использовании поиска в глубину и поиска в ширину. При попытке сначала выбрать более северные варианты, будет найден второй возможный вариант решения, который совсем не исследует Таллинн.
С помощью представленного выше алгоритма поиска можно осуществить и другие способы. Заменяя лишь параметр ПОРЯДОК. Более сложные функции могли бы, например, делать предварительную оценку различных направлений поиска и для повышения эффективности даже исключать некоторые альтернативы.
Лекция №7 макросы
Часто бывает полезно не выписывать вычисляемые выражения вручную, а сформировать его с помощью программы. Эта идея автоматического динамического программирования особенно хорошо реализуется в ЛИСПе, поскольку программа в этом языке также представляется в виде списка. При этом вычисление такого выражения или его части при необходимости можно предотвратить блокировкой (QUOTE), например с целью преобразования выражения. Для вычисления уже сформированного выражения программист всегда может вызвать интерпретатор (EVAL). Предусмотренные в ЛИСПе специальные способы обработки аргументов открывают возможность для комбинирования различных методов.
Внешние макросы определяются и используются так же, как функции, отличается лишь способ их вычисления. Вычисляя вызов макроса сначала из его аргумента строится форма, задаваемая определением макроса. В результате вызова возвращается значение этой формы, как было бы при вычислении функций. Таким образом, макрос вычисляется как бы в два этапа.