У меня небольшие затруднения в понимании того, как функция 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))
)
Извините за беспокойство: (