将读取列表拆分为其元素

时间:2017-09-24 09:47:01

标签: clips jess

我想让一个人过敏,然后通过过敏分裂过敏来断言每个人。为此,我使用do-backward-chainingassert-stringreadline

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

1 个答案:

答案 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>