CLIPS простой процент дефруле
В конце, когда программа должна вывести процент достоверности, программа зависает. Что может быть не так? Это должно быть правило расчета процента, так как при удалении выводятся непроцентные данные.
(defmodule PRINT-RESULTS (import MAIN ?ALL))
(defrule PRINT-RESULTS::calculate-percentages
?var <- (religion (name ?religion) (aspects $?aspects) (certainty ?certainty))
=>
(modify ?var (certainty =(*(/ ?certainty 700)100))))
(defrule PRINT-RESULTS::print-religion
?rel <- (religion (name ?religion) (aspects $?aspects) (certainty ?certainty))
=>
(retract ?rel)
(printout t crlf RELIGION: " "
?religion crlf ASPECTS: " "
?aspects crlf CERTAINTY: " "
?certainty crlf))
2 ответа
Кроме того, вы можете использовать дополнительный слот в ваших фактах, чтобы указать, было ли вычисление выполнено для факта (в этом примере слот статуса):
(defrule PRINT-RESULTS::calculate-percentages
?var <- (religion (name ?religion) (status ~final) (aspects $?aspects) (certainty ?certainty))
=>
(modify ?var (status final) (certainty =(*(/ ?certainty 700)100))))
Похоже, что вы попали в бесконечный цикл. Когда вы изменяете deftemplate
экземпляр, вы заменяете оригинал измененным экземпляром, который в вашей ситуации будет соответствовать calculate-percentages
опять и опять. Поэтому вам нужно предотвратить этот бесконечный цикл совпадений правил.
Поскольку вы используете модули, рассмотрите возможность расчета вашей достоверности в модуле, отличном от PRINT-RESULTS (другой модуль я буду называть UPDATE-CERTAINTY). Тогда в then
часть вашего calculate-percentages
Правило, вы можете открыть модуль UPDATE-CERTAINTY, чтобы предотвратить соответствие правила измененному факту.