Лабораторная работа № 2. Построение ЭС с использованием неупорядоченных фактов (шаблонов) и
Построение ЭС с использованием неупорядоченных фактов (шаблонов) и различных типов условных элементов в антецедентах правил.
Общие сведения. Неупорядоченные факты представляют собой список взаимосвязанных именованных полей, называемых слотами. Наличие имен полей позволяет осуществлять доступ к полям по именам, в отличие от упорядоченных фактов, где поля специфицируются своим местоположением в факте. Существует два типа слотов: одиночные и мультислоты. Одиночный слот (или просто слот) содержит единственное поле, тогда как мультислот может содержать любое число полей. Для спецификации состава неупорядоченных фактов (содержащихся в них слотов) используются шаблоны, которые задаются конструкцией deftemplate. Синтаксис конструкции deftemplate определен ниже: (deftemplate <имя шаблона> [“<комментарий>”] <определение слота-1> ... <определение слота-N>) Пример шаблона, содержащего три одиночных слота представлен ниже: (deftemplate object “Шаблон объекта” (slot name) (slot location) (slot weight)). Пример конкретного неупорядоченного факта на основе данного шаблона представлен ниже: (object (name table) (location “room”) (weight 15)). Синтаксис антецедентов правил. Антецедент правила состоит из последовательности условных элементов – УЭ (conditional elements - CEs), которые должны удовлетворяться, чтобы правило было помещено в агенду. В CLIPS используется шесть основных типов условных элементов: УЭ на основе образца, УЭ-проверка, УЭ “И”, УЭ “ИЛИ”, УЭ “НЕ”, УЭ “существует”, УЭ “для всех”, логические УЭ. Ниже рассмотрены наиболее часто используемые типы условных элементов, необходимые для выполнения данной лабораторной работы. УЭ на основе образца (УЭ-образец) – основной и чаще всего используемый тип условного элемента. Он состоит из совокупности ограничений на поля, масок полей (wildcards) и переменных, используемых в качестве ограничений для фактов и объектов, которые сопоставляются с образцом условного элемента. УЭ-образец удовлетворяется каждой сущностью, которая удовлетворяет его ограничениям. Ограничение на поле представляет собой в общем случае совокупность ограничений, которые используются для проверки единственного поля или слота факта или объекта. Ограничение может состоять из единственного литерала или из нескольких связанных ограничений. Кроме литеральных ограничений, поддерживает три других типа ограничений: связанные ограничения (connective constraints), предикатные ограничения и ограничения возвращаемым значением. Литеральное ограничение задает точное значение (константу) целого, вещественного, символьного или строкового типа, которое должно сопоставляться с полем. При работе с объектами литеральное ограничение задает имя экземпляра. УЭ-образец с литеральными ограничениями не содержит полей масок и переменных. Все ограничения литерального образца должны точно совпадать со всеми полями сопоставляемой сущности. Упорядоченный УЭ-образец, содержащий только литералы, имеет следующий синтаксис: (<константа-1>... <константа-n>). Пример: (data 1 “two”). УЭ-образец на основе шаблона, содержащий только литеральные ограничения, имеет следующий синтаксис: (<имя шаблона> (<имя слота-1> <константа-1>) ... (<имя слота-n> <константа-n>)). Пример литерального условного элемента для неупорядоченного факта: (person (name Bob) (age 20)). Переменные используются для запоминания значений полей, чтобы их можно было использовать в дальнейшем в других условных элементах антецедента или в операторах консеквента правила. Таким образом, переменные позволяют “захватить” значения переменных, содержащихся в сопоставляемой сущности, для дальнейшего использования. Используются одно- и многоместные переменные со следующим синтаксисом: <одноместная переменная> записывается как?<переменная>, <многоместная переменная> записывается как $?< переменная>, где <переменная> является символьным типом, но должна начинаться с буквенного символа. В имени переменой не допускается использование кавычек. При первом появлении переменная работает так же, как в маске, т.е. связывается с любым значением в данном поле(ях). Последующие появления переменной требуют, чтобы поле сопоставлялось со связанным значением переменной. Имена переменных являются локальными в пределах каждого правила. Ограничения со связками позволяют объединить несколько индивидуальных ограничений и переменных с помощью операций & (и), | (или), и ~ (не). Старшинство операций обычное: ~, &, | - по убыванию. Исключением является случай, когда первым ограничением является переменная, после которой следует связка &. В этом случае первая переменная трактуется как отдельное ограничение, которое также должно удовлетворяться. Например, ограничение?x&red|blue трактуется как?x&(red|blue), а не как (?x&red)|blue. Синтаксис ограничений со связками: <term-1>&<term-2>... &<term-3>, <term-1>|<term-2>... |<term-3>, ~<term>, где <term> - одно- или многоместная переменная, константа или ограничение со связками. Примеры УЭ, содержащих ограничения со связками: (data-A ~blue) (data-A?x&~green)
Ограничение возвращаемым значением использует в качестве ограничения поля значение, возвращаемое некоторой функцией, которая вызывается непосредственно из условного элемента. Возвращаемое значение должно быть одного из примитивных типов. Это значение подставляется непосредственно в образец на позицию, из которой была вызвана функция, как если бы оно было литеральным ограничением. При этом функция вычисляется каждый раз, когда проверяется ограничение. Данное ограничение так же как функция сравнения использует символ “=”. Пусть, например, в базе данных хранятся факты на основе следующего шаблона: (deftemplate data (slot x) (slot y)) Тогда следующий образец будет сопоставляться с фактами, у которых значение второго слота в два раза больше, чем первого.: (data (x?x) (y =(* 2?x))). УЭ-проверка используется для оценки выражений в процессе сопоставления с образцом и имеет следующий синтаксис: (test <вызов функции>). УЭ-проверка удовлетворяется, если вызываемая в нем функция возвращает значение, отличное от FALSE, и не удовлетворяется в противном случае. Использование данного типа УЭ позволяет, в частности, проверять любые соотношения между значениями различных полей (слотов) фактов. Пример. В следующем правиле проверяется, что разность между значениями фактов data и value не меньше трех: (defrule example-1 (data?x) (value?y) (test (>= (abs (-?y?x)) 3)) =>).
Порядок выполнения работы. 1. Используя редактор clips, сформировать базу данных, содержащую не менее десяти неупорядоченных фактов на основе следующего шаблона: (deftemplate student (slot name); имя студента (slot age); возраст (slot year); год обучения (курс) (slot spec); специализация (slot aver_mark)); средний балл
Типы и допустимые значения слотов представлены ниже: Имя слота Тип значения Допустимые значения name symbol любые имена age integer 17 - 22 year integer 2 - 5 spec string “hard”, “soft”, “ai” aver_mark float в интервале [3 - 5]
Пример заполнения БД представлен ниже: (deffacts students (student (name John) (age 20) (year 3) (spec "hard") (aver_mark 4.5)) ... ) Сохранить конструкции deftemplate и deffacts в файле.
2. Составить в соответствии с вариантом задания правила, реализующие описанные ниже функции, с использованием заданных типов условных элементов. Правила, соответствующие различным пунктам задания, следует сохранять в разных файлах, чтобы демонстрировать их работу преподавателю по отдельности. 2.1. Используя только литеральные ограничения, составить правила для нахождения в БД фактов, удовлетворяющих заданным в таблице 1 условиям, и выдачи соответствующих сообщений. 2.2. Изменить сформированные в п. 2.1. правила путем добавления в антецедент новых условий и изменения выводимых сообщений в соответствии с табл. 2. При реализации новых УЭ использовать УЭ-проверки (test).
Таблица 1.
Таблица 2.
2.3. Изменить сформированные в п. 2.2. правила путем добавления в антецеденты условных элементов с ограничением по возвращаемому значению. Условия ограничения для различных вариантов приведены в табл. 3.
Таблица 3.
Возраст поступления в университет определяется по формуле: [age] - [year]. Возраст окончания: [age] + (5 - [year].)
|