【问题标题】:How to debug "Check appropriate syntax for defrule" in Clips rule engine?如何在 Clips 规则引擎中调试“检查 defrule 的适当语法”?
【发布时间】:2016-11-04 07:53:05
【问题描述】:
(deftemplate illness
   (slot sickness)
   (multislot keywords))

(deffacts qestion-refrences
    (illness (sickness stunted-Groth)(keywords stunted groth))
    (illness (sickness pale-Yellow) (keywords pale yellow))
    (illness (sickness reddish-Brown)(keywords reddish brown))
    (illness (sickness stunted-Root)(keywords stunted root)))

(deffunction askquestion (?question)
    (printout t ?question)
    (bind ?answer (read))
    (if (lexemep ?answer) 
        then (bind ?answer (lowcase ?answer)))  
    ?answer)

(defrule determineSickness
    (bind ?f (askquestion "whot Does the plant seem to have ? "))
    (illness (keywords ?kw) (sickness ?sk))
    (while  (not (subsetp ?kw ?f )) 
        (bind ?f (askquestion "whot Does the plant seem to have ? ")))
=>   
    (assert ?sk))

我想做的只是简单地询问用户他们的工厂出了什么问题,并使用关键字来识别问题,然后断言问题。但是我不断收到以下错误。

Defining defrule: determineSickness 
[PRNTUTIL2] Syntax Error:  Check appropriate syntax for defrule.

ERROR:
(defrule MAIN::determineSickness
   (bind ?f (
FALSE
CLIPS> 

【问题讨论】:

    标签: clips


    【解决方案1】:

    在 CLIPS 基本编程指南中有一个有效 CLIPS 语法的 BNF 规范。 defrules 的相关部分是:

    <defrule-construct> ::=
       (defrule <rule-name> [<comment>] 
          [<declaration>]
          <conditional-element>*
          =>
          <action>*)
    
    <action> ::= <expression>
    
    <expression> ::= <constant> | <variable> | <function-call>
    
    <function-call> ::= (<function-name> <expression>*)
    
    <conditional-element> ::= 
       <pattern-CE> | 
       <assigned-pattern-CE> | 
       <not-CE> | 
       <and-CE> | 
       <or-CE> | 
       <logical-CE> |
       <test-CE> |
       <exists-CE> |
       <forall-CE>
    

    规则的 when 部分(=> 之前的部分)包含必须与事实/实例匹配的条件,以便规则适用。您可以根据规则的条件进行函数调用,但不能使用您尝试过的语法。另外,由于条件可以以非顺序的顺序激活,因此必须在规则的动作中(=>之后的部分)指定必须顺序执行的程序代码。

    您可以通过一些更改使您的原始代码在语法上正确:

    (defrule determineSickness
        (illness (keywords $?kw) (sickness ?sk))
    =>
        (bind ?f (askquestion "whot Does the plant seem to have ? "))
        (while  (not (member$ ?f ?kw)) 
            (bind ?f (askquestion "whot Does the plant seem to have ? ")))
        (assert (diagnosis ?sk)))
    

    您的规则在语义上仍然不正确。这就是他们目前所做的:

    For every illness, ask the user to specify one of the symptoms for that illness.
    

    这是他们需要做的:

    For every symptom specified by the user, find every illness having that symptom.
    

    【讨论】:

    • 非常感谢您的帮助。也感谢this
    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 2014-09-28
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多