0

我正在为一个项目使用 CLIPS。

我正在使用这个模板 A,它有一个属性模型和另一个模板 B,它也有一个属性模型。

所以我想要实现的是基于属性模型,返回模板A的那些事实,这些事实与模板B中的事实具有相同的属性模型值。

我尝试使用这种格式

  (find-all-facts((?a template_A)(?b template_B))
    (and
      //condition to be met
    )
  )

它确实给了我结果,但它给了我重复的 A 和 B 的结果。我如何使它返回非重复值,无论是 A 还是 B?

4

1 回答 1

1
CLIPS> 
(deftemplate template_A
   (slot model))
CLIPS>    
(deftemplate template_B
   (slot model))
CLIPS>    
(deffacts start
   (template_A (model 1))
   (template_A (model 2))
   (template_A (model 3))
   (template_B (model 2))
   (template_B (model 3))
   (template_B (model 4)))
CLIPS>    
(deffunction extract-every-nth-value (?values ?start ?increment)
   (bind ?rv (create$))
   (while (<= ?start (length$ ?values))
      (bind ?rv (create$ ?rv (nth$ ?start ?values)))
      (bind ?start (+ ?start ?increment)))
   (return ?rv))
CLIPS> (reset)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (template_A (model 1))
f-2     (template_A (model 2))
f-3     (template_A (model 3))
f-4     (template_B (model 2))
f-5     (template_B (model 3))
f-6     (template_B (model 4))
For a total of 7 facts.
CLIPS> 
(find-all-facts ((?a template_A)(?b template_B))
    (eq ?a:model ?b:model))
(<Fact-2> <Fact-4> <Fact-3> <Fact-5>)
CLIPS>     
(extract-every-nth-value
   (find-all-facts ((?a template_A)(?b template_B))
    (eq ?a:model ?b:model))
   1 2)
(<Fact-2> <Fact-3>)
CLIPS> 
于 2012-04-23T23:19:46.677 回答