Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab3

.docx
Скачиваний:
33
Добавлен:
02.01.2023
Размер:
670.83 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

Отчет по лабораторной работе №3

по дисциплине «Введение в искусственный интеллект»

Студент гр.

Преподаватель

Родионов С.В.

Тема: Изучение основных возможностей и базовых команд среды CLIPS.

Разработка демонстрационной экспертной системы.

Цель работы: изучение основных возможностей и базовых команд среды CLIPS и практическое

Задачи:

  1. Изучить базовые команды и конструкции CLIPS: запустить систему CLIPS, активизировать окно просмотра текущего списка фактов, выполнить следующую последовательность действий, фиксируя после каждого шага состояние списка фактов: – сбросить систему в исходное состояние командой (clear); – выполнить начальную установку командой (reset); – ввести 3 любых упорядоченных факта командой (assert); – повторно выполнить сброс командой (reset); – установить 3 ранее вводимых упорядоченных факта в качестве исходных фактов, используя конструкцию (deffacts); – выполнить сброс командой (reset). Затем активизировать дополнительно окно просмотра агенды и выполнить последовательность действий по созданию правил, фиксируя после каждого шага состояния списка фактов и агенды.

  2. Разработать демонстрационную экспертную систему. Для этого необходимо: предложить предметную область демонстрационной экспертной системы; сформировать, пользуясь редактором CLIPS, базу знаний демонстрационной ЭС и сохранить ее в файле rulebase.clp. Общее количество правил в БЗ должно быть не менее 25. Количество значений переменных должно выбираться таким образом, чтобы БЗ отвечала требованию полноты, т.е. содержала правила, соответствующие любым сочетаниям значений переменных в левых частях правил; для активизации ЭС в среде CLIPS использовать пакетный файл Run_Lab_3.bat; протестировать ЭС на различных комбинациях входных значений в пошаговом режиме.

Задание 1

Рисунок 1. Сброс системы командой clear и начальная установка командой reset

Рисунок 2. Выполнение команды assert

Рисунок 3. Повторное использование команды reset

Рисунок 4. Использование конструкции deffacts

Рисунок 5. Выполнение сброса командой reset

Рисунок 6. Использование конструкции deffrule

Рисунок 7. Активизация правил 1

Рисунок 8. Активизация правил 2

Описание выбранной предметной области

ЭС должна определять нужную книгу для пользователя, она имеет четыре входные переменные (тип обложки, кол-во страниц, цена и жанр), две промежуточные переменные (кол-во страниц и стоимость) и выходную переменную (название книги).

Пример работы программы

Рисунок 9. Пример работы программы 1

Рисунок 10. Пример работы программы 2

Рисунок 10. Пример работы программы 3

Текст программы представлен в приложении.

Вывод

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

Приложение

; Шаблон выбираемой книги

(deftemplate book_struct "Book struct"

  ; Название книги

  (slot name (type STRING))

  ; Тип обложки: твердый переплет, мягкий переплет, бумажная

  (slot cover (type STRING) (allowed-values "hard" "soft" "paper"))

  ; Кол-во страниц

  (slot pagesNumber (type STRING) (allowed-values "many" "few"))

  ; Стоимость

  (slot price (type STRING) (allowed-values "low" "high"))

  ; Жанр

  (slot genre (type STRING) (allowed-values "drama" "novel"))

);

; Изначальная "база знаний" (библиотека)

(deffacts initial

  (book_struct (name "Gone by wind") (cover "soft") (pagesNumber "many") (price "low") (genre "drama"));

  (book_struct (name "Karamazovy brothers") (cover "soft") (pagesNumber "many") (price "low") (genre "novel"));

  (book_struct (name "Idiot") (cover "soft") (pagesNumber "many") (price "high") (genre "drama"));

  (book_struct (name "Crime and punishment") (cover "soft") (pagesNumber "many") (price "high") (genre "novel"));

  (book_struct (name "Childhood") (cover "soft") (pagesNumber "few") (price "low") (genre "drama"));

  (book_struct (name "Dead souls") (cover "soft") (pagesNumber "few") (price "low") (genre "novel"));

  (book_struct (name "Shinel") (cover "soft") (pagesNumber "few") (price "high") (genre "drama"));

  (book_struct (name "Taras Bulba") (cover "soft") (pagesNumber "few") (price "high") (genre "novel"));

  (book_struct (name "Nose") (cover "paper") (pagesNumber "few") (price "low") (genre "novel"));

  (book_struct (name "Viy") (cover "paper") (pagesNumber "few") (price "low") (genre "drama"));

  (book_struct (name "War and peace") (cover "paper") (pagesNumber "few") (price "high") (genre "novel"));

  (book_struct (name "Sunday") (cover "paper") (pagesNumber "few") (price "high") (genre "drama"));

  (book_struct (name "Afterparty") (cover "paper") (pagesNumber "many") (price "low") (genre "novel"));

  (book_struct (name "Captain's daughter") (cover "paper") (pagesNumber "many") (price "low") (genre "drama"));

  (book_struct (name "Pushkin's fairy tales") (cover "paper") (pagesNumber "many") (price "high") (genre "novel"));

  (book_struct (name "Transformation") (cover "paper") (pagesNumber "many") (price "high") (genre "drama"));

  (book_struct (name "Process") (cover "hard") (pagesNumber "many") (price "low") (genre "drama"));

  (book_struct (name "Castle") (cover "hard") (pagesNumber "many") (price "low") (genre "novel"));

  (book_struct (name "Hero of our time") (cover "hard") (pagesNumber "many") (price "high") (genre "drama"));

  (book_struct (name "Mtsyri") (cover "hard") (pagesNumber "many") (price "high") (genre "novel"));

  (book_struct (name "Borodino") (cover "hard") (pagesNumber "few") (price "low") (genre "drama"));

  (book_struct (name "Esenin's poems") (cover "hard") (pagesNumber "few") (price "low") (genre "novel"));

  (book_struct (name "Gamer") (cover "hard") (pagesNumber "many") (price "high") (genre "drama"));

  (book_struct (name "White nights") (cover "hard") (pagesNumber "few") (price "high") (genre "novel"));

  (book_struct (name "Poor people") (cover "hard") (pagesNumber "many") (price "low") (genre "drama")); additional

);

; Точка входа в приложение

(defrule init

  (initial-fact)

  =>

  (assert (choice 0))

);

(defrule R_menu

  (choice 0)

  ?f_addr <- (choice 0)

  =>

  (printout t crlf "Enter 1 if you want take recommendation," crlf

                        "2 if you want to add new book," crlf

                        "3 if you want to exit" crlf "> ");

  (bind ?choice (read)); Введенное значение приравнивается переменной

  (assert (choice ?choice));

  (retract ?f_addr);

);

; Получение рекомендации

(defrule R_recommend

  (choice 1)

  =>

  (printout t crlf "Enter needed book's cover (hard, soft or paper): ");

  (bind ?buff2 (str-cat (read)));

  (assert (user_book_cover ?buff2));

  (printout t crlf "Enter pages number (many or few): ");

  (bind ?buff3 (str-cat (read)));

  (assert (user_book_pagesNumber ?buff3));

  (printout t crlf "Enter needed price (low or high): ");

  (bind ?buff4 (str-cat (read)));

  (assert (user_book_price ?buff4));

  (printout t crlf "Enter needed genre (drama, novel): ");

  (bind ?buff5 (str-cat (read)));

  (assert (user_book_genre ?buff5));

);

; Выдача рекомендации

(defrule R_found

  (choice 1)

  (user_book_cover ?x_cover)

  (user_book_pagesNumber ?x_pagesNumber)

  (user_book_price ?x_price)

  (user_book_genre ?x_genre)

  (book_struct (name ?x_name) (cover ?x_cover) (pagesNumber ?x_pagesNumber) (price ?x_price) (genre ?x_genre))

  ?f_addr <- (choice 1)

  =>

  (printout t crlf "Founded book for you: " ?x_name ". " crlf);

  (retract ?f_addr);

  (assert (choice 0));

);

; Если запросу пользователя не найти книгу из библиотеки

(defrule R_not_found

  (choice 1)

  (user_book_cover ?x_cover)

  (user_book_pagesNumber ?x_pagesNumber)

  (user_book_price ?x_price)

  (user_book_genre ?x_genre)

  (not(exists(book_struct (name ?x_name) (cover ?x_cover) (pagesNumber ?x_pagesNumber) (price ?x_price) (genre ?x_genre))))

  ?f_addr <- (choice 1)

  =>

  (printout t crlf "Not founded book for you" crlf);

  (retract ?f_addr);

  (assert (choice 0));

);

; Дополнение "базы знаний"

(defrule R_read_data

  (choice 2)

  =>

  (printout t crlf "Enter book name: ");

  (bind ?buff1 (str-cat (read)));

  (assert (new_book_name ?buff1));

  (printout t crlf "Enter book's cover (hard, soft or paper): ");

  (bind ?buff2 (str-cat (read)));

  (assert (new_book_cover ?buff2));

  (printout t crlf "Enter pages number: ");

  (bind ?buff3 (read));

  (assert (new_book_pagesNumber_num ?buff3));

  (printout t crlf "Enter book's price: ");

  (bind ?buff4 (read));

  (assert (new_book_price_rub ?buff4));

  (printout t crlf "Enter book's genre (drama, novel): ");

  (bind ?buff5 (str-cat (read)));

  (assert (new_book_genre ?buff5));

);

; Перевод кол-ва страниц в категорию численности

(defrule R_if1

  (choice 2)

  (new_book_pagesNumber_num ?x)

  (test (< ?x 450))

  ?f_addr <- (new_book_pagesNumber_num ?x)

  =>

  (assert (new_book_pagesNumber "few"));

  (retract ?f_addr);

);

; Перевод кол-ва страниц в категорию численности

(defrule R_if1_else

  (choice 2)

  (new_book_pagesNumber_num ?x)

  (test (>= ?x 450))

  ?f_addr <- (new_book_pagesNumber_num ?x)

  =>

  (assert (new_book_pagesNumber "many"));

  (retract ?f_addr);

);

; Перевод числовой цены в категорию стоимости

(defrule R_if2

  (choice 2)

  (new_book_price_rub ?x)

  (test (< ?x 800))

  ?f_addr <- (new_book_price_rub ?x)

  =>

  (assert (new_book_price "low"));

  (retract ?f_addr);

);

; Перевод числовой цены в категорию стоимости

(defrule R_if2_else

  (choice 2)

  (new_book_price_rub ?x)

  (test (>= ?x 800))

  ?f_addr <- (new_book_price_rub ?x)

  =>

  (assert (new_book_price "high"));

  (retract ?f_addr);

);

; Занесение новой книги в библиотеку

(defrule R_add_new_book

  (choice 2)

  (new_book_name ?x_name)

  (new_book_cover ?x_cover)

  (new_book_pagesNumber ?x_pagesNumber)

  (new_book_price ?x_price)

  (new_book_genre ?x_genre)

  ?f_addr_0 <- (choice 2)

  ?f_addr_1 <- (new_book_name ?x_name)

  ?f_addr_2 <- (new_book_cover ?x_cover)

  ?f_addr_3 <- (new_book_pagesNumber ?x_pagesNumber)

  ?f_addr_4 <- (new_book_price ?x_price)

  ?f_addr_5 <- (new_book_genre ?x_genre)

  =>

  (assert (book_struct (name ?x_name) (cover ?x_cover) (pagesNumber ?x_pagesNumber) (price ?x_price) (genre ?x_genre)));

  (retract ?f_addr_1 ?f_addr_2 ?f_addr_3 ?f_addr_4 ?f_addr_5 ?f_addr_0);

  (assert (choice 0));

);

; Выход из программы

(defrule R_goodbye

  (choice 3)

  =>

  (printout t crlf "Goodbye!" crlf);

);

Санкт-Петербург

2022

Соседние файлы в предмете Введение в искусственный интеллект