Материал: 3130

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

(нахождение максимума). Конструкция 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

Источник: https://studfile.net/preview/16413162/