Опубликован: 18.05.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технологический университет «Станкин»
Лекция 7:

Практическая разработка экспертных систем в среде CLIPS

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Основы программирования в системе CLIPS.

CLIPS (C Language Integrated Production System) начала разрабатываться в космическом центре Джонсона NASA в 1984 году. Сейчас CLIPS и документация на этот инструмент свободно распространяется через интернет (http://www.ghg.net/clips/CLIPS.html). Язык CLIPS свободен от недостатков предыдущих инструментальных средств для создания ЭС, основанных на языке LISP. Язык CLIPS получил большое распространение в государственных организациях и учебных заведениях благодаря низкой стоимости, мощности, эффективности и переносимости с платформы на платформу. Например, даже Web-ориентированный инструментарий JESS (Java Expert System Shell), использующий язык представления знаний CLIPS, приобрел достаточную известность в настоящее время.

Следует отметить, что несмотря на многочисленные преимущества функционального программирования, некоторые задачи лучше решать в терминах объектно-ориентированного программирования (ООП), для которого характерны три основные возможности: ИНКАПСУЛЯЦИЯ (работа с классами), ПОЛИМОРФИЗМ (работа с родовыми функциями, поддерживающими различное поведение функции в зависимости от типа аргументов), НАСЛЕДОВАНИЕ (поддержка абстрактных классов). ООП поддерживает многие языки, в том числе Smalltalk, C++, Java, Common LISP Object System (CLOS). Язык CLIPS, в свою очередь, вобрал в себя основные преимущества С++ и CLOS.

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

Отличительной особенностью CLIPS являются конструкторы для создания баз знаний (БЗ):

defrule определение правил;
deffacts определение фактов;
deftemplate определение шаблона факта;
defglobal определение глобальных переменных;
deffunction определение функций;
defmodule определение модулей (совокупности правил);
defclass определение классов;
defintances определение объектов по шаблону, заданному defclass ;
defmessagehandler определение сообщений для объектов;
defgeneric создание заголовка родовой функции;
defmethod определение метода родовой функции.

Конструкторы не возвращают никаких значений, в отличии от функций, например:

(deftemplate person
 (slot name)
 (slot age)
 (multislot friends))
 (deffacts people
 (person (name Joe) (age 20))
 (person (name Bob) (age 20))
 (person (name Joe) (age 34))
 (person (name Sue) (age 34))
 (person (name Sue) (age 20)))

Пример функции:

(deffunction factorial (?a)
	(if (or (not (integerp ? a)) (< ? a0)) then
		(printout t "Factorial Error!" crlf)
	else
		(if (= ? a0) then
			1
		else
			(*? a (factorial ($-$ ? a1))))))

Правила в CLIPS состоят из предпосылок и следствия. Предпосылки также называют ЕСЛИ-частью правила, левой частью правила или LHS правила (left-hand side of rule). Следствие называют ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule).

Пример правила представлен ниже:

(deftemplate data (slot x) (slot y))
(defrule twice
(data (x ? x) (y =(*2 ? x)))
=>)
(assert (data (x2) (y4)); f-0
	(data (x3) (y9))); f-1

Здесь самая распространенная в CLIPS функция assert добавляет новые факты в список правил. В противоположность assert функция retract удаляет факты из списка фактов, например:

(defrule vis11
	?doors < — (fit ? wdfit)
	(test (eq ? wdfit no))
 =>
	(assert (EVIDENCE OF MAJOR ACCIDENT))
	(retract ? doors))

В этом правиле проверяется наличие факта doors и в случае его отсутствия факт doors удаляется из списка фактов задачи.

Функция modify является также весьма распространенной. Она позволяет в определенном факте поменять значение слота, например,

(deftemplate age (slot value))
(assert (age (value young)))
(modify 0 (value old))

Следующий пример описывает представление данных в виде фактов, объектов и глобальных переменных. Примеры фактов:

(voltage is 220 volt)
(meeting (subject "AI") (chief "Kuzin") (Room "3240"))

В первой строке приведен упорядоченный факт, во второй - неупорядоченный, в котором порядок слотов не важен.

CLIPS поддерживает следующие типы данных: integer, float, string, symbol, external-address, fact-address, instance-name, instance-address.

Пример integer: 594 23 +51 -17
Пример float: 594e2 23.45 +51.0 -17.5e-5

String — это строка символов, заключенная в двойные кавычки.

Пример string: "expert", "Phil Blake", "состояние $-0$", "quote=\"

CLIPS поддерживает следующие процедурные функции , реализующие возможности ветвления, организации циклов в программах и т.,п.:

If оператор ветвления;
While цикл с предусловием;
loop-for-count итеративный цикл;
prong объединение действий в одной логической команде;
prong$ выполнение набора действий над каждым элементом поля;
return прерывание функции, цикла, правила и т.д.;
break то же, что и return, но без возвращения параметров;
switch оператор множественного ветвления;
bind создание и связывание переменных.
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Дмитрий Черепанов
Дмитрий Черепанов

Неоднократно находил ошибки в тестах, особенно в экзаменационных вопросах, когда правильно данный ответ на вопрос определялся в итоге как не правильно отвеченный... Из-за этого сильно страдает конечный бал! Да еще в заблуждение студентов вводит! Они-то думают, что это они виноваты!!! Но они тут не причем! Я много раз проверял ответы на некоторые такие "ошибочные" вопросы по нескольким источникам - результат везде одинаковый! Но ИНТУИТ выдавал ошибку... Как это понимать?

Из-за подобных недоразумений приходиться часами перерешивать экзамен на отличную оценку...!!!

Исправьте, пожалуйста, такие "ошибки"...

Анжелика Шлома
Анжелика Шлома

Огромная просьба сделать проще тесты, это просто ужас какой-то! Слишком сложно! 

Ринат Гатауллин
Ринат Гатауллин
Россия
Григорий Усанов
Григорий Усанов
Россия