【问题标题】:How to know which questions to ask on front end for rule based system如何知道在基于规则的系统的前端要问哪些问题
【发布时间】:2016-08-28 23:22:16
【问题描述】:

我正在开发一个基于简单诊断规则的专家系统。它应该提出问题并识别动物健康问题。我正在使用反向链接进行推理。我怎么知道在前端要问哪些问题来断言新规则?假设我有一堆规则 IF A THEN B,IF B THEN C。知道如果 B 被断言它会检查 C,然后它会检查 A 是否被断言。现在由于没有断言 a,我需要在前端提出问题。是否有一些方法可以知道要问什么问题?

【问题讨论】:

    标签: rule-engine expert-system


    【解决方案1】:

    这在很大程度上取决于如何实现反向链接的细节。例如,您可以在 Jess 中执行此操作,其中引擎生成可以通过规则匹配的目标:

    Jess> 
    (deftemplate symptom
       (declare (backchain-reactive TRUE))
       (slot name)
       (slot value))
    TRUE
    Jess>    
    (deftemplate diagnosis
       (slot name))
    TRUE
    Jess>    
    (deftemplate question
       (slot name)
       (slot string))
    TRUE
    Jess>    
    (deffacts questions
       (question (name has-fever) (string "Does patient have a fever?"))
       (question (name swollen-neck) (string "Does patient have a swollen neck?"))
       (question (name skin-rash) (string "Does patient have a skin rash?")))
    TRUE
    Jess>    
    (defrule measles
       (symptom (name has-fever) (value yes))
       (symptom (name skin-rash) (value yes))
       =>
       (assert (diagnosis (name measles)))
       (printout t "Patient has measles." crlf))
    TRUE
    Jess> 
    (defrule mumps
       (symptom (name has-fever) (value yes))
       (symptom (name swollen-neck) (value yes))
       =>
       (assert (diagnosis (name mumps)))
       (printout t "Patient has mumps." crlf))
    TRUE
    Jess>    
    (defrule ask-question
       (need-symptom (name ?name))
       (question (name ?name) (string ?string))
       (not (diagnosis))
       =>
       (printout t ?string " ")
       (assert (symptom (name ?name) (value (read)))))
    TRUE
    Jess> (reset)
    TRUE
    Jess> (run)
    Does patient have a fever? yes
    Does patient have a swollen neck? yes
    Patient has mumps.
    3
    Jess> (reset)
    TRUE
    Jess> (run)
    Does patient have a fever? yes
    Does patient have a swollen neck? no
    Does patient have a skin rash? yes
    Patient has measles.
    4
    Jess> 
    

    【讨论】:

    • 感谢您的回复。如果我对某些问题有子问题会发生什么。例如,假设我想“病人在咳嗽吗?”和“病人有头痛吗?”。然后我对咳嗽有一个小问题,“患者在咳嗽时会感到肺部疼痛吗?”。如果病人回答是,他在咳嗽,它应该跳过头痛的问题,而问感觉肺部疼痛的问题。这样做的方法是什么?
    • 对反向链接如何工作的详细解释过于宽泛,无法简要回答。我建议使用带有关键字反向链接算法的搜索引擎。
    • 还有一个问题。如果工作记忆中没有事实症状,则需要症状为真?例如,反向链接检查“麻疹”的左侧,检查是否断言“发烧”,如果不是,则触发规则询问“患者是否发烧?”
    • 当规则具有不匹配的症状条件并且满足所有先前条件时,将自动生成需要症状目标。因此,最初会生成一个(需要症状(名称有发烧)(值是))目标,因为它对应于麻疹和腮腺炎规则的第一个不匹配的症状。当创建 (symptom (name has-fever) (value yes)) 事实时,为 (need-symptom (name skin-rash) (value yes)) 和 (need-symptom (name swollen-neck) 生成目标(值是))。
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多