- •Введение
- •Арифметика
- •Ввод-вывод при работе с консолью
- •Управление средой
- •Правила
- •Управление правилами
- •Использование переменных в правилах
- •Наборы фактов
- •Конструкции
- •Правила-2 Активации и повестка
- •Диагностические сообщения
- •Получение адреса факта
- •Сложные условия
- •Правила-3 Условия с кванторами
- •Вызовы функций в качестве ограничений параметров фактов
- •Сложные ограничения на параметры фактов
- •Поддержка истинности
- •Стратегии
- •Последовательности
- •Шаблонные факты
Правила-3 Условия с кванторами
Помимо логических связок при записи условий можно использовать кванторы. Система CLIPS поддерживает следующие кванторы:
-
forall — всеобщность. Выполняется, если для всякого факта (или комбинации фактов), соответствующей первому параметру, найдутся факты (или комбинации фактов) соответствующие всем остальным параметрам. Отметим, что условие forall должно быть записано, по крайней мере, с двумя параметрами;
-
exists — существование. Выполняется, если найдутся факты (или комбинации фактов) соответствующие всем параметрам.
Особенностью условий forall и exists является то, что если в этих условиях содержится присваивание значения какой-либо переменной, то использовать ее можно только в пределах этих условий.
Вызовы функций в качестве ограничений параметров фактов
Ограничения параметров фактов могут представлять собой не только константы, заполнители (? и $?) и переменные. В системе CLIPS поддерживается задание ограничений с помощью функций, причем в составе ограничения функция может использоваться двумя способами, синтаксически различающимися между собой знаком ставящемся перед вызовом функции:
-
= (знак равенства) — значение функции непосредственно задает значение параметра;
-
: (знак двоеточия) — значение функции, интерпретируется как логическая величина (символ FALSE — ложь, любое другое значение — истина), определяющая соответствует ли значение параметра ограничению.
Сложные ограничения на параметры фактов
Еще один вид ограничений — это сложные ограничения. В системе CLIPS доступно три вида сложных ограничений соответствующих трем логическим связкам:
-
& (амперсанд) — конъюнкция;
-
| (вертикальная черта) — дизъюнкция;
-
~ (тильда) — отрицание.
Особенностью сложных ограничений является то, что они записываются не в виде списка, а по обычным правилам, принятым в математике, т. е. конъюнкция и дизъюнкция — как инфиксный оператор, а отрицания — как префиксный. Максимальным приоритетом обладает отрицание, а минимальным дизъюнкция, однако из этого правила есть исключение: если левый операнд конъюнкции — переменная, то приоритет такой конъюнкции меньше чем у любой другой операции. Как и в математике для явного задания приоритета можно использовать круглые скобки (в этом случае CLIPS не рассматривает их в качестве начала и конца списка).
Пример 1:
CLIPS> (deffacts initial-fib-nums
(fib-num 1 1)
(fib-num 2 1))
CLIPS> (defrule calc-next-fib-num
(exists (target-fib-num ?k) (not (fib-num ?k ?)))
(fib-num ?i ?n1)
(fib-num =(+ ?i 1) ?n2)
(not (fib-num =(+ ?i 2) ?))
=>
(assert (fib-num (+ ?i 2) (+ ?n1 ?n2))))
CLIPS> (defrule print-target-fib-num
(target-fib-num ?k)
(fib-num ?k ?n)
=>
(printout t "F[" ?k "] = " ?n crlf))
CLIPS> (reset)
CLIPS> (assert
(target-fib-num 10)
(target-fib-num 15))
<Fact-4>
CLIPS> (run)
F[10] = 55
F[15] = 610
Пример 2:
CLIPS> (deffacts mark-criteria
(mark-criterion 25 excellent)
(mark-criterion 20 good)
(mark-criterion 15 satisfactory))
CLIPS> (deffacts subjects
(subject math)
(subject cs))
CLIPS> (deffacts students
(student ivanov "Иванов"))
CLIPS> (defrule put-mark
(mark-criterion ?min ?mark)
(num-right-answers ?stud ?subj ?n&:(>= ?n ?min))
(not (mark-criterion ?min2&:(>= ?n ?min2)&:(> ?min2 ?min) ?))
=>
(assert (mark ?stud ?subj ?mark)))
CLIPS> (defrule select-good-student
(student ?stud ?name)
(forall (subject ?subj) (mark ?stud ?subj excellent|good))
=>
(assert (good-student ?stud)))
CLIPS> (defrule print-unique-good-student
(good-student ?stud)
(not (good-student ?stud2&~:(eq ?stud2 ?stud)))
(student ?stud ?name)
=>
(printout t ?name " - единственный хороший студент" crlf))
CLIPS> (reset)
CLIPS> (assert
(num-right-answers ivanov math 23)
(num-right-answers ivanov cs 29))
<Fact-8>
CLIPS> (run)
Иванов - единственный хороший студент