2016-09-20 2 views
0

クリップ奇妙な行動

CLIPS> (bind ?test (nth$ 1 (create$ 1))) 

1 

新しいウィンドウ:

(defrule testrule 
    (bind ?test2 (nth$ 1 (create$ 1))) 
=> 
    (assert (nothing here))) 

出力無題ウィンドウの「後ロードバッファ」:

CLIPS> Loading Selection... 
Defining defrule: testrule 
[PRNTUTIL2] Syntax Error: Check appropriate syntax for defrule. 

ERROR: 
(defrule MAIN::testrule 
(bind ?test2 (
CLIPS> 

どちらの場合も同じように失敗することはありますか?

私はこの問題を何回もテストしました。したがって、それは束縛線の構文解析切断を調べることによって確認できる、紛失構文の残りの部分からは問題ではありません。

ありがとうございました。

答えて

1

苦情の構文には問題があります。テスト条件要素を使用して、ルールの条件で式を評価します。使用した構文は、ファクトとリレーション名のバインドを一致させようとしていることを示しています。コマンドラインでやっていることへのアナログは、ルールのアクションからバインドするための関数呼び出しを実行することです:括弧が広くクリップに区切り文字として使用されているので

CLIPS> (bind ?test (nth$ 1 (create$ 1))) 
1 
CLIPS> 
(defrule testrule 
    => 
    (bind ?test (nth$ 1 (create$ 1))) 
    (printout t ?test crlf)) 
CLIPS> (run) 
1 
CLIPS> 

、多くの場合、コンテキストがありますコードの意味を決定します。例えば、ここではコマンドプロンプトから印刷コマンドの呼び出しです:

ルールの条件にプリントアウトコードを移動
CLIPS> 
(defrule hello 
    => 
    (printout t Hello crlf)) 
CLIPS> (run) 
Hello 
CLIPS> 

:ここではルールのアクションから同様の呼び出しは

CLIPS> (printout t Hello crlf) 
Hello 
CLIPS> 

です関数呼び出しから事実と一致することを意図したパターンにコードの意味を変更します

CLIPS> 
(defrule hello 
    (printout t Hello crlf) 
    =>) 
CLIPS> (agenda) 
CLIPS> (facts) 
f-0  (initial-fact) 
For a total of 1 fact. 
CLIPS> (assert (printout t Hello crlf)) 
<Fact-1> 
CLIPS> (agenda) 
0  hello: f-1 
For a total of 1 activation. 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (printout t Hello crlf) 
For a total of 2 facts. 
CLIPS> 

試験条件要素はindはするルールの条件で使用することができますいくつかのルールベースの言語は、しかし、クリップがない、あなたがルールの条件で得られた値に変数をバインドすることができ

CLIPS> 
(defrule hello (test (printout t Hello crlf)) =>) 
Hello 
CLIPS> 

:囲まれたコードは、関数呼び出しではなく事実をパターンマッチングであることをicateこれをサポートしていないので、テスト条件要素内にバインド関数呼び出しを置くことでこの制限を回避することはできません:

CLIPS> (defrule hello (test (bind ?x 1)) => (printout t ?x crlf)) 

[PRCCODE3] Undefined variable x referenced in RHS of defrule. 

ERROR: 
(defrule MAIN::hello 
    (test (bind ?x 1)) 
    => 
    (printout t ?x crlf)) 
CLIPS> 
+0

回答ありがとうございますが、バインドを割り当てることはできません左側にあるように、この問題に関連して、より単純なバインド(bind?test 1)が代わりに機能する理由は... –

+0

追加されたいくつかの追加のclari薬。 –

+0

今私には意味をなさないと思われるので、テストを除いて左辺のすべてがパターンマッチングのためだけに解釈され、nth $/create $ /などの標準関数はバインドに失敗するその文脈で使用することはできません。 –