0

最后,当程序应该打印百分比确定性时,程序挂起。可能有什么问题?它必须是计算百分比规则,因为当删除时,将打印非百分比数据。

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

2 回答 2

0

您似乎陷入了无限循环。当您修改一个deftemplate实例时,您将用修改后的实例替换原始实例,在您的情况下它将calculate-percentages一次又一次地匹配。所以你需要防止这种无限循环的规则匹配。

由于您使用的是模块,因此请考虑在 PRINT-RESULTS 以外的模块中计算您的确定性(我将其他模块称为 UPDATE-CERTAINTY)。然后在您的规则then部分calculate-percentages,您可以弹出 UPDATE-CERTAINTY 模块以防止规则匹配修改后的事实。

于 2013-05-24T14:03:52.657 回答
0

或者,您可以在事实中使用一个附加槽来指示是否已对事实进行了计算(在本示例中为状态槽):

(defrule PRINT-RESULTS::calculate-percentages
?var <- (religion (name ?religion) (status ~final) (aspects $?aspects) (certainty ?certainty))
=>
(modify ?var (status final) (certainty =(*(/ ?certainty 700)100))))
于 2013-05-26T21:54:33.233 回答