Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
74
Добавлен:
22.05.2015
Размер:
155.69 Кб
Скачать

Процедурные функции

В языке 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))))