0

最後に、プログラムがパーセンテージの確実性を出力することになっているときに、プログラムがハングします。何が間違っている可能性がありますか? 削除すると、非パーセンテージ データが出力されるため、これは calculate-percentage ルールである必要があります。

(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-percentagesUPDATE-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 に答える