Скачиваний:
9
Добавлен:
01.05.2014
Размер:
318.46 Кб
Скачать

Лабораторная работа №6

«Построение простейших экспертных систем»

Цель работы: приобретение навыков программирования экспертных систем (ЭС) и информационно-справочных систем (ИСС) на языке muLisp.

Задание к работе: составить программу, содержащую сведения о лучшей десятке фильмов. Данные для построения вывода: название, режиссер, сценарист, год выпуска, киностудия, страна-производитель. В программе должна быть реализована возможность получения следующей информации: по порядковому номеру – фамилия режиссера, название фильма, страны-производителя; все фильмы одного годы выпуска или одной киностудии; все фильмы одной страны.

Выполнение работы:

Описание функций:

printfx (list) – печатает полную информацию о фильме, который удовлетворяет заданным условиям поиска.

printfx1 (list) – печатает только номер и название фильма, который удовлетворяет заданным условиям поиска.

films_10 ( ) – содержит описание базы данных о лучшей десятке фильмов и организует вывод главного меню программы.

analiz_flag (flag) – функция, которая в зависимости от значения параметра flag формирует отрицательный ответ, если в базе нет фильмов, удовлетворяющих заданным критериям.

analiz_number (number list) – определяет, имеет ли фильм list порядковый номер number.

poisk_number (films) – организует поиск фильма по его номеру.

analiz_year (year list) – определяет, имеет ли фильм list год выпуска year.

poisk_year (films) – организует поиск фильмов по году выпуска.

analiz_strana (strana list) – определяет, произведен ли фильм list в стране strana.

poisk_strana (films) – организует поиск фильмов по стране-производителю.

analiz_studio (studio list) – определяет, произведен ли фильм list на киностудии studio.

poisk_studio (films) – организует поиск фильмов одной киностудии.

analiz (punkt films) – анализирует введенный пункт меню и вызывает соответствующую функцию выполнения поиска.

Листинг программы:

(defun printfx (list)

(prin1 "Порядковый номер ==> ") (print (nth 0 list))

(prin1 "Название ==> ") (print (nth 1 list))

(prin1 "Режиссер ==> ") (print (nth 2 list))

(prin1 "Сценарист ==> ") (print (nth 3 list))

(prin1 "Год ==> ") (print (nth 4 list))

(prin1 "Киностудия ==> ") (print (nth 5 list))

(prin1 "Страна ==> ") (print (nth 6 list))

(print "===========================================")

)

(defun printfx1 (list)

(prin1 "Порядковый номер ==> ") (print (nth 0 list))

(prin1 "Название ==> ") (print (nth 1 list))

(print "===========================================")

)

(defun films_10 ( )

(setq films

' ( (1 "Пираты Карибского моря-3: На краю света" "Гор Вербински" "Джерри Брукхаймер" 2007 "Universal" "USA")

(2 "Самый лучший фильм" "Кирилл Кузин" "Алексей Огурцов" 2007 "Mosfilm" "Russia")

(3 "Ирония судьбы - 2. Продолжение" "Тимур Бекмамбетов" "Алексей Слеповский" 2007 "Mosfilm" "Russia")

(4 "Восемнадцать - четырнадцать" "Андрес Пуустусмаа" "Иван Мартынов" 2007 "Lenfilm" "Russia")

(5 "Беовульф" "Роберт Земекис" "Рэй Уинстоун" 2007 "Paramount" "USA")

(6 "1612: Хроники Смутного времени" "Владимир Хатиненко" "Ариф Алиев" 2007 "Trite" "Russia")

(7 "Везунчик" "Кертис Хенсон" "Эрик Рот" 2007 "Paramount" "USA")

(8 "Вторжение" "Оливер Хиршбигель" "Дениэл Крейг" 2007 "Universal" "USA")

(9 "Зодиак" "Девид Финчер" "Кевин Лима" 2007 "Universal" "USA")

(10 "Королевство" "Стивен Фрирц" "Питер Берг" 2007 "Miramax" "France")

))

(loop

(print "Добро пожаловать в лучшую десятку фильмов!")

(print "Выберите нужный пункт")

(print "1 - Найти фильм по порядковому номеру")

(print "2 - Найти все фильмы одного года выпуска")

(print "3 - Найти все фильмы одной страны")

(print "4 - Найти все фильмы одной киностудии")

(print "5 - Выйти из программы")

(setq punkt (read))

((>= punkt 5) "Выход")

(analiz punkt films)

(print "Желаете продолжить? (1/0)")

(setq yes_no (read))

((eql yes_no 0) "Выход")

)

)

(defun analiz_flag (flag)

(( or (eql flag nil) (eql flag 0)) (print "Не найден фильм с такими параметрами"))

(( eql flag 1) (print "Фильм найден"))

)

(defun analiz_number (number list)

(if (eql number (nth 0 list)) (progn (printfx list) (setq f 1)))

)

(defun poisk_number (films)

(prin1 "Введите порядковый номер фильма: ") (setq number (read)) (print " ")

(setq flag 0)

(loop

((null films) (analiz_flag flag))

( if ( eql flag 1) (analiz_number number (pop films)) (setq flag (analiz_number number (pop films))))

)

)

(defun analiz_year (year list)

(if (eql year (nth 4 list)) (progn (printfx1 list) (setq f 1)))

)

(defun poisk_year (films)

(prin1 "Введите год выпуска фильма: ") (setq year (read)) (print " ")

(setq flag 0)

(loop

((null films) (analiz_flag flag))

( if ( eql flag 1) (analiz_year year (pop films)) (setq flag (analiz_year year (pop films))))

)

)

(defun analiz_strana (strana list)

(if (string= strana (nth 6 list) t) (progn (printfx1 list) (setq f 1)))

)

(defun poisk_strana (films)

(prin1 "Введите страну-производитель фильма: ") (setq strana (read)) (print " ")

(setq flag 0)

(loop

((null films) (analiz_flag flag))

( if ( eql flag 1) (analiz_strana strana (pop films)) (setq flag (analiz_strana strana (pop films))))

)

)

(defun analiz_studio (studio list)

(if (string= studio (nth 5 list) t) (progn (printfx1 list) (setq f 1)))

)

(defun poisk_studio (films)

(prin1 "Введите киностудию-производитель фильма: ") (setq studio (read)) (print " ")

(setq flag 0)

(loop

((null films) (analiz_flag flag))

( if ( eql flag 1) (analiz_studio studio (pop films)) (setq flag (analiz_studio studio (pop films))))

)

)

(defun analiz (punkt films)

((eql punkt 1) (poisk_number films))

((eql punkt 2) (poisk_year films))

((eql punkt 3) (poisk_strana films))

((eql punkt 4) (poisk_studio films))

)

Работа программы: Для начала работы программы необходимо вызвать функцию films_10, при этом появится главное меню программы:

Далее нужно выбрать необходимый пункт меню:

При выборе пункта №1 будет найден фильм по порядковому номеру:

При выборе пункта №2 будут найдены все фильмы одного года выпуска:

При выборе пункта №3 будут найдены все фильмы одной страны:

При выборе пункта №4 будут найдены все фильмы одной киностудии:

При выборе пункта №5 произойдет выход из программы.

Вывод: в данной лабораторной работе состоялось знакомство с основами построения экспертных систем и информационно-справочных систем на языке muLisp. В ходе выполнения работы были получены навыки по созданию внутренней базы знаний в виде списка списков, а также поиску фильмов, соответствующих заданным критериям.

6

Соседние файлы в папке Лабораторные работы на muLisp