Пример 4.8. Составные поля


(a) (1 bar foo) () (х 3.0 "red" 567)

Замечание

Составное поле (а) не эквивалентно простому полю а.

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

Переменной является значение некоторого типа, сохраненное в простом или составном поле и имеющее некоторое имя. Переменные используются В конструкторах CLIPS (в частности в defrule, deffunction, defmethod и defmessage-handier). Описания использования переменных в конструкторах приведены в соответствующих разделах.

Функции

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

CLIPS оперирует с несколькими типами функций — определенные пользова­телем внешние функции, системные (внутренние) функции, функции, опреде­ленные в среде CLIPS с помощью конструктора deffunction, родовые функции. Определенные пользователем внешние функции и системные функции соз­даются на внешних языках программирования (например, С), и затем под­ключаются к CLIPS на этапе компилирования или функционирования сре­ды. Системные функции созданы разработчиками среды CLIPS и описаны в руководстве. Описания наиболее важных системных функций приведены в гл. 15 и 16.

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

Родовые функции определяются с помощью конструкторов defgeneric и defmethod. Родовые функции позволяют выполнять различные действия, в зависимости от набора аргументов, заданных при вызове функции. Таким образом функция перегружается различными реализациями (подобный ме­ханизм перегрузки функций можно встретить, например, в языке C++). Бо­лее подробно родовые функции описаны в гл. 10.

Вызов функций в CLIPS имеет префиксную нотацию — аргументы функции всегда следуют после имени функции. При вызове имя функции вместе со всеми аргументами заключается в круглые скобки. Аргументы отделяются друг от друга по крайней мере одним пробелом. Аргументами функций мо­гут быть переменные примитивных типов, константы или вызовы других функций. Ниже приведены примеры использования функций + (арифмети­ческое сложение) и * (арифметическое умножение):

Пример 4.9. Использование функций + и *

(+345)

(* 5 6.0 2)

(+ 3 (* 8 9) 4)

(* 8 (+3 (* 2 3 4) 9) (* 3 4))

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

Конструкторы

В CLIPS определены следующие конструкторы: defmodule, defrule, deffacts, deftemplate, defglobal, deffunction, defclass, definstances, defmessage-handler, defgeneric и defmethod. Вызовы всех конструкторов заключаются в круглые скобки. Конструкторы отличаются от встроенных функций по выполняемым ими действиям. Как правило, функции не меняют состояние базы знаний среды CLIPS (за некоторым исключением, например, функ­ций, очищающих среду или загружающих на выполнение некоторый файл). Конструкторы, наоборот, предназначены для добавления в базу знаний но­вых элементов. Кроме того, в отличие от функций, конструкторы не воз­вращают никаких значений.

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

Абстракции данных

Для представления данных CLIPS использует три основных абстракции дан­ных: факты, объекты и глобальные переменные. В данном разделе подробно описана каждая из этих форм представления информации.

Факты

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

Факт может быть добавлен в текущий список фактов системы (с помощью команды assert), удален из него (команда retract), изменен (modify) или продублирован (duplicate) пользователем, в процессе интерактивной рабо­ты в системе, либо из программы. Количество фактов, которые может содержать список фактов, а также количество информации, содержащейся в каждом факте, ограничено только свободной памятью вашего компьютера. В случае выполнения пользователем попытки добавить в систему факт, точ­но соответствующий уже существующему, данная операция будет игнориро­вана, хотя подобное поведение системы можно изменить (см. гл. 5).

Некоторые команды, такие как retract, modify или duplicate, требуют в качестве параметра некоторого уже существующего факта. Факт может быть задан с помощью значений типа fact-index или fact-address. После созда­ния (или изменения) факт получает уникальный индекс, называемый индексом факта (fact-index). Индекс фактов начинаются с 0 и увеличивается на 1 при каждом добавлении или изменении факта. При выполнении команды reset или clear текущий индекс фактов обнуляется. Для опреде­ления конкретного факта с помощью типа fact-address необходимо полу­чить соответствующее значение от функции, возвращающей значение дан­ного типа (например, assert, modify или duplicate), или некоторого правила.

Для удобства отображения фактов в CLIPS используется понятие идентифи­катора факта. Идентификатор факта состоит из символа f, следующего за ним знака - и индекса факта. Например, идентификатор f-io ссылается на факт с индексом 10.

Для хранения фактов используется один из двух следующих форматов: упо­рядоченные факты и неупорядоченные факты или шаблоны.



Дата добавления: 2021-12-14; просмотров: 348;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.