Скачать презентацию Функциональное программирование Поиск на ЛИСПЕ Функционалы Свойства символов Скачать презентацию Функциональное программирование Поиск на ЛИСПЕ Функционалы Свойства символов

b45ed0153579617e4bc3498c4e8c69fb.ppt

  • Количество слайдов: 49

Функциональное программирование Поиск на ЛИСПЕ. Функционалы. Свойства символов. Лекция 7 Мар. ГТУ 2008 г. Функциональное программирование Поиск на ЛИСПЕ. Функционалы. Свойства символов. Лекция 7 Мар. ГТУ 2008 г. 1

n n Алгоритм поиска на Лиспе (Функциональный подход к задаче о фермере, волке, козе n n Алгоритм поиска на Лиспе (Функциональный подход к задаче о фермере, волке, козе и капусте) Функционалы n n n Отображающий функционал MAPCAR для нескольких списков Лямбда выражения Свойства символов Команды MCL и CLISP Мар. ГТУ 2008 г. 2

Алгоритм поиска на Лиспе (Функциональный подход к задаче о фермере, волке, козе и капусте) Алгоритм поиска на Лиспе (Функциональный подход к задаче о фермере, волке, козе и капусте) Мар. ГТУ 2008 г. 3

Постановка задачи n Фермер (Farmer), волк (Wolf), козел (Goat) и капуста (Cabbidge) находятся на Постановка задачи n Фермер (Farmer), волк (Wolf), козел (Goat) и капуста (Cabbidge) находятся на одном берегу. Надо перебраться на другой берег на лодке. Мар. ГТУ 2008 г. 4

Ограничения Лодка перевозит только двоих. n Нельзя оставлять на одном берегу козу и капусту, Ограничения Лодка перевозит только двоих. n Нельзя оставлять на одном берегу козу и капусту, козу и волка n Мар. ГТУ 2008 г. 5

Информация о задаче на Лиспе n Главная проблема в формировании алгоритма – найти эффективное Информация о задаче на Лиспе n Главная проблема в формировании алгоритма – найти эффективное представление структурой данных Лиспа информации о задаче. n Процесс перевозки может быть представлен последовательностью состояний. Состояние представляется списком из четырех элементов, каждый из которых отражает размещение объектов F, W, G, C: (e w e w) – F, G на восточном берегу (e – east); F W G C – W, C на западном берегу (w – west). Мар. ГТУ 2008 г. 6

Базовые функции программы конструктор – make-state, которая берет в качестве аргументов размещение F, W, Базовые функции программы конструктор – make-state, которая берет в качестве аргументов размещение F, W, G, C и возвращает состояние n функции доступа, каждая из которых берет состояние и возвращает размещение (defun farmer-side (state) (nth 0 state)) (defun wolf-side (state) (nth 1 state)) (defun goat-side (state) (nth 2 state)) (defun cabbage-side (state) (nth 3 state)) n Мар. ГТУ 2008 г. 7

Базовые функции программы n Оставшаяся программа основывается на этих функциях доступа и конструкторах. В Базовые функции программы n Оставшаяся программа основывается на этих функциях доступа и конструкторах. В частности, они используются для реализации четырех возможных действий фермера: ¨ перевоз через реку или самого себя или W, G, C. Эти функции используют четыре функции доступа для разбиения состояния на его компоненты. n Функция opposite ( определена позже ) определяет новое размещение объектов, которые пересекли реку, а make-state собирает их в новое состояние. Мар. ГТУ 2008 г. 8

Функция изменения состояния фермера (defun farmer-take-self (state) (safe (make-state (opposite (farmer-side state)) (wolf-side state) Функция изменения состояния фермера (defun farmer-take-self (state) (safe (make-state (opposite (farmer-side state)) (wolf-side state) (goat-side state) (cabbage-side state)) ) ) Мар. ГТУ 2008 г. 9

Функция изменения состояния фермера n n Отметим, что эта функция возвращает новое состояние, независимо Функция изменения состояния фермера n n Отметим, что эта функция возвращает новое состояние, независимо от того, безопасно оно или нет. Однако могут быть опасные состояния: например, когда W, G или G, C находятся на одном берегу. Программа должна найти в качестве решения только безопасные состояния. Проверка на опасные состояния должна производиться на разных стадиях программы. В нашем случае это можно сделать в функциях движения. Мар. ГТУ 2008 г. 10

Проверка на опасные состояния n n n * (safe '(w w w w)) (w Проверка на опасные состояния n n n * (safe '(w w w w)) (w w w w) состояние безопасно, возвращается без изменений Safe используется в каждой функции перемещения для фильтрования опасных состояний. Таким образом, любое перемещение, которое ведет к опасному состоянию будет возвращать nil вместо состояния. Алгоритм формирования пути может проверять этот nil и использовать его для избегания этого состояния. Мар. ГТУ 2008 г. 11

Проверка на опасные состояния (defun safe (state) (cond ((and (equal (goat-side state) (wolf-side state)) Проверка на опасные состояния (defun safe (state) (cond ((and (equal (goat-side state) (wolf-side state)) (not (equal (farmer-side state) (wolf-side state)))) nil) ((and (equal (goat-side state) (cabbage-side state)) (not (equal (farmer-side state) (goat-side state)))) nil) (t state) ) ) Мар. ГТУ 2008 г. 12

Функция opposite Определяет новое размещение объектов, которые пересекли реку (defun opposite (side) (cond ((equal Функция opposite Определяет новое размещение объектов, которые пересекли реку (defun opposite (side) (cond ((equal side 'e) 'w) ((equal side 'w) 'e) ) ) n Мар. ГТУ 2008 г. 13

Функция изменения состояния волка (defun farmer-take-wolf (state) (cond ((equal (farmer-side state) (wolf-side state)) (safe Функция изменения состояния волка (defun farmer-take-wolf (state) (cond ((equal (farmer-side state) (wolf-side state)) (safe (make-state (opposite (farmer-side state)) (opposite (wolf-side state)) (goat-side state) (cabbage-side state)) ) ) (t nil) ) ) Мар. ГТУ 2008 г. 14

Функция изменения состояния козы (defun farmer-take-goat (state) (cond ((equal (farmer-side state) (goat-side state)) (safe Функция изменения состояния козы (defun farmer-take-goat (state) (cond ((equal (farmer-side state) (goat-side state)) (safe (make-state (opposite (farmer-side state)) (wolf-side state) (opposite(goat-side state)) (cabbage-side state))) ) (t nil) ) ) Мар. ГТУ 2008 г. 15

Функция изменения состояния капусты (defun farmer-take-cabbage (state) (cond ((equal (farmer-side state) (cabbage-side state)) (safe Функция изменения состояния капусты (defun farmer-take-cabbage (state) (cond ((equal (farmer-side state) (cabbage-side state)) (safe (make-state (opposite (farmer-side state)) (wolf-side state) (goat-side state) (opposite(cabbage-side state)))) ) (t nil) ) ) Мар. ГТУ 2008 г. 16

Функция перемещения (defun path (state goal) (cond ((equal state goal)) (t (or (path (farmer-takes-self Функция перемещения (defun path (state goal) (cond ((equal state goal)) (t (or (path (farmer-takes-self state) goal))) (path (farmer-take-wolf state) goal) (path (farmer-take-goat state) goal) (path (farmer-take-cabbage state) goal) ) ) Эта версия функции path является простым переводом и содержит несколько ошибок, которые надо исправить. В частности, отметим использование формы OR для управления выполнением ее аргументов. Мар. ГТУ 2008 г. 17

Ошибки в данной функции n Функция перемещения может вернуть значение nil, если перемещение не Ошибки в данной функции n Функция перемещения может вернуть значение nil, если перемещение не может быть сделано, когда оно ведет не к безопасному состоянию n Возможность возникновения петель в пространстве состояний. Мар. ГТУ 2008 г. 18

Предотвращение данных ошибок n n третий параметр, been-list, список всех состояний, которые уже были Предотвращение данных ошибок n n третий параметр, been-list, список всех состояний, которые уже были достигнуты. Каждый раз, когда path вызывается рекурсивно с новым дочерним состоянием, состояние-родитель должно быть добавлено в been-list. Вставляя в path предикат member, можно проверять, что текущее состояние не является элементом been-list, то есть здесь поиск уже побывал. Это выполняется проверкой текущего состояния, на присутствие в been-list перед генерацией его наследников. Мар. ГТУ 2008 г. 19

Функция path (defun path (state goal been-list) (cond ((null state) nil) ((equal state goal) Функция path (defun path (state goal been-list) (cond ((null state) nil) ((equal state goal) (reverse (cons state been-list))) ((not (member-lis state been-list)) (or (path (farmer-take-self state) goal (cons state been-list)) (path (farmer-take-wolf state) goal (cons state been-list)) (path (farmer-take-goat state) goal (cons state been-list)) (path (farmer-take-cabbage state) goal (cons state been-list)) ) ) Мар. ГТУ 2008 г. 20

Проверка принадлежности элемента списку (defun member-lis (x lis) (cond ((null lis) nil) ((equal x Проверка принадлежности элемента списку (defun member-lis (x lis) (cond ((null lis) nil) ((equal x (car lis)) t) (t (member-lis x (cdr lis))) ) ) Вместо того, чтобы вернуть t, можно вернуть список состояний, которые были пройдены до достижения цели. Так как цель не содержится в списке, она может быть вставлена, как последний элемент. Мар. ГТУ 2008 г. 21

Главная функция программы n Перед тем, как вернуть список, его надо перевернуть, используя reverse. Главная функция программы n Перед тем, как вернуть список, его надо перевернуть, используя reverse. Окончательно, чтобы параметр been-list скрыть от пользователя, может быть написана вызывающая функция, которая имеет два аргумента – начальное и конечное состояния и вызывает path с пустым списком been-list = nil. (defun solve-fwgc (state goal) (path state goal nil) ) Мар. ГТУ 2008 г. 22

Пример работы программы (solve-fvgc '(w w w w) '(e e e e)) n Состояния Пример работы программы (solve-fvgc '(w w w w) '(e e e e)) n Состояния (F, W, G, C) ¨w www ¨e w ¨w w e w ¨e e e w ¨w e w w ¨e e w e ¨w e ¨e e Мар. ГТУ 2008 г. 23

Функционалы Мар. ГТУ 2008 г. 24 Функционалы Мар. ГТУ 2008 г. 24

Аргументы как данные * (add 1 3) ; ; добавляет к аргументу 1 4 Аргументы как данные * (add 1 3) ; ; добавляет к аргументу 1 4 (defun add 1 (x) (+ 1 x) ) Мар. ГТУ 2008 г. 25

Функциональный аргумент n Функциональный аргумент – это аргумент, значением которого является функция n Функционал Функциональный аргумент n Функциональный аргумент – это аргумент, значением которого является функция n Функционал – это функция, имеющую функциональный аргумент. Мар. ГТУ 2008 г. 26

Данные и функция n Различие между понятиями Данные и функция n Различие между понятиями "данные" и "функция", определяются не на основе их структуры, а в зависимости от использования. ¨ Если аргумент используется в функции, как объект, участвующий в вычислениях, то это данные. ¨ Если аргумент используется как средство, определяющее вычисления, то это функция. Мар. ГТУ 2008 г. 27

Отображающий функционал MAPCAR n Важный класс функционалов используемых в лиспе – отображающие функционалы (МАР Отображающий функционал MAPCAR n Важный класс функционалов используемых в лиспе – отображающие функционалы (МАР функционалы) МАР функционалы – функции, которые некоторым образом отображают (map) список в новый список. Мар. ГТУ 2008 г. 28

Отображающий функционал MAPCAR (MAPCAR f '(x 1 x 2 x 3. . . x. Отображающий функционал MAPCAR (MAPCAR f '(x 1 x 2 x 3. . . x. N)) n Функция определенная первым аргументом применяется к каждому элементу списка, определенному вторым аргументом. n Результат помещает (отображает) в новый список. n Мар. ГТУ 2008 г. 29

Пример * (mapcar 'add 1 '( 1 2 3)) (2 3 4) (MAPCAR f Пример * (mapcar 'add 1 '( 1 2 3)) (2 3 4) (MAPCAR f '(x 1 x 2 x 3. . . x. N)) n эквивалентно n (list (f 'x 1) (f 'x 2). . (f 'x. N)) n Мар. ГТУ 2008 г. 30

Пример (defun list-add 1 (lis) (mapcar 'add 1 lis)) * (list-add 1 '(1 2 Пример (defun list-add 1 (lis) (mapcar 'add 1 lis)) * (list-add 1 '(1 2 3)) (2 3 4) * (setq x '(a b (d))) * (setq y 'atom) * (mapcar y x) (t t nil) Мар. ГТУ 2008 г. 31

MAPCAR для нескольких списков (defun addlist (l 1 l 2) (mapcar '+ l 1 MAPCAR для нескольких списков (defun addlist (l 1 l 2) (mapcar '+ l 1 L 2)) * (addlist '( 1 2 3) '(1 2 3)) (2 4 6) n то есть (list (+ 1 1) (+ 2 2) (+ 3 3)) Если списки разной длины, то длина результата будет равна длине наименьшего. Мар. ГТУ 2008 г. 32

Лямбда выражения Мар. ГТУ 2008 г. 33 Лямбда выражения Мар. ГТУ 2008 г. 33

Пример Так, если мы желаем получить список с элементами: x*x+1 n Мы должны определить Пример Так, если мы желаем получить список с элементами: x*x+1 n Мы должны определить функцию: (defun f 1 (x) (+ 1 (* x x))) * (mapcar 'f 1 '(1 2 3)) n Таким образом, определяется специальная функция, которая используется только в MAPCAR. Аналогично происходит с add 1. n Мар. ГТУ 2008 г. 34

Лямбда выражения (mapcar '(lambda (x) (+ 1 (* x x))) '(1 2 3)) n Лямбда выражения (mapcar '(lambda (x) (+ 1 (* x x))) '(1 2 3)) n сравни ¨ (defun f 1 (x) (+ 1 (* x x))) ¨ (mapcar '(lambda (x) (+ 1 x)) '(1 2 3)) n Т. о. лямбда выражения позволяют определять функцию внутри другой функции. Мар. ГТУ 2008 г. 35

Лямбда выражения определяют функцию, не имеющую имени. n Общая форма: (lambda (параметры) <тело функции>) Лямбда выражения определяют функцию, не имеющую имени. n Общая форма: (lambda (параметры) <тело функции>) n Мар. ГТУ 2008 г. 36

Свойства символов Мар. ГТУ 2008 г. 37 Свойства символов Мар. ГТУ 2008 г. 37

Свойства символов Связывание не только значения, но и информации n Информация о Mary свойство: Свойства символов Связывание не только значения, но и информации n Информация о Mary свойство: значение: age 28 occupation lawyer salary 90 children Bill Alice Susan n Список свойств в этом случае выглядит (age 28 occupation lawyer salary 90 children (Bill Alice Susan)) n Мар. ГТУ 2008 г. 38

Чтение свойства n (GET <cимвол> <свойство>) * (get 'Mary 'age) 28 * (get 'Mary Чтение свойства n (GET <свойство>) * (get 'Mary 'age) 28 * (get 'Mary 'children) (Bill Alice Susan)) * (get 'Mary 'hobby) nil Мар. ГТУ 2008 г. 39

Присвоение свойства (setf (get <символ> <свойство>) <значение>) * ( setf ( get 'Mary 'salary) Присвоение свойства (setf (get <символ> <свойство>) <значение>) * ( setf ( get 'Mary 'salary) 90 n Функция putprop: (putprop <символ> <значение> <свойство>) <свойство> – нечисловой атом; <значение> – любое выражение; Мар. ГТУ 2008 г. 40

Присвоение свойства (defun putprop (atom value property) (setf (get atom property) value)) Свойств у Присвоение свойства (defun putprop (atom value property) (setf (get atom property) value)) Свойств у атома может быть много, но у каждого только одно значение. n При внесении нового свойства, оно помещается в начале списка свойств. * (putprop 'Mary 'cinema 'hobby) (hobby cinema. . . ) n Мар. ГТУ 2008 г. 41

Замена свойства Замена значения свойства производится повторным присвоением. (putprop 'mary 29 'age) (get 'mary Замена свойства Замена значения свойства производится повторным присвоением. (putprop 'mary 29 'age) (get 'mary 'age) n Если возникает необходимость замены текущего значения новым, используя при этом текущее значение, можно поступить следующим образом: (putprop 'mary (+ 1 (get 'mary 'age)) 'age) n Мар. ГТУ 2008 г. 42

Удаление свойства (remprop <символ> <свойство>) * (remprop 'Mary 'age) T Мар. ГТУ 2008 г. Удаление свойства (remprop <символ> <свойство>) * (remprop 'Mary 'age) T Мар. ГТУ 2008 г. 43

SYMBOL-PLIST n Дает информацию о списке свойств * ( SYMBOL-PLIST 'Mary) (age 28 occupation SYMBOL-PLIST n Дает информацию о списке свойств * ( SYMBOL-PLIST 'Mary) (age 28 occupation lawyer salary 90 children (Bill Alice Susan)) Мар. ГТУ 2008 г. 44

Команды MCL и CLISP Мар. ГТУ 2008 г. 45 Команды MCL и CLISP Мар. ГТУ 2008 г. 45

MCL. Команды (load <имя файла>) – загрузка файла (load “FWGC. LSP”) n (inspect) – MCL. Команды (load <имя файла>) – загрузка файла (load “FWGC. LSP”) n (inspect) – инспектор группы n Задание к лабораторной работе № 7: n ¨ Изучите в обучающей системе (alt E) разделы с " Использование рекурсии" по "Чтение файлов". Мар. ГТУ 2008 г. 46

CLISP. Команды (load <имя файла>) – загрузка файла (load “FWGC. LSP”) n (compile-file <имя CLISP. Команды (load <имя файла>) – загрузка файла (load “FWGC. LSP”) n (compile-file <имя файла>) – компиляция файла. Создает файл с расширением fas. (compile-file “FWGC. LSP”) (load “FWGC. fas”) n Мар. ГТУ 2008 г. 47

CLISP. Помощь /doc/clisp. html – основные команды запуска приложения n /doc/LISP-tutorial. txt – синтаксис CLISP. Помощь /doc/clisp. html – основные команды запуска приложения n /doc/LISP-tutorial. txt – синтаксис языка n /doc/impnotes. html – синтаксис и расширения языка n Мар. ГТУ 2008 г. 48

Спасибо за внимание! Вопросы? Мар. ГТУ 2008 г. 49 Спасибо за внимание! Вопросы? Мар. ГТУ 2008 г. 49