(нахождение максимума). Конструкция deffunction позволяет пользователю определять новые функции непосредственно в среде CLIPS.
2.2.4. Конструкции
В CLIPS существует несколько описывающих конструкций: defmodule, defrule, deffacts, deftemplate, defglobal, deffunction, defclass, definstances, defmes- sage-handler, defgeneric. При записи все они заключаются в скобки. Определение конструкции отличается от вызова функции главным образом по производимому эффекту. В отличие от функций конструкции никогда не возвращают значений.
2.2.5. Факты
Факты являются одной из основных форм представления информации в системе CLIPS. Каждый факт представляет фрагмент информации, который был помещен в текущий список фактов, называемый fact-list.
Сразу после запуска CLIPS-приложения на выполнение на экране появится приглашение, извещающее пользователя, что он работает с интерпретато-
ром: CLIPS>. |
|
Факты можно включить в базу |
CLIPS> (assert (today is Sunday)) |
фактов прямо из командной строки |
<Fact-0> |
с помощью команды assert |
CLIPS> (assert (weather is warm)) |
|
<Fact-l> |
Для вывода списка фактов, |
CLIPS> (facts) |
имеющихся в базе, используется |
f-0 (today is Sunday) |
команда facts |
f-1 (weather is warm) |
Для удаления фактов из базы |
CLIPS> (retract 1) |
используется команда retract |
CLIPS> (facts) |
|
f-0 (today is Sunday) |
Команда clear очищает |
CLIPS> (clear) |
базу фактов |
CLIPS> (facts) |
В тексте программы факты |
(deffacts today |
можно включать в базу массивом. |
(today is Sunday) |
Используется команда deffacts |
(weather is warm)) |
Выражение начинается с команды deffacts, затем приводится имя списка фактов, который программист собирается определить (в примере — today), за
ним следуют элементы списка. |
|
Этот массив фактов можно |
CLIPS> (undeffacts today) |
удалить из базы командой undef facts |
|
6
Выражение deffacts лучше |
CLIPS> (load "my file") |
записать в текстовый файл, а |
CLIPS> (reset) |
затем загрузить. Команда reset сначала очищает базу фактов, а затем включает
внее факты из всех ранее загруженных массивов.
2.2.6.Правила
Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент,
как только оно становится применимым. |
|
В языке CLIPS правила имеют формат: |
Например: |
(defrule <имя правила> |
(defrule chores |
< необязательный комментарий > |
"Things to do on Sunday" |
< необязательное объявление > |
(salience 10) |
< предпосылка_1 > |
(today is Sunday) |
< предпосылка_т > => |
(weather is warm) => |
< действие_1 > |
(assert (wash car)) |
< предпосылка_п >) |
(assert (chop wood)) |
В этом примере Chores — произвольно выбранное имя правила. Предпосылки в условной части правила (today is Sunday), (weather is warm) сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =>), вставят в базу два факта (wash car), (chop wood) в случае, если правило будет активизировано. Приведенный в тексте правила комментарий "Things to do on Sunday" ("Что сделать в воскресенье") поможет в дальнейшем вспомнить, для чего это правило включено в программу.
Выражение (salience 10) указывает на степень важности правила. Пусть, например, в программе имеется другое правило:
Поскольку предпосылки обоих правил |
(defrule fun |
одинаковы, то при выполнении оговоренных |
"Better things to do on Sunday" |
условий они будут "конкурировать" за |
(salience 100) |
внимание интерпретатора. Предпочтение |
(today is Sunday) |
будет отдано правилу, у которого параметр |
(weather is warm) => |
salience имеет более высокое значение, |
(assert (drink beer)) |
в данном случае — правилу fun. |
(assert (play guitar))) |
Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.
7
Обычно в определении правила |
(defrule pick-a-chore |
присутствуют и переменные. Если, |
"Allocating chores to days" |
например, правило |
(today is ?day) |
|
(chore is ?job) => |
|
(assert (do ?job on ?day)) ) |
будет сопоставлено с фактами |
(today is Sunday) (chore is carwash) |
то в случае активизации оно включит |
|
в базу новый факт |
(do carwash on Sunday) |
Аналогично, правило |
(defrule drop-a-chore |
отменит выполнение работ |
"Allocating chores to days" |
по дому (a chore). Оба эк- |
(today is ?day) |
экземпляра переменной |
?chore <- (do ?job on ?day) => |
?day должны получить |
(retract ?chore) ) |
одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой со-
держатся |
(today is Sunday) |
то при активизации правила |
(do carwash on Sunday) |
из базы будет удален факт |
(do carwash on Sunday) |
Отметим, что факт |
(do carwash on Sunday) |
будет сопоставлен с любым из представленных ниже образцов
Учтите, что префикс $? |
(do ? ? Sunday) |
является признаком |
(do ? on ?) |
сегментной переменной, |
(do ? on ?when) |
которая будет связана |
(do $?) |
с сегментом списка. |
(do $? Sunday) |
|
(do ?chore $?when) |
Например, в приведенном выше примере переменная $?when будет связана с (on Sunday). Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.
2.3. Наблюдение за процессом интерпретации
Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.
8
(defrule start (initial-fact)
(printout t "hello, world" crlf) )
Выполните команду reset. Для этого либо введите эту команду в командной строке интерпретатора
CLIPS> (reset)
либо выберите в меню команду Execution=>Reset, либо нажмите <CTRL+U> (последних два варианта возможны в версии, которая работает под Windows).
Затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора
CLIPS> (run)
либо выберите в меню команду ExecutionORun, либо нажмите <CTRL+R> (последних два варианта возможны в версии, которая работает под Windows).
Вответ программа должна вывести сообщение hello, world, знакомое всем программистам мира. Для повторного запуска программы повторите команды reset и run.
Если в меню Execution^Watch ранее был установлен флажок Rules или перед запуском программы на выполнение вы ввели в командную строку команду watch rules, то на экране появится результат трассировки процесса выполнения
CLIPS> (run) FIRE 1 start: f-0 hello, world
Вэтом сообщении в строке, начинающейся с FIRE, выведена информация об активизированном правиле: start — это имя правила, а f-0 — имя факта, который "удовлетворил" условие в этом правиле. Команда watch позволяет организовать несколько разных режимов трассировки, с деталями которых вы можете познакомиться в Руководстве пользователя. Если перед запуском программы вы ввели
CLIPS> (dribble-on "dribble.dp") TRUE
то выведенный протокол трассировки будет сохранен в файле dribble.dp. Сохранение протокола прекратится после ввода команды
CLIPS> (dribble-off) TRUE
Это очень удобная опция, особенно на этапе освоения языка.
2.4. Использование шаблонов
9
Для определения фактов можно использовать не только списочные структуры, но и шаблоны, которые напоминают простые записи. (Шаблоны в CLIPS не имеют ничего общего с шаблонами C++.) Шаблон выглядит примерно так:
(deftemplate student "a student record"
(slot name (type STRING)) (slot age (type NUMBER) (default 18))
Каждое определение шаблона состоит из произвольного имени шаблона, необязательного комментария и некоторого количества определений слотов. Слот включает поле данных, например name, и тип данных, например STRING. Можно указать и значение по умолчанию, как в приведенном выше примере.
Если в программу включено приведенное выше определение шаблона, то выражение
(deffacts students (student (name fred))
(student (name freda) (age 19)) )
приведет к тому, что в базу фактов после выполнения команды reset будет добавлено
(student (name fred) (age 18)) (student (name freda) (age 19))
ЛАБОРАТОРНАЯ РАБОТА №2. «Логическое программирование» Цель работы:
1.Изучение языка логического программирования Турбо-Пролог.
2.Создание экспертной системы на языке логического программирования PROLOG, содержащей базу правил, начальные факты и возможные исходы.
Теоретическое введение.
Синтаксис и семантика Пролог-программ
3.1. Объекты данных
На Рис.3.1. приведена классификация объектов данных Пролога. Прологсистема распознает тип объекта по его синтаксической форме в тексте программы.
Рис.3.1. Обьекты данных Пролога.
простые объекты |
|
структуры |
|
|
|
константы переменные
атомы |
|
числа |
|
|
|
10