Почему мое правило заморозило CLIPSIDE, но каждый загружается нормально
(defrule rule1
(not
(or
(and
(or
(Cloud1 (cloudcount FEW|SCT) )
(Cloud2 (cloudcount FEW|SCT))
(Cloud3 (cloudcount FEW|SCT))
(Cloud4 (cloudcount FEW|SCT))
)
(or
(Trend1Cloud1 (cloudcount BKN|OVC))
(Trend1Cloud2 (cloudcount BKN|OVC))
(Trend1Cloud3 (cloudcount BKN|OVC))
(Trend1Cloud4 (cloudcount BKN|OVC))
)
)
(and
(or
(Cloud1 (cloudcount BKN|OVC))
(Cloud2 (cloudcount BKN|OVC))
(Cloud3 (cloudcount BKN|OVC))
(Cloud4 (cloudcount BKN|OVC))
)
(or
(Trend1Cloud1 (cloudcount FEW|SCT))
(Trend1Cloud2 (cloudcount FEW|SCT))
(Trend1Cloud3 (cloudcount FEW|SCT))
(Trend1Cloud4 (cloudcount FEW|SCT))
)
)
)
)
=>
(asser 1))
вот мое правило, LHS содержит две части внутри "или", каждая часть загружается хорошо, но она заморозит IDE, когда соединит две части. Но почему? моя IDE - CLIPSIDE64, версия 6.3
1 ответ
Это ошибка в клипах. Перестановки условных элементов 'или' в правиле генерируют 32 шаблона следующей формы:
(нет (и (Cloud1 (количество облаков FEW | SCT)) (Trend1Cloud1 (количество облаков BKN | OVC))))
Из-за ошибки длинная цепочка этих процессов будет занимать слишком много времени. Исправление было проверено в репозитории CLIPS SVN.
Независимо от того, я бы предложил параметризовать ваши факты, если ваши требования позволяют это:
(defrule example
(not
(or
(and (Cloud (id 1 | 2 | 3 | 4) (cloudcount FEW | SCT))
(Trend (id 1 | 2 | 3 | 4) (cloudcount BKN | OVC)))
(and (Cloud (id 1 | 2 | 3 | 4) (cloudcount BKN | OVC))
(Trend (id 1 | 2 | 3 | 4) (cloudcount FEW | SCT)))))
=>)