Использование шаблонов. Определение функций.
Для определения фактов можно использовать не только списочные структуры, но и шаблоны, которые напоминают простые записи. (Шаблоны в CLIPS не имеют ничего общего с шаблонами C++.)
Шаблон выглядит примерно так:
(deftemplate student "a student record" (slot name (type STRING)) (slot age (type NUMBER) (default 18))
Каждое определение шаблона состоит из произвольного имени шаблона, необязательного комментария и некоторого количества определений слотов. Слот включает поле данных, например name, и тип данных, например STRING.
Можно указать и значение по умолчанию, как в приведенном выше примере.
Если в программу включено приведенное выше определение шаблона, то выражение:
(deffacts students (student (name fred)) (student (name freda) (age 19)))
Приведет к тому, что в базу фактов после выполнения команды reset будет добавлено:
(student (name fred) (age 18)) (student (name freda) (age 19))
Определение функций
В языке CLIPS функции конструируются примерно так же, как в языке LISP (см. главу 4). Существенное отличие состоит в том, что переменные должны иметь префикс?, как это показано в приведенном ниже определении.
(deffunction hypotenuse (?a?b) (sqrt (+ (?a?a) (?b?b)))
Формат определения функции в CLIPS следующий:
(deffunction <имя функции (<аргумент>… <аргумент>) <выражение> <выражение>)
Функция возвращает результат последнего выражения в списке. Иногда выполнение функции имеет побочные эффекты, как в приведенном ниже примере.
(deffunction init (?day) (reset) (assert (today is?day)))
В результате после запуска функции на выполнение командой:
CLIPS> (init Sunday)
Будет выполнена команда reset и, следовательно, очищена база фактов, а затем в нее будет включен новый факт:
(today is Sunday).