CLIPS простой процент defrule

В конце, когда программа должна распечатать процент уверенности, программа зависает. Что может быть не так? Это должно быть правило вычисления процента, поскольку при его удалении печатаются непроцентные данные.

(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))

person user    schedule 23.05.2013    source источник


Ответы (2)


Похоже, вы попали в бесконечный цикл. Когда вы изменяете экземпляр deftemplate, вы заменяете оригинал измененным экземпляром, который в вашей ситуации будет соответствовать calculate-percentages снова и снова. Поэтому вам нужно предотвратить этот бесконечный цикл совпадений правил.

Поскольку вы используете модули, рассмотрите возможность расчета своей уверенности в модуле, отличном от PRINT-RESULTS (я буду называть другой модуль UPDATE-CERTAINTY). Затем в then части вашего calculate-percentages правила вы можете вывести модуль UPDATE-CERTAINTY, чтобы правило не соответствовало измененному факту.

person bogatron    schedule 24.05.2013

В качестве альтернативы вы можете использовать дополнительный слот в своих фактах, чтобы указать, были ли выполнены вычисления по факту (в этом примере слот статуса):

(defrule PRINT-RESULTS::calculate-percentages
?var <- (religion (name ?religion) (status ~final) (aspects $?aspects) (certainty ?certainty))
=>
(modify ?var (status final) (certainty =(*(/ ?certainty 700)100))))
person Gary Riley    schedule 26.05.2013