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

То, что я пытаюсь сделать, это просто спросить у пользователя, что не так с их установкой, и использовать ключевые слова для определения проблемы, а затем утвердить проблему. Однако я продолжаю получать следующую ошибку.Как отладить «Проверить соответствующий синтаксис для defrule» в движке правил Clips?

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

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

ответ

1

В базовом руководстве по программированию CLIPS имеется спецификация BNF действительного синтаксиса CLIPS. Соответствующая часть для 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))) 

Правилу (s) все еще семантически некорректным. Это то, что они в настоящее время делают:

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

Смежные вопросы