2017-03-17 134 views
0

this读的属性,以便回答,这是CLIPS访问属性

better to explicitly retrieve the slot value by matching it rather than using the slot accessor as this will cause the condition to be reevaluated whenever the slot value changes

如果我想访问一个属性的属性?例如,

分别给出了分别为ABab的两个实例。

a有一个名为ref_to_b的属性,它是对b的引用。 b有一个属性some_prop_of_b

如何匹配以下:

aref_to_b等于bsome_prop_of_b等于 “some_string”。

我试过,但得到了一个错误:

(defrule my_rule "comment me" 
    (object (is-a A) 
     (ref_to_b ?ref_to_b)) 
    (?ref_to_b 
     (some_prop_of_b "some_string")) 
=> 
) 

回答

1

放入ref_to_b插槽引用的实例的实例名称,然后使用名称插槽相匹配的参考:

CLIPS> 
(defclass A (is-a USER) (slot ref_to_b)) 
CLIPS> 
(defclass B (is-a USER) (slot some_prop_of_b)) 
CLIPS> 
(make-instance [b1] of B (some_prop_of_b "some_string")) 
[b1] 
CLIPS> 
(make-instance [b2] of B (some_prop_of_b "not_some_string")) 
[b2] 
CLIPS> 
(make-instance [a] of A (ref_to_b [b2])) 
[a] 
CLIPS> 
(defrule my_rule 
    (object (is-a A) (ref_to_b ?name_b)) 
    (object (name ?name_b) (some_prop_of_b "some_string")) 
    =>) 
CLIPS> (agenda) 
CLIPS> (send [a] put-ref_to_b [b1]) 
[b1] 
CLIPS> (agenda) 
0  my_rule: [a],[b1] 
For a total of 1 activation. 
CLIPS> 
+0

阿名称插槽。这是关键。 – stackoverflowwww