Почему мое правило заморозило 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)))))
   =>)
Другие вопросы по тегам