Clips 6.22
Краткая история CLIPS
Факты
Функции для работы с неупорядоченными фактами
Функции сохранения и загрузки списка фактов
Правила
Групповые символы для простых и составных полей
Связывающие ограничения
Предикатные ограничения
Ограничения, возвращающие значения
Адрес образца
Условный элемент test
Условный элемент or
Условный элемент and
Условный элемент not
Условный элемент exists
Условный элемент forall
369.50K
Category: programmingprogramming

Основы разработки экспертных систем

1. Clips 6.22

Основы разработки экспертных
систем

2. Краткая история CLIPS

Название языка CLIPS — аббревиатура
от С Language Integrated Production
System. Язык был разработан в Центре
космических исследований NASA
(NASA's Johnson Space Center) в
середине 1980-х годов и во многом
сходен с языками, созданными на базе
LISP, в частности OPS5 и ART.

3.

Первая версия представляла собой, по сути,
интерпретатор порождающих правил.
Процедурный язык и объектно-ориентированное
расширение CLIPS Object-Oriented Language
(COOL) были включены в этот программный
продукт только в 1990-х годах. Существующая в
настоящее время версия может эксплуатироваться
на платформах UNIX, DOS, Windows и Macintosh.
Она является хорошо документированным
общедоступным программным продуктом и
доступна по сети FTP с множества
университетских сайтов.

4.

Запуск среды,clipswin.exe
Приглашение в среду
clips>

5.

Пример
(+ 3 4) – операция сложения двух чисел
(defglobal ?*x* = 3) – создание глобальной переменной x
?*x* – просмотр значения глобальной переменной x
red – ввод символьного выражения
Clips поддерживает 8 примитивных типов данных:
float, integer, - для хранения численной информации
symbol, string, -для символической
external-address,
address.
fact-address,
instance-name,
instance-
symbol заканчивается ограничителем (пробел, символ
табуляции, переход на др. строку, двойные кавычки и др.),
Значение типа symbol не может начинаться с символа ? или
$?, но может содержать эти символы.
; символ начала комментариев.

6.

Примеры symbol
foo? hello? 456-56-89 B76-HI
– строка символов заключенных в
двойные кавычки
Пример
“foo”, “hello”, "1 number"
String
адрес структуры данных,
возвращенной внешней функцией (например,
написнной на языке С)
external-address-

7. Факты

Факт основная форма представления
информации в CLIPS. Каждый факт
представляет собой фрагмент данных,
помещенных в текущий список фактов
системы (рабочую память).

8.

Команды:
assert - добавить факт (стр. 115)
retract – удалить факт (стр. 117)
modify – изменить (стр. 118), применяется
для неупорядоченных фактов
duplicate – продублировать (стр. 120),
применяется
для
неупорядоченных
фактов

9.

Каждый
факт добавляемый в систему
получает индекс (fact-index). Индекс
начинается с 0 и увеличивается на 1 при
каждом добавлении или изменении
факта.
При выполнении команды reset или clear
текущий индекс фактов обнуляется.
Clips поддерживает два вида фактов
упорядоченные факты (ordered facts) и
неупорядоченные факты или шаблоны
(non-order facts или template facts).

10.

Упорядоченные факты состоят из поля
типа symbol и следующего за ним,
возможно пустой, последовательностью
полей, разделенных пробелами.
(данное_типа_symbol [поле] *)
Первое поле факта определяет так
называемое отношение, или связь факта
(relation)
Пример:
(assert (father-of jack bill))
(assert (the pump is on))
(assert (altitude is 10000 feet))

11.

Количество
полей
в
факте
не
ограничено, они могут хранить данные
любого типа.
Зарезервированные слова, которые не
могут быть в качестве первого поля: test,
and, or, not, declare, logical, object, exist,
forall.

12.

Неупорядоченные
факты (шаблоны) дают
возможность задавать абстрактную структуру
факта, путем назначения имени каждому полю.
Для
создания
шаблонов
используется
конструктор deftemplate. Он задает имя
шаблона и определяет последовательность из
нуля или более полей неупорядоченного факта,
называемых слотами. Слот состоит из имени,
заданного
значением
типа
symbol
и
следующего за ним списка полей.
Применение deftemplate:
(deftemplate client
(slot name)
(slot id))

13.

Примеры неупорядоченных фактов:
(assert (client (name "Michael Johnson")
(id 5789525))
)
Для проверки второго примера сначала нужно создать шаблон
class, с соответствующими слотами.
(assert (class (starosta "Voronov Ivan")
(students 30)
(group 402))
)
Для просмотра всех определенных в системе шаблонов
используется команда get-deftemplate-list.

14.

Порядок слотов в неупорядоченном факте не
важен.
Все ниже приведенные факты считаются
идентичными:
(class (teacher "Mari Safronova") (students 30)
(romm “404”))
(class (students 30) (teacher "Mari Safronova")
(romm “404”))
(class (romm “404”) (teacher "Mari Safronova")
(students 30))
Однако, упорядоченные факты из следующего примера не
являются идентичными:
(class "Mari Safronova" 30 "404")
(class 30 "Mari Safronova" "404")

15.

Конструктор deffacts
Данный конструктор позволяет определять список
фактов, которые будут автоматически добавляться
всякий раз после выполнения команды reset.
Синтаксис:
(deffacts
<имя-списка-фатов>
[коментарии] [<факт> *]
Пример
(deffacts startup
(refrigerator light on)
(refrigerator door open)
(refrigerator temp (+ 5 7 10)))
Ввести (reset) и (facts) должен показаться список фактов

16.

Функция fact-existp – эта функция определяет,
присутствует ли в данный момент факт,
заданный индексом или переменной указателем.
Если да, то функция вернет TRUE, иначе FALSE.
Пример:
(clear)
(assert (a) (b))
(fact-existp 0)
(retract 0)
(fact-existp 0)

17. Функции для работы с неупорядоченными фактами

Для
работы с неупорядоченными
фактами в CLIPS предусмотрен целый
ряд функций. Основные из них:
fact-relation
fact-slot-names
fact-slot-value

18.

Функция
fact-relation позволяет установить
связь (relation) существующего факта с
шаблоном. Связь факта с шаблоном,
определенным с помощью конструктора
deftamplate определяется по первому полю
факта.
Пример:
(clear)
(assert (car Ford))
(fact-relation 1) - вернет слово car
(retract 1)
(fact-relation 1) – вернет false

19.

Функция
fact-slot-names служит для
получения имен всех слотов заданного
факта. Для упорядоченных фактов
функция возвращает значение implied
(подразумеваемый), так как CLIPS
представляет упорядоченные факты как
неявно заданные неупорядоченные с
одним составным слотом.
Синтаксис: (fact-slot-name <определение
факта>).

20.

Пример:
(clear)
(deftemplate car
(slot name)
(slot producer)
(slot type)
(slot max-speed))
(assert (car
(name scorpio)
(producer ford)
(type sedan)
(max-speed 180)))
(fact-slot-names 1) – вернет (name producer type max-speed)

21.

Функция
(fact-slot-value)
позволяет
получить значение слота некоторого
заданного факта.
Синтаксис: (fact-slot-value <определение факта> <имя - слота> ).
Пример.
(факты примера выше)
(fact-slot-value 1 name) – вернет scorpio

22. Функции сохранения и загрузки списка фактов

Как
мы уже заметили наполнение системы
фактами кропотливое занятие. Чтобы вся
работа не пошла на смарку в CLIPS есть
команды сохранения и загрузки фактов.
Команда (save-facts <имя-файла> [<границывидимости> <список-шаблонов>]) <границывидимости> ::= visible | local

23.

Сохраняет факты из текущего списка фактов в
текстовый файл. На каждый факт отводится
одна строчка. Неупорядоченные факты
сохраняются вместе с именами слотов. Есть
возможность ограничить область видимости
сохраненных фактов: visible – сохраняется все
факты, присутствующие в данный момент в
системе, local – только факты из текущего
модуля (подробнее на следующем слайде).
После аргумента <границы-видимости> может
следовать список определенных в системе
шаблонов.

24.

CLIPS предоставляет возможность разбиения
базы данных и решения задачи на отдельные
независимые модули. Для создания таких
модулей служит конструктор defmodule. С
помощью модулей можно группировать вместе
отдельные элементы базы знаний и управлять
процессом доступа к этим элементам во время
решения некоторой задачи.

25.

Пример
(clear)
(deftemplate template
(slot a)
(slot b))
(assert (template (a 1) (b 2)))
(assert (simple-fact1) (simple-fact2))
(save-facts f1 local template simple-fact1) –
получится файл f1 в текущем каталоге со
следующим содержанием:
(template (а 1) (b 2) ) (simple-factl).

26.

Для
загрузки файлов
функция load- facts
(load-facts <имя-файла>)
используется
Файл со списком фактов можно создать в
любом текстовом редакторе, а можно
воспользоваться встроенным
редактором, предоставляемым средой
CLIPS.

27. Правила

Правила
в CLIPS служат для представления
«эмпирических правил», которые определяют
набор
действий,
выполняемых
при
возникновении некоторой ситуации. Правила
состоят из предпосылок и
следствия.
Предпосылки называются также ЕСЛИчастью правила или левой частью (LHS – Lefthand side of rule). Следствие называют ТОчастью, правой частью правила (RHS - Righthand side of rule).

28.

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

29.

Конструктор defrule
(defrule
<имя-правила> ; значение типа symbol
[<комментарии>]
[<определение-свойства-правила>]
<предпосылки> ; левая часть
=>
<следствие>; правая часть правила
)

30.

ПРИМЕР
(clear)
(defrule hello-world
=>
(printout t crlf crlf)
(printout t "********************************" crlf)
(printout t "***** H e l l o W o r l d*****" crlf)
(printout t "********************************" crlf)
(printout t crlf crlf)
)
(reset)
(run)

31.

Параметр
t задает стандартный поток
вывода – экран. Он аналогичен,
стандартному потоку cout в С++.
Выражение crlf служит для перехода на
новую строку.
Функция
run запускает механизм
логического вывода.

32.

Образец (pattern СЕ)
Этот
условный элемент состоит из
списка ограничений полей, групповых
символов
и
переменных,
которые
соответствуют
заданному
образцу.
Таким образом, образец как бы
определяет маску, которой должны
соответствовать данные.
Ограничение
полей – это набор
ограничений, которые используются для
проверки простых полей или слотов
объектов.

33.

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

34.

Пример
(deffacts data-facts
(data 1.0 blue "red")
(data 1 blue)
(data 1 blue red)
(data 1 blue RED)
(data 1 blue red 6.9))
(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 20))
(person (name Sue) (age 34))
)

35.

(defrule find-data
(data 1 blue red)
=>
(printout t crlf "Found data (data 1 blue red)" crlf))
(defrule Find-Bob-20
(person (name Bob) (age 20))
=>
(printout t crlf "Found Bob-20 (person (name Bob) (age 20))"
crlf))
(defrule Find-Bob-30
(person (name Bob) (age 30))
=>
(printout t crlf "Found Bob-30 (person (name Bob) (age 30))"
crlf))

36. Групповые символы для простых и составных полей

В CLIPS имеется два различных групповых символа,
которые используются для сопоставления полей в
образцах. CLIPS интерпретирует эти групповые
символы как место для подстановки некоторых частей
данных, удовлетворяющих образцам. Групповой
символ для простого поля - ?, который соответствует
одному любому значению, сохраненному в заданном
поле. Групповой символ составного поля записывается
с помощью $? и соответствует, возможно, пустой
последовательностью полей, сохраненным в составном
поле.

37.

Пример:
Образец
(data $? YELLOW $?)
соответствует
(data YELLOW blue red green)
• (data YELLOW red)
• (data red YELLOW)
• (data YELLOW)
• (data YELLOW data YELLOW)

38. Связывающие ограничения

CLIPS представляет 3 связывающих
ограничения
& «логическое И»;
| «логическое ИЛИ»;
~ «логическое НЕ»;

39.

(clear)
(deftemplate data-B (slot value))
(deffacts AB
(data-A green)
(data-A blue)
(data-B (value red))
(data-B (value blue)))
(defrule example1-1
(data-A ~blue)
=>
(printout t crlf "The data is found" crlf)
)
(defrule example1-2
(data-B (value ~red&~green))
=>
(printout t crlf "Data-B is found" crlf)
)

40.

CLIPS> (reset)
CLIPS> (facts)
f-0 (initial-fact)
f-1 (data-A green)
f-2 (data-A blue)
f-3 (data-B (value red))
f-4 (data-B (value blue))
For a total of 5 facts.
CLIPS> (agenda)
0
example1-2: f-4
0
example1-1: f-1
For a total of 2 activations.
CLIPS>

41. Предикатные ограничения

Предикатные ограничения позволяют
вызывать предикатные функции,
которые возвращают значения истина
или ложь (стр. 288, таблица 15.1).
Предикатные ограничения записываются
при помощи двоеточия и следующего за
ним вызова соответствующей
предикатной функции.

42.

Примеры:
(defrule example-2
(data ?x&:(symbolp ?x))
=>
)
(defrule example-4
(data ?y)
(data ?x&:(> ?x ?y))
=>
)

43. Ограничения, возвращающие значения

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

44.

(deffacts f1
(data 1 2)
(data 2 3)
(data 2 4))
(defrule find-data
(data ?x ?y&=(* 2 ?x))
=>
(printout t crlf "x = " ?x " y = " ?y crlf))

45. Адрес образца

Некоторые действия в правой части
правил (например, retract) оперируют с
фактами или объектами, участвующими
в левой части. Для того чтобы
определить, какой факт или объект будет
изменяться, необходимо присвоить
переменной адрес конкретного факта.

46.

(defrule dummy
(data 1)
?fact <- (dummy pattern)
=>
(retract ?fact))
(defrule del-data-facts
?data-facts <- (data $?)
=>
(retract ?data-facts))
(defrule compare-facts-2
?f1 <- (color ~red)
?f2 <- (color ~green&:(neq ?f1 ?f2))
=>
(printout t crlf "Rule fires from different facts" crlf))

47. Условный элемент test

Условный элемент test предостовляет
возможность наложения
дополнительных ограничений на слоты
фактов или объекты. Элемент test
удовлетворяется, если вызванная в нем
функция возвращает значение не ложь.

48.

(defrule example-1
(data ?x)
(value ?y)
(test (>= (abs (- ?y ?x)) 3))
=>)
(deffunction positive-slope
(?x1 ?y1 ?x2 ?y2)
(< 0 (/ (- ?y2 ?y1) (- ?x2 ?x1))))
(defrule example-2
(point ?a ?x1 ?y1)
(point ?b ?x2 ?y2)
(test (> ?b ?a))
(test (positive-slope ?x1 ?y1 ?x2 ?y2))
=>)

49. Условный элемент or

Условный элемент or позволяет
активировать правило любым из
нескольких заданных условных
элементов.

50.

(defrule system-fault
(error-status unknown)
(or (temp high)
(valve broken)
(pump (status off)))
=>
(printout t "The system has a fault." crlf))

51. Условный элемент and

Все элементы левой части любого
правила объединены неявным условным
элементов and.

52.

(defrule system-flow
(error-status confirmed)
(or (and (temp high)
(valve closed))
(and (temp low)
(valve open)))
=>
(printout t "The system is having a flow
problem." crlf))

53. Условный элемент not

Иногда важнее отсутствие информации,
то есть например необходимо
активировать правило при отсвутсвии
факта.

54.

(defrule high-flow-rate
(temp high)
(valve open)
(not (error-status confirmed)) =>
(printout t "Recommend closing of valve due to high temp"
crlf))
(defrule check-valve
(check-status ?valve)
(not (valve-broken ?valve)) =>
(printout t "Device " ?valve " is OK" crlf))
(defrule double-pattern
(data red)
(not (data red ?x ?x)) =>
(printout t "No patterns with red green green!" crlf ))

55. Условный элемент exists

Условный элемент exists позволяет
определить, существует ли хотя бы один
набор данных, которые удовлетворяют
условным элементам, заданным внутри
элемента exists.

56.

(deftemplate hero
(multislot name)
(slot status (default unoccupied)))
(deffacts goal-and-heroes
(goal save-the-day)
(hero (name Death Defying Man))
(hero (name Stupendous Man))
(hero (name Incredible Man)))
(defrule save-the-day
(goal save-the-day)
(exists (hero (status unoccupied))) =>
(printout t "The day is saved." crlf))

57. Условный элемент forall

Условный элемент forall позволяет
определить, что некоторое заданное
условие выполняется для всех заданных
условных элементов.

58.

(defrule all-students-passed
(forall (student ?name)
(reading ?name)
(writing ?name)
(arithmetic ?name))
=>
(printout t "All students passed." crlf))

59.

Заметьте, что данное правило удовлетворяется, пока
нет ни одного студента. При добавлении факта (student
Bob) правило перестает удовлетворяться, т. к. нет
фактов, подтверждающих, что Bob прошел все
необходимые предметы. Правило не начнет
удовлетворяться и после добавления фактов (reading
Bob) и (writing Bob). А вот после добавления факта
(arithmetic Bob) правило будет активировано и сможет
вывести на экран соответствующую запись.
Если добавить факт (student John), правило опять перестанет удовлетворяться, т. к. один из студентов (John)
не прошел все необходимые предметы. Используя
условный элемент exists, вы без труда сможете
изменить это правило так, чтобы оно не выполнялось в
случае отсутствия студентов.
English     Русский Rules