0

知識ベースを構築するために、pyClips (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

お願いします、何度も修正しましたが、ルールの構築に問題はなく、Clips を使用しても機能するので、どうすれば解決できますか?

4

1 に答える 1

0

まず第一に、プログラムで欠落している空白に注意する必要があります。Eoln と比較ステートメント用のスペースが必要です。したがって、プログラムは次のようになります。

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())
于 2014-03-19T19:09:30.133 に答える