我想让一个人过敏,然后通过过敏分裂过敏来断言每个人。为此,我使用do-backward-chaining
,assert-string
和readline
。
(do-backward-chaining allergies)
(defrule ask-allergies
(need-allergies nil)
=>
(printout t "Tell me your allergies (tomato, cheese): ")
(assert-string (str-cat "(allergies " (readline) ")")))
(defrule assert-allergies
(allergies $? ?a $?)
=>
(assert (allergy ?a)))
(reset)
(run)
但输出此错误:
Jess reported an error in routine Context.getVariable
while executing (reset).
Message: No such variable _blank_mf1.
答案 0 :(得分:0)
我找不到关于后向链接如何工作的任何详细文档,但我认为你需要使用$?变量,你只需要$?在断言过敏模式中:
Jess> (do-backward-chaining allergies)
TRUE
Jess>
(defrule ask-allergies
(need-allergies $?)
=>
(printout t "Tell me your allergies (tomato, cheese): ")
(assert-string (str-cat "(allergies " (readline) ")")))
TRUE
Jess>
(defrule assert-allergies
(allergies $?b ?a $?e)
=>
(assert (allergy ?a)))
TRUE
Jess> (reset)
TRUE
Jess> (run)
Tell me your allergies (tomato, cheese): fish onions salt
4
Jess> (facts)
f-0 (MAIN::initial-fact)
f-1 (MAIN::need-allergies nil nil nil)
f-2 (MAIN::allergies fish onions salt)
f-3 (MAIN::allergy salt)
f-4 (MAIN::allergy fish)
f-5 (MAIN::allergy onions)
For a total of 6 facts in module MAIN.
Jess>