Ошибка в клипах. BuildRule - PullRequest
       7

Ошибка в клипах. BuildRule

0 голосов
/ 16 сентября 2011

Я использую PyClips (это Clips, встроенный в Python) для создания знаний база. Я хочу добавить новое правило в файл базы знаний, вызвав функцию который реализует правило, показанное в этой функции:

def normalRule(clips, i, path):
    rule_name = 'rule_' + str(i)
    rule_prec = '(phase ?phase)'
    rule_prec += '?address1 <-(Organ (name ?organ))'
    rule_prec += '?address2 <-(Surgical-Action (action ?action))'
    rule_prec += '?address3 <-(Medical-Devices (tool-name ?tool))'
    rule_body = '(if(=(str-compare ?*pickupEvent* "no")0) then'
    rule_body += '(bind ?predicted-action ?action)'
    rule_body += '(bind ?*current-action* ?predicted-action)'
    rule_body += '(bind ?ex-tool ?tool)'
    rule_body += 'else'
    rule_body += '(bind ?actual-action ?action)'
    rule_body += '(bind ?s-tool ?tool)'
    rule_body += '(retract ?address1 ?address2 ?address3)'
    rule_body += '(if (and (=(str-compare ?predicted-action ?actual-action)0)\
    (=(str-compare ?ex-tool ?s-tool) 0)) then'
    rule_body += '(updateAction ?*current-action* ?actual-action)'
    rule_body += 'else'
    rule_body += '( if (not(=(str-compare ?predicted-action ?actual-action)0)) then'
    rule_body += '(updateAction ?*current-action* ?actual-action)'
    rule_body += '(assert (You have mistake: incorrect action))'
    rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1)))'
    rule_body += '(if (not(=(str-compare ?ex-tool ?s-tool) 0)) then'
    rule_body += '(updateAction ?*current-action* ?actual-action)'
    rule_body += '(assert (You have mistake: incorrect surgical device))'
    rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1))'
    rule_body += ')))'

    rule = clips.BuildRule(rule_name, rule_prec, rule_body)

Правило внутри этой функции работает нормально, когда я применяю его с помощью клипов, но теперь я хочу создавать новое правило каждый раз, когда вызывается функция.

Но когда я вызвал эту функцию, я получил ошибку:

Traceback (most recent call last):
File "C:\Users\DELL\My Documents\Aptana Studio 3 Workspace\
    Interface\src\ruleModel\ruleTypes.py", line 305,
    in <module> normalRule(clips, 1, "C:\Users\DELL\Desktop\bjareb\tt.py")          
File "C:\Users\DELL\My Documents\Aptana Studio 3 Workspace\
    Interface\src\ruleModel\ruleTypes.py", line 39,
    in normalRule rule = clips.BuildRule(rule_name, rule_prec, rule_body)
File "C:\Python26\lib\clips\_clips_wrap.py", line 149, in _WRAPPER return f(*args)
File "C:\Python26\lib\clips\_clips_wrap.py", line 238, in _WRAPPER return f(*newargs)
File "C:\Python26\lib\clips\_clips_wrap.py", line 3317, in BuildRule _c.build(construct)
    _clips.ClipsError: C08: syntax error, or unable to parse expression

Так что, пожалуйста, я пересмотрел это много раз, и в этом нет ничего плохого конструкция, также она работает, когда я использую клипы, так как мне решить эту проблему?

1 Ответ

0 голосов
/ 19 марта 2014

Прежде всего вы должны быть осторожны с пробелами, которые отсутствуют в вашей программе. Нужны Eoln's и пробелы для ваших сравнений. Итак, ваша программа должна выглядеть так:

rule_prec = '(phase ?phase)\n'
rule_prec += '?address1 <-(Organ (name ?organ))\n'
rule_prec += '?address2 <-(Surgical-Action (action ?action))\n'
rule_prec += '?address3 <-(Medical-Devices (tool-name ?tool))\n'
rule_body = '(if(=(str-compare ?*pickupEvent* "no") 0) then\n'
rule_body += '(bind ?predicted-action ?action)\n'
rule_body += '(bind ?*current-action* ?predicted-action)\n'
rule_body += '(bind ?ex-tool ?tool)\n'
rule_body += 'else\n'
rule_body += '(bind ?actual-action ?action)\n'
rule_body += '(bind ?s-tool ?tool)\n'
rule_body += '(retract ?address1 ?address2 ?address3)\n'
rule_body += '(if (and (= (str-compare ?predicted-action ?actual-action) 0) \
(=(str-compare ?ex-tool ?s-tool) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += 'else\n'
rule_body += '( if (not (= (str-compare ?predicted-action ?actual-action) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += '(assert (You have mistake: incorrect action))\n'
rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1)))\n'
rule_body += '(if (not (= (str-compare ?ex-tool ?s-tool) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += '(assert (You have mistake: incorrect surgical device))\n'
rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1))\n'
rule_body += ')))\n'

Во-вторых, если вы используете PyClips и чувствуете себя комфортно с CLIPS, используйте следующие строки, чтобы получить настоящее сообщение об ошибке CLIPS для вашего правила. Я пытался решить вашу проблему, но есть несколько проблем в шаблонах и действиях вашего правила.

import logging.config
engine = clips.Environment()
try:
rule_name = 'rule_1'
rule_prec = '(phase ?phase)\n'
rule_prec += '?address1 <-(Organ (name ?organ))\n'
rule_prec += '?address2 <-(Surgical-Action (action ?action))\n'
rule_prec += '?address3 <-(Medical-Devices (tool-name ?tool))\n'
rule_body = '(if(=(str-compare ?*pickupEvent* "no") 0) then\n'
rule_body += '(bind ?predicted-action ?action)\n'
rule_body += '(bind ?*current-action* ?predicted-action)\n'
rule_body += '(bind ?ex-tool ?tool)\n'
rule_body += 'else\n'
rule_body += '(bind ?actual-action ?action)\n'
rule_body += '(bind ?s-tool ?tool)\n'
rule_body += '(retract ?address1 ?address2 ?address3)\n'
rule_body += '(if (and (= (str-compare ?predicted-action ?actual-action) 0) \
(=(str-compare ?ex-tool ?s-tool) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += 'else\n'
rule_body += '( if (not (= (str-compare ?predicted-action ?actual-action) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += '(assert (You have mistake: incorrect action))\n'
rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1)))\n'
rule_body += '(if (not (= (str-compare ?ex-tool ?s-tool) 0)) then\n'
rule_body += '(updateAction ?*current-action* ?actual-action)\n'
rule_body += '(assert (You have mistake: incorrect surgical device))\n'
rule_body += '(bind ?*number-of-mistakes* (+ ?*number-of-mistakes* 1))\n'
rule_body += ')))\n'

rule=clips.BuildRule(rule_name, rule_prec, rule_body,"test rule")
    except clips.ClipsError:
logging.error(clips.ErrorStream.Read())
...