【问题标题】:Clips defRule defined successfully but does not fire with other defrulesClips defRule 定义成功,但不与其他 defrules 一起触发
【发布时间】:2021-05-22 19:35:44
【问题描述】:

这是我的代码,第一个 Defrule 会触发“get-patientnationalic”,但第二个称为“fever”不会
我正在尝试制作一个剪辑程序来测试用户的症状并诊断他们的疾病(如果有的话) 这是一个 uni 项目,我有一个截止日期,但我无法运行这个位

(deftemplate patient 
   (slot name)
   (slot fever))
   
(defrule get-patientnationalic
   =>
   (printout t "What is your national-IC? " crlf) 
   (bind ?nationalic (readline))
   (assert (patients's-nationalic ?nationalic)))
 
(defrule get-patientgender
   =>
   (printout t "What is your gender?" crlf) 
   (bind ?gender (readline))
   (assert (patient's-gender ?gender)))
    
(defrule fever
   (or (fever ?n)
       (fever ?n))
   ?patient <- (patient (name ?name))
   =>
   (printout t crlf "Does "?name" has fever? (yes/no)" crlf)
   (printout t " Answer: ")
   (bind ?fever (lowcase (readline)))
   (if (eq ?fever yes)
      then
      (bind ?fever y)
      else 
      (if (eq ?fever no)
         then 
         (bind ?fever n)))
   (assert (fever ?fever))
   (modify ?patient (fever ?fever)))

【问题讨论】:

    标签: computer-science clips


    【解决方案1】:

    您的发烧规则的条件无法匹配,因为不存在患者事实,并且该规则要求的发烧事实仅由同一规则断言。只需相应地修改您的代码:

             CLIPS (6.4 2/9/21)
    CLIPS> 
    (deftemplate patient 
       (slot name)
       (slot gender (default unknown))
       (slot fever (default unknown))
       (slot IC (default unknown)))
    CLIPS>    
    (defrule get-patient-name
       =>
       (printout t "What is your name? ") 
       (bind ?name (readline))
       (assert (patient (name ?name))))
    CLIPS>    
    (defrule get-patient-nationalic
       ?patient <- (patient (IC unknown))
       =>
       (printout t "What is your national-IC? ") 
       (bind ?nationalic (readline))
       (modify ?patient (IC ?nationalic)))
    CLIPS>  
    (defrule get-patient-gender
       ?patient <- (patient (gender unknown))
       =>
       (printout t "What is your gender? ") 
       (bind ?gender (readline))
       (modify ?patient (gender ?gender)))
    CLIPS>     
    (defrule fever
       ?patient <- (patient (name ?name) (fever unknown))
       =>
       (printout t "Does " ?name " has fever? (yes/no) ")
       (bind ?fever (lowcase (readline)))
       (if (eq ?fever yes)
          then
          (bind ?fever y)
          else 
          (if (eq ?fever no)
             then 
             (bind ?fever n)))
       (modify ?patient (fever ?fever)))
    CLIPS> (reset)
    CLIPS> (run)
    What is your name? Fred
    What is your national-IC? US
    What is your gender? male
    Does Fred has fever? (yes/no) yes
    CLIPS> (facts)
    f-1     (patient (name "Fred") (gender "male") (fever "yes") (IC "US"))
    For a total of 1 fact.
    CLIPS> 
    

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2014-04-10
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多