Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лисп - лаб.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
373.76 Кб
Скачать

Лабораторная работа №3 Построение простейших экспертных систем

При выполнении заданий студенты должны приобрести навыки программирования экспертных систем (ЭС) и информационно–справочных систем (ИСС). Во всех системах должен быть реализован дружественный диалог с пользователем. Указанные в каждой задаче по ЭС характеристики для оценки являются необязательными, они показывают примерный набор критериев для построения дерева вывода.

 

Пример.

 Имеется база данных, хранящая сведения о книгах библиотеки. По каждой книге имеются следующие сведения: автор, название, издательство и год издания. Требуется построить систему, которая позволит по автору и году издания получить полную информацию о всех книгах, удовлетворяющих заданным параметрам.

Реализация в Mulisp

Описание пользовательских функций:

lastelt (list) – функция позволяет получить последний элемент списка;

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

books_lib() – функция содержит описание базы данных задачи и организует общий вычислительный процесс;

analiz(autor year list) – для заданной книги, которая связана с параметром list, выполняет проверку на соответствие заданному автору и году;

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

 

(defun lastelt (list)

((null (cdr list)) (car list))

(lastelt (cdr list))

)

(defun printfx(list)

(prin1 "Autor=>")(print (car list))

(prin1 "Title=>")(print (cadr list))

(prin1 "Publisher=>")(print (caddr list))

(prin1 "Year=>")(print (lastelt list))

(print "+++++++++++++++++++++++")

)

(defun books_lib()

(setq books

'(("R.Forsyth" "Expert systems" "Chapman and Hall" 1987)

("J.Doores" "Prolog" "Sigma Press" 1980)

("D.Marscellus" "Expert systems" "Prentice Hall" 1994)

("K.M.Yin" "Using Turbo Prolog" "Que Corporation" 1993)

("J.R.R. Tolkien" "The return of the king" "Rainbow" 1990)

("J.R.R. Tolkien" "The two towers" "Rainbow" 1994)

("R.Jordan" "The fires of heaven" "ACT" 1997)

("R.Jordan" "The dragon reborn" "ACT" 1997))

)

(print "Expert system")

(prin1 "Autor=>")(setq autor (read))(print "–––––––––")

(prin1 "Year=>")(setq year (read))(print "–––––––––")

(setq flag 0)

(loop

((null books)(analiz_flag flag))

(if (eql flag 1) (analiz autor year (pop books))

(setq flag (analiz autor year (pop books))))

)

)

(defun analiz_flag(flag)

((or (eql flag nil)(eql flag 0))

(print "Not found this book"))

((eql flag 1)(print "Ok rezault"))

)

(defun analiz(autor year list)

(if (and (string= autor (car list) t)

(eql year (lastelt list)))

(progn (printfx list) (setq f 1)))

)

Реализация для LispWorks Вариант 1

Для описания записи используется property list (список свойств) или, сокращенно, plist . Plist – это такой список, в котором каждый нечетный элемент является символом, описывающим следующий (чётный) элемент списка. Для символов, именующих поля записи, можно использовать частный случай символов, называемый символами-ключами (keyword symbol) и начинающихся с двоеточия (:)

(defun construct-book (autor title publisher year)

(list :autor autor :title title :publisher publisher :year year))

defvar books

(list (construct-book "R.Forsyth" "Expert systems" "Chapman and Hall" 1987)

(construct-book "J.Doores" "Prolog" "Sigma Press" 1980)

(construct-book "K.M.Yin" "Using Turbo Prolog" "Que Corporation" 1993 )

(construct-book "J.R.R. Tolkien" "The return of the king" "Rainbow" 1990)

(construct-book "J.R.R. Tolkien" "The two towers" "Rainbow" 1994)

(construct-book "R.Jordan" "The dragon reborn" "ACT" 1997)

(construct-book "R.Jordan" "The fires of heaven" "ACT" 1997)

(construct-book "D.Marscellus" "Expert systems" "Prentice Hall" 1994)))

(defun print-list (stl)

(print "Результат")

(dolist (cd stl)

(format t "~{~a:~10t~a~%~}~%" cd)))

(defun select-by-book (autor year)

(setq res

(and (remove-if-not #'(lambda (cd) (equal (getf cd :autor) autor)) books)

(remove-if-not #'(lambda (cd) (equal (getf cd :year) year)) books)))

(cond ((null res) (print "Совпадений нет") nil )

(t (print-list res))))

(defun start ()

(print "Введите автора ->") (setq autor (read))

(print "Введите год издания ->") (setq year (read))

(select-by-book autor year)

)

Пример обращения:

CL-USER > (start)

"Введите автора ->" "R.Jordan"

"Введите год издания ->" 1997

"Результат"

AUTOR: R.Jordan

TITLE: The dragon reborn

PUBLISHER: ACT

YEAR: 1997

AUTOR: R.Jordan

TITLE: The fires of heaven

PUBLISHER: ACT

YEAR: 1997