2017-09-24 8 views
0

私は、クリッププログラミング言語で基本エキスパートシステムを実装しようとしています。私は彼らの両親と一緒に子供の知識ベースを持っています。私はルールを設定して、2人の子供が同じ両親を持っていれば、彼らが兄弟であるという事実を主張するようにしたい。クリップファミリーエキスパートシステム


(deftemplate person "family tree" 
      (slot name) 
      (slot father) 
      (slot mother)) 

(assert 
     (person 
       (name "William") 
       (father "John") 
       (mother "Megan"))) 
(assert 
     (person (name "David") 
       (father "John") 
       (mother "Megan"))) 

(defrule sibling 
     (person 
       (name ?name1) 
       (father ?x) 
       (mother ?x)) 
     (person 
       (name ?name2) 
       (father ?y) 
       (mother ?y))) 

と私はルールを定義するとき、私は構文エラーを取得:

Syntax Error: Check appropriate syntax for defrule. 

答えて

0

あなたのルールの正しい構文は次のとおりです。rule以内

(defrule sibling 
    (person (name ?name1) (father ?x) (mother ?x)) 
    (person (name ?name2) (father ?y) (mother ?y)) 
    => 
    ...) 

template

(template_name (slot_name value) (slot_name value)) 

ルールは、そのルールを満たす条件を定義するLHS(左手側)と、結果として生じるアクションを定義するRHS(右手側)の2つの側面に分かれています。

CLIPSでは、=>オペレータが2辺を区切ります。

例:

(defrule animal-is-a-duck 
    (animal ?name) 
    (quacks) 
    (two legs) 
    (lay eggs) 
    => 
    (assert (animal ?name is a duck))) 

あなたはbasic programming guide内のクリップの構文の詳細を読むことができます。

+0

ありがとうございましたが、私の兄弟の前にMAIN ::を置く必要がありました。しかし、今私が 'assert'でルールを呼び出すと、私はエラーが発生し続けます。私は構文 ''(MAIN :: sibling(person "name" First_Person "))(person(name" Second_Person ")))' 'と' '(MAIN :: sibling(person(" David ")) person( "William")))) 'MAIN ::なしの提案なしで試してみましたか? – cdruckemiller

+0

どのようなエラーが発生したかを指定して質問を編集してください。また、それぞれの文を改行文字で区切って記述することで、読みやすさを高めることができます。 – noxdafox

+0

申し訳ありませんが、私は答えを受け入れなければなりませんでした。ルールは実際には進まなかった。今は構文エラーが出ています。私は自分のコードと私のエラーを表示する質問をeditted。 – cdruckemiller