Программирование в CLIPS экспертной системы управления технологическим процессом

Программа ЭС управления ТП по обработке деталей сложной формы, разработанная на основе табл. 7.1 и табл. 7.2, выглядит следующим образом.

;;;======================================================

;;; Control Expert System of technological process

;;;

;;; This expert system administers technological process

;;; of creations of details of the complex form

;;;

;;; CLIPS Version 6.0 Example

;;;

;;; To execute, merely load, reset and run.

;;;======================================================

(deffacts initial-state

(Ds 800)

(Dm 2)

(Da 2)

(Dar 1))

(defrule rule1

(declare (salience 9098))

(Ds 10)

(Dm 1)

(Da 1)

=>

(printout t "Rule1: Vr=A, Vm=10, T=0, I=1, G=tor " crlf))

(defrule rule2

(declare (salience 9095))

(Ds 10)

(Dm 2)

(Da 2)

=>

(printout t "Rule2: Vr=B, Vm=10, T=1, I=1, G=line, Rm=40, J=80, S=60 " crlf))

(defrule rule3

(declare (salience 9092))

(Ds 300)

(Dm 2)

=>

(printout t "Rule3: Vr=B, Vm=20, T=2, I=1, G=tor " crlf))

(defrule rule4

(declare (salience 9097))

(Ds 300)

(Da 3)

=>

(printout t "Rule4: Vr=C, Vm=40, T=3, I=2, G= line, Rm=50, J=75, S=75" crlf))

(defrule rule5

(declare (salience 9094))

(Ds 800)

(Dm 2)

(Da 2)

(Dar 1)

=>

(printout t "Rule5: Vr=B, Vm=60, T=4, I=2, G= line, Rm=60, J=70, S=70 " crlf))

(defrule rule6_7

(declare (salience 9090))

(Ds 800)

(Dar ?num)

=>

(if (< ?num 3)

then

(printout t "Rule6: Vr=B, Vm=40, T=6, I=3, G= line, Rm=60, J=60, S=75 " crlf)

else

(printout t "Rule7: Vr=C, Vm=80, T=6, I=3, G= line, Rm=60, J=60, S=75 " crlf)))

Листинг 7.1. Программа ЭС управления ТП по обработке деталей сложной формы.

Эта программа сохраняется в виде файла с именем, например, robot.clp, далее в среде CLIPS выполняются команды: clear; loadrobot.clp; reset и run. Эта программа начинает работать. Входные воздействия заданы в данном примере через deffacts initial-state.

Активизация правил БЗ для конкретных воздействий, заданных в программе, дает конфликтное множество (базу целей) - правила rule5 и rule6_7, а затем по критерию максимальной достоверности первым выбирается управляющее воздействие на систему низшего уровня:

Rule5: Vr=B, Vm=60, T=4, I=2, G= line, Rm=60, J=70, S=70

В реальной жизни входные воздействия поступают через оператор read (ввод данных с заданного устройства), например, следующим образом:

(defrule Dar_parameter

(declare (salience 9101))

(Dar ? num)

=>

(printout t "Ds parameter has value "crlf"

1) 10 "crlf" 2) 300 "crlf" 3) 800 "crlf" Choose 1-3 =>")

(assert (Dar =(read))))

Читателю предлагается самостоятельно дописать правила останова программы ( halt ) по условиям Da=Dar или достижению заданного значения Ds, а также правила для проверки граничных условий. Дотошный читатель, разобравшийся в программе, может спросить, зачем мне CLIPS, если такую простую программу я могу написать на любом языке программирования. Во-первых, это учебный пример с простейшей базой знаний. Во-вторых, в реальной жизни база знаний содержит сотни правил, управляющие параметры постоянно считываются с датчиков и видеокамер, и сразу же отрабатывается поиск в сети продукций новых управляющих воздействий. Простой программой в таком случае не обойтись.

Примером более сложной программы для решения задачи планирования последовательности действий робота (лекция 3, рис. 3.4) является фрагмент программы Д. Грим-шоу (www.ryerson.ca/~dgrimsha). Эта программа управления роботом по перекладыванию кубиков. Начальное состояние положения кубиков в стеке 1 и стеке 2 определяется путем перечисления кубиков сверху вниз. Задавая различные комбинации в deffacts initial-state, мы получим конкретные последовательности действий робота.

(deftemplate goal

(slot move)

(slot on-top-of))

(deffacts initial-state

(stack A B C)

(stack D E F)

(goal (move C) (on-top-of E)))

(defrule move-directly

?goal < - (goal (move ?block1) (on-top-of ?block2))

?stack-1 < - (stack ?block1 $?rest1)

?stack-2 < - (stack ?block2 $?rest2)

=>

(retract ?goal ?stack-1 ?stack-2)

(assert (stack $?rest1))

(assert (stack ?block1 ?block2 $?rest2))

(printout t ?block1 "moved on top of" ?block2 crlf))

(defrule move-to-floor >

?goal < - (goal (move ?block1) (on-top-of floor))

?stack-1 < - (stack ?block1 $?rest)

=>

(retract ?goal ?stack-1)

(assert (stack ?block1))

(assert (stack $?rest))

(printout t ?block1 "moved to the floor." crlf))

(defrule clear-upper-block

(goal (move ?block))

(stack ?top $? ?block $?)

=>

(assert (goal (move ?top) (on-top-of floor))))

(defrule clear-lower-block

(goal (on-top-of ?block))

(stack ?top $? ?block $?)

=>

(assert (goal (move ?top) (on-top-of floor))))

Результат работы CLIPS в данном случае будет следующий:

CLIPS$>$ (run)

A moved to the floor.

B moved to the floor.

D moved to the floor.

C moved on top of E

CLIPS$>$

В завершение лекции читателю может быть рекомендована книга Ж.Гурратано [ 7.7 ] , содержащая множество примеров программирования ЭС на основе CLIPS.

Итак, завершающий вывод по данной лекции. Экспертные системы является эффективным и универсальным инструментом для таких задач. Они работают. Их могут уже не называть экспертными системами. Их могут называть просто системами управления, системами мониторинга, системами диагностики. Суть от этого не меняется. Мощные базы знаний, заложенные в создаваемые человеком аппаратно-программные комплексы, позволяют строить новое поколение интеллектуальных робототехнических систе