将读取列表拆分为其元素

问题描述 投票:0回答:1

我想让一个人过敏,然后通过过敏分裂过敏来断言每个人。要做到这一点,我使用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.
clips jess
1个回答
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> 
© www.soinside.com 2019 - 2024. All rights reserved.