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, чтобы предотвратить соответствие правила измененному факту.

Другие вопросы по тегам