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

Правила-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)

Иванов - единственный хороший студент

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]