2017-08-22 4 views
0

私はCLIPSのルールは通常defruleを使って名前が与えられていることを知っています。この規則はrule1と呼ばれている:CLIPSの "匿名"ルールの定義

(deftemplate animal (slot species)) 

(deffacts animal 
    (animal (species dog))) 

(defrule rule1 
    (animal (species ?name)) 
    => 
    (printout t ?name crlf)) 
(reset) 

(run) 

(exit) 
; 

しかし、私はまだルールが命名されることが必要であるかどうかわかりません。このように名前を付けずにルールを定義することは可能ですか?基本的なプログラミングガイドのセクション5から

(deftemplate animal (slot species)) 

(deffacts animal 
    (animal (species dog))) 

(defrule 
    (animal (species ?name)) 
    => 
    (printout t ?name crlf)) 
(reset) 

(run) 

(exit) 
; 

答えて

1

は:

(defrule <rule-name> [<comment>] 
    [<declaration>] 
    <conditional-element>* 
    => 
    <action>*) 

ルール名が必要です。

は、動的に、ルール名を生成するユニークなシンボルを作成し、gensymはの*機能を使用するには:私はまだそれがこの制限を回避することができます願っています

CLIPS> 
(deffunction create-anonymous (?conditions ?actions) 
    (bind ?str (str-cat "(defrule " (gensym*) " " 
         ?conditions " => " ?actions ")")) 
    (build ?str)) 
CLIPS> (deftemplate animal (slot species)) 
CLIPS> 
(create-anonymous "(animal (species ?name))" 
        "(printout t ?name crlf)") 
TRUE 
CLIPS> (rules) 
gen1 
For a total of 1 defrule. 
CLIPS> (ppdefrule gen1) 
(defrule MAIN::gen1 
    (animal (species ?name)) 
    => 
    (printout t ?name crlf)) 
CLIPS> 
+0

を。 1つのルール内に複数のif-thenステートメントを定義することは可能でしょうか? –

+0

より良い質問は、あなたが匿名のルールが必要だと思っていることを何をしようとしているのですか? –

+0

私は、既に知られている事実に基づいて、実行時に新しいルールを作成する必要のある機械学習システムを開発しています。作成される新しいルールごとに一意の名前を生成するのは難しいかもしれませんが、それでも可能であることを願っています。 –

関連する問題