Вам нужно решить две проблемы. Во-первых, определенные вами шаблоны могут соответствовать одному и тому же факту несколько раз (например, датчик L1
будет привязан к a
, b
и c
). Чтобы обойти это, вам нужно убедиться, что a
, b
и c
уникальны. Один из способов сделать это следующий (обратите внимание, что я также добавил отсутствующий "(" перед вашим оператором printout
):
(deffacts listaSenzor
(sensor L1 0)
(sensor L2 0)
(sensor L3 1)
(sensor L4 1)
(sensor L5 1)
(sensor L6 1)
(sensor L7 0)
(sensor L8 1)
(sensor L9 0))
(defrule rr
(sensor ?a 0)
(sensor ?b 0)
(sensor ?c 0)
(test (neq ?a ?b))
(test (neq ?a ?c))
(test (neq ?b ?c))
=>
(printout t ?a ?b ?c "==>WARNING" crlf))
Использование этого правила против ваших фактов дает:
CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
L9L7L1==>WARNING
L9L2L7==>WARNING
...
L1L2L7==>WARNING
L2L1L7==>WARNING
Предупреждение теперь генерируется только при наличии трех или более датчиков неисправности; однако выходные данные представляют вторую проблему, а именно то, что ваше предупреждение генерируется несколько раз (по одному разу для каждой уникальной комбинации трех неисправных датчиков). Чтобы обойти это, вам, вероятно, понадобится контрольный факт, чтобы правило не срабатывало несколько раз. Для этого вы можете изменить правило следующим образом:
(defrule rr
(not (sensor-warning))
(sensor ?a 0)
(sensor ?b 0)
(sensor ?c 0)
(test (neq ?a ?b))
(test (neq ?a ?c))
(test (neq ?b ?c))
=>
(assert (sensor-warning))
(printout t ?a ?b ?c "==>WARNING" crlf))
Это гарантирует, что правило сработает только один раз (если вы не отмените sensor-warning
факт). Запуск с обновленным правилом:
CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
CLIPS>
Это простое решение вашей проблемы. Если вы, вероятно, измените количество датчиков "не в порядке", которые должны запускать правило, то вам, вероятно, следует заменить сравнение имен "зашитых" датчиков более общей логикой (например, вы можете вычислить общее количество датчиков, не отвечающих требованиям, и сравните это с вашим порогом).
person
bogatron
schedule
16.12.2013