This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
courses:knowledge_representation_and_artificial_intelligence_systems:lab1 [2019/07/16 09:47] andrey.suchkov [Изучение базовых команд и конструкций CLIPS] |
courses:knowledge_representation_and_artificial_intelligence_systems:lab1 [2022/12/10 09:08] (current) |
||
---|---|---|---|
Line 10: | Line 10: | ||
^ Пункт ^ Подпункт ^ <<Горячие>> клавиши ^ Назначение команды ^ | ^ Пункт ^ Подпункт ^ <<Горячие>> клавиши ^ Назначение команды ^ | ||
- | | File | New | Ctrl-N | Вызов редактора | | + | | File | New | <nowiki>^</nowiki>N | Вызов редактора | |
- | | ::: | Load | Ctrl-L | Загрузка конструкций из файла | | + | | ::: | Load | <nowiki>^</nowiki>L | Загрузка конструкций из файла | |
| ::: | Load Batch | - | Исполнение пакетного файла | | | ::: | Load Batch | - | Исполнение пакетного файла | | ||
- | | Execution | Reset | Ctrl-E | Инициализация конструкций | | + | | Execution | Reset | <nowiki>^</nowiki>E | Инициализация конструкций | |
- | | ::: | Run | Ctrl-R | Запуск МЛВ | | + | | ::: | Run | <nowiki>^</nowiki>R | Запуск МЛВ | |
- | | ::: | Step | Ctrl-T | Выполнение одного шага вывода | | + | | ::: | Step | <nowiki>^</nowiki>T | Выполнение одного шага вывода | |
| Window | Facts Window | - | Активация окна списка фактов | | | Window | Facts Window | - | Активация окна списка фактов | | ||
| ::: | Agenda Window | - | Активация окна агенды | | | ::: | Agenda Window | - | Активация окна агенды | | ||
Line 55: | Line 55: | ||
(deffacts <имя_группы_фактов> ["<комментарий>"] <факт>*) | (deffacts <имя_группы_фактов> ["<комментарий>"] <факт>*) | ||
</code> | </code> | ||
- | где ''<имя_группы_фактов>'' -- идентификатор символьного типа; ''<комментарий>'' -- необязательное поле комментария; ''<факт>*)'' -- произвольная последовательность фактов, записанных через разделитель. | + | где ''<имя_группы_фактов>'' -- идентификатор символьного типа; ''<комментарий>'' -- необязательное поле комментария; ''<факт>*'' -- произвольная последовательность фактов, записанных через разделитель. |
+ | |||
+ | Пример использования конструкции ''deffacts'': | ||
+ | <code> | ||
+ | (deffacts startup "Refrigerator Status" | ||
+ | (refrigerator light on) | ||
+ | (refrigerator door open)) | ||
+ | </code> | ||
Факты, определенные конструкцией ''deffacts'' добавляются в список фактов всякий раз при выполнении команды ''reset''. | Факты, определенные конструкцией ''deffacts'' добавляются в список фактов всякий раз при выполнении команды ''reset''. | ||
- | Для задания правил используется конструкция defrule со следующим синтаксисом: | + | Для задания правил используется конструкция '' defrule'' со следующим синтаксисом: |
<code> | <code> | ||
(defrule <имя_правила> ["<комментарий>"] | (defrule <имя_правила> ["<комментарий>"] | ||
[<объявление>] | [<объявление>] | ||
- | <условный элемент>* ; Левая часть правила (антецедент) | + | <условный элемент>* ; Левая часть правила (антецедент) |
=> | => | ||
- | <действие>*) ; Правая часть правила (консеквент) | + | <действие>*) ; Правая часть правила (консеквент) |
</code> | </code> | ||
где ''<имя_правила>'' -- идентификатор символьного типа, уникальный для данной группы правил; ''<комментарий>'' -- необязательное поле комментария; ''<условный элемент>*'' -- произвольная последовательность условных элементов; ''<действие>*'' -- произвольная последовательность действий. | где ''<имя_правила>'' -- идентификатор символьного типа, уникальный для данной группы правил; ''<комментарий>'' -- необязательное поле комментария; ''<условный элемент>*'' -- произвольная последовательность условных элементов; ''<действие>*'' -- произвольная последовательность действий. | ||
Line 71: | Line 78: | ||
Пример задания правила: | Пример задания правила: | ||
<code> | <code> | ||
- | (defrule R1 | + | (defrule R1 "Пример задания правила" |
(days 2) | (days 2) | ||
(works 100) | (works 100) | ||
Line 83: | Line 90: | ||
Демонстрационная ЭС разрабатывается для предметной области, согласованной с преподавателем и производится ее тестирование на различных комбинациях входных значений в пошаговом режиме. | Демонстрационная ЭС разрабатывается для предметной области, согласованной с преподавателем и производится ее тестирование на различных комбинациях входных значений в пошаговом режиме. | ||
===== Порядок выполнения работы ===== | ===== Порядок выполнения работы ===== | ||
- | ==== Изучение базовых команд и конструкций CLIPS ==== | + | ==== 1. Изучение базовых команд и конструкций CLIPS ==== |
- Запустить систему CLIPS (файл //clipswin.exe//). Активизировать окно просмотра текущего списка фактов (подпункт <<Facts Window>> пункта <<Windows>> главного меню). Выполнить следующую последовательность действий, фиксируя после каждого шага состояние списка фактов: | - Запустить систему CLIPS (файл //clipswin.exe//). Активизировать окно просмотра текущего списка фактов (подпункт <<Facts Window>> пункта <<Windows>> главного меню). Выполнить следующую последовательность действий, фиксируя после каждого шага состояние списка фактов: | ||
* сбросить систему в исходное состояние командой ''(clear)''; | * сбросить систему в исходное состояние командой ''(clear)''; | ||
- | * выполнить начальную установку командой (reset) или комбинацией клавиш Ctrl-E; | + | * выполнить начальную установку командой ''(reset)'' или комбинацией клавиш ^E; |
- | * ввести 3 любых упорядоченных факта командой (assert), например: \\ ''CLIPS> (assert (n n) (m m) (p p))''; | + | * ввести 3 любых упорядоченных факта командой ''(assert)'', например: \\ ''(assert (n n) (m m) (p p))''; |
* повторно выполнить сброс командой ''(reset)''; | * повторно выполнить сброс командой ''(reset)''; | ||
* установить 3 ранее вводимых упорядоченных факта в качестве исходных фактов, используя конструкцию ''(deffacts)''; | * установить 3 ранее вводимых упорядоченных факта в качестве исходных фактов, используя конструкцию ''(deffacts)''; | ||
* выполнить сброс командой ''(reset)''. | * выполнить сброс командой ''(reset)''. | ||
- Активизировать дополнительно окно просмотра агенды (подпункт <<Agenda Window>> пункта <<Windows>> главного меню). Выполнить следующую последовательность действий, фиксируя после каждого шага состояния списка фактов и агенды: | - Активизировать дополнительно окно просмотра агенды (подпункт <<Agenda Window>> пункта <<Windows>> главного меню). Выполнить следующую последовательность действий, фиксируя после каждого шага состояния списка фактов и агенды: | ||
- | * используя конструкцию ''(defrule)'', ввести три правила, такие, что антецеденты первых двух правил сопоставляются с комбинацией фактов, заданных ранее конструкцией (deffacts), а консеквенты этих правил добавляют новые факты, сопоставляемые с антецедентом третьего правила. Пусть, например, ''X'', ''Y'' и ''Z'' -- факты, заданные конструкцией ''(deffacts)''. Тогда структура вводимых правил может быть представлена следующим образом: <code> | + | * используя конструкцию ''(defrule)'', ввести три правила, такие, что антецеденты первых двух правил сопоставляются с комбинацией фактов, заданных ранее конструкцией ''(deffacts)'', а консеквенты этих правил добавляют новые факты, сопоставляемые с антецедентом третьего правила. Пусть, например, ''X'', ''Y'' и ''Z'' -- факты, заданные конструкцией ''(deffacts)''. Тогда структура вводимых правил может быть представлена следующим образом: <code> |
X & Y => V; | X & Y => V; | ||
Y & Z => W; | Y & Z => W; | ||
V & W => U; | V & W => U; | ||
</code> | </code> | ||
- | * выполнить по шагам активизацию правил (используя <<горячую>> комбинацию Ctrl-T). | + | * выполнить по шагам активизацию правил (используя <<горячую>> комбинацию ^T). |
- | ==== Разработка демонстрационной экспертной системы ==== | + | ==== 2. Разработка демонстрационной экспертной системы ==== |
* Сформировать, пользуясь редактором CLIPS, базу знаний демонстрационной ЭС и сохранить ее в файле //rulebase.CLP//. Предметную область экспертной системы выбрать по согласованию с преподавателем. | * Сформировать, пользуясь редактором CLIPS, базу знаний демонстрационной ЭС и сохранить ее в файле //rulebase.CLP//. Предметную область экспертной системы выбрать по согласованию с преподавателем. | ||
* Общее количество правил в базе знаний (БЗ) должно быть не менее 25. Количество значений переменных должно выбираться таким образом, чтобы БЗ отвечала требованию полноты, т.е. содержала правила, соответствующие любым сочетаниям значений переменных в левых частях правил. Например, если переменная <<свободное время>> имеет 3 значения (<<отсутствует>>, <<мало>> и <<много>>), а переменная <<погода>> -- 2 значения (<<плохая>> и <<хорошая>>), то максимальное число правил для определения переменной <<действие>> будет равно 6. | * Общее количество правил в базе знаний (БЗ) должно быть не менее 25. Количество значений переменных должно выбираться таким образом, чтобы БЗ отвечала требованию полноты, т.е. содержала правила, соответствующие любым сочетаниям значений переменных в левых частях правил. Например, если переменная <<свободное время>> имеет 3 значения (<<отсутствует>>, <<мало>> и <<много>>), а переменная <<погода>> -- 2 значения (<<плохая>> и <<хорошая>>), то максимальное число правил для определения переменной <<действие>> будет равно 6. | ||
Line 114: | Line 121: | ||
* Код программы. | * Код программы. | ||
===== Пример выполнения задания ===== | ===== Пример выполнения задания ===== | ||
- | Данная ЭС вырабатывает рекомендации студенту накануне зачета и имеет четыре входные переменные (<<число дней до зачета>>, <<количество несделанных лабораторных работ (в %)>>, <<температура на улице>> и <<наличие осадков>>), две промежуточные (<<свободное время>> и <<погода>>) и выходную переменную (<<рекомендуемые действия>>). Диаграмма зависимости переменных показана на рис. ниже, в скобках указаны возможные имена переменных. | + | Данная ЭС вырабатывает рекомендации студенту накануне зачета и имеет четыре входные переменные (<<число дней до зачета>>, <<количество несделанных лабораторных работ (в %)>>, <<температура на улице>> и <<наличие осадков>>), две промежуточные (<<свободное время>> и <<погода>>) и выходную переменную (<<рекомендуемые действия>>). Диаграмма зависимости переменных показана на рис. 1, в скобках указаны возможные имена переменных. |
- | {{ :courses:knowledge_representation_and_artificial_intelligence_systems:lab1_eg.png | Структура демострационной экспертной системы }} | + | {{ :courses:knowledge_representation_and_artificial_intelligence_systems:lab1_eg.png?nolink |Рисунок 1 – Структура демострационной экспертной системы}} |
==== Реализация ЭС в среде CLIPS ==== | ==== Реализация ЭС в среде CLIPS ==== | ||
<file text rulebase.CLP> | <file text rulebase.CLP> | ||
Line 121: | Line 128: | ||
(initial-fact) | (initial-fact) | ||
=> | => | ||
- | (printout t crlf "¬ведите число дней до зачета (целое значение): ") | + | (printout t crlf "Введите число дней до зачета (целое значение): ") |
(bind ?days (read)) | (bind ?days (read)) | ||
- | (if (numberp ?days) | + | (if (numberp ?days) |
- | then (assert (days ?days)) | + | then (assert (days ?days)) |
- | else (printout t "¬¬едите число" crlf)) | + | else (printout t "Введите число" crlf)) |
- | + | (printout t crlf "Введите число несделаных лабораторных работ (в %): ") | |
- | (printout t crlf "¬ведите число несделанных лабораторных работ (в %) ") | + | |
(bind ?works (read)) | (bind ?works (read)) | ||
(assert (works ?works))) | (assert (works ?works))) | ||
- | |||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
- | |||
- | ;(defrule test | ||
- | ; (days ?days) | ||
- | ; (works ?works) | ||
- | ;=> | ||
- | ;(printout t crlf crlf "ѕ–ќ¬≈– ј" crlf) | ||
- | ;(assert (freetime "no"))) | ||
(defrule R1 | (defrule R1 | ||
- | (days ?days) | + | (days ?days) |
- | (works ?works) | + | (works ?works) |
- | (test (and (= ?days 1) (<> ?works 0))) | + | (test (and (= ?days 1) (<> ?works 0))) |
=> | => | ||
- | (printout t crlf crlf "—вободного времени нет" crlf) | + | (printout t crlf crlf "Свободного времени нет!" crlf) |
- | (assert (freetime "no"))) | + | (assert (freetime "no"))) |
(defrule R2 | (defrule R2 | ||
- | (days ?days) | + | (days ?days) |
- | (works ?works) | + | (works ?works) |
- | (test (and (= ?days 2) (>= ?works 10))) | + | (test (and (= ?days 2) (>= ?works 10))) |
=> | => | ||
- | (printout t crlf crlf "—вободного времени нет" crlf) | + | (printout t crlf crlf "Свободного времени нет!" crlf) |
- | (assert (freetime "no"))) | + | (assert (freetime "no"))) |
(defrule R3 | (defrule R3 | ||
- | (days ?days) | + | (days ?days) |
- | (works ?works) | + | (works ?works) |
- | (test (and (= ?days 2) (< ?works 10))) | + | (test (and (= ?days 2) (< ?works 10))) |
=> | => | ||
- | (printout t crlf crlf "—вободного времени мало" crlf) | + | (printout t crlf crlf "Свободного времени мало!" crlf) |
- | (assert (freetime "a-little"))) | + | (assert (freetime "a-little"))) |
(defrule R4 | (defrule R4 | ||
- | (days ?days) | + | (days ?days) |
- | (works ?works) | + | (works ?works) |
- | (test (and (= ?days 3) (> ?works 25))) | + | (test (and (= ?days 3) (> ?works 25))) |
=> | => | ||
- | (printout t crlf crlf "—вободного времени нет" crlf) | + | (printout t crlf crlf "Свободного времени нет!" crlf) |
- | (assert (freetime "no"))) | + | (assert (freetime "no"))) |
;RULE: R5 | ;RULE: R5 |