2016-11-04 5 views
1
(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)) 

私がしようとしているのは、プラントに何が間違っているのかを尋ね、キーワードを使用して問題を特定し、問題をアサーションするだけです。しかし、私は次のエラーが発生し続けます。Clipsルールエンジンの "defruleの適切な構文を確認する"をデバッグする方法は?

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

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

答えて

1

有効なCLIPS構文のBNF仕様は、「CLIPS Basic Programming Guide」にあります。 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> 

ザ・ルール(=前の部分>)の部分は適用可能であることがルールのために事実/インスタンスにマッチしなければならない条件で構成されています。ルールの条件から関数呼び出しを行うことはできますが、試行した構文を使用することはできません。さらに、条件は非順次的にアクティブにできるため、規則のアクション(=>の後の部分)で順番に実行する必要がある手続き型コードを指定する必要があります。あなたはいくつかの変更を使用して、元のコードは、構文的に正しいことができます

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

は助けのためにあなたをとても感謝しています。また[これ](http://stackoverflow.com/a/27363761/3738647)のおかげで。 – user373864q

関連する問題