Использование CLIPS (не (a-fact $?)) Не срабатывает - PullRequest
2 голосов
/ 21 декабря 2011

У меня небольшие затруднения в понимании того, как функция not взаимодействует с сопоставлением с образцом. Я хотел бы написать сопоставление с шаблоном, которое гласит: «такого факта не существует».

А именно, что я хочу:

(defrule init-count
    (not (highest-debt ?))
    (catherines ?debt)
    =>
    (assert (highest-debt ?debt))
)

и затем:

(defrule continue-count
    ?debt-fact <- (highest-debt ?h-debt)
    (? ?a-debt)
    (test (> ?a-debt ?h-debt))
    =>
    (retract ?debt-fact)
    (assert (highest-debt ?a-debt))
)

Но по какой-то причине not здесь не работает. Замена not на (not (exists /*pattern*/)), похоже, тоже не работает. Есть ли что-то, чего мне не хватает и / или хороший способ реализовать поиск наибольшего числа с такими правилами?

Обновление

Ответ, который я только что обнаружил, таков: шаблон not не должен быть первым ((declare (salience 0)) тоже не считается). Итак, следующий код работает правильно:

(defrule init-count
    (catherines ?debt)
    (not (highest-debt ?))
    =>
    (assert (highest-debt ?debt))
)

Извините за беспокойство: (

1 Ответ

3 голосов
/ 16 марта 2012

В версиях 6.24 и ранее, когда условный элемент not был первым шаблоном в правиле, шаблон (initial-fact) был добавлен перед ним (это описано в разделе 5.4.9, АвтоматическиДобавление и переупорядочение CE LHS, в Основном руководстве по программированию).Факт (исходный факт) подтверждается при выполнении команды (сброс).Я думаю, что это является причиной вашей проблемы.Ваше исходное правило сработало бы, если бы вы выполнили (сброс) до утверждения других фактов.

...