
- •Введение
- •Система обозначений
- •Переменные
- •Функция bind
- •Глобальные переменные
- •Процедурные функции
- •Функция if
- •Функция while
- •Функция switch
- •Функция loop-for-count
- •Функция break
- •Функция halt
- •Конструкция deffunction
- •Функция return
- •Конструкция deftemplate
- •Упорядоченные факты
- •Атрибуты deftemplate
- •Правила
- •Значимость
- •Рабочий список правил и выполнение программы
- •Отображение рабочего списка правил
- •Команды, применяемые для манипулирования конструкциями
- •Команда printout
Процедурные функции
В языке CLIPS предусмотрено несколько функций, предназначенных для управления потоком выполнения действий. Функции while, if, switch, loop-for-count, progn$ и break предоставляют функциональные возможности, аналогичные управляющим структурам, которые предусмотрены в таких современных языках высокого уровня, как С. Кроме того, функция halt, заданная в правой части любого правила, позволяет остановить выполнение правил.
Язык CLIPS в первую очередь предназначен для использования в качестве эффективного языка, основанного на правилах, а процедурные функции, рассматриваемые в этой главе, предусмотрены лишь для ограниченного применения. Попытка написать объемистую процедурную программу, включив ее в правую часть правила, противоречит общему назначению языка, основанного на правилах. Поэтому, вообще говоря, такие функции должны использоваться для выполнения простых проверок и циклов в правой части правила, и следует избегать применения в правых частях правил сложных вложенных конструкций, состоящих из процедурных функций.
Функция if
Функция if имеет следующий синтаксис:
(if <predicate-expression> then <expression>+ [else <expression>+])
В этом определении <predicate-expression> — это единственное выражение (такое как предикативная функция или переменная), а параметр <expression>+, который следует за ключевыми словами if и then, представляет собой одно или несколько выражений, которые должны быть вычислены с учетом значения, полученного в результате вычисления выражения <predicate-expression>. Обратите внимание на то, что выражение else является необязательным.
Функцию if удобно использовать для проверки значений в правой части правила, поскольку это позволяет избавиться от необходимости осуществлять проверку с помощью других правил. Например, с помощью следующего правила можно определить, должно ли быть продолжено выполнение программы:
(defrule continue-check
?phase <- (phase check-continue) =>
(retract ?phase) (printout t "Continue? ")
(bind ?answer (read))
(if (or (eq ?answer y) (eq ?answer yes)) then (assert (phase continue)) else (assert (phase halt))))
Следует отметить, что функция if позволяет преобразовать положительный или отрицательный ответ, yes или nо, в факт, указывающий, какого типа действие должно быть предпринято. В рассматриваемом случае таким действием становится либо continue, либо halt.
Возвращаемым значением функции if является результат вычисления последнего выражения в части then или else функции. Если результатом вычисления выражения <predicate-expression> становится FALSE и в функции отсутствует часть then, то функция возвращает символ FALSE.
Функция while
Функция while имеет следующий синтаксис:
(while <predicate-expression> [do] <expression>*)
В этом определении <predicate-expression> представляет собой единственное выражение (такое как предикативная функция или переменная), а параметр <expression>*, который следует за необязательным ключевым словом do, обозначает от нуля или больше выражений, которые должны быть вычислены с учетом значения, возвращаемого в результате вычисления выражения <predicate-expression>. Эти выражения составляют тело цикла.
Та часть функции while, которая представлена выражением predicate- express ion>, вычисляется до выполнения действий, предусмотренных в теле цикла. Если вычисление выражения <predicate-expression> приводит к получению любого значения, отличного от символа FALSE, то выполняются выражения, представленные в теле цикла. Если же вычисление выражения <predicate-expression> приводит к получению символа FALSE, то программа переходит к выполнению оператора, который следует за функцией while, если таковой имеется. Условие функции while проверяется каждый раз перед выполнением операторов в теле цикла для определения того, должны ли они быть снова выполнены.
Функция while может использоваться вместе с функцией if для проверки ошибок ввода в правой части правила. Ниже приведена еще одна модификация правила continue-check, в которой применяется функция while для определения условия продолжения цикла до тех пор, пока не будет получен приемлемый ответ.
(defrule continue-check
?phase <- (phase check-continue) =>
(retract ?phase) (printout t "Continue? ")
(bind ?answer (read))
(while (and (neq ?answer yes) (neq ?answer no)) do
(printout t "Continue? ") (bind ?answer (read))) (if (eq ?answer yes)
then (assert (phase continue)) else (assert (phase halt))))